You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by jo...@apache.org on 2007/04/14 00:12:32 UTC

svn commit: r528686 - /ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearch.java

Author: jonesde
Date: Fri Apr 13 15:12:31 2007
New Revision: 528686

URL: http://svn.apache.org/viewvc?view=rev&rev=528686
Log:
Fixed problem with category search in sub-categories caused by the include/exclude/alwaysInclude stuff added a while back; note that there is still a problem with excludes in certain circumstances

Modified:
    ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearch.java

Modified: ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearch.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearch.java?view=diff&rev=528686&r1=528685&r2=528686
==============================================================================
--- ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearch.java (original)
+++ ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearch.java Fri Apr 13 15:12:31 2007
@@ -163,6 +163,9 @@
         public Set excludeCategoryIds = FastSet.newInstance();
         public Set alwaysIncludeCategoryIds = FastSet.newInstance();
 
+        public List includeCategoryIdOrSetAndList = FastList.newInstance();
+        public List alwaysIncludeCategoryIdOrSetAndList = FastList.newInstance();
+        
         public Set includeFeatureIds = FastSet.newInstance();
         public Set excludeFeatureIds = FastSet.newInstance();
         public Set alwaysIncludeFeatureIds = FastSet.newInstance();
@@ -326,8 +329,9 @@
 
         public void finishCategoryAndFeatureConstraints() {
             if (includeCategoryIds.size() == 0 && excludeCategoryIds.size() == 0 && alwaysIncludeCategoryIds.size() == 0 &&
+                    includeCategoryIdOrSetAndList.size() == 0 && alwaysIncludeCategoryIdOrSetAndList.size() == 0 &&
                     includeFeatureIds.size() == 0 && excludeFeatureIds.size() == 0 && alwaysIncludeFeatureIds.size() == 0 &&
-                    includeFeatureIdOrSetAndList.size() == 0) {
+                    includeFeatureIdOrSetAndList.size() == 0 && alwaysIncludeFeatureIdOrSetAndList.size() == 0) {
                 return;
             }
             
@@ -342,41 +346,44 @@
             
             EntityCondition topCond = null;
             
-            Iterator includeCategoryIdIter = includeCategoryIds.iterator();
-            while (includeCategoryIdIter.hasNext()) {
-                String includeCategoryId = (String) includeCategoryIdIter.next();
-                String categoryPrefix = "pcm" + this.index;
-                String entityAlias = "PCM" + this.index;
-                this.index++;
-
-                this.dynamicViewEntity.addMemberEntity(entityAlias, "ProductCategoryMember");
-                this.dynamicViewEntity.addAlias(entityAlias, categoryPrefix + "ProductCategoryId", "productCategoryId", null, null, null, null);
-                this.dynamicViewEntity.addAlias(entityAlias, categoryPrefix + "FromDate", "fromDate", null, null, null, null);
-                this.dynamicViewEntity.addAlias(entityAlias, categoryPrefix + "ThruDate", "thruDate", null, null, null, null);
-                this.dynamicViewEntity.addViewLink("PROD", entityAlias, Boolean.FALSE, ModelKeyMap.makeKeyMapList("productId"));
-                incExcCondList.add(new EntityExpr(new EntityExpr(categoryPrefix + "ThruDate", EntityOperator.EQUALS, null), EntityOperator.OR, new EntityExpr(categoryPrefix + "ThruDate", EntityOperator.GREATER_THAN, this.nowTimestamp)));
-                incExcCondList.add(new EntityExpr(categoryPrefix + "FromDate", EntityOperator.LESS_THAN, this.nowTimestamp));
-                incExcCondList.add(new EntityExpr(categoryPrefix + "ProductCategoryId", EntityOperator.EQUALS, includeCategoryId));
-            }
-            Iterator includeFeatureIdIter = includeFeatureIds.iterator();
-            while (includeFeatureIdIter.hasNext()) {
-                String includeFeatureId = (String) includeFeatureIdIter.next();
-                String featurePrefix = "pfa" + this.index;
-                String entityAlias = "PFA" + this.index;
-                this.index++;
-
-                this.dynamicViewEntity.addMemberEntity(entityAlias, "ProductFeatureAppl");
-                this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "ProductFeatureId", "productFeatureId", null, null, null, null);
-                this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "FromDate", "fromDate", null, null, null, null);
-                this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "ThruDate", "thruDate", null, null, null, null);
-                this.dynamicViewEntity.addViewLink("PROD", entityAlias, Boolean.FALSE, ModelKeyMap.makeKeyMapList("productId"));
-                incExcCondList.add(new EntityExpr(new EntityExpr(featurePrefix + "ThruDate", EntityOperator.EQUALS, null), EntityOperator.OR, new EntityExpr(featurePrefix + "ThruDate", EntityOperator.GREATER_THAN, this.nowTimestamp)));
-                incExcCondList.add(new EntityExpr(featurePrefix + "FromDate", EntityOperator.LESS_THAN, this.nowTimestamp));
-                incExcCondList.add(new EntityExpr(featurePrefix + "ProductFeatureId", EntityOperator.EQUALS, includeFeatureId));
+            if (includeCategoryIds.size() > 0) {
+                Iterator includeCategoryIdIter = includeCategoryIds.iterator();
+                while (includeCategoryIdIter.hasNext()) {
+                    String includeCategoryId = (String) includeCategoryIdIter.next();
+                    String categoryPrefix = "pcm" + this.index;
+                    String entityAlias = "PCM" + this.index;
+                    this.index++;
+
+                    this.dynamicViewEntity.addMemberEntity(entityAlias, "ProductCategoryMember");
+                    this.dynamicViewEntity.addAlias(entityAlias, categoryPrefix + "ProductCategoryId", "productCategoryId", null, null, null, null);
+                    this.dynamicViewEntity.addAlias(entityAlias, categoryPrefix + "FromDate", "fromDate", null, null, null, null);
+                    this.dynamicViewEntity.addAlias(entityAlias, categoryPrefix + "ThruDate", "thruDate", null, null, null, null);
+                    this.dynamicViewEntity.addViewLink("PROD", entityAlias, Boolean.FALSE, ModelKeyMap.makeKeyMapList("productId"));
+                    incExcCondList.add(new EntityExpr(new EntityExpr(categoryPrefix + "ThruDate", EntityOperator.EQUALS, null), EntityOperator.OR, new EntityExpr(categoryPrefix + "ThruDate", EntityOperator.GREATER_THAN, this.nowTimestamp)));
+                    incExcCondList.add(new EntityExpr(categoryPrefix + "FromDate", EntityOperator.LESS_THAN, this.nowTimestamp));
+                    incExcCondList.add(new EntityExpr(categoryPrefix + "ProductCategoryId", EntityOperator.EQUALS, includeCategoryId));
+                }
+            }
+            if (includeFeatureIds.size() > 0) {
+                Iterator includeFeatureIdIter = includeFeatureIds.iterator();
+                while (includeFeatureIdIter.hasNext()) {
+                    String includeFeatureId = (String) includeFeatureIdIter.next();
+                    String featurePrefix = "pfa" + this.index;
+                    String entityAlias = "PFA" + this.index;
+                    this.index++;
+
+                    this.dynamicViewEntity.addMemberEntity(entityAlias, "ProductFeatureAppl");
+                    this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "ProductFeatureId", "productFeatureId", null, null, null, null);
+                    this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "FromDate", "fromDate", null, null, null, null);
+                    this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "ThruDate", "thruDate", null, null, null, null);
+                    this.dynamicViewEntity.addViewLink("PROD", entityAlias, Boolean.FALSE, ModelKeyMap.makeKeyMapList("productId"));
+                    incExcCondList.add(new EntityExpr(new EntityExpr(featurePrefix + "ThruDate", EntityOperator.EQUALS, null), EntityOperator.OR, new EntityExpr(featurePrefix + "ThruDate", EntityOperator.GREATER_THAN, this.nowTimestamp)));
+                    incExcCondList.add(new EntityExpr(featurePrefix + "FromDate", EntityOperator.LESS_THAN, this.nowTimestamp));
+                    incExcCondList.add(new EntityExpr(featurePrefix + "ProductFeatureId", EntityOperator.EQUALS, includeFeatureId));
+                }
             }
             
