r1447 - in trunk/wikitty-api/src: main/java/org/nuiton/wikitty/query test/java/org/nuiton/wikitty
Author: bpoussin Date: 2012-03-07 22:52:52 +0100 (Wed, 07 Mar 2012) New Revision: 1447 Url: http://nuiton.org/repositories/revision/wikitty/1447 Log: Evolution #1998: In parser support ' as string delimiter and not only " Evolution #1999: Add support of limit and offset in query parser Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java 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 2012-03-07 18:42:05 UTC (rev 1446) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2012-03-07 21:52:52 UTC (rev 1447) @@ -208,8 +208,9 @@ * au maximume que 75 reponses retournees. * @return */ - public void setOffset(int offset) { + public WikittyQuery setOffset(int offset) { this.offset = offset; + return this; } /** Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2012-03-07 18:42:05 UTC (rev 1446) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2012-03-07 21:52:52 UTC (rev 1447) @@ -29,7 +29,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.wikitty.query.conditions.Aggregate; @@ -97,8 +97,10 @@ public static final String SELECT = "SELECT"; public static final String WHERE = "WHERE"; public static final String IN = "IN"; - public static final String LITERAL_CLOSE = "\""; - public static final String LITERAL_OPEN = "\""; + public static final String LITERAL_OPEN_SIMPLE = "'"; + public static final String LITERAL_CLOSE_SIMPLE = "'"; + public static final String LITERAL_OPEN_DOUBLE = "\""; + public static final String LITERAL_CLOSE_DOUBLE = "\""; public static final String NULL = "NULL"; public static final String TO = "TO"; public static final String FALSE = "FALSE"; @@ -124,6 +126,12 @@ public static final String SQUARE_BRACKET_CLOSE = "]"; public static final String SQUARE_BRACKET_OPEN = "["; + public static final String OFFSET = "#OFFSET"; + public static final String LIMIT = "#LIMIT"; + + public Rule icOFFSET = IgnoreCase(OFFSET); + public Rule icLIMIT = IgnoreCase(LIMIT); + public Rule icEXTENSION = IgnoreCase(Element.EXTENSION.getValue()); public Rule icID = IgnoreCase(Element.ID.getValue()); public Rule icNOT = IgnoreCase(NOT); @@ -260,9 +268,8 @@ } // System.out.println("\nParse Tree:\n" + ParseTreeUtils.printNodeTree(result) + '\n'); - Condition c = (Condition)result.resultValue; + WikittyQuery query = (WikittyQuery)result.resultValue; - WikittyQuery query = new WikittyQuery(c); return query; } @@ -276,6 +283,11 @@ return result; } + protected int toInt(String v) { + int result = Integer.parseInt(v); + return result; + } + /** * Remove quote at beginning and ending of String in parameter if necessary * @@ -289,17 +301,30 @@ */ protected String removeQuote(String s) { String result = s; - if (StringUtils.startsWith(s, LITERAL_OPEN) - && StringUtils.startsWith(s, LITERAL_CLOSE)) { + if (StringUtils.startsWithAny(s, LITERAL_OPEN_SIMPLE, LITERAL_OPEN_DOUBLE) + && StringUtils.endsWithAny(s, LITERAL_CLOSE_SIMPLE, LITERAL_CLOSE_DOUBLE)) { result = StringUtils.substring(s, 1, -1); } return result; } Rule start() { - return Sequence(or(), EOI); + return Sequence(or(), push(new WikittyQuery((Condition)pop())), + offset(), limit(), space(), EOI); } + Rule offset() { + return Optional(space(), icOFFSET, FirstOf(EQUALS, space()), OneOrMore(AnyOf("1234567890")), + push(((WikittyQuery)pop()).setOffset(toInt(match()))) + ); + } + + Rule limit() { + return Optional(space(), icLIMIT, FirstOf(EQUALS, space()), OneOrMore(AnyOf("1234567890")), + push(((WikittyQuery)pop()).setLimit(toInt(match()))) + ); + } + Rule or() { return Sequence(and(), ZeroOrMore(space(), icOR, space(), and(), push(new Or((Condition)pop(1), (Condition)pop())))); @@ -487,44 +512,69 @@ } Rule valueText() { - return Sequence(FirstOf(StringLiteral(), SimpleString()), + return Sequence(FirstOf(StringLiteralDouble(), StringLiteralSimple(), SimpleString()), push(new ConditionValueString(removeQuote(match())))); } /** * Une chaine simple sans espace, parenthese, retour chariot, tabulation, - * accolade, crochet + * accolade, crochet, ", '. * @return */ Rule SimpleString() { return OneOrMore(FirstOf( Escape(), - Sequence(TestNot(AnyOf(" \t\r\n\\" + Sequence(TestNot(AnyOf(" #\t\r\n\\" +COMMA - +LITERAL_OPEN+LITERAL_CLOSE + +LITERAL_OPEN_SIMPLE+LITERAL_OPEN_DOUBLE +BRACKET_OPEN+BRACKET_CLOSE +CURLY_BRACKET_OPEN+CURLY_BRACKET_CLOSE +SQUARE_BRACKET_OPEN+SQUARE_BRACKET_CLOSE)), ANY) )).suppressSubnodes(); } - Rule StringLiteral() { + Rule StringLiteralSimple() { return Sequence( - LITERAL_OPEN, + LITERAL_OPEN_SIMPLE, ZeroOrMore( FirstOf( - Escape(), - Sequence(TestNot(AnyOf("\r\n\\"+LITERAL_OPEN+LITERAL_CLOSE)), ANY) + EscapeSimple(), + Sequence(TestNot(AnyOf("\r\n\\"+LITERAL_CLOSE_SIMPLE)), ANY) ) ).suppressSubnodes(), - LITERAL_CLOSE + LITERAL_CLOSE_SIMPLE ); } + Rule StringLiteralDouble() { + return Sequence( + LITERAL_OPEN_DOUBLE, + ZeroOrMore( + FirstOf( + EscapeDouble(), + Sequence(TestNot(AnyOf("\r\n\\"+LITERAL_CLOSE_DOUBLE)), ANY) + ) + ).suppressSubnodes(), + LITERAL_CLOSE_DOUBLE + ); + } + Rule Escape() { - return Sequence('\\', FirstOf(AnyOf("btnfr\'\\"+LITERAL_OPEN+LITERAL_CLOSE), OctalEscape(), UnicodeEscape())); + return Sequence('\\', FirstOf(AnyOf("btnfr\'\\" + +LITERAL_OPEN_SIMPLE+LITERAL_CLOSE_SIMPLE+LITERAL_OPEN_DOUBLE+LITERAL_CLOSE_DOUBLE), + OctalEscape(), UnicodeEscape())); } + Rule EscapeSimple() { + return Sequence('\\', FirstOf(AnyOf("btnfr\'\\"+LITERAL_CLOSE_SIMPLE), + OctalEscape(), UnicodeEscape())); + } + + Rule EscapeDouble() { + return Sequence('\\', FirstOf(AnyOf("btnfr\'\\"+LITERAL_CLOSE_DOUBLE), + OctalEscape(), UnicodeEscape())); + } + Rule OctalEscape() { return FirstOf( Sequence(CharRange('0', '3'), CharRange('0', '7'), CharRange('0', '7')), Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java 2012-03-07 18:42:05 UTC (rev 1446) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorToString.java 2012-03-07 21:52:52 UTC (rev 1447) @@ -161,7 +161,7 @@ @Override public void visit(ConditionValueString o) { - text += WikittyQueryParser.LITERAL_OPEN + o.getValue() + WikittyQueryParser.LITERAL_CLOSE; + text += WikittyQueryParser.LITERAL_OPEN_DOUBLE + o.getValue() + WikittyQueryParser.LITERAL_CLOSE_DOUBLE; } @Override Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java =================================================================== --- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java 2012-03-07 18:42:05 UTC (rev 1446) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java 2012-03-07 21:52:52 UTC (rev 1447) @@ -50,7 +50,6 @@ import org.nuiton.wikitty.entities.ExtensionFactory; import org.nuiton.wikitty.entities.Wikitty; import org.nuiton.wikitty.entities.WikittyAuthorisation; -import org.nuiton.wikitty.entities.WikittyAuthorisationHelper; import org.nuiton.wikitty.entities.WikittyAuthorisationImpl; import org.nuiton.wikitty.entities.WikittyExtension; import org.nuiton.wikitty.entities.WikittyGroup; @@ -337,7 +336,7 @@ public void testSearchExtensionFacetExplicitly() throws Exception { // essai de facettiser sur les extensions WikittyQuery query = new WikittyQueryMaker().keyword("*").end(); - query.setFirst(0); + query.setOffset(0); query.setLimit(0); query.setFacetExtension(true); WikittyQueryResult<String> result = wikittyClient.findAllByQuery(query); @@ -352,7 +351,7 @@ public void testSearchExtensionFacet() throws Exception { // essai de facettiser sur les extensions WikittyQuery query = new WikittyQueryMaker().keyword("*").end(); - query.setFirst(0); + query.setOffset(0); query.setLimit(0); query.setFacetField(Element.EXTENSION); WikittyQueryResult<String> result = wikittyClient.findAllByQuery(query); @@ -937,6 +936,59 @@ } /** + * Test de ' comme chaine de caractere + */ + @Test + public void testQueryParserSimpleQuote() throws IOException { + importBooks(); + { // avec ' escape + WikittyQuery query = WikittyQueryParser.parse("Product.name=\"Harry Potter et le Prisonnier d'Azkaban\""); + WikittyQueryResult<Product> results = wikittyClient.findAllByQuery(Product.class, query); + Assert.assertEquals(1, results.getTotalResult()); + } + { // avec ' escape + WikittyQuery query = WikittyQueryParser.parse("Product.name='Harry Potter et le Prisonnier d\\'Azkaban'"); + WikittyQueryResult<Product> results = wikittyClient.findAllByQuery(Product.class, query); + Assert.assertEquals(1, results.getTotalResult()); + } + } + /** + * Test de limit et offset dans le parser. + */ + @Test + public void testQueryParseOffsetAndLimit() { + { + // 22 in init db + WikittyQuery query = WikittyQueryParser.parse("TRUE"); + WikittyQueryResult<String> results = wikittyClient.findAllByQuery(query); + Assert.assertEquals(22, results.getTotalResult()); + } + { + // 22 in init db + WikittyQuery query = WikittyQueryParser.parse("TRUE #offset 2"); + WikittyQueryResult<String> results = wikittyClient.findAllByQuery(query); + Assert.assertEquals(22, results.getTotalResult()); + Assert.assertEquals(20, results.size()); + } + { + // 22 in init db + WikittyQuery query = WikittyQueryParser.parse("TRUE #limit 10"); + WikittyQueryResult<String> results = wikittyClient.findAllByQuery(query); + Assert.assertEquals(22, results.getTotalResult()); + Assert.assertEquals(10, results.size()); + } + { + // 22 in init db + WikittyQuery query = WikittyQueryParser.parse("TRUE #offset 2 #limit 10"); + WikittyQueryResult<String> results = wikittyClient.findAllByQuery(query); + Assert.assertEquals(22, results.getTotalResult()); + Assert.assertEquals(10, results.size()); + } + } + + + + /** * Test eq() operator. */ @Test @@ -1631,7 +1683,7 @@ .select(Product.ELEMENT_FIELD_PRODUCT_PRICE) .exteq(Product.EXT_PRODUCT).end(); query1.setSortAscending(Product.ELEMENT_FIELD_PRODUCT_PRICE); - query1.setFirst(0); + query1.setOffset(0); query1.setLimit(2); WikittyQueryResult<Double> results1 = wikittyClient.findAllByQuery(Double.class, query1); // 17 books, but only 11 differents prices ? @@ -1641,14 +1693,14 @@ // second // FIXME echatellier 20120201 setLimit -1 us buggy - /*query1.setFirst(0); + /*query1.setOffset(0); query1.setLimit(WikittyQuery.MAX); results1 = wikittyClient.findAllByQuery(query1); Assert.assertEquals(17, results1.getTotalResult()); Assert.assertEquals(17, results1.getAll().size());*/ // third - query1.setFirst(0); + query1.setOffset(0); query1.setLimit(0); results1 = wikittyClient.findAllByQuery(Double.class, query1); Assert.assertEquals(11, results1.getTotalResult());
participants (1)
-
bpoussin@users.nuiton.org