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); |
Free forum by Nabble | Edit this page |