r320 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty/search wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr wikitty-solr-impl/src/main/resources wikitty-solr-impl/src/test/java/org/nuiton/wikitty/solr/test
Author: jruchaud Date: 2010-09-16 15:26:42 +0200 (Thu, 16 Sep 2010) New Revision: 320 Url: http://nuiton.org/repositories/revision/wikitty/320 Log: Manage null in search Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Null.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Restriction.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/RestrictionHelper.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/RestrictionName.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Search.java trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/Restriction2Solr.java trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java trunk/wikitty-solr-impl/src/main/resources/schema.xml trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/solr/test/SolrSearchTest.java Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Null.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Null.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Null.java 2010-09-16 13:26:42 UTC (rev 320) @@ -0,0 +1,45 @@ +/* *##% + * Copyright (c) 2009 ruchaud. All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + *##%*/ +package org.nuiton.wikitty.search; + +/** + * Is null or is not null restriction + * + * @author ruchaud + */ +public class Null extends Restriction { + + private static final long serialVersionUID = 1L; + + protected String fieldName; + + public Null() { + } + + public Null(String fieldName) { + this.fieldName = fieldName; + } + + public String getFieldName() { + return fieldName; + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + +} Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Restriction.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Restriction.java 2010-09-16 12:29:21 UTC (rev 319) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Restriction.java 2010-09-16 13:26:42 UTC (rev 320) @@ -71,6 +71,7 @@ return true; } + @Override public int hashCode() { // equals use objects that are not constant through time // then, unable to create hashCode from those objects Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/RestrictionHelper.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/RestrictionHelper.java 2010-09-16 12:29:21 UTC (rev 319) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/RestrictionHelper.java 2010-09-16 13:26:42 UTC (rev 320) @@ -202,6 +202,20 @@ return keyword; } + public static Null isNull(String fieldName) { + Null isNull = new Null(); + isNull.setName(RestrictionName.IS_NULL); + isNull.setFieldName(fieldName); + return isNull; + } + + public static Null isNotNull(String fieldName) { + Null isNotNull = new Null(); + isNotNull.setName(RestrictionName.IS_NOT_NULL); + isNotNull.setFieldName(fieldName); + return isNotNull; + } + static ThreadLocal<SimpleDateFormat> myFormats = new ThreadLocal<SimpleDateFormat>() { @Override protected SimpleDateFormat initialValue() { Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/RestrictionName.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/RestrictionName.java 2010-09-16 12:29:21 UTC (rev 319) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/RestrictionName.java 2010-09-16 13:26:42 UTC (rev 320) @@ -26,5 +26,7 @@ FALSE, ASSOCIATED, IN, - KEYWORD + KEYWORD, + IS_NULL, + IS_NOT_NULL } \ No newline at end of file Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Search.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Search.java 2010-09-16 12:29:21 UTC (rev 319) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Search.java 2010-09-16 13:26:42 UTC (rev 320) @@ -327,6 +327,28 @@ } /** + * Is null. + * + * @param fieldName + * @return {@code this} + */ + public Search isNull(String fieldName) { + restrictions.add(RestrictionHelper.isNull(fieldName)); + return this; + } + + /** + * Is not null. + * + * @param fieldName + * @return {@code this} + */ + public Search isNotNull(String fieldName) { + restrictions.add(RestrictionHelper.isNotNull(fieldName)); + return this; + } + + /** * Not (sub query). * * @return sub query Modified: trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/Restriction2Solr.java =================================================================== --- trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/Restriction2Solr.java 2010-09-16 12:29:21 UTC (rev 319) +++ trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/Restriction2Solr.java 2010-09-16 13:26:42 UTC (rev 320) @@ -34,6 +34,7 @@ import org.nuiton.wikitty.search.StartsWith; import org.nuiton.wikitty.search.Unlike; import org.nuiton.wikitty.search.Like.SearchAs; +import org.nuiton.wikitty.search.Null; /** * @author "Nicolas Chapurlat" <nicolas.chapurlat@logica.com> @@ -135,6 +136,12 @@ case KEYWORD: Keyword keyword = (Keyword) restriction; return keyword2solr(keyword); + case IS_NULL: + Null isNull = (Null) restriction; + return isNull2solr(isNull); + case IS_NOT_NULL: + Null isNotNull = (Null) restriction; + return isNotNull2solr(isNotNull); default: throw new WikittyException("this kind of restriction is not supported : " + restriction.getName().toString()); @@ -383,6 +390,14 @@ return value2solr(keyword.getValue()); } + private String isNull2solr(Null isNull) { + return "-" + WikittySearchEnginSolr.SOLR_NOT_NULL_FIELDS + ":" + isNull.getFieldName(); + } + + private String isNotNull2solr(Null isNotNull) { + return WikittySearchEnginSolr.SOLR_NOT_NULL_FIELDS + ":" + isNotNull.getFieldName(); + } + private String element2solr(Element element) throws WikittyException { String result = element.getName(); result = fieldModifer.convertToSolr(transaction, result); Modified: trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java =================================================================== --- trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java 2010-09-16 12:29:21 UTC (rev 319) +++ trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java 2010-09-16 13:26:42 UTC (rev 320) @@ -85,6 +85,9 @@ /** extensions field name in solr */ static final public String SOLR_EXTENSIONS = "extensions"; + /** group all fields is not null */ + static final public String SOLR_NOT_NULL_FIELDS = "not_null_fields"; + /** extension use to store field without extension to search on all extesnion */ static final public String SOLR_ALL_EXTENSIONS = "all"; @@ -593,6 +596,7 @@ } } + @Override public void delete(Collection<String> idList) throws WikittyException { try { for (String id : idList) { @@ -843,6 +847,7 @@ doc.addField(solrAllFieldName + "_c", itemValueLowerCase); } + doc.addField(SOLR_NOT_NULL_FIELDS, fqfieldName); log.debug("index field " + solrFqFieldName + " with value '" + itemValue + "'"); } } @@ -859,6 +864,7 @@ doc.addField(solrAllFieldName + "_c", objectValueLowerCase); } + doc.addField(SOLR_NOT_NULL_FIELDS, fqfieldName); log.debug("index field " + solrFqFieldName + " with value '" + objectValue + "'"); } } Modified: trunk/wikitty-solr-impl/src/main/resources/schema.xml =================================================================== --- trunk/wikitty-solr-impl/src/main/resources/schema.xml 2010-09-16 12:29:21 UTC (rev 319) +++ trunk/wikitty-solr-impl/src/main/resources/schema.xml 2010-09-16 13:26:42 UTC (rev 320) @@ -273,6 +273,7 @@ <field name="id" type="string" indexed="true" stored="true" required="true" /> <field name="extensions" type="string" indexed="true" stored="true" multiValued="true"/> + <field name="not_null_fields" type="string" indexed="true" stored="true" multiValued="true"/> <!-- catchall field, containing all other searchable text fields (implemented via copyField further on in this schema --> Modified: trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/solr/test/SolrSearchTest.java =================================================================== --- trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/solr/test/SolrSearchTest.java 2010-09-16 12:29:21 UTC (rev 319) +++ trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/solr/test/SolrSearchTest.java 2010-09-16 13:26:42 UTC (rev 320) @@ -5,7 +5,6 @@ import java.util.ArrayList; import java.util.Calendar; -import java.util.Date; import java.util.List; import org.apache.commons.logging.Log; @@ -58,6 +57,7 @@ "String name", "Numeric price", "String value", + "String optional", "Wikitty category") ); @@ -70,11 +70,13 @@ "name = Other Paint blue," + "price = 20," + "value = 1," + + "optional = test," + "category = " + hardwareCategoryId, "name = Paint red," + "price = 35," + "value = 1," + + "optional = test," + "category = " + hardwareCategoryId, "name = Paint Staff blue," + @@ -363,6 +365,19 @@ } @Test + public void testNullSearch() { + Criteria criteria = Search.query().isNotNull("Product.optional").eq(Element.ELT_EXTENSION, "Product").criteria(); + PagedResult<String> pagedResult = ws.findAllByCriteria(null, criteria); + List<String> result = pagedResult.getAll(); + assertEquals(2, result.size()); + + criteria = Search.query().isNull("Product.optional").eq(Element.ELT_EXTENSION, "Product").criteria(); + pagedResult = ws.findAllByCriteria(null, criteria); + result = pagedResult.getAll(); + assertEquals(3, result.size()); + } + + @Test public void testLikeSearch() throws Exception { Criteria criteria = Search.query().like("Category.name", "hArDwArE", Like.SearchAs.ToLowerCase).criteria(); PagedResult<String> pagedResult = ws.findAllByCriteria(null, criteria);
participants (1)
-
jruchaud@users.nuiton.org