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