Author: ashish
Date: Fri Jan  8 11:33:19 2010
New Revision: 897170

URL: http://svn.apache.org/viewvc?rev=897170&view=rev
Log:
Applied patch from jira issue -  OFBIZ-3397-  Advance Search should also 
support the feature base sorting.
User should be able to sort on SIZE and COLORS kind of features associated with 
Products. This sort will be additional sort with ProductFields and 
ProductPrice. Here we need to add the additional sort not to change the 
existing.
This will be achieve in the similar manner the ProductPrice in the 
ProductSearch.java and ProductSearchSession.java.

Thanks Deepak & Rishi for the contribution.

Modified:
    
ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/actions/entry/catalog/AdvancedSearchOptions.groovy
    
ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearch.java
    
ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearchSession.java
    
ofbiz/trunk/specialpurpose/ecommerce/webapp/ecommerce/catalog/advancedsearch.ftl

Modified: 
ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/actions/entry/catalog/AdvancedSearchOptions.groovy
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/actions/entry/catalog/AdvancedSearchOptions.groovy?rev=897170&r1=897169&r2=897170&view=diff
==============================================================================
--- 
ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/actions/entry/catalog/AdvancedSearchOptions.groovy
 (original)
+++ 
ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/actions/entry/catalog/AdvancedSearchOptions.groovy
 Fri Jan  8 11:33:19 2010
@@ -26,6 +26,8 @@
 import org.ofbiz.product.catalog.*;
 import org.ofbiz.product.feature.*;
 import org.ofbiz.product.product.*;
+import org.ofbiz.entity.condition.EntityCondition;
+import org.ofbiz.entity.condition.EntityOperator;
 
 searchCategoryId = parameters.SEARCH_CATEGORY_ID;
 if (!searchCategoryId) {
@@ -36,6 +38,9 @@
 
 productFeaturesByTypeMap = 
ParametricSearch.makeCategoryFeatureLists(searchCategoryId, delegator);
 productFeatureTypeIdsOrdered = new TreeSet(productFeaturesByTypeMap.keySet()) 
as List;
+if(productFeatureTypeIdsOrdered) {
+    context.productFeatureTypes = delegator.findList("ProductFeatureType", 
EntityCondition.makeCondition("productFeatureTypeId", EntityOperator.IN, 
productFeatureTypeIdsOrdered), null, null, null, false);
+}
 
 searchOperator = parameters.SEARCH_OPERATOR;
 if (!"AND".equals(searchOperator) && !"OR".equals(searchOperator)) {

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?rev=897170&r1=897169&r2=897170&view=diff
==============================================================================
--- 
ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearch.java
 (original)
+++ 
ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearch.java
 Fri Jan  8 11:33:19 2010
@@ -2094,6 +2094,55 @@
         }
     }
 
