Author: bpoussin Date: 2013-02-16 17:18:19 +0100 (Sat, 16 Feb 2013) New Revision: 1529 Url: http://nuiton.org/projects/wikitty/repository/revisions/1529 Log: fixes #2370: add a date format translator in the query parser when the field to compare is a date Modified: trunk/src/site/rst/user/query.rst trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java Modified: trunk/src/site/rst/user/query.rst =================================================================== --- trunk/src/site/rst/user/query.rst 2013-02-16 15:44:22 UTC (rev 1528) +++ trunk/src/site/rst/user/query.rst 2013-02-16 16:18:19 UTC (rev 1529) @@ -724,6 +724,21 @@ Spécificité de WikittyQueryParser --------------------------------- +Date +~~~~ + +Pour simplifier l'écriture des dates, il est possible d'utiliser la fonction date, +ce qui évite de devoir écrire les dates dans un format spécifique.:: + + WikittyQuery q = WikittyQueryParser.parse( + "SELECT MIN Person.birthday WHERE Person.firstname=Jean and Person.birthday < date(01/01/2000)"); + +Ici on recherche une personne s'appelant 'Jean' ayant l'âge le plus petit, mais +dont l'âge est tout de même avant l'an 2000. + +Alias +~~~~~ + Vous pouvez ajouter des alias pour simplifier l'écriture de certaines requêtes. Par exemple si vous utilisez souvent une longue requête comme:: 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 2013-02-16 15:44:22 UTC (rev 1528) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2013-02-16 16:18:19 UTC (rev 1529) @@ -25,6 +25,7 @@ package org.nuiton.wikitty.query; import java.util.Collections; +import java.util.Date; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -32,6 +33,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.wikitty.WikittyUtil; import org.nuiton.wikitty.query.conditions.Aggregate; import org.nuiton.wikitty.query.conditions.And; import org.nuiton.wikitty.query.conditions.Between; @@ -89,6 +91,7 @@ @BuildParseTree public class WikittyQueryParser extends BaseParser<Object> { + public static final String DATE = "DATE"; public static final String AVG = "AVG"; public static final String COUNT = "COUNT"; public static final String MAX = "MAX"; @@ -155,6 +158,7 @@ public Rule icLIKE = IgnoreCase(LIKE); public Rule icUNLIKE = IgnoreCase(UNLIKE); public Rule icNULL = IgnoreCase(NULL); + public Rule icDATE = IgnoreCase(DATE); /** to use log facility, just put in your code: log.info(\"...\"); */ static private Log log = LogFactory.getLog(WikittyQueryParser.class); @@ -316,6 +320,15 @@ return result; } + protected String toDate(Object s) { + if (s instanceof ConditionValueString) { + s = ((ConditionValueString)s).getValue(); + } + Date d = WikittyUtil.toDate(s); + String result = WikittyUtil.toString(d); + return result; + } + Rule start() { return Sequence(FirstOf(or(), empty()), push(new WikittyQuery((Condition)pop())), offset(), limit(), depth(), space(), EOI); @@ -536,9 +549,14 @@ } Rule value() { - return FirstOf(select(), valueText()); + return FirstOf(select(), date(), valueText()); } + Rule date() { + return Sequence(icDATE, BRACKET_OPEN, valueText() ,BRACKET_CLOSE, + push(new ConditionValueString(toDate(pop())))); + } + Rule valueText() { return Sequence(FirstOf(StringLiteralDouble(), StringLiteralSimple(), SimpleString()), push(new ConditionValueString(removeQuote(match()))));