-            
-            if (excludeCategoryIds.size() != 0) {
+            if (excludeCategoryIds.size() > 0) {
                 String categoryPrefix = "pcm" + this.index;
                 String entityAlias = "PCM" + this.index;
                 this.index++;
@@ -390,7 +397,7 @@
                 incExcCondList.add(new EntityExpr(categoryPrefix + "FromDate", EntityOperator.LESS_THAN, this.nowTimestamp));
                 incExcCondList.add(new EntityExpr(categoryPrefix + "ProductCategoryId", EntityOperator.NOT_IN, excludeCategoryIds)); 
             }
-            if (excludeFeatureIds.size() != 0) {
+            if (excludeFeatureIds.size() > 0) {
                 String featurePrefix = "pfa" + this.index;
                 String entityAlias = "PFA" + this.index;
                 this.index++;
@@ -405,7 +412,7 @@
                 incExcCondList.add(new EntityExpr(featurePrefix + "ProductFeatureId", EntityOperator.NOT_IN, excludeFeatureIds)); 
             }
             
-            if (alwaysIncludeCategoryIds.size() != 0) {
+            if (alwaysIncludeCategoryIds.size() > 0) {
                 String categoryPrefix = "pcm" + this.index;
                 String entityAlias = "PCM" + this.index;
                 this.index++;
@@ -419,7 +426,7 @@
                 alwIncCondList.add(new EntityExpr(categoryPrefix + "FromDate", EntityOperator.LESS_THAN, this.nowTimestamp));
                 alwIncCondList.add(new EntityExpr(categoryPrefix + "ProductCategoryId", EntityOperator.IN, alwaysIncludeCategoryIds)); 
             }
-            if (alwaysIncludeFeatureIds.size() != 0) {
+            if (alwaysIncludeFeatureIds.size() > 0) {
                 String featurePrefix = "pfa" + this.index;
                 String entityAlias = "PFA" + this.index;
                 this.index++;
@@ -435,39 +442,79 @@
             }
 
             // handle includeFeatureIdOrSetAndList and alwaysIncludeFeatureIdOrSetAndList
-            
-            Iterator includeFeatureIdOrSetAndIter = includeFeatureIdOrSetAndList.iterator();
-            while (includeFeatureIdOrSetAndIter.hasNext()) {
-                Set includeFeatureIdOrSet = (Set) includeFeatureIdOrSetAndIter.next();
-                String featurePrefix = "pfa" + this.index;
-                String entityAlias = "PFA" + this.index;
-                this.index++;
-
-                this.dynamicViewEntity.addMemberEntity(entityAlias, "ProductFeatureAppl");
-                this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "ProductFeatureId", "productFeatureId", null, null, null, null);
-                this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "FromDate", "fromDate", null, null, null, null);
-                this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "ThruDate", "thruDate", null, null, null, null);
-                this.dynamicViewEntity.addViewLink("PROD", entityAlias, Boolean.FALSE, ModelKeyMap.makeKeyMapList("productId"));
-                incExcCondList.add(new EntityExpr(new EntityExpr(featurePrefix + "ThruDate", EntityOperator.EQUALS, null), EntityOperator.OR, new EntityExpr(featurePrefix + "ThruDate", EntityOperator.GREATER_THAN, this.nowTimestamp)));
-                incExcCondList.add(new EntityExpr(featurePrefix + "FromDate", EntityOperator.LESS_THAN, this.nowTimestamp));
-                incExcCondList.add(new EntityExpr(featurePrefix + "ProductFeatureId", EntityOperator.EQUALS, includeFeatureIdOrSet));
-            }
-
-            Iterator alwaysIncludeFeatureIdOrSetAndIter = alwaysIncludeFeatureIdOrSetAndList.iterator();
-            while (alwaysIncludeFeatureIdOrSetAndIter.hasNext()) {
-                Set alwaysIncludeFeatureIdOrSet = (Set) alwaysIncludeFeatureIdOrSetAndIter.next();
-                String featurePrefix = "pfa" + this.index;
-                String entityAlias = "PFA" + this.index;
-                this.index++;
-
-                this.dynamicViewEntity.addMemberEntity(entityAlias, "ProductFeatureAppl");
-                this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "ProductFeatureId", "productFeatureId", null, null, null, null);
-                this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "FromDate", "fromDate", null, null, null, null);
-                this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "ThruDate", "thruDate", null, null, null, null);
-                this.dynamicViewEntity.addViewLink("PROD", entityAlias, Boolean.FALSE, ModelKeyMap.makeKeyMapList("productId"));
-                alwIncCondList.add(new EntityExpr(new EntityExpr(featurePrefix + "ThruDate", EntityOperator.EQUALS, null), EntityOperator.OR, new EntityExpr(featurePrefix + "ThruDate", EntityOperator.GREATER_THAN, this.nowTimestamp)));
-                alwIncCondList.add(new EntityExpr(featurePrefix + "FromDate", EntityOperator.LESS_THAN, this.nowTimestamp));
-                alwIncCondList.add(new EntityExpr(featurePrefix + "ProductFeatureId", EntityOperator.EQUALS, alwaysIncludeFeatureIdOrSet));
+            if (includeFeatureIdOrSetAndList.size() > 0) {
+                Iterator includeFeatureIdOrSetAndIter = includeFeatureIdOrSetAndList.iterator();
+                while (includeFeatureIdOrSetAndIter.hasNext()) {
+                    Set includeFeatureIdOrSet = (Set) includeFeatureIdOrSetAndIter.next();
+                    String featurePrefix = "pfa" + this.index;
+                    String entityAlias = "PFA" + this.index;
+                    this.index++;
+
+                    this.dynamicViewEntity.addMemberEntity(entityAlias, "ProductFeatureAppl");
+                    this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "ProductFeatureId", "productFeatureId", null, null, null, null);
+                    this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "FromDate", "fromDate", null, null, null, null);
+                    this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "ThruDate", "thruDate", null, null, null, null);
+                    this.dynamicViewEntity.addViewLink("PROD", entityAlias, Boolean.FALSE, ModelKeyMap.makeKeyMapList("productId"));
+                    incExcCondList.add(new EntityExpr(new EntityExpr(featurePrefix + "ThruDate", EntityOperator.EQUALS, null), EntityOperator.OR, new EntityExpr(featurePrefix + "ThruDate", EntityOperator.GREATER_THAN, this.nowTimestamp)));
+                    incExcCondList.add(new EntityExpr(featurePrefix + "FromDate", EntityOperator.LESS_THAN, this.nowTimestamp));
+                    incExcCondList.add(new EntityExpr(featurePrefix + "ProductFeatureId", EntityOperator.IN, includeFeatureIdOrSet));
+                }
+            }
+            if (alwaysIncludeFeatureIdOrSetAndList.size() > 0) {
+                Iterator alwaysIncludeFeatureIdOrSetAndIter = alwaysIncludeFeatureIdOrSetAndList.iterator();
+                while (alwaysIncludeFeatureIdOrSetAndIter.hasNext()) {
+                    Set alwaysIncludeFeatureIdOrSet = (Set) alwaysIncludeFeatureIdOrSetAndIter.next();
+                    String featurePrefix = "pfa" + this.index;
+                    String entityAlias = "PFA" + this.index;
+                    this.index++;
+
+                    this.dynamicViewEntity.addMemberEntity(entityAlias, "ProductFeatureAppl");
+                    this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "ProductFeatureId", "productFeatureId", null, null, null, null);
+                    this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "FromDate", "fromDate", null, null, null, null);
+                    this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "ThruDate", "thruDate", null, null, null, null);
+                    this.dynamicViewEntity.addViewLink("PROD", entityAlias, Boolean.FALSE, ModelKeyMap.makeKeyMapList("productId"));
+                    alwIncCondList.add(new EntityExpr(new EntityExpr(featurePrefix + "ThruDate", EntityOperator.EQUALS, null), EntityOperator.OR, new EntityExpr(featurePrefix + "ThruDate", EntityOperator.GREATER_THAN, this.nowTimestamp)));
+                    alwIncCondList.add(new EntityExpr(featurePrefix + "FromDate", EntityOperator.LESS_THAN, this.nowTimestamp));
+                    alwIncCondList.add(new EntityExpr(featurePrefix + "ProductFeatureId", EntityOperator.IN, alwaysIncludeFeatureIdOrSet));
+                }
+            }
+
+            // handle includeCategoryIdOrSetAndList and alwaysIncludeCategoryIdOrSetAndList
+            if (includeCategoryIdOrSetAndList.size() > 0) {
+                Iterator includeCategoryIdOrSetAndIter = includeCategoryIdOrSetAndList.iterator();
+                while (includeCategoryIdOrSetAndIter.hasNext()) {
+                    Set includeCategoryIdOrSet = (Set) includeCategoryIdOrSetAndIter.next();
+                    String categoryPrefix = "pcm" + this.index;
+                    String entityAlias = "PCM" + this.index;
+                    this.index++;
+
+                    this.dynamicViewEntity.addMemberEntity(entityAlias, "ProductCategoryMember");
+                    this.dynamicViewEntity.addAlias(entityAlias, categoryPrefix + "ProductCategoryId", "productCategoryId", null, null, null, null);
+                    this.dynamicViewEntity.addAlias(entityAlias, categoryPrefix + "FromDate", "fromDate", null, null, null, null);
+                    this.dynamicViewEntity.addAlias(entityAlias, categoryPrefix + "ThruDate", "thruDate", null, null, null, null);
+                    this.dynamicViewEntity.addViewLink("PROD", entityAlias, Boolean.FALSE, ModelKeyMap.makeKeyMapList("productId"));
+                    incExcCondList.add(new EntityExpr(new EntityExpr(categoryPrefix + "ThruDate", EntityOperator.EQUALS, null), EntityOperator.OR, new EntityExpr(categoryPrefix + "ThruDate", EntityOperator.GREATER_THAN, this.nowTimestamp)));
+                    incExcCondList.add(new EntityExpr(categoryPrefix + "FromDate", EntityOperator.LESS_THAN, this.nowTimestamp));
+                    incExcCondList.add(new EntityExpr(categoryPrefix + "ProductCategoryId", EntityOperator.IN, includeCategoryIdOrSet));
+                }
+            }
+            if (alwaysIncludeCategoryIdOrSetAndList.size() > 0) {
+                Iterator alwaysIncludeCategoryIdOrSetAndIter = alwaysIncludeCategoryIdOrSetAndList.iterator();
+                while (alwaysIncludeCategoryIdOrSetAndIter.hasNext()) {
+                    Set alwaysIncludeCategoryIdOrSet = (Set) alwaysIncludeCategoryIdOrSetAndIter.next();
+                    String categoryPrefix = "pcm" + this.index;
+                    String entityAlias = "PCM" + this.index;
+                    this.index++;
+
+                    this.dynamicViewEntity.addMemberEntity(entityAlias, "ProductCategoryMember");
+                    this.dynamicViewEntity.addAlias(entityAlias, categoryPrefix + "ProductCategoryId", "productCategoryId", null, null, null, null);
+                    this.dynamicViewEntity.addAlias(entityAlias, categoryPrefix + "FromDate", "fromDate", null, null, null, null);
+                    this.dynamicViewEntity.addAlias(entityAlias, categoryPrefix + "ThruDate", "thruDate", null, null, null, null);
+                    this.dynamicViewEntity.addViewLink("PROD", entityAlias, Boolean.FALSE, ModelKeyMap.makeKeyMapList("productId"));
+                    alwIncCondList.add(new EntityExpr(new EntityExpr(categoryPrefix + "ThruDate", EntityOperator.EQUALS, null), EntityOperator.OR, new EntityExpr(categoryPrefix + "ThruDate", EntityOperator.GREATER_THAN, this.nowTimestamp)));
+                    alwIncCondList.add(new EntityExpr(categoryPrefix + "FromDate", EntityOperator.LESS_THAN, this.nowTimestamp));
+                    alwIncCondList.add(new EntityExpr(categoryPrefix + "ProductCategoryId", EntityOperator.IN, alwaysIncludeCategoryIdOrSet));
+                }
             }
 
             if (incExcCondList.size() > 0) {
@@ -779,24 +826,21 @@
         }
 
         public void addConstraint(ProductSearchContext productSearchContext) {
-            List productCategoryIdList = null;
+            Set productCategoryIdSet = FastSet.newInstance();
             if (includeSubCategories) {
                 // find all sub-categories recursively, make a Set of productCategoryId
-                Set productCategoryIdSet = FastSet.newInstance();
                 ProductSearch.getAllSubCategoryIds(productCategoryId, productCategoryIdSet, productSearchContext.getDelegator(), productSearchContext.nowTimestamp);
-                productCategoryIdList = FastList.newInstance();
-                productCategoryIdList.addAll(productCategoryIdSet);
             } else {
-                productCategoryIdList = UtilMisc.toList(productCategoryId);
+                productCategoryIdSet.add(productCategoryId);
             }
 
             // just add to global sets
             if (exclude == null) {
-                productSearchContext.includeCategoryIds.addAll(productCategoryIdList);
+                productSearchContext.includeCategoryIdOrSetAndList.add(productCategoryIdSet);
             } else if (exclude.equals(Boolean.TRUE)) {
-                productSearchContext.excludeCategoryIds.addAll(productCategoryIdList);
+                productSearchContext.excludeCategoryIds.addAll(productCategoryIdSet);
             } else if (exclude.equals(Boolean.FALSE)) {
-                productSearchContext.alwaysIncludeCategoryIds.addAll(productCategoryIdList);
+                productSearchContext.alwaysIncludeCategoryIdOrSetAndList.add(productCategoryIdSet);
             }
             
             // add in productSearchConstraint, don't worry about the productSearchResultId or constraintSeqId, those will be fill in later