On 04/18/2012 09:14 PM, Scott Gray wrote:
> Nice, I ran into a problem related to this very recently.  Thanks for taking 
> care of it.

<view-entity>
  <member-entity entity-name="Foo">
<view-entity>

<view-entity entity-name="Foo">
  <member-entity alias="A" entity-name="Bar">
  <member-entity alias="B" entity-name="Baz">
  <view-link entity-alias="A" rel-entity-alias="B">
    <view-condition/>
  </view-link>
</view-entity>

<entity entity-name="Bar"/>

<view-entity entity-name="Baz">
  <view-condition/>
</view-entity>

This now works.


> 
> 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