Author: jcouteau Date: 2011-04-11 15:39:40 +0200 (Mon, 11 Apr 2011) New Revision: 775 Url: http://nuiton.org/repositories/revision/wikitty/775 Log: Put back Like and Unlike search Update GWT files Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Like.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Unlike.java Modified: trunk/pom.xml trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/RestrictionHelper.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Search.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/RestrictionName.java trunk/wikitty-api/src/main/resources/org/nuiton/WikittyAPI.gwt.xml trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/storage/solr/Restriction2Solr.java trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/storage/solr/SolrSearchTest.java Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2011-04-11 09:49:21 UTC (rev 774) +++ trunk/pom.xml 2011-04-11 13:39:40 UTC (rev 775) @@ -508,7 +508,7 @@ <!-- common versions used in sub-poms --> <eugeneVersion>2.3.1</eugeneVersion> - <nuitonUtilsVersion>2.1-SNAPSHOT</nuitonUtilsVersion> + <nuitonUtilsVersion>2.1</nuitonUtilsVersion> <nuitonI18nVersion>2.2</nuitonI18nVersion> <processPluginVersion>1.1</processPluginVersion> 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 2011-04-11 09:49:21 UTC (rev 774) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/RestrictionHelper.java 2011-04-11 13:39:40 UTC (rev 775) @@ -25,6 +25,7 @@ package org.nuiton.wikitty.search; import org.nuiton.wikitty.search.operators.False; +import org.nuiton.wikitty.search.operators.Like; import org.nuiton.wikitty.search.operators.RestrictionName; import org.nuiton.wikitty.search.operators.Restriction; import org.nuiton.wikitty.search.operators.StartsWith; @@ -50,6 +51,7 @@ import java.util.TimeZone; import org.nuiton.wikitty.search.operators.In; import org.nuiton.wikitty.search.operators.True; +import org.nuiton.wikitty.search.operators.Unlike; /** * @author "Nicolas Chapurlat" <nicolas.chapurlat@logica.com> @@ -260,6 +262,31 @@ return isNotNull; } + public static Restriction like(Element element, String value, Like.SearchAs searchAs) { + Like like = new Like(); + like.setName(RestrictionName.LIKE); + like.setElement(element); + like.setValue(value); + like.setSearchAs(searchAs); + + return like; + + } + + + + public static Restriction unlike(Element element, String value, Like.SearchAs searchAs) { + Unlike unlike = new Unlike(); + unlike.setName(RestrictionName.UNLIKE); + unlike.setElement(element); + unlike.setValue(value); + unlike.setSearchAs(searchAs); + + return unlike; + + } + + static ThreadLocal<SimpleDateFormat> myFormats = new ThreadLocal<SimpleDateFormat>() { @Override protected SimpleDateFormat initialValue() { 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 2011-04-11 09:49:21 UTC (rev 774) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/Search.java 2011-04-11 13:39:40 UTC (rev 775) @@ -24,6 +24,7 @@ */ package org.nuiton.wikitty.search; +import org.nuiton.wikitty.search.operators.Like; import org.nuiton.wikitty.search.operators.Restriction; import org.nuiton.wikitty.search.operators.SubSearch; import org.nuiton.wikitty.search.operators.Element; @@ -37,11 +38,11 @@ /** * Helper to create a criteria with a restriction - * + * <p/> * Element : * <extensionName>.<fieldName>[.<fieldType>] : search on an extension and field with specific type (optional) * Criteria.ALL_EXTENSIONS.<fieldName>.<fieldType> : search on all extension and field name with specific type - * + * <p/> * <fieldType> specify search on field as NUMERIC, STRING, WIKITTY, BOOLEAN, DATE. Use Element.ElementType to specify type. */ public class Search { @@ -456,6 +457,44 @@ } /** + * Like. + * + * @param element + * @param value + * @param searchAs + * @return {@code this} + */ + public Search like(String element, String value, Like.SearchAs searchAs) { + restrictions.add(RestrictionHelper.like(elt(element), value, searchAs)); + return this; + } + + public Search like(String element, String value) { + restrictions.add(RestrictionHelper.like( + elt(element), value, Like.SearchAs.AsText)); + return this; + } + + /** + * Unlike. + * + * @param element + * @param value + * @param searchAs + * @return {@code this} + */ + public Search unlike(String element, String value, Like.SearchAs searchAs) { + restrictions.add(RestrictionHelper.unlike(elt(element), value, searchAs)); + return this; + } + + public Search unlike(String element, String value) { + restrictions.add(RestrictionHelper.unlike( + elt(element), value, Like.SearchAs.AsText)); + return this; + } + + /** * Not (sub query). * * @return sub query Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Like.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Like.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Like.java 2011-04-11 13:39:40 UTC (rev 775) @@ -0,0 +1,38 @@ +package org.nuiton.wikitty.search.operators; + +import java.io.Serializable; + +/** + * Like is use on String field type, to precise some particularity on search. + * + * @author ruchaud + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ + + +public class Like extends BinaryOperator implements Serializable { + // serialVersionUID is used for serialization. + + private static final long serialVersionUID = 1L; + + + public enum SearchAs {AsText, ToLowerCase}; + + protected SearchAs searchAs; + + + public Like() { + + } + + public SearchAs getSearchAs() { + return searchAs; + } + + public void setSearchAs(SearchAs searchAs) { + this.searchAs = searchAs; + } +} Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/RestrictionName.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/RestrictionName.java 2011-04-11 09:49:21 UTC (rev 774) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/RestrictionName.java 2011-04-11 13:39:40 UTC (rev 775) @@ -33,6 +33,8 @@ public enum RestrictionName { EQUALS, NOT_EQUALS, + LIKE, + UNLIKE, LESS, LESS_OR_EQUAL, GREATER, Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Unlike.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Unlike.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/search/operators/Unlike.java 2011-04-11 13:39:40 UTC (rev 775) @@ -0,0 +1,32 @@ +package org.nuiton.wikitty.search.operators; + +import java.io.Serializable; + +/** + * UnLike is use on String field type, to precise some particularity on search + * (case insensitive for example). + * + * @author martel + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ + + +public class Unlike extends BinaryOperator implements Serializable { + + // serialVersionUID is used for serialization. + private static final long serialVersionUID = 1L; + protected Like.SearchAs searchAs; + + public Unlike() { + } + public Like.SearchAs getSearchAs() { + return searchAs; + } + + public void setSearchAs(Like.SearchAs searchAs) { + this.searchAs = searchAs; + } +} Modified: trunk/wikitty-api/src/main/resources/org/nuiton/WikittyAPI.gwt.xml =================================================================== --- trunk/wikitty-api/src/main/resources/org/nuiton/WikittyAPI.gwt.xml 2011-04-11 09:49:21 UTC (rev 774) +++ trunk/wikitty-api/src/main/resources/org/nuiton/WikittyAPI.gwt.xml 2011-04-11 13:39:40 UTC (rev 775) @@ -29,6 +29,7 @@ <source path="wikitty"> <exclude name="WikittyConfig.java"/> + <exclude name="WikittyServerStart.java"/> <exclude name="*Abstract.java"/> <exclude name="*Impl.java"/> <exclude name="*Helper.java"/> Modified: trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/storage/solr/Restriction2Solr.java =================================================================== --- trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/storage/solr/Restriction2Solr.java 2011-04-11 09:49:21 UTC (rev 774) +++ trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/storage/solr/Restriction2Solr.java 2011-04-11 13:39:40 UTC (rev 775) @@ -35,6 +35,8 @@ import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import org.nuiton.wikitty.WikittyException; +import org.nuiton.wikitty.search.operators.Like; +import org.nuiton.wikitty.search.operators.Unlike; import org.nuiton.wikitty.services.WikittyTransaction; import org.nuiton.wikitty.search.operators.And; import org.nuiton.wikitty.search.operators.AssociatedRestriction; @@ -99,67 +101,74 @@ throws WikittyException { // ParameterValidator.checkNullParameter(restriction, "restriction"); switch (restriction.getName()) { - case TRUE: - return true2solr(); - case FALSE: - return false2solr(); - case NOT: - Not not = (Not) restriction; - return not2solr(not, solr); - case AND: - And and = (And) restriction; - return and2solr(and, solr); - case OR: - Or or = (Or) restriction; - return or2solr(or, solr); - case EQUALS: - Equals eq = (Equals) restriction; - return eq2solr(eq); - case NOT_EQUALS: - NotEquals neq = (NotEquals) restriction; - return neq2solr(neq); - case LESS: - Less less = (Less) restriction; - return less2solr(less); - case LESS_OR_EQUAL: - LessOrEqual lessEq = (LessOrEqual) restriction; - return lessEq2solr(lessEq); - case GREATER: - Greater great = (Greater) restriction; - return great2solr(great); - case GREATER_OR_EQUAL: - GreaterOrEqual greatEq = (GreaterOrEqual) restriction; - return greatEq2solr(greatEq); - case BETWEEN: - Between between = (Between) restriction; - return between2solr(between); - case CONTAINS: - Contains contains = (Contains) restriction; - return contains2solr(contains); - case IN: - In in = (In) restriction; - return in2solr(in); - case STARTS_WITH: - StartsWith start = (StartsWith) restriction; - return start2solr(start); - case ENDS_WITH: - EndsWith end = (EndsWith) restriction; - return end2solr(end); - case ASSOCIATED: - AssociatedRestriction associated = (AssociatedRestriction) restriction; - return associated2solr(associated, solr); - 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()); + case TRUE: + return true2solr(); + case FALSE: + return false2solr(); + case NOT: + Not not = (Not) restriction; + return not2solr(not, solr); + case AND: + And and = (And) restriction; + return and2solr(and, solr); + case OR: + Or or = (Or) restriction; + return or2solr(or, solr); + case EQUALS: + Equals eq = (Equals) restriction; + return eq2solr(eq); + case NOT_EQUALS: + NotEquals neq = (NotEquals) restriction; + return neq2solr(neq); + case LESS: + Less less = (Less) restriction; + return less2solr(less); + case LESS_OR_EQUAL: + LessOrEqual lessEq = (LessOrEqual) restriction; + return lessEq2solr(lessEq); + case GREATER: + Greater great = (Greater) restriction; + return great2solr(great); + case GREATER_OR_EQUAL: + GreaterOrEqual greatEq = (GreaterOrEqual) restriction; + return greatEq2solr(greatEq); + case BETWEEN: + Between between = (Between) restriction; + return between2solr(between); + case CONTAINS: + Contains contains = (Contains) restriction; + return contains2solr(contains); + case IN: + In in = (In) restriction; + return in2solr(in); + case STARTS_WITH: + StartsWith start = (StartsWith) restriction; + return start2solr(start); + case ENDS_WITH: + EndsWith end = (EndsWith) restriction; + return end2solr(end); + case LIKE: + Like like = (Like) restriction; + return like2solr(like); + case UNLIKE: + Unlike + unlike = (Unlike) restriction; + return unlike2solr(unlike); + case ASSOCIATED: + AssociatedRestriction associated = (AssociatedRestriction) restriction; + return associated2solr(associated, solr); + 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()); } } @@ -400,6 +409,51 @@ return result; } + private String like2solr(Like like) throws WikittyException { + Like.SearchAs searchAs = like.getSearchAs(); + String element2solr = element2solr(like.getElement()); + if (element2solr.endsWith(WikittySolrConstant.SUFFIX_STRING)) { // is string + switch (searchAs) { + case AsText: + element2solr += WikittySolrConstant.SUFFIX_STRING_FULLTEXT; + break; + case ToLowerCase: + element2solr += WikittySolrConstant.SUFFIX_STRING_LOWERCASE; + break; + } + } + // Warning if you need add searchAs, AsText and ToLowerCase need search + // at lowercase + String value2solr = value2solr(like.getValue()); + if (!element2solr.endsWith(WikittySolrConstant.SUFFIX_DATE)) { // is not date + value2solr = value2solr.toLowerCase(); + } + return element2solr + ":" + value2solr; + } + + private String unlike2solr(Unlike unlike) throws WikittyException { + Like.SearchAs searchAs = unlike.getSearchAs(); + String element2solr = element2solr(unlike.getElement()); + if (element2solr.endsWith(WikittySolrConstant.SUFFIX_STRING)) { // is string + switch (searchAs) { + case AsText: + element2solr += WikittySolrConstant.SUFFIX_STRING_FULLTEXT; + break; + case ToLowerCase: + element2solr += WikittySolrConstant.SUFFIX_STRING_LOWERCASE; + break; + } + } + // Warning if you need add searchAs, AsText and ToLowerCase need search + // at lowercase + String value2solr = value2solr(unlike.getValue()); + if (!element2solr.endsWith(WikittySolrConstant.SUFFIX_DATE)) { // is not date + value2solr = value2solr.toLowerCase(); + } + return "-" + element2solr + ":" + value2solr; + } + + private static String escapeValue(String value) { final String LUCENE_REPLACE_PATTERN = "\\+" + "|-" + "|&&" + "|\\|" + "|!" + "|\\(|\\)" + "|\\[|\\]" + "|\\{|\\}" + "|\"" + "|:"; Modified: trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/storage/solr/SolrSearchTest.java =================================================================== --- trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/storage/solr/SolrSearchTest.java 2011-04-11 09:49:21 UTC (rev 774) +++ trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/storage/solr/SolrSearchTest.java 2011-04-11 13:39:40 UTC (rev 775) @@ -28,6 +28,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import com.arjuna.ats.internal.jdbc.drivers.modifiers.list; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; @@ -52,6 +53,7 @@ import org.nuiton.wikitty.search.operators.Element; import org.nuiton.wikitty.search.RestrictionHelper; import org.nuiton.wikitty.search.Search; +import org.nuiton.wikitty.search.operators.Like; public class SolrSearchTest extends AbstractTestSolr { @@ -436,7 +438,7 @@ // on ignore ce test car le like toLowercase devrait disparaitre et pour l'instant il ne marche pas :( // @Ignore - /*@Test + @Test public void testLikeSearch() throws Exception { Criteria criteria = Search.query().like("Category.name", "hArDwArE").criteria(); PagedResult<String> pagedResult = ws.findAllByCriteria(null, Collections.singletonList(criteria)).get(0); @@ -460,11 +462,11 @@ criteria = Search.query().like("Test.description", "helped").criteria(); pagedResult = ws.findAllByCriteria(null, Collections.singletonList(criteria)).get(0); assertEquals(1, pagedResult.getNumFound()); - }*/ + } // on ignore ce test car le like toLowercase devrait disparaitre et pour l'instant il ne marche pas :( // @Ignore -/* @Test + @Test public void testLikeStrict() throws Exception { Criteria criteria = Search.query() @@ -487,7 +489,7 @@ result = ws.findAllByCriteria(null, Collections.singletonList(criteria)).get(0); list = result.getAll(); assertEquals(5, list.size()); - }*/ + } /** test that doing a search with a date criteria is possible */ @Test @@ -586,10 +588,34 @@ // avec accent specifiquement sur le champs name // mais sans accent pour la recherche // et et majuscule - /*Criteria criteria = Search.query().like( + Criteria criteria = Search.query().like( WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME, "CECA").criteria(); PagedResult<String> result = ws.findAllByCriteria(null, Collections.singletonList(criteria)).get(0); - Assert.assertEquals(1, result.size());*/ + Assert.assertEquals(1, result.size()); } } + + @Test + public void testSearchNonSensitive() throws Exception { + Criteria criteria = Search.query() + .like("Test.name_s", "cHaIsE", Like.SearchAs.ToLowerCase) + .criteria() + .setFirstIndex(0).setEndIndex(Criteria.ALL_ELEMENTS); + PagedResult < String > result = ws.findAllByCriteria(null, criteria)[0]; + List < String > list = result.getAll(); + assertEquals(1, list.size()); + + Wikitty w = ws.restore(null, list.get(0)); + assertEquals("chaise", w.getFieldAsString("Test", "name")); + assertEquals(113311, w.getFieldAsInt("Test", "amount")); + assertEquals(AbstractTestConformance.parse("26/09/2009"), w.getFieldAsDate("Test", "buildDate")); + + criteria = Search.query() + .unlike("Test.name_s", "cHaIsE", Like.SearchAs.ToLowerCase) + .criteria() + .setFirstIndex(0).setEndIndex(Criteria.ALL_ELEMENTS); + result = ws.findAllByCriteria(null, criteria)[0]; + list = result.getAll(); + assertEquals(12, list.size()); + } }