This is an automated email from the ASF dual-hosted git repository. nmalin pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git
The following commit(s) were added to refs/heads/trunk by this push: new f1c2e8732e Improved: Allow DynamicView use in standard performFind services (OFBIZ-12663) f1c2e8732e is described below commit f1c2e8732ed56eef989ed37821b39927184063a0 Author: Nicolas Malin <nicolas.ma...@nereide.fr> AuthorDate: Fri Jul 8 17:33:30 2022 +0200 Improved: Allow DynamicView use in standard performFind services (OFBIZ-12663) Extend standard find services (prepareFind, executeFind and performFind) to use a built dynamicView instead of just an entityName. With this, you can prepare a dedicated dynamicView and call the performFind with on result a database optimisation. Thanks to Leila Mekika for this proposal and patch --- framework/common/servicedef/services.xml | 3 ++ .../java/org/apache/ofbiz/common/FindServices.java | 44 ++++++++++++++++------ 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/framework/common/servicedef/services.xml b/framework/common/servicedef/services.xml index 1c87d3d10a..04d58969db 100644 --- a/framework/common/servicedef/services.xml +++ b/framework/common/servicedef/services.xml @@ -209,6 +209,7 @@ under the License. <description>Generic service to return a entity conditions</description> <attribute name="entityName" type="String" mode="IN" optional="false"/> <attribute name="inputFields" type="java.util.Map" mode="IN" optional="false"/> + <attribute name="dynamicViewEntity" type="org.apache.ofbiz.entity.model.DynamicViewEntity" mode="IN" optional="true"/> <attribute name="orderBy" type="String" mode="IN" optional="true"/> <attribute name="noConditionFind" type="String" mode="IN" optional="true"><!-- find with no condition (empty entityConditionList) only done when this is Y --></attribute> <attribute name="filterByDate" type="String" mode="IN" optional="true"/> @@ -223,6 +224,7 @@ under the License. <service name="executeFind" auth="false" engine="java" invoke="executeFind" location="org.apache.ofbiz.common.FindServices"> <description>Generic service to return an entity iterator</description> <attribute name="entityName" type="String" mode="IN" optional="false"/> + <attribute name="dynamicViewEntity" type="org.apache.ofbiz.entity.model.DynamicViewEntity" mode="IN" optional="true"/> <attribute name="fieldList" type="java.util.List" mode="IN" optional="true"/> <attribute name="orderByList" type="java.util.List" mode="IN" optional="true"/> <attribute name="maxRows" mode="IN" type="Integer" optional="true"/> @@ -237,6 +239,7 @@ under the License. <description>Generic service to return an entity iterator. set filterByDate to Y to exclude expired records. set noConditionFind to Y to find without conditions. </description> <attribute name="entityName" type="String" mode="IN" optional="false"/> + <attribute name="dynamicViewEntity" type="org.apache.ofbiz.entity.model.DynamicViewEntity" mode="IN" optional="true"/> <attribute name="inputFields" type="java.util.Map" mode="IN" optional="false"/> <attribute name="fieldList" type="java.util.List" mode="IN" optional="true"/> <attribute name="orderBy" type="String" mode="IN" optional="true"/> diff --git a/framework/common/src/main/java/org/apache/ofbiz/common/FindServices.java b/framework/common/src/main/java/org/apache/ofbiz/common/FindServices.java index e96001f548..239a013167 100644 --- a/framework/common/src/main/java/org/apache/ofbiz/common/FindServices.java +++ b/framework/common/src/main/java/org/apache/ofbiz/common/FindServices.java @@ -51,8 +51,11 @@ import org.apache.ofbiz.entity.condition.EntityCondition; import org.apache.ofbiz.entity.condition.EntityConditionList; import org.apache.ofbiz.entity.condition.EntityFunction; import org.apache.ofbiz.entity.condition.EntityOperator; +import org.apache.ofbiz.entity.model.DynamicViewEntity; import org.apache.ofbiz.entity.model.ModelEntity; import org.apache.ofbiz.entity.model.ModelField; +import org.apache.ofbiz.entity.model.ModelReader; +import org.apache.ofbiz.entity.model.ModelViewEntity; import org.apache.ofbiz.entity.util.EntityListIterator; import org.apache.ofbiz.entity.util.EntityQuery; import org.apache.ofbiz.entity.util.EntityUtil; @@ -500,6 +503,7 @@ public class FindServices { */ public static Map<String, Object> performFind(DispatchContext dctx, Map<String, ?> context) { String entityName = (String) context.get("entityName"); + DynamicViewEntity dynamicViewEntity = (DynamicViewEntity) context.get("dynamicViewEntity"); String orderBy = (String) context.get("orderBy"); Map<String, ?> inputFields = checkMap(context.get("inputFields"), String.class, Object.class); // Input String noConditionFind = (String) context.get("noConditionFind"); @@ -545,6 +549,7 @@ public class FindServices { Map<String, Object> prepareResult = null; try { prepareResult = dispatcher.runSync("prepareFind", UtilMisc.toMap("entityName", entityName, "orderBy", orderBy, + "dynamicViewEntity", dynamicViewEntity, "inputFields", inputFields, "filterByDate", filterByDate, "noConditionFind", noConditionFind, "filterByDateValue", filterByDateValue, "userLogin", userLogin, "fromDateName", fromDateName, "thruDateName", thruDateName, @@ -559,6 +564,7 @@ public class FindServices { Map<String, Object> executeResult = null; try { executeResult = dispatcher.runSync("executeFind", UtilMisc.toMap("entityName", entityName, "orderByList", orderByList, + "dynamicViewEntity", dynamicViewEntity, "fieldList", fieldList, "entityConditionList", exprList, "noConditionFind", noConditionFind, "distinct", distinct, "locale", context.get("locale"), "timeZone", context.get("timeZone"), @@ -589,6 +595,7 @@ public class FindServices { */ public static Map<String, Object> prepareFind(DispatchContext dctx, Map<String, ?> context) { String entityName = (String) context.get("entityName"); + DynamicViewEntity dynamicViewEntity = (DynamicViewEntity) context.get("dynamicViewEntity"); Delegator delegator = dctx.getDelegator(); String orderBy = (String) context.get("orderBy"); Map<String, ?> inputFields = checkMap(context.get("inputFields"), String.class, Object.class); // Input @@ -611,7 +618,16 @@ public class FindServices { String thruDateName = (String) context.get("thruDateName"); Map<String, Object> queryStringMap = new LinkedHashMap<>(); - ModelEntity modelEntity = delegator.getModelEntity(entityName); + ModelEntity modelEntity; + if (dynamicViewEntity != null) { + try { + modelEntity = new ModelViewEntity(dynamicViewEntity, ModelReader.getModelReader(delegator.getDelegatorName())); + } catch (GenericEntityException e) { + return ServiceUtil.returnError(e.toString()); + } + } else { + modelEntity = delegator.getModelEntity(entityName); + } List<EntityCondition> tmpList = createConditionList(inputFields, modelEntity.getFieldsUnmodifiable(), queryStringMap, delegator, context); /* the filter by date condition should only be added when there are other conditions or when @@ -668,6 +684,7 @@ public class FindServices { */ public static Map<String, Object> executeFind(DispatchContext dctx, Map<String, ?> context) { String entityName = (String) context.get("entityName"); + DynamicViewEntity dynamicViewEntity = (DynamicViewEntity) context.get("dynamicViewEntity"); EntityConditionList<EntityCondition> entityConditionList = UtilGenerics.cast(context.get("entityConditionList")); List<String> orderByList = checkCollection(context.get("orderByList"), String.class); boolean noConditionFind = "Y".equals(context.get("noConditionFind")); @@ -686,20 +703,25 @@ public class FindServices { int listSize = 0; try { if (noConditionFind || (entityConditionList != null && entityConditionList.getConditionListSize() > 0)) { - listIt = EntityQuery.use(delegator) - .select(fieldSet) - .from(entityName) - .where(entityConditionList) - .orderBy(orderByList) - .cursorScrollInsensitive() - .maxRows(maxRows) - .distinct(distinct) - .queryIterator(); + EntityQuery query = EntityQuery.use(delegator); + if (dynamicViewEntity != null) { + query.from(dynamicViewEntity); + } else { + query.from(entityName); + } + listIt = query.select(fieldSet) + .where(entityConditionList) + .orderBy(orderByList) + .cursorScrollInsensitive() + .maxRows(maxRows) + .distinct(distinct) + .queryIterator(); listSize = listIt.getResultsSizeAfterPartialList(); } } catch (GenericEntityException e) { return ServiceUtil.returnError(UtilProperties.getMessage(RESOURCE, "CommonFindErrorRunning", - UtilMisc.toMap("entityName", entityName, "errorString", e.getMessage()), locale)); + UtilMisc.toMap("entityName", (dynamicViewEntity != null ? dynamicViewEntity.getEntityName() : entityName), + "errorString", e.getMessage()), locale)); } Map<String, Object> results = ServiceUtil.returnSuccess();