Author: lektran Date: Sun Oct 5 20:28:25 2014 New Revision: 1629538 URL: http://svn.apache.org/r1629538 Log: Add EntityQuery support for filtering by one or more explicit from/thruDate field pairs
Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/util/EntityQuery.java Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/util/EntityQuery.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/util/EntityQuery.java?rev=1629538&r1=1629537&r2=1629538&view=diff ============================================================================== --- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/util/EntityQuery.java (original) +++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/util/EntityQuery.java Sun Oct 5 20:28:25 2014 @@ -19,6 +19,7 @@ package org.ofbiz.entity.util; import java.sql.Timestamp; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -26,6 +27,7 @@ import java.util.Set; import org.ofbiz.base.util.Debug; import org.ofbiz.base.util.UtilMisc; +import org.ofbiz.base.util.UtilValidate; import org.ofbiz.entity.Delegator; import org.ofbiz.entity.GenericEntityException; import org.ofbiz.entity.GenericValue; @@ -59,6 +61,7 @@ public class EntityQuery { private EntityCondition havingEntityCondition = null; private boolean filterByDate = false; private Timestamp filterByDateMoment; + private List<String> filterByFieldNames = null; @@ -285,6 +288,7 @@ public class EntityQuery { public EntityQuery filterByDate() { this.filterByDate = true; this.filterByDateMoment = null; + this.filterByFieldNames = null; return this; } @@ -296,6 +300,22 @@ public class EntityQuery { public EntityQuery filterByDate(Timestamp moment) { this.filterByDate = true; this.filterByDateMoment = moment; + this.filterByFieldNames = null; + return this; + } + + /** Specifies whether the query should return only values that are currently active using the specified from/thru field name pairs. + * + * @param fromThruFieldName - String pairs representing the from/thru date field names e.g. "fromDate", "thruDate", "contactFromDate", "contactThruDate" + * @return this EntityQuery object, to enable chaining + */ + public EntityQuery filterByDate(String... filterByFieldName) { + this.filterByDate = true; + this.filterByDateMoment = null; + if (filterByFieldName.length % 2 != 0) { + throw new IllegalArgumentException("You must pass an even sized array to this method, each pair should represent a from date field name and a thru date field name"); + } + this.filterByFieldNames = Arrays.asList(filterByFieldName); return this; } @@ -373,11 +393,7 @@ public class EntityQuery { result = queryIterator().getCompleteList(); } if (filterByDate && useCache) { - if (filterByDateMoment == null) { - return EntityUtil.filterByDate(result); - } else { - return EntityUtil.filterByDate(result, filterByDateMoment); - } + return EntityUtil.filterByCondition(result, this.makeDateCondition()); } return result; } @@ -402,12 +418,26 @@ public class EntityQuery { private EntityCondition makeWhereCondition(boolean usingCache) { // we don't use the useCache field here because not all queries will actually use the cache, e.g. findCountByCondition never uses the cache if (filterByDate && !usingCache) { + return EntityCondition.makeCondition(whereEntityCondition, this.makeDateCondition()); + } + return whereEntityCondition; + } + + private EntityCondition makeDateCondition() { + List<EntityCondition> conditions = new ArrayList<EntityCondition>(); + if (UtilValidate.isEmpty(this.filterByFieldNames)) { + this.filterByDate("fromDate", "thruDate"); + } + + for (int i = 0; i < this.filterByFieldNames.size();) { + String fromDateFieldName = this.filterByFieldNames.get(i++); + String thruDateFieldName = this.filterByFieldNames.get(i++); if (filterByDateMoment == null) { - return EntityCondition.makeCondition(whereEntityCondition, EntityUtil.getFilterByDateExpr()); + conditions.add(EntityUtil.getFilterByDateExpr(fromDateFieldName, thruDateFieldName)); } else { - return EntityCondition.makeCondition(whereEntityCondition, EntityUtil.getFilterByDateExpr(filterByDateMoment)); + conditions.add(EntityUtil.getFilterByDateExpr(this.filterByDateMoment, fromDateFieldName, thruDateFieldName)); } } - return whereEntityCondition; + return EntityCondition.makeCondition(conditions); } }