You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by nm...@apache.org on 2017/07/22 09:02:44 UTC
svn commit: r1802660 - in
/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity:
test/EntityQueryTestSuite.java util/EntityQuery.java
Author: nmalin
Date: Sat Jul 22 09:02:44 2017
New Revision: 1802660
URL: http://svn.apache.org/viewvc?rev=1802660&view=rev
Log:
Improved: Improve EntityQuery.queryOne() function to resolve a record by auto matching the primary key on a given context. (OFBIZ-9447)
Like that :
GenericValue product = from('Product').where(context).queryOne()
This improvement simulate the minilang element <entity-one entity-name=Product value-name=product/> for helping the minilang migration to groovy
Thanks Jacopo to help the conception, Taher for the review
Modified:
ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/test/EntityQueryTestSuite.java
ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/util/EntityQuery.java
Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/test/EntityQueryTestSuite.java
URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/test/EntityQueryTestSuite.java?rev=1802660&r1=1802659&r2=1802660&view=diff
==============================================================================
--- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/test/EntityQueryTestSuite.java (original)
+++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/test/EntityQueryTestSuite.java Sat Jul 22 09:02:44 2017
@@ -21,6 +21,7 @@ package org.apache.ofbiz.entity.test;
import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
import org.apache.ofbiz.base.util.UtilDateTime;
import org.apache.ofbiz.base.util.UtilMisc;
import org.apache.ofbiz.entity.GenericEntityException;
@@ -138,6 +139,29 @@ public class EntityQueryTestSuite extend
}
/*
+ * queryOne(): This method returns only one record based on the conditions given, resolve from a context Map.
+ * assert 1: Check the TestingType entity queryOneMap-2 has been resolve
+ * assert 2: Check the TestingType entity queryOneMap-3 has been resolve with the parameters map present in context
+ */
+ public void testQueryOneWithContext() throws GenericEntityException {
+ List<GenericValue> testingTypes = new LinkedList<GenericValue>();
+ testingTypes.add(delegator.makeValue("TestingType", "testingTypeId", "queryOneMap-1", "description", "query one by map"));
+ testingTypes.add(delegator.makeValue("TestingType", "testingTypeId", "queryOneMap-2", "description", "query two by map"));
+ testingTypes.add(delegator.makeValue("TestingType", "testingTypeId", "queryOneMap-3", "description", "query three by map"));
+ delegator.storeAll(testingTypes);
+
+ Map<String, Object> context = UtilMisc.toMap("testingTypeId", "queryOneMap-2", "description", "query two by map", "otherField", "otherValue");
+ GenericValue queryOneByEntityQueryAndContext = EntityQuery.use(delegator).from("TestingType").where(context).queryOne();
+ assertNotNull("queryOne() with context: Record found", queryOneByEntityQueryAndContext);
+
+ context = UtilMisc.toMap("description", "query two by map", "otherField", "otherValue",
+ "parameters", UtilMisc.toMap("testingTypeId", "queryOneMap-3", "description", "query three by map", "otherField", "otherValue"));
+ GenericValue queryOneByEntityQueryAndParameters = EntityQuery.use(delegator).from("TestingType").where(context).queryOne();
+ assertNotNull("queryOne() with parameters: Record found", queryOneByEntityQueryAndParameters);
+ assertEquals("queryOne() with parameters: Record is queryOneMap-3 ", "queryOneMap-3", queryOneByEntityQueryAndParameters.getString("testingTypeId"));
+ }
+
+ /*
* select(): This method is used to select particular fields only from the entity.
* assert 1: Compared value of first record of selected 'description' field by both EntityEngine method and EntityQuery method.
* assert 2: Compared 'testingTypeId' field for null which is fetched by EntityQuery method.
Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/util/EntityQuery.java
URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/util/EntityQuery.java?rev=1802660&r1=1802659&r2=1802660&view=diff
==============================================================================
--- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/util/EntityQuery.java (original)
+++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/util/EntityQuery.java Sat Jul 22 09:02:44 2017
@@ -22,6 +22,7 @@ import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
@@ -38,6 +39,7 @@ import org.apache.ofbiz.entity.GenericEn
import org.apache.ofbiz.entity.GenericValue;
import org.apache.ofbiz.entity.condition.EntityCondition;
import org.apache.ofbiz.entity.model.DynamicViewEntity;
+import org.apache.ofbiz.entity.model.ModelEntity;
/**
* Used to setup various options for and subsequently execute entity queries.
@@ -67,6 +69,8 @@ public class EntityQuery {
private boolean filterByDate = false;
private Timestamp filterByDateMoment;
private List<String> filterByFieldNames = null;
+ private boolean searchPkOnly = false;
+ private Map<String, Object> fieldMap = null;
@@ -148,7 +152,7 @@ public class EntityQuery {
* @return this EntityQuery object, to enable chaining
*/
public EntityQuery where(Map<String, Object> fieldMap) {
- this.whereEntityCondition = EntityCondition.makeCondition(fieldMap);
+ this.fieldMap = fieldMap;
return this;
}
@@ -416,6 +420,7 @@ public class EntityQuery {
* @return GenericValue representing the only result record from the query
*/
public GenericValue queryOne() throws GenericEntityException {
+ this.searchPkOnly = true;
GenericValue result = EntityUtil.getOnly(queryList());
return result;
}
@@ -474,6 +479,25 @@ public class EntityQuery {
}
private EntityCondition makeWhereCondition(boolean usingCache) {
+ if (whereEntityCondition == null && fieldMap != null) {
+ if (this.searchPkOnly) {
+ //Resolve if the map contains a sub map parameters, use a containsKeys to avoid error when a GenericValue is given as map
+ Map<String, Object> parameters = fieldMap.containsKey("parameters") ? (Map<String, Object>) fieldMap.get("parameters") : null;
+ Map<String, Object> resolveFieldMap = new HashMap<>();
+ ModelEntity modelEntity = delegator.getModelEntity(entityName);
+ List<String> fieldNames = modelEntity.getPkFieldNames();
+ for (String fieldName : fieldNames) {
+ if (fieldMap.containsKey(fieldName)) {
+ resolveFieldMap.put(fieldName, fieldMap.get(fieldName));
+ } else if (parameters != null && parameters.containsKey(fieldName)) {
+ resolveFieldMap.put(fieldName, parameters.get(fieldName));
+ }
+ }
+ this.whereEntityCondition = EntityCondition.makeCondition(resolveFieldMap);
+ } else {
+ this.whereEntityCondition = EntityCondition.makeCondition(fieldMap);
+ }
+ }
// 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) {
if (whereEntityCondition != null) {