📄 productsearch.java
字号:
// make index based values and increment
String entityAlias = "PK" + index;
String prefix = "pk" + index;
index++;
dynamicViewEntity.addMemberEntity(entityAlias, "ProductKeyword");
dynamicViewEntity.addAlias(entityAlias, prefix + "Keyword", "keyword", null, null, null, null);
dynamicViewEntity.addViewLink("PROD", entityAlias, Boolean.FALSE, ModelKeyMap.makeKeyMapList("productId"));
List keywordOrList = new LinkedList();
Iterator keywordIter = keywordFixedOrSet.iterator();
while (keywordIter.hasNext()) {
String keyword = (String) keywordIter.next();
keywordOrList.add(new EntityExpr(prefix + "Keyword", EntityOperator.LIKE, keyword));
}
entityConditionList.add(new EntityConditionList(keywordOrList, EntityOperator.OR));
productIdGroupBy = true;
if (doingBothAndOr) {
relevancyComplexAlias.addComplexAliasMember(new ComplexAliasField(entityAlias, "relevancyWeight", "sum"));
} else {
dynamicViewEntity.addAlias(entityAlias, "totalRelevancy", "relevancyWeight", null, null, null, "sum");
}
}
}
if (doingBothAndOr) {
dynamicViewEntity.addAlias(null, "totalRelevancy", null, null, null, null, null, relevancyComplexAlias);
}
}
public EntityListIterator doQuery(GenericDelegator delegator) {
// handle the now assembled or and and keyword fixed lists
this.finishKeywordConstraints();
if (resultSortOrder != null) {
resultSortOrder.setSortOrder(this);
}
dynamicViewEntity.addAlias("PROD", "productId", null, null, null, new Boolean(productIdGroupBy), null);
EntityCondition whereCondition = new EntityConditionList(entityConditionList, EntityOperator.AND);
EntityFindOptions efo = new EntityFindOptions();
efo.setDistinct(true);
efo.setResultSetType(EntityFindOptions.TYPE_SCROLL_INSENSITIVE);
EntityListIterator eli = null;
try {
eli = delegator.findListIteratorByCondition(dynamicViewEntity, whereCondition, null, fieldsToSelect, orderByList, efo);
} catch (GenericEntityException e) {
Debug.logError(e, "Error in product search", module);
return null;
}
return eli;
}
public ArrayList makeProductIdList(EntityListIterator eli) {
ArrayList productIds = new ArrayList(maxResults == null ? 100 : maxResults.intValue());
if (eli == null) {
Debug.logWarning("The eli is null, returning zero results", module);
return productIds;
}
try {
boolean hasResults = false;
Object initialResult = null;
/* this method has been replaced by the following to address issue with SAP DB and possibly other DBs
if (resultOffset != null) {
Debug.logInfo("Before relative, current index=" + eli.currentIndex(), module);
hasResults = eli.relative(resultOffset.intValue());
} else {
initialResult = eli.next();
if (initialResult != null) {
hasResults = true;
}
}
*/
initialResult = eli.next();
if (initialResult != null) {
hasResults = true;
}
if (resultOffset != null && resultOffset.intValue() > 1) {
Debug.logInfo("Before relative, current index=" + eli.currentIndex(), module);
hasResults = eli.relative(resultOffset.intValue() - 1);
initialResult = null;
}
// get the first as the current one
GenericValue searchResult = null;
if (hasResults) {
if (initialResult != null) {
searchResult = (GenericValue) initialResult;
} else {
searchResult = eli.currentGenericValue();
}
}
if (searchResult == null) {
// nothing to get...
int failTotal = 0;
if (this.resultOffset != null) {
failTotal = this.resultOffset.intValue() - 1;
}
this.totalResults = new Integer(failTotal);
return productIds;
}
productIds.add(searchResult.getString("productId"));
// init numRetreived to one since we have already grabbed the initial one
int numRetreived = 1;
int duplicatesFound = 0;
Set productIdSet = new HashSet();
while (((searchResult = (GenericValue) eli.next()) != null) && (maxResults == null || numRetreived < maxResults.intValue())) {
String productId = searchResult.getString("productId");
if (!productIdSet.contains(productId)) {
productIds.add(productId);
productIdSet.add(productId);
numRetreived++;
} else {
duplicatesFound++;
}
/*
StringBuffer lineMsg = new StringBuffer("Got search result line: ");
Iterator fieldsToSelectIter = fieldsToSelect.iterator();
while (fieldsToSelectIter.hasNext()) {
String fieldName = (String) fieldsToSelectIter.next();
lineMsg.append(fieldName);
lineMsg.append("=");
lineMsg.append(searchResult.get(fieldName));
if (fieldsToSelectIter.hasNext()) {
lineMsg.append(", ");
}
}
Debug.logInfo(lineMsg.toString(), module);
*/
}
if (searchResult != null) {
// we weren't at the end, so go to the end and get the index
//Debug.logInfo("Getting totalResults from ending index - before last() currentIndex=" + eli.currentIndex(), module);
if (eli.last()) {
this.totalResults = new Integer(eli.currentIndex());
//Debug.logInfo("Getting totalResults from ending index - after last() currentIndex=" + eli.currentIndex(), module);
}
}
if (this.totalResults == null || this.totalResults.intValue() == 0) {
int total = numRetreived;
if (this.resultOffset != null) {
total += (this.resultOffset.intValue() - 1);
}
this.totalResults = new Integer(total);
}
Debug.logInfo("Got search values, numRetreived=" + numRetreived + ", totalResults=" + totalResults + ", maxResults=" + maxResults + ", resultOffset=" + resultOffset + ", duplicatesFound(in the current results)=" + duplicatesFound, module);
} catch (GenericEntityException e) {
Debug.logError(e, "Error getting results from the product search query", module);
}
return productIds;
}
public void saveSearchResultInfo(Long numResults, Double secondsTotal) {
// uses entities: ProductSearchResult and ProductSearchConstraint
try {
// make sure this is in a transaction
boolean beganTransaction = TransactionUtil.begin();
try {
GenericValue productSearchResult = delegator.makeValue("ProductSearchResult", null);
Long nextPkrSeqId = delegator.getNextSeqId("ProductSearchResult");
String productSearchResultId = nextPkrSeqId.toString();
productSearchResult.set("productSearchResultId", productSearchResultId);
productSearchResult.set("visitId", this.visitId);
productSearchResult.set("orderByName", this.resultSortOrder.getOrderName());
productSearchResult.set("isAscending", this.resultSortOrder.isAscending() ? "Y" : "N");
productSearchResult.set("numResults", numResults);
productSearchResult.set("secondsTotal", secondsTotal);
productSearchResult.set("searchDate", nowTimestamp);
productSearchResult.create();
Iterator productSearchConstraintIter = productSearchConstraintList.iterator();
int seqId = 1;
while (productSearchConstraintIter.hasNext()) {
GenericValue productSearchConstraint = (GenericValue) productSearchConstraintIter.next();
productSearchConstraint.set("productSearchResultId", productSearchResultId);
productSearchConstraint.set("constraintSeqId", Integer.toString(seqId));
productSearchConstraint.create();
seqId++;
}
TransactionUtil.commit(beganTransaction);
} catch (GenericEntityException e1) {
TransactionUtil.rollback(beganTransaction);
Debug.logError(e1, "Error saving product search result info/stats", module);
}
} catch (GenericTransactionException e) {
Debug.logError(e, "Error saving product search result info/stats", module);
}
}
}
// ======================================================================
// Search Constraint Classes
// ======================================================================
public static abstract class ProductSearchConstraint {
public ProductSearchConstraint() { }
public abstract void addConstraint(ProductSearchContext productSearchContext);
/** pretty print for log messages and even UI stuff */
public abstract String prettyPrintConstraint(GenericDelegator delegator, boolean detailed);
}
public static class CategoryConstraint extends ProductSearchConstraint {
public static final String constraintName = "Category";
protected String productCategoryId;
protected boolean includeSubCategories;
public CategoryConstraint(String productCategoryId, boolean includeSubCategories) {
this.productCategoryId = productCategoryId;
this.includeSubCategories = includeSubCategories;
}
public void addConstraint(ProductSearchContext productSearchContext) {
List productCategoryIdList = null;
if (includeSubCategories) {
// find all sub-categories recursively, make a Set of productCategoryId
Set productCategoryIdSet = new HashSet();
ProductSearch.getAllSubCategoryIds(productCategoryId, productCategoryIdSet, productSearchContext.getDelegator(), productSearchContext.nowTimestamp);
productCategoryIdList = new ArrayList(productCategoryIdSet);
} else {
productCategoryIdList = UtilMisc.toList(productCategoryId);
}
// make index based values and increment
String entityAlias = "PCM" + productSearchContext.index;
String prefix = "pcm" + productSearchContext.index;
productSearchContext.index++;
productSearchContext.dynamicViewEntity.addMemberEntity(entityAlias, "ProductCategoryMember");
productSearchContext.dynamicViewEntity.addAlias(entityAlias, prefix + "ProductCategoryId", "productCategoryId", null, null, null, null);
productSearchContext.dynamicViewEntity.addAlias(entityAlias, prefix + "FromDate", "fromDate", null, null, null, null);
productSearchContext.dynamicViewEntity.addAlias(entityAlias, prefix + "ThruDate", "thruDate", null, null, null, null);
productSearchContext.dynamicViewEntity.addViewLink("PROD", entityAlias, Boolean.FALSE, ModelKeyMap.makeKeyMapList("productId"));
productSearchContext.entityConditionList.add(new EntityExpr(prefix + "ProductCategoryId", EntityOperator.IN, productCategoryIdList));
productSearchContext.entityConditionList.add(new EntityExpr(new EntityExpr(prefix + "ThruDate", EntityOperator.EQUALS, null), EntityOperator.OR, new EntityExpr(prefix + "ThruDate", EntityOperator.GREATER_THAN, productSearchContext.nowTimestamp)));
productSearchContext.entityConditionList.add(new EntityExpr(prefix + "FromDate", EntityOperator.LESS_THAN, productSearchContext.nowTimestamp));
// add in productSearchConstraint, don't worry about the productSearchResultId or constraintSeqId, those will be fill in later
productSearchContext.productSearchConstraintList.add(productSearchContext.getDelegator().makeValue("ProductSearchConstraint", UtilMisc.toMap("constraintName", constraintName, "infoString", this.productCategoryId, "includeSubCategories", this.includeSubCategories ? "Y" : "N")));
}
/** pretty print for log messages and even UI stuff */
public String prettyPrintConstraint(GenericDelegator delegator, boolean detailed) {
GenericValue productCategory = null;
try {
productCategory = delegator.findByPrimaryKeyCache("ProductCategory", UtilMisc.toMap("productCategoryId", productCategoryId));
} catch (GenericEntityException e) {
Debug.logError(e, "Error finding ProductCategory information for constraint pretty print", module);
}
StringBuffer ppBuf = new StringBuffer();
ppBuf.append("Category: ");
if (productCategory != null) {
ppBuf.append(productCategory.getString("description"));
}
if (productCategory == null || detailed) {
ppBuf.append(" [");
ppBuf.append(productCategoryId);
ppBuf.append("]");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -