r1268 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty wikitty-api/src/main/java/org/nuiton/wikitty/query wikitty-generators/src/main/java/org/nuiton/wikitty/generator wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr
Author: bpoussin Date: 2011-12-30 16:12:58 +0100 (Fri, 30 Dec 2011) New Revision: 1268 Url: http://nuiton.org/repositories/revision/wikitty/1268 Log: Evolution #1863: Create new query api with visitor and better implementation Evolution #1864: Add query langage syntaxe Generation dans les interfaces d'objet ElementField pour chaque champs Utilisation du ElementField au lieu d'une String pour les sort et les facetField Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2011-12-30 14:32:17 UTC (rev 1267) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2011-12-30 15:12:58 UTC (rev 1268) @@ -38,6 +38,7 @@ import org.nuiton.wikitty.query.WikittyQueryMaker; import org.nuiton.wikitty.query.WikittyQueryResult; import org.nuiton.wikitty.query.WikittyQueryResultTreeNode; +import org.nuiton.wikitty.query.conditions.ElementField; /** * Wikitty client is object used in client side to access WikittyService. @@ -486,7 +487,7 @@ * @return */ public <E extends BusinessEntityImpl> WikittyQueryResult<E> findAllByExample(E e, - int first, int limit, String ... fieldFacet ) { + int first, int limit, ElementField ... fieldFacet ) { long start = TimeLog.getTime(); WikittyQuery query = new WikittyQueryMaker().wikitty(e).end() Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2011-12-30 14:32:17 UTC (rev 1267) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2011-12-30 15:12:58 UTC (rev 1268) @@ -8,6 +8,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.wikitty.query.conditions.Condition; +import org.nuiton.wikitty.query.conditions.ElementField; /** * Classe permettant de faire des recherches dans les données. @@ -66,14 +67,14 @@ /** Facet on condition. */ protected List<FacetQuery> facetQuery; /** Facet on field. */ - protected List<String> facetField; + protected List<ElementField> facetField; /** if true facet is done on extension name */ protected boolean facetExtension = false; /** Sort ascending on fields. */ - protected List<String> sortAscending; + protected List<ElementField> sortAscending; /** Sort descending on fields. */ - protected List<String> sortDescending; + protected List<ElementField> sortDescending; /** create anonymous query */ @@ -232,24 +233,24 @@ return this; } - public List<String> getFacetField() { + public List<ElementField> getFacetField() { if (facetField == null) { - facetField = new LinkedList<String>(); + facetField = new LinkedList<ElementField>(); } return facetField; } - public WikittyQuery addFacetField(String field) { + public WikittyQuery addFacetField(ElementField field) { getFacetField().add(field); return this; } - public WikittyQuery setFacetField(String ... facetField) { - this.facetField = new LinkedList<String>(Arrays.asList(facetField)); + public WikittyQuery setFacetField(ElementField ... facetField) { + this.facetField = new LinkedList<ElementField>(Arrays.asList(facetField)); return this; } - public WikittyQuery setFacetField(List<String> facetField) { + public WikittyQuery setFacetField(List<ElementField> facetField) { this.facetField = facetField; return this; } @@ -269,24 +270,24 @@ * * @return field names */ - public List<String> getSortAscending() { + public List<ElementField> getSortAscending() { if (sortAscending == null) { - sortAscending = new LinkedList<String>(); + sortAscending = new LinkedList<ElementField>(); } return sortAscending; } - public WikittyQuery addSortAscending(String ... field) { + public WikittyQuery addSortAscending(ElementField ... field) { getSortAscending().addAll(Arrays.asList(field)); return this; } - public WikittyQuery setSortAscending(String ... sortAscending) { - this.sortAscending = new LinkedList<String>(Arrays.asList(sortAscending)); + public WikittyQuery setSortAscending(ElementField ... sortAscending) { + this.sortAscending = new LinkedList<ElementField>(Arrays.asList(sortAscending)); return this; } - public WikittyQuery setSortAscending(List<String> sortAscending) { + public WikittyQuery setSortAscending(List<ElementField> sortAscending) { this.sortAscending = sortAscending; return this; } @@ -296,24 +297,24 @@ * * @return field names */ - public List<String> getSortDescending() { + public List<ElementField> getSortDescending() { if (sortDescending == null) { - sortDescending = new LinkedList<String>(); + sortDescending = new LinkedList<ElementField>(); } return sortDescending; } - public WikittyQuery addSortDescending(String ... field) { + public WikittyQuery addSortDescending(ElementField ... field) { getSortDescending().addAll(Arrays.asList(field)); return this; } - public WikittyQuery setSortDescending(String ... sortDescending) { - this.sortDescending = new LinkedList<String>(Arrays.asList(sortDescending)); + public WikittyQuery setSortDescending(ElementField ... sortDescending) { + this.sortDescending = new LinkedList<ElementField>(Arrays.asList(sortDescending)); return this; } - public WikittyQuery setSortDescending(List<String> sortDescending) { + public WikittyQuery setSortDescending(List<ElementField> sortDescending) { this.sortDescending = sortDescending; return this; } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-30 14:32:17 UTC (rev 1267) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-30 15:12:58 UTC (rev 1268) @@ -8,6 +8,7 @@ import org.nuiton.wikitty.query.conditions.Condition; import org.nuiton.wikitty.query.conditions.ContainsAll; import org.nuiton.wikitty.query.conditions.ContainsOne; +import org.nuiton.wikitty.query.conditions.ElementField; import org.nuiton.wikitty.query.conditions.Equals; import org.nuiton.wikitty.query.conditions.False; import org.nuiton.wikitty.query.conditions.Greater; @@ -63,15 +64,15 @@ @Override public boolean visitEnter(WikittyQuery o) { WikittyQuery q = getQuery(); - q.setFacetField(new ArrayList<String>(o.getFacetField())); + q.setFacetField(new ArrayList<ElementField>(o.getFacetField())); q.setFacetLimit(o.getFacetLimit()); q.setFacetMinCount(o.getFacetMinCount()); q.setFirst(o.getFirst()); q.setLimit(o.getLimit()); q.setName(o.getName()); q.setSelect(o.getSelect()); - q.setSortAscending(new ArrayList<String>(o.getSortAscending())); - q.setSortDescending(new ArrayList<String>(o.getSortDescending())); + q.setSortAscending(new ArrayList<ElementField>(o.getSortAscending())); + q.setSortDescending(new ArrayList<ElementField>(o.getSortDescending())); for (FacetQuery c : o.getFacetQuery()) { WikittyQueryVisitorCopy v = new WikittyQueryVisitorCopy(); Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java =================================================================== --- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java 2011-12-30 14:32:17 UTC (rev 1267) +++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java 2011-12-30 15:12:58 UTC (rev 1268) @@ -115,6 +115,7 @@ addImport(contract, WikittyTransformerUtil.BUSINESS_ENTITY_WIKITTY_CLASS_FQN); addImport(contract, WikittyTransformerUtil.WIKITTY_CLASS_FQN); addImport(contract, WikittyTransformerUtil.ENTITY_PACKAGE + ".WikittyExtension"); + addImport(contract, "org.nuiton.wikitty.query.conditions.ElementField"); addImport(contract, "org.nuiton.wikitty.WikittyUtil"); addImport(contract, WikittyTransformerUtil.ENTITY_PACKAGE + ".WikittyUser"); addImport(contract, WikittyTransformerUtil.ENTITY_PACKAGE + ".WikittyUserAbstract"); @@ -202,7 +203,14 @@ "FQ_" + fieldVariableName, "String", extensionVariableName + " + \"." + name + "\"", - ObjectModelModifier.PUBLIC); + ObjectModelModifier.PUBLIC); + + // adding public static final String ELEMENT_FIELD_CLIENT_NAME = new ElementField(EXT_CLIENT + ".name"); + addConstant(contract, + "ELEMENT_" + fieldVariableName, + "ElementField", + "new ElementField(FQ_" +fieldVariableName + ")", + ObjectModelModifier.PUBLIC); } } Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java =================================================================== --- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java 2011-12-30 14:32:17 UTC (rev 1267) +++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/ElementModifier.java 2011-12-30 15:12:58 UTC (rev 1268) @@ -50,6 +50,7 @@ * final 'monfield' n'est pas de ce type alors on ne retrouvera rien car * on recherchera sur un champs inexistant * <li> *.* ou * = recherche fulltext + * <li> #..... = un champs special force par l'utilisateur * * @param tx * @param element @@ -62,88 +63,105 @@ } else if (element instanceof ElementExtension) { result = SOLR_EXTENSIONS; } else if (element instanceof ElementField) { - String[] searchField = - element.getValue().split(WikittyUtil.FQ_FIELD_NAME_SEPARATOR_REGEX); + String fieldValue = element.getValue(); + if (StringUtils.startsWith(fieldValue, WikittySolrConstant.SOLR_WIKITTY_PREFIX)) { + // c'est un champs specifique a l'indexation, un utilisateur + // avance a du l'utiliser directement, on lui fait confiance + // et on le laisse comme ca + result = fieldValue; + } else { + String[] searchField = fieldValue.split(WikittyUtil.FQ_FIELD_NAME_SEPARATOR_REGEX); - if (searchField.length >= 2) { - String extName = searchField[0]; - String fieldName = searchField[1]; + if (searchField.length >= 2) { + String extName = searchField[0]; + String fieldName = searchField[1]; - if ("*".equals(extName) && "*".equals(fieldName)) { - result = SOLR_FULLTEXT; - } else if ("*".equals(extName)) { - result = SOLR_ALL_EXTENSIONS - + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName; + if ("*".equals(extName) && "*".equals(fieldName)) { + result = SOLR_FULLTEXT; + } else if ("*".equals(extName)) { + result = SOLR_ALL_EXTENSIONS + + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName; - String modifier = ""; - // on recherche si le type a ete force - if (searchField.length >= 3) { - // On passe ici, si on indique dans le champs son type (ex: *.monfield.NUMERIC) - // utile pour force la recherche sur les bons champs lorsqu'on - // demande une recherche sur * == #all - String fieldNameType = searchField[2]; - TYPE type = FieldType.TYPE.valueOf(fieldNameType); - // Ajout du pattern solr pour discriminer le champs ex : _s, _dt, _w, ... - modifier = SolrUtil.getSolrFieldName("", type); - } + String modifier = ""; + // on recherche si le type a ete force + if (searchField.length >= 3) { + // On passe ici, si on indique dans le champs son type (ex: *.monfield.NUMERIC) + // utile pour force la recherche sur les bons champs lorsqu'on + // demande une recherche sur * == #all + String fieldNameType = searchField[2]; + TYPE type = FieldType.TYPE.valueOf(fieldNameType); + // Ajout du pattern solr pour discriminer le champs ex : _s, _dt, _w, ... + modifier = SolrUtil.getSolrFieldName("", type); + } - if (StringUtils.isEmpty(modifier)) { - // si on arrive ici, c'est qu'on a pas reussi a calculer le - // modifier cela peut arriver par exemple pour - // #all ou le seul moyen d'avoir le type est qu'il soit donne - // dans le champs, sinon on ne peut pas le trouver - if (log.isDebugEnabled()) { - log.debug("Search on multi extentions (*) without field" - + " type, fallback search in fulltext"); + if (StringUtils.isEmpty(modifier)) { + // si on arrive ici, c'est qu'on a pas reussi a calculer le + // modifier cela peut arriver par exemple pour + // #all ou le seul moyen d'avoir le type est qu'il soit donne + // dans le champs, sinon on ne peut pas le trouver + if (log.isDebugEnabled()) { + log.debug("Search on multi extentions (*) without field" + + " type, fallback search in fulltext"); + } + result = SOLR_FULLTEXT_ALL_EXTENSIONS + + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName; + } else { + result += modifier; } - result = SOLR_FULLTEXT_ALL_EXTENSIONS - + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName; + + } else if ("*".equals(fieldName)) { + // on doit recherche sur tout les champs de cette extension + // en fait cela revient a faire une recherche fulltext avec + // une 2eme condition sur le type d'extension + // Il ne faut donc pas le gere comme ca, on previent via + // une exception qui l'explique + throw new WikittyException( + "To search on all field of one extension, you must" + + " use two condition, one on extension type, other" + + " in fulltext '*.*' with the wanted constraint"); } else { - result += modifier; - } + result = extName + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName; - } else if ("*".equals(fieldName)) { - // on doit recherche sur tout les champs de cette extension - // en fait cela revient a faire une recherche fulltext avec - // une 2eme condition sur le type d'extension - // Il ne faut donc pas le gere comme ca, on previent via - // une exception qui l'explique - throw new WikittyException( - "To search on all field of one extension, you must" - + " use to condition, one on extension type, other" - + " in fulltext '*.*' with the wanted constraint"); - } else { - result = extName + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName; - - // Ajout du pattern solr pour discriminer le champs ex : _s, _sm, _wm ... - // Search type of field in extension - String version = - extensionStorage.getLastVersion(tx, extName); - if (version != null) { // not valid extension if version == null - WikittyExtension ext = extensionStorage.restore( - tx, extName, version); - FieldType fieldType = ext.getFieldType(fieldName); - if (log.isDebugEnabled()) { - log.debug(ext.toDefinition() + " for " + fieldName); - } - if (fieldType != null) { // type can be null if extension version differ - TYPE type = fieldType.getType(); - result = SolrUtil.getSolrFieldName(result, type); + // Ajout du pattern solr pour discriminer le champs ex : _s, _sm, _wm ... + // Search type of field in extension + String version = + extensionStorage.getLastVersion(tx, extName); + if (version == null) { + // not valid extension if version == null + // cela arrive si le framework genere des requetes + // si des extensions non enregistrer en base + // cela est possible par exemple sur les WikittyTreeNode + log.info(String.format( + "Can't find extension '%s'", extName)); } else { - throw new WikittyException(String.format( - "Can't find field '%s' in extension '%s'" - + " with definition: %s", - fieldName, ext.getId(), ext.toDefinition())); + WikittyExtension ext = extensionStorage.restore( + tx, extName, version); + FieldType fieldType = ext.getFieldType(fieldName); + if (log.isDebugEnabled()) { + log.debug(ext.toDefinition() + " for " + fieldName); + } + if (fieldType != null) { // type can be null if extension version differ + TYPE type = fieldType.getType(); + result = SolrUtil.getSolrFieldName(result, type); + } else { + // on ne retrouve pas le champs, on le laisse comme il est + // mais normalement rien ne matchera avec + // TODO poussin 20111230 peut-etre transforme + // le champs en une recherche fulltext ??? + // mais c peut-etre dangereux car ce n'est pas + // ce qu'a demande l'utilisateur + log.info(String.format( + "Can't find field '%s' in extension '%s'" + + " with definition: %s", + fieldName, ext.getId(), ext.toDefinition())); + } } - } else { - throw new WikittyException(String.format( - "Can't find extension '%s'", extName)); } + } else if (searchField.length >= 1 && "*".equals(searchField[0])) { + result = SOLR_FULLTEXT; + } else { + throw new WikittyException("Empty field name is unsupported"); } - } else if (searchField.length >= 1 && "*".equals(searchField[0])) { - result = SOLR_FULLTEXT; - } else { - throw new WikittyException("Empty field name is unsupported"); } } else { throw new WikittyException(String.format( Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java =================================================================== --- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-30 14:32:17 UTC (rev 1267) +++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-30 15:12:58 UTC (rev 1268) @@ -72,6 +72,7 @@ import org.nuiton.wikitty.query.WikittyQueryMaker; import org.nuiton.wikitty.query.WikittyQueryResult; import org.nuiton.wikitty.query.WikittyQueryResultTreeNode; +import org.nuiton.wikitty.query.conditions.ElementField; import org.nuiton.wikitty.search.Search; import org.nuiton.wikitty.search.TreeNodeResult; @@ -675,19 +676,19 @@ querySolr.setRows(limit); // Add sorting - List<String> sortAscending = query.getSortAscending(); + List<ElementField> sortAscending = query.getSortAscending(); if(sortAscending != null) { - for (String sort : sortAscending) { - String tranform = fieldModifier.convertToSolr(transaction, sort); + for (ElementField sort : sortAscending) { + String tranform = elementModifier.convertToSolr(transaction, sort); tranform += WikittySolrConstant.SUFFIX_SORTABLE; querySolr.addSortField(tranform, SolrQuery.ORDER.asc); } } - List<String> sortDescending = query.getSortDescending(); + List<ElementField> sortDescending = query.getSortDescending(); if(sortDescending != null) { - for (String sort : sortDescending) { - String tranform = fieldModifier.convertToSolr(transaction, sort); + for (ElementField sort : sortDescending) { + String tranform = elementModifier.convertToSolr(transaction, sort); tranform += WikittySolrConstant.SUFFIX_SORTABLE; querySolr.addSortField(tranform, SolrQuery.ORDER.desc); } @@ -701,14 +702,14 @@ // Limit on wikitty String selectWikitty = SolrUtil.getSolrFieldName(select, TYPE.WIKITTY); - query.addFacetField(selectWikitty); + query.addFacetField(new ElementField(selectWikitty)); // We need no result, just facet query.setLimit(0); } // Add faceting - List<String> facetField = query.getFacetField(); + List<ElementField> facetField = query.getFacetField(); List<FacetQuery> facetQuery = query.getFacetQuery(); // use to map query string to criteria facet name @@ -722,8 +723,8 @@ // field facetisation if (facetField != null) { - for (String fqfieldName : facetField) { - String tranform = fieldModifier.convertToSolr(transaction, fqfieldName); + for (ElementField fqfieldName : facetField) { + String tranform = elementModifier.convertToSolr(transaction, fqfieldName); querySolr.addFacetField(tranform); } } @@ -747,7 +748,7 @@ Map<String, List<FacetTopic>> facets = new HashMap<String, List<FacetTopic>>(); if (facetField != null && !facetField.isEmpty()) { for (FacetField facet : resp.getFacetFields()) { - String facetName = fieldModifier.convertToField(transaction, facet.getName()); + String facetName = elementModifier.convertToField(facet.getName()); List<FacetTopic> topics = new ArrayList<FacetTopic>(); if (facet.getValues() != null) { for (FacetField.Count value : facet.getValues()) { @@ -876,7 +877,7 @@ .and().condition(filter.getCondition()) .eq(TREENODE_ATTACHED_ALL, wikittyId).end() .setFirst(0).setLimit(0) - .addFacetField(TREENODE_ATTACHED_ALL) + .addFacetField(new ElementField(TREENODE_ATTACHED_ALL)) // l'arbre peut avoir beaucoup de branche, il // faut que toutes les branches aient un count // des attachments
participants (1)
-
bpoussin@users.nuiton.org