svn commit: r1804323 - /ofbiz/branches/release13.07/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r1804323 - /ofbiz/branches/release13.07/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java

jleroux@apache.org
Author: jleroux
Date: Mon Aug  7 10:48:45 2017
New Revision: 1804323

URL: http://svn.apache.org/viewvc?rev=1804323&view=rev
Log:
"Applied BY HAND fix from trunk framework for revision: 1804319  "
------------------------------------------------------------------------
r1804319 | jleroux | 2017-08-07 12:40:32 +0200 (lun. 07 août 2017) | 20 lignes

Fixed: Bug SQL Count Distinct command in GenericDAO.java
(OFBIZ-5701)

jleroux: Kieuanhvu's explanation was not totally clear. So I rather provide
Renuka Srishti's at OFBIZ-9428 "getResultsSizeAfterPartialList() return wrong
count with distinct() for View Entity"

Here is the code sample to test the issue:

EntityListIterator productAssocListItr = null;
productAssocListItr = from("ProductAndAssoc").distinct().queryIterator();
productAssocListSize = productAssocListItr.getResultsSizeAfterPartialList();

productAssocListSize will differ from the actual distinct records in the
ProductAndAssoc View Entity.
This issue exists because it gives distinct records on the basis of the
first column in the table.

Thanks: Kieuanhvu for the patch, Renuka Srishti for a clear explanation and a
simple way to test (in a groovy for me)
------------------------------------------------------------------------

Modified:
    ofbiz/branches/release13.07/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java

Modified: ofbiz/branches/release13.07/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/release13.07/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java?rev=1804323&r1=1804322&r2=1804323&view=diff
==============================================================================
--- ofbiz/branches/release13.07/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java (original)
+++ ofbiz/branches/release13.07/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java Mon Aug  7 10:48:45 2017
@@ -43,7 +43,6 @@ import org.ofbiz.entity.Delegator;
 import org.ofbiz.entity.EntityLockedException;
 import org.ofbiz.entity.GenericDataSourceException;
 import org.ofbiz.entity.GenericEntity;
-import org.ofbiz.entity.GenericEntityConfException;
 import org.ofbiz.entity.GenericEntityException;
 import org.ofbiz.entity.GenericEntityNotFoundException;
 import org.ofbiz.entity.GenericModelException;
@@ -52,9 +51,8 @@ import org.ofbiz.entity.GenericValue;
 import org.ofbiz.entity.condition.EntityCondition;
 import org.ofbiz.entity.condition.EntityConditionParam;
 import org.ofbiz.entity.condition.EntityOperator;
-import org.ofbiz.entity.config.model.Datasource;
-import org.ofbiz.entity.config.model.EntityConfig;
 import org.ofbiz.entity.config.EntityConfigUtil;
+import org.ofbiz.entity.config.model.Datasource;
 import org.ofbiz.entity.jdbc.DatabaseUtil;
 import org.ofbiz.entity.jdbc.SQLProcessor;
 import org.ofbiz.entity.jdbc.SqlJdbcUtil;
@@ -1035,6 +1033,7 @@ public class GenericDAO {
         }
 
         boolean isGroupBy = false;
+        boolean isCountGroup = false;
         ModelViewEntity modelViewEntity = null;
         if (modelEntity instanceof ModelViewEntity) {
             modelViewEntity = (ModelViewEntity) modelEntity;
@@ -1065,11 +1064,20 @@ public class GenericDAO {
                     // if the field has a function already we don't want to count just it, would be meaningless
                     sqlBuffer.append("COUNT(DISTINCT *) ");
                 } else {
-                    sqlBuffer.append("COUNT(DISTINCT ");
-                    // this only seems to support a single column, which is not desirable but seems a lot better than no columns or in certain cases all columns
-                    sqlBuffer.append(firstSelectField.getColValue());
-                    // sqlBuffer.append(modelEntity.colNameString(selectFields, ", ", "", datasource.aliasViews));
-                    sqlBuffer.append(")");
+                    isCountGroup = true;
+                    StringBuilder sqlBufferTMP = new StringBuilder("SELECT COUNT(*) FROM(");
+                    sqlBuffer.append("DISTINCT ");
+                    for (int i = 0; i < selectFields.size() - 1; i++) {
+                        ModelViewEntity.ModelAlias tmpMA = modelViewEntity != null ? modelViewEntity.getAlias(selectFields.get(i).getName()) : null;
+                        if (tmpMA != null && !tmpMA.getColAlias().isEmpty()) {
+                            sqlBuffer.append(selectFields.get(i).getColValue() + " as " + tmpMA.getColAlias() + ",");
+                        } else {
+                            sqlBuffer.append(selectFields.get(i).getColValue() + ",");
+                        }
+                    }
+                    sqlBuffer.append(selectFields.get(selectFields.size() - 1).getColValue());
+                    sqlBufferTMP.append(sqlBuffer);
+                    sqlBuffer = sqlBufferTMP;
                 }
             } else {
                 sqlBuffer.append("COUNT(DISTINCT *) ");
@@ -1109,6 +1117,9 @@ public class GenericDAO {
         if (isGroupBy) {
             sqlBuffer.append(") TEMP_NAME");
         }
+        if (isCountGroup) {
+            sqlBuffer.append(") TEMP_COUNT_NAME");
+        }
 
         String sql = sqlBuffer.toString();
         if (Debug.verboseOn()) Debug.logVerbose("Count select sql: " + sql, module);