|
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, [hidden email] 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 > > |
|
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, [hidden email] 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 >> >> > |
| Free forum by Nabble | Edit this page |