+    public static class SortProductFeature extends ResultSortOrder {
+        protected String productFeatureTypeId;
+        protected boolean ascending;
+
+        public SortProductFeature(String productFeatureTypeId, boolean 
ascending) {
+            this.productFeatureTypeId = productFeatureTypeId;
+            this.ascending = ascending;
+        }
+
+        @Override
+        public void setSortOrder(ProductSearchContext productSearchContext) {
+            productSearchContext.dynamicViewEntity.addMemberEntity("PFAPPL", 
"ProductFeatureAndAppl");
+            productSearchContext.dynamicViewEntity.addAlias("PFAPPL", 
"sortProductFeatureTypeId", "productFeatureTypeId", null, null, null, null);
+            productSearchContext.dynamicViewEntity.addAlias("PFAPPL", 
"sortProductFeatureId", "productFeatureId", null, null, null, null);
+            productSearchContext.dynamicViewEntity.addAlias("PFAPPL", 
"sortFromDate", "fromDate", null, null, null, null);
+            productSearchContext.dynamicViewEntity.addAlias("PFAPPL", 
"sortThruDate", "thruDate", null, null, null, null);
+            productSearchContext.dynamicViewEntity.addViewLink("PROD", 
"PFAPPL", Boolean.TRUE, UtilMisc.toList(new ModelKeyMap("productId", 
"productId")));
+            
productSearchContext.entityConditionList.add(EntityCondition.makeCondition("sortProductFeatureTypeId",
 EntityOperator.EQUALS, this.productFeatureTypeId));
+            
productSearchContext.entityConditionList.add(EntityCondition.makeCondition("sortFromDate",
 EntityOperator.LESS_THAN_EQUAL_TO, productSearchContext.nowTimestamp));
+            
productSearchContext.entityConditionList.add(EntityCondition.makeCondition(
+                    EntityCondition.makeCondition("sortThruDate", 
EntityOperator.EQUALS, null), EntityOperator.OR,
+                    EntityCondition.makeCondition("sortThruDate", 
EntityOperator.GREATER_THAN_EQUAL_TO, productSearchContext.nowTimestamp)));
+            if (ascending) {
+                productSearchContext.orderByList.add("+sortProductFeatureId");
+            } else {
+                productSearchContext.orderByList.add("-sortProductFeatureId");
+            }
+            productSearchContext.fieldsToSelect.add("sortProductFeatureId");
+        }
+
+        @Override
+        public String getOrderName() {
+            return "ProductFeature:" + this.productFeatureTypeId;
+        }
+
+        @Override
+        public String prettyPrintSortOrder(boolean detailed, Locale locale) {
+            String featureTypeName = null;
+            if (this.productFeatureTypeId != null) {
+                featureTypeName = this.productFeatureTypeId;
+            }
+            return featureTypeName;
+        }
+
+        @Override
+        public boolean isAscending() {
+            return this.ascending;
+        }
+    }
     /** A rather large and verbose method that doesn't use the cool constraint 
and sort order objects */
     /*
     public static ArrayList parametricKeywordSearchStandAlone(Set 
featureIdSet, String keywordsString, Delegator delegator, String 
productCategoryId, boolean includeSubCategories, String visitId, boolean 
anyPrefix, boolean anySuffix, boolean isAnd) {

Modified: 
ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearchSession.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearchSession.java?rev=897170&r1=897169&r2=897170&view=diff
==============================================================================
--- 
ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearchSession.java
 (original)
+++ 
ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearchSession.java
 Fri Jan  8 11:33:19 2010
@@ -828,6 +828,12 @@
             } else if (sortOrder.startsWith("SPP:")) {
                 String priceTypeId = sortOrder.substring("SPP:".length());
                 searchSetSortOrder(new 
ProductSearch.SortProductPrice(priceTypeId, ascending), session);
+            } else if (sortOrder.startsWith("SortProductFeature:")) {
+                String featureId = 
sortOrder.substring("SortProductFeature:".length());
+                searchSetSortOrder(new 
ProductSearch.SortProductFeature(featureId, ascending), session);
+            } else if (sortOrder.startsWith("SPFT:")) {
+                String priceTypeId = sortOrder.substring("SPFT:".length());
+                searchSetSortOrder(new 
ProductSearch.SortProductPrice(priceTypeId, ascending), session);
             }
         }
 
@@ -1151,6 +1157,10 @@
                 ProductSearch.SortProductPrice spp = 
(ProductSearch.SortProductPrice) resultSortOrder;
                 searchParamString.append("&S_O=SPP:");
                 searchParamString.append(spp.productPriceTypeId);
+            } else if (resultSortOrder instanceof 
ProductSearch.SortProductFeature) {
+                ProductSearch.SortProductFeature spf = 
(ProductSearch.SortProductFeature) resultSortOrder;
+                searchParamString.append("&S_O=SPFT:");
+                searchParamString.append(spf.productFeatureTypeId);
             }
             searchParamString.append("&S_A=");
             searchParamString.append(resultSortOrder.isAscending() ? "Y" : 
"N");

Modified: 
ofbiz/trunk/specialpurpose/ecommerce/webapp/ecommerce/catalog/advancedsearch.ftl
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/ecommerce/webapp/ecommerce/catalog/advancedsearch.ftl?rev=897170&r1=897169&r2=897170&view=diff
==============================================================================
--- 
ofbiz/trunk/specialpurpose/ecommerce/webapp/ecommerce/catalog/advancedsearch.ftl
 (original)
+++ 
ofbiz/trunk/specialpurpose/ecommerce/webapp/ecommerce/catalog/advancedsearch.ftl
 Fri Jan  8 11:33:19 2010
@@ -73,6 +73,11 @@
             <option 
value="SortProductField:averageCustomerRating">${uiLabelMap.ProductCustomerRating}</option>
             <option 
value="SortProductPrice:LIST_PRICE">${uiLabelMap.ProductListPrice}</option>
             <option 
value="SortProductPrice:DEFAULT_PRICE">${uiLabelMap.ProductDefaultPrice}</option>
+            <#if productFeatureTypes?exists && productFeatureTypes?has_content>
+              <#list productFeatureTypes as productFeatureType>
+                <option 
value="SortProductFeature:${productFeatureType.productFeatureTypeId}">${productFeatureType.description?default(productFeatureType.productFeatureTypeId)}</option>
+              </#list>
+            </#if>
           </select>
           ${uiLabelMap.EcommerceLowToHigh} <input type="radio" 
name="sortAscending" value="Y" checked="checked"/>
           ${uiLabelMap.EcommerceHighToLow} <input type="radio" 
name="sortAscending" value="N"/>


Reply via email to