Author: jleroux
Date: Mon Aug  7 10:48:11 2017
New Revision: 1804322

URL: http://svn.apache.org/viewvc?rev=1804322&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/release14.12/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java

Modified: 
ofbiz/branches/release14.12/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java
URL: 
http://svn.apache.org/viewvc/ofbiz/branches/release14.12/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java?rev=1804322&r1=1804321&r2=1804322&view=diff
==============================================================================
--- 
ofbiz/branches/release14.12/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java
 (original)
+++ 
ofbiz/branches/release14.12/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java
 Mon Aug  7 10:48:11 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);


Reply via email to