From: <die...@us...> - 2010-07-16 07:33:46
|
Revision: 2820 http://openutils.svn.sourceforge.net/openutils/?rev=2820&view=rev Author: diego_schivo Date: 2010-07-16 07:33:39 +0000 (Fri, 16 Jul 2010) Log Message: ----------- CRIT-15 Restrictions.betweenDates(String, Calendar, Calendar) Modified Paths: -------------- trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/BetweenExpression.java trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/Criterion.java trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/Restrictions.java trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/SimpleExpression.java trunk/openutils-mgnlcriteria/src/test/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/CriteriaTest.java Modified: trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/BetweenExpression.java =================================================================== --- trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/BetweenExpression.java 2010-07-16 06:32:42 UTC (rev 2819) +++ trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/BetweenExpression.java 2010-07-16 07:33:39 UTC (rev 2820) @@ -69,33 +69,23 @@ else if (lo instanceof Calendar && hi instanceof Calendar) { Calendar cal = (Calendar) lo; + DATE_FORMAT.setCalendar(cal); + String fmt = DATE_FORMAT.format(cal.getTime()); Calendar cal2 = (Calendar) hi; - StringBuilder date = new StringBuilder(); - date.append(XS_DATETIME_FUNCTION + "('"); - date.append(cal.get(Calendar.YEAR)) - .append(HYPHEN) - .append( - cal.get(Calendar.MONTH) < MONTH_MAX - ? "0" + (cal.get(Calendar.MONTH) + 1) - : cal.get(Calendar.MONTH) + 1) - .append(HYPHEN) - .append( - cal.get(Calendar.DAY_OF_MONTH) < DAY_MAX ? "0" + cal.get(Calendar.DAY_OF_MONTH) : cal - .get(Calendar.DAY_OF_MONTH)); - date.append(MIDNIGHT); - date.append("') "); - - StringBuilder date2 = new StringBuilder(); - date2.append(XS_DATETIME_FUNCTION + "('"); - date2.append(cal2.get(Calendar.YEAR)).append(HYPHEN).append( - cal2.get(Calendar.MONTH) < MONTH_MAX - ? "0" + (cal2.get(Calendar.MONTH) + 1) - : cal2.get(Calendar.MONTH) + 1).append(HYPHEN).append( - cal2.get(Calendar.DAY_OF_MONTH) < DAY_MAX ? "0" + cal2.get(Calendar.DAY_OF_MONTH) : cal2 - .get(Calendar.DAY_OF_MONTH)); - date2.append(T235959); - date2.append("') "); - fragment.append(date.toString() + " and " + propertyName + " <= " + date2.toString()); + DATE_FORMAT.setCalendar(cal2); + String fmt2 = DATE_FORMAT.format(cal2.getTime()); + fragment.append(XS_DATETIME_FUNCTION + + "('" + + fmt + + "+00:00" + + "') and " + + propertyName + + " <= " + + XS_DATETIME_FUNCTION + + "('" + + fmt2 + + "+00:00" + + "') "); } else { Modified: trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/Criterion.java =================================================================== --- trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/Criterion.java 2010-07-16 06:32:42 UTC (rev 2819) +++ trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/Criterion.java 2010-07-16 07:33:39 UTC (rev 2820) @@ -70,7 +70,7 @@ int MONTH_MAX = 9; - DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); /** * Render the XPath fragment Modified: trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/Restrictions.java =================================================================== --- trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/Restrictions.java 2010-07-16 06:32:42 UTC (rev 2819) +++ trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/Restrictions.java 2010-07-16 07:33:39 UTC (rev 2820) @@ -21,6 +21,7 @@ import java.util.Calendar; import java.util.Collection; +import java.util.TimeZone; import net.sourceforge.openutils.mgnlcriteria.jcr.query.Criteria; import net.sourceforge.openutils.mgnlcriteria.jcr.query.xpath.utils.XPathTextUtils; @@ -37,6 +38,16 @@ public class Restrictions { + private static final Calendar MIDNIGHT_GMT; + + static { + MIDNIGHT_GMT = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + MIDNIGHT_GMT.set(Calendar.HOUR_OF_DAY, 0); + MIDNIGHT_GMT.set(Calendar.MINUTE, 0); + MIDNIGHT_GMT.set(Calendar.SECOND, 0); + MIDNIGHT_GMT.set(Calendar.MILLISECOND, 0); + } + Restrictions() { // cannot be instantiated @@ -241,6 +252,17 @@ return new BetweenExpression(nodeName, lo, hi); } + public static Criterion betweenDates(String nodeName, Calendar lo, Calendar hi) + { + Calendar lo2 = (Calendar) MIDNIGHT_GMT.clone(); + lo2.set(lo.get(Calendar.YEAR), lo.get(Calendar.MONTH), lo.get(Calendar.DAY_OF_MONTH)); + Calendar hi2 = (Calendar) MIDNIGHT_GMT.clone(); + hi2.set(hi.get(Calendar.YEAR), hi.get(Calendar.MONTH), hi.get(Calendar.DAY_OF_MONTH)); + hi2.add(Calendar.DAY_OF_YEAR, 1); + hi2.add(Calendar.MILLISECOND, -1); + return between(nodeName, lo2, hi2); + } + /** * Apply an "in" constraint to the named node * @param nodeName - String a qualified (eg. nt:somenode) or unqualified (eg. somenode) node name. When a node is an Modified: trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/SimpleExpression.java =================================================================== --- trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/SimpleExpression.java 2010-07-16 06:32:42 UTC (rev 2819) +++ trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/criterion/SimpleExpression.java 2010-07-16 07:33:39 UTC (rev 2820) @@ -104,8 +104,9 @@ { fragment.append(propertyName).append(getOp()); Calendar cal = (Calendar) value; + DATE_FORMAT.setCalendar(cal); String fmt = DATE_FORMAT.format(cal.getTime()); - fragment.append(XS_DATETIME_FUNCTION + "('" + fmt.substring(0, 26) + ':' + fmt.substring(26) + "')) "); + fragment.append(XS_DATETIME_FUNCTION + "('" + fmt + "+00:00" + "')) "); } else if (value != null) { Modified: trunk/openutils-mgnlcriteria/src/test/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/CriteriaTest.java =================================================================== --- trunk/openutils-mgnlcriteria/src/test/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/CriteriaTest.java 2010-07-16 06:32:42 UTC (rev 2819) +++ trunk/openutils-mgnlcriteria/src/test/java/net/sourceforge/openutils/mgnlcriteria/jcr/query/CriteriaTest.java 2010-07-16 07:33:39 UTC (rev 2820) @@ -92,7 +92,7 @@ String expectedStmt = "//pets//*" + "[((jcr:contains(@title, 'Lucky')) and (@petType='dog')" + " and (@birthDate >=xs:dateTime('1999-01-01T00:00:00.000+00:00')" - + " and @birthDate <=xs:dateTime('2001-12-31T23:59:59.000+00:00')))]" + + " and @birthDate <=xs:dateTime('2001-12-31T23:59:59.999+00:00')))]" + " order by @title descending"; String actualStmt = criteria.toXpathExpression(); Assert.assertEquals(StringUtils.remove(actualStmt, ' '), StringUtils.remove(expectedStmt, ' ')); @@ -127,7 +127,7 @@ Criteria criteria = JCRCriteriaFactory.createCriteria().setWorkspace(ContentRepository.WEBSITE).setBasePath( "/pets").add(Restrictions.contains("@title", "Lucky")).add(Restrictions.eq("@petType", "dog")).add( - Restrictions.between("@birthDate", begin, end)).addOrder(Order.desc("@title")); + Restrictions.betweenDates("@birthDate", begin, end)).addOrder(Order.desc("@title")); return criteria; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |