details: https://code.openbravo.com/erp/devel/pi/rev/46ec5ec2839d
changeset: 21754:46ec5ec2839d
user: Asier Lostalé <asier.lostale <at> openbravo.com>
date: Tue Jan 07 13:20:26 2014 +0100
summary: fixed bug 25182: FK filter drop down list bad perfomance
Changed the way FK drop down list query is composed
For example filtering organization in product window:
* Before it was:
select distinct o.AD_Org_ID
from M_Product p left join AD_Org o
on p.AD_Org_ID = o.AD_Org_ID
where (//grid filter in product)
* Now it is:
select o.AD_Org_ID
from AD_Org o
where exists (select 1
from M_Product p
where p.AD_Org_ID = o.AD_Org_ID
and (//grid filter in product))
details: https://code.openbravo.com/erp/devel/pi/rev/9c5fe282d29c
changeset: 21755:9c5fe282d29c
user: Asier Lostalé <asier.lostale <at> openbravo.com>
date: Tue Jan 07 13:28:07 2014 +0100
summary: fixed bug 25378: drop down filter doesn't work in FK property columns
diffstat:
modules/org.openbravo.service.json/src/org/openbravo/service/json/AdvancedQueryBuilder.java
| 84 ++-
modules/org.openbravo.service.json/src/org/openbravo/service/json/DataEntityQueryService.java
| 55 +-
modules/org.openbravo.service.json/src/org/openbravo/service/json/DefaultJsonDataService.java
| 239 ++++-----
3 files changed, 201 insertions(+), 177 deletions(-)
diffs (truncated from 560 to 300 lines):
diff -r 9405040d251c -r 9c5fe282d29c
modules/org.openbravo.service.json/src/org/openbravo/service/json/AdvancedQueryBuilder.java
---
a/modules/org.openbravo.service.json/src/org/openbravo/service/json/AdvancedQueryBuilder.java
Fri Jan 03 14:08:41 2014 +0530
+++
b/modules/org.openbravo.service.json/src/org/openbravo/service/json/AdvancedQueryBuilder.java
Tue Jan 07 13:28:07 2014 +0100
@@ -11,7 +11,7 @@
* under the License.
* The Original Code is Openbravo ERP.
* The Initial Developer of the Original Code is Openbravo SLU
- * All portions are Copyright (C) 2009-2013 Openbravo SLU
+ * All portions are Copyright (C) 2009-2014 Openbravo SLU
* All Rights Reserved.
* Contributor(s): ______________________________________.
************************************************************************
@@ -150,6 +150,11 @@
private boolean joinAssociatedEntities = false;
private List<String> additionalProperties = new ArrayList<String>();
+ private Entity subEntity;
+ private Property distinctProperty;
+ private DataEntityQueryService subDataEntityQueryService;
+
+ private int aliasOffset = 0;
public Entity getEntity() {
return entity;
@@ -200,9 +205,51 @@
whereClause += " ";
+ if (subEntity != null) {
+ // if there's subentity, process it as a subquery with "exists"
+ String subEntityClientOrg = " and e.organization.id "
+ +
createInClause(OBContext.getOBContext().getReadableOrganizations());
+ subEntityClientOrg += " and e.client.id "
+ + createInClause(OBContext.getOBContext().getReadableClients());
+
+ AdvancedQueryBuilder subEntityQueryBuilder =
subDataEntityQueryService.getQueryBuilder();
+ subEntityQueryBuilder.aliasOffset = typedParameters.size();
+
+ String subentityWhere = subEntityQueryBuilder.getWhereClause();
+ if (StringUtils.isEmpty(subentityWhere.trim())) {
+ subentityWhere += " where ";
+ } else {
+ subentityWhere += " and ";
+ }
+
+ String distinctPropName = distinctProperty.getName();
+ if (distinctProperty.isComputedColumn()) {
+ distinctPropName = Entity.COMPUTED_COLUMNS_PROXY_PROPERTY +
DalUtil.DOT + distinctPropName;
+ }
+ whereClause += StringUtils.isEmpty(whereClause.trim()) ? "where" : "and";
+ whereClause += " exists (select 1 from " + subEntity.getName() + " "
+ + subEntityQueryBuilder.getJoinClause() + subentityWhere + "e." +
distinctPropName
+ + " = " + mainAlias + subEntityClientOrg + ") ";
+ typedParameters.addAll(subEntityQueryBuilder.typedParameters);
+ }
+
return whereClause;
}
+ private String createInClause(String[] values) {
+ if (values.length == 0) {
+ return " in ('') ";
+ }
+ final StringBuilder sb = new StringBuilder();
+ for (final String v : values) {
+ if (sb.length() > 0) {
+ sb.append(", ");
+ }
+ sb.append("'" + v + "'");
+ }
+ return " in (" + sb.toString() + ")";
+ }
+
private String addWhereOrgParameters(String where) {
String localWhereClause = where;
// add the organization parameter
@@ -1056,7 +1103,7 @@
}
private String getTypedParameterAlias() {
- return ":" + ALIAS_PREFIX + typedParameters.size();
+ return ":" + ALIAS_PREFIX + (typedParameters.size() + aliasOffset);
}
/**
@@ -1478,17 +1525,6 @@
return checkAlias.equals(ownerAlias) && checkProperty == property;
}
- public String getPropertyPath() {
- if (ownerAlias != null) {
- for (JoinDefinition jd : AdvancedQueryBuilder.this.joinDefinitions) {
- if (jd.getJoinAlias().equals(ownerAlias)) {
- return jd.getPropertyPath() + DalUtil.DOT + property.getName();
- }
- }
- }
- return property.getName();
- }
-
public String getJoinStatement() {
String propName;
if (property.isComputedColumn()) {
@@ -1517,17 +1553,9 @@
this.ownerAlias = ownerAlias;
}
- public boolean isFetchJoin() {
- return fetchJoin;
- }
-
public void setFetchJoin(boolean fetchJoin) {
this.fetchJoin = fetchJoin;
}
-
- public Property getProperty() {
- return property;
- }
}
public String getMainAlias() {
@@ -1639,4 +1667,18 @@
public void setAdditionalProperties(List<String> additionalProperties) {
this.additionalProperties = additionalProperties;
}
+
+ public void setSubEntityName(String subEntityName) {
+ this.subEntity = ModelProvider.getInstance().getEntity(subEntityName);
+ }
+
+ public void setSubDataEntityQueryService(DataEntityQueryService
dataEntityQueryService) {
+ this.subDataEntityQueryService = dataEntityQueryService;
+
+ }
+
+ public void setDistinctProperty(Property distinctProperty) {
+ this.distinctProperty = distinctProperty;
+
+ }
}
diff -r 9405040d251c -r 9c5fe282d29c
modules/org.openbravo.service.json/src/org/openbravo/service/json/DataEntityQueryService.java
---
a/modules/org.openbravo.service.json/src/org/openbravo/service/json/DataEntityQueryService.java
Fri Jan 03 14:08:41 2014 +0530
+++
b/modules/org.openbravo.service.json/src/org/openbravo/service/json/DataEntityQueryService.java
Tue Jan 07 13:28:07 2014 +0100
@@ -11,7 +11,7 @@
* under the License.
* The Original Code is Openbravo ERP.
* The Initial Developer of the Original Code is Openbravo SLU
- * All portions are Copyright (C) 2009-2013 Openbravo SLU
+ * All portions are Copyright (C) 2009-2014 Openbravo SLU
* All Rights Reserved.
* Contributor(s): ______________________________________.
************************************************************************
@@ -21,6 +21,7 @@
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import org.apache.log4j.Logger;
import org.codehaus.jettison.json.JSONException;
@@ -132,26 +133,6 @@
if (getSummarySettings() != null) {
obq.setSelectClause(queryBuilder.getSelectClause());
- } else if (getDistinct() != null) {
- final String localDistinct = getDistinct();
- queryBuilder.addSelectClausePart(localDistinct + ".id");
-
- final List<Property> properties = getDistinctDisplayProperties();
-
- for (Property identifierProp : properties) {
- if (identifierProp.getTargetEntity() != null) {
- // go one level deeper
- final List<Property> nextIdentifierProps =
JsonUtils.getIdentifierSet(identifierProp);
- for (Property nextIdentifierProp : nextIdentifierProps) {
- queryBuilder.addSelectClausePart(localDistinct + DalUtil.DOT +
identifierProp.getName()
- + "." + nextIdentifierProp);
- }
- } else {
- queryBuilder.addSelectClausePart(localDistinct + DalUtil.DOT +
identifierProp.getName());
- }
- }
-
- obq.setSelectClause("distinct " + queryBuilder.getSelectClause());
}
if (getFirstResult() != null) {
@@ -168,11 +149,23 @@
}
obq.setFilterOnActive(isFilterOnActive());
+ if (log.isDebugEnabled()) {
+ String params = "";
+ Map<String, Object> namedParams = queryBuilder.getNamedParameters();
+ for (String paramName : namedParams.keySet()) {
+ params += " -" + paramName + ": " + namedParams.get(paramName) + "\n";
+ }
+ log.debug("Setting params:\n" + params);
+ }
obq.setNamedParameters(queryBuilder.getNamedParameters());
return obq;
}
+ AdvancedQueryBuilder getQueryBuilder() {
+ return queryBuilder;
+ }
+
// package private on purpose
List<Property> getDistinctDisplayProperties() {
final String localDistinct = getDistinct();
@@ -205,9 +198,6 @@
+ queryBuilder.getOrderByClause();
log.debug("Querying for " + entityName + " " + whereOrderBy);
-
- // System.err.println("Querying for " + entityName + " " + whereOrderBy);
-
final OBQuery<BaseOBObject> obq =
OBDal.getInstance().createQuery(entityName, whereOrderBy);
obq.setFilterOnReadableClients(isFilterOnReadableClients());
obq.setFilterOnReadableOrganization(isFilterOnReadableOrganizations());
@@ -365,4 +355,21 @@
this.filterOnReadableClients = filterOnReadableClients;
}
+ /**
+ * In case of performing query for FK drop down list (ie. Organization link
in Product window),
+ * there are 2 entities to query:
+ * <ul>
+ * <li>main entity: in the example would be Organization which is the one we
want to get records
+ * from
+ * <li>sub entity: in this case Product, it will be filtered in the same way
it is in the grid so
+ * only organizations with that criteria will be shown
+ * </ul>
+ */
+ public void setSubEntity(String subEntityName, DataEntityQueryService
dataEntityQueryService,
+ Property distinctProperty) {
+ queryBuilder.setSubEntityName(subEntityName);
+ queryBuilder.setSubDataEntityQueryService(dataEntityQueryService);
+ queryBuilder.setDistinctProperty(distinctProperty);
+ }
+
}
diff -r 9405040d251c -r 9c5fe282d29c
modules/org.openbravo.service.json/src/org/openbravo/service/json/DefaultJsonDataService.java
---
a/modules/org.openbravo.service.json/src/org/openbravo/service/json/DefaultJsonDataService.java
Fri Jan 03 14:08:41 2014 +0530
+++
b/modules/org.openbravo.service.json/src/org/openbravo/service/json/DefaultJsonDataService.java
Tue Jan 07 13:28:07 2014 +0100
@@ -11,7 +11,7 @@
* under the License.
* The Original Code is Openbravo ERP.
* The Initial Developer of the Original Code is Openbravo SLU
- * All portions are Copyright (C) 2009-2013 Openbravo SLU
+ * All portions are Copyright (C) 2009-2014 Openbravo SLU
* All Rights Reserved.
* Contributor(s): ______________________________________.
************************************************************************
@@ -21,9 +21,11 @@
import java.sql.BatchUpdateException;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
@@ -60,8 +62,6 @@
public class DefaultJsonDataService implements JsonDataService {
private static final Logger log =
Logger.getLogger(DefaultJsonDataService.class);
- private static final long serialVersionUID = 1L;
-
private static final String ADD_FLAG = "_doingAdd";
private static DefaultJsonDataService instance = new
DefaultJsonDataService();
@@ -105,7 +105,10 @@
boolean preventCountOperation =
!parameters.containsKey(JsonConstants.NOCOUNT_PARAMETER)
|| "true".equals(parameters.get(JsonConstants.NOCOUNT_PARAMETER));
- DataEntityQueryService queryService =
createSetQueryService(parameters, true);
+ @SuppressWarnings("unchecked")
+ Map<String, String> paramsCount = (Map<String, String>)
((HashMap<String, String>) parameters)
+ .clone();
+ DataEntityQueryService queryService =
createSetQueryService(paramsCount, true);
queryService.setEntityName(entityName);
// only do the count if a paging request is done and it has not been
prevented
@@ -140,9 +143,7 @@
jsonResponse.put(JsonConstants.RESPONSE_TOTALROWS, count);
return jsonResponse.toString();
}
-
queryService = createSetQueryService(parameters, false);
- queryService.setEntityName(entityName);
if (parameters.containsKey(JsonConstants.SUMMARY_PARAMETER)) {
final JSONObject singleResult = new JSONObject();
@@ -168,90 +169,10 @@
jsonResponse.put(JsonConstants.RESPONSE_ENDROW, 1);
------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT
organizations don't have a clear picture of how application performance
affects their revenue. With AppDynamics, you get 100% visibility into your
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk
_______________________________________________
Openbravo-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openbravo-commits