You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by jl...@apache.org on 2017/08/07 10:40:32 UTC

svn commit: r1804319 - /ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/datasource/GenericDAO.java

Author: jleroux
Date: Mon Aug  7 10:40:32 2017
New Revision: 1804319

URL: http://svn.apache.org/viewvc?rev=1804319&view=rev
Log:
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/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/datasource/GenericDAO.java

Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/datasource/GenericDAO.java
URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/datasource/GenericDAO.java?rev=1804319&r1=1804318&r2=1804319&view=diff
==============================================================================
--- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/datasource/GenericDAO.java (original)
+++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/datasource/GenericDAO.java Mon Aug  7 10:40:32 2017
@@ -1024,6 +1024,7 @@ public class GenericDAO {
         }
 
         boolean isGroupBy = false;
+        boolean isCountGroup = false;
         ModelViewEntity modelViewEntity = null;
         if (modelEntity instanceof ModelViewEntity) {
             modelViewEntity = (ModelViewEntity) modelEntity;
@@ -1054,11 +1055,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 *) ");
@@ -1098,6 +1108,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);