Nice, I ran into a problem related to this very recently.  Thanks for taking 
care of it.

Regards
Scott

On 19/04/2012, at 11:48 AM, doo...@apache.org wrote:

> Author: doogie
> Date: Wed Apr 18 23:48:40 2012
> New Revision: 1327735
> 
> URL: http://svn.apache.org/viewvc?rev=1327735&view=rev
> Log:
> FEATURE/FIX: <entity-condition> on views are now done correctly.  When a
> view was previously joined to another view, the conditions on the inner
> view were added to the outer-most WHERE clause.  This caused multiple
> problems.  One, if the join was optional, the generated sql actually made
> it required(because it was in the WHERE, and not in the ON clause).
> Second, the outer WHERE may reference a field that was not available *at
> all* in the generated nested select(view table).
> 
> The fix is to *not* recurse thru all view member entities when finding
> conditions, and instead attach them to a new WHERE clause on the
> generated inner SELECT(view table).
> 
> Modified:
>    ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/SqlJdbcUtil.java
>    
> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelViewEntity.java
> 
> Modified: 
> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/SqlJdbcUtil.java
> URL: 
> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/SqlJdbcUtil.java?rev=1327735&r1=1327734&r2=1327735&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/SqlJdbcUtil.java 
> (original)
> +++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/SqlJdbcUtil.java 
> Wed Apr 18 23:48:40 2012
> @@ -40,6 +40,7 @@ import java.util.TreeSet;
> import javax.sql.rowset.serial.SerialBlob;
> import javax.sql.rowset.serial.SerialClob;
> 
> +import javolution.util.FastList;
> import javolution.util.FastMap;
> 
> import org.ofbiz.base.util.Debug;
> @@ -54,6 +55,7 @@ import org.ofbiz.entity.GenericNotImplem
> 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.condition.OrderByList;
> import org.ofbiz.entity.config.DatasourceInfo;
> import org.ofbiz.entity.jdbc.JdbcValueHandler;
> @@ -420,11 +422,31 @@ public class SqlJdbcUtil {
>             }
>             sql.append(makeFromClause(modelEntity, modelFieldTypeReader, 
> datasourceInfo));
>             String viewWhereClause = makeViewWhereClause(modelEntity, 
> datasourceInfo.joinStyle);
> -            if (UtilValidate.isNotEmpty(viewWhereClause)) {
> +            ModelViewEntity modelViewEntity = (ModelViewEntity)modelEntity;
> +            List<EntityCondition> whereConditions = FastList.newInstance();
> +            List<EntityCondition> havingConditions = FastList.newInstance();
> +            List<String> orderByList = FastList.newInstance();
> +
> +            
> modelViewEntity.populateViewEntityConditionInformation(modelFieldTypeReader, 
> whereConditions, havingConditions, orderByList, null);
> +            String viewConditionClause;
> +            if (!whereConditions.isEmpty()) {
> +                viewConditionClause = 
> EntityCondition.makeCondition(whereConditions, 
> EntityOperator.AND).makeWhereString(modelViewEntity,  null, datasourceInfo);
> +            } else {
> +                viewConditionClause = null;
> +            }
> +            if (UtilValidate.isNotEmpty(viewWhereClause) || 
> UtilValidate.isNotEmpty(viewConditionClause)) {
>                 sql.append(" WHERE ");
> -                sql.append(viewWhereClause);
> +                if (UtilValidate.isNotEmpty(viewWhereClause)) {
> +                    sql.append("(").append(viewWhereClause).append(")");
> +                    if (UtilValidate.isNotEmpty(viewConditionClause)) {
> +                        sql.append(" AND ");
> +                    }
> +                }
> +                if (UtilValidate.isNotEmpty(viewConditionClause)) {
> +                    sql.append("(").append(viewConditionClause).append(")");
> +                }
>             }
> -            ModelViewEntity modelViewEntity = (ModelViewEntity)modelEntity;
> +            // FIXME: handling HAVING, don't need ORDER BY for nested views
>             modelViewEntity.colNameString(modelViewEntity.getGroupBysCopy(), 
> sql, " GROUP BY ", ", ", "", false);
> 
>             sql.append(")");
> 
> Modified: 
> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelViewEntity.java
> URL: 
> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelViewEntity.java?rev=1327735&r1=1327734&r2=1327735&view=diff
> ==============================================================================
> --- 
> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelViewEntity.java 
> (original)
> +++ 
> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelViewEntity.java 
> Wed Apr 18 23:48:40 2012
> @@ -315,16 +315,6 @@ public class ModelViewEntity extends Mod
>                 orderByList.addAll(currentOrderByList);
>             }
>         }
> -
> -        for (Map.Entry<String, String> memberEntityEntry: 
> this.memberModelEntities.entrySet()) {
> -            ModelEntity modelEntity = 
> this.getModelReader().getModelEntityNoCheck(memberEntityEntry.getValue());
> -            if (modelEntity instanceof ModelViewEntity) {
> -                ModelViewEntity memberViewEntity = (ModelViewEntity) 
> modelEntity;
> -                entityAliasStack.add(memberEntityEntry.getKey());
> -                
> memberViewEntity.populateViewEntityConditionInformation(modelFieldTypeReader, 
> whereConditions, havingConditions, orderByList, entityAliasStack);
> -                entityAliasStack.remove(entityAliasStack.size() - 1);
> -            }
> -        }
>     }
> 
>     @Deprecated @Override
> 
> 

Reply via email to