Authored by hugufei

移包

@@ -7,8 +7,8 @@ import com.yoho.search.base.utils.ProductIndexEsField; @@ -7,8 +7,8 @@ import com.yoho.search.base.utils.ProductIndexEsField;
7 import com.yoho.search.core.es.model.SearchParam; 7 import com.yoho.search.core.es.model.SearchParam;
8 import com.yoho.search.core.es.model.SearchResult; 8 import com.yoho.search.core.es.model.SearchResult;
9 import com.yoho.search.models.SearchApiResult; 9 import com.yoho.search.models.SearchApiResult;
10 -import com.yoho.search.recall.scene.beans.CacheRecallSknRequestResponseBean;  
11 -import com.yoho.search.recall.scene.beans.CacheSknInfoRequestResponseBean; 10 +import com.yoho.search.recall.scene.cache.beans.CacheRecallSknRequestResponseBean;
  11 +import com.yoho.search.recall.scene.cache.beans.CacheSknInfoRequestResponseBean;
12 import com.yoho.search.recall.scene.strategy.helper.SortBuilderHelper; 12 import com.yoho.search.recall.scene.strategy.helper.SortBuilderHelper;
13 import com.yoho.search.recall.scene.models.*; 13 import com.yoho.search.recall.scene.models.*;
14 import com.yoho.search.recall.scene.builder.request.RecallParamsBuilder; 14 import com.yoho.search.recall.scene.builder.request.RecallParamsBuilder;
@@ -31,9 +31,11 @@ public class RecallParamsBuilder { @@ -31,9 +31,11 @@ public class RecallParamsBuilder {
31 List<String> firstProductSkns = recallServiceHelper.getFirstProductSkns(paramMap); 31 List<String> firstProductSkns = recallServiceHelper.getFirstProductSkns(paramMap);
32 32
33 //3、获取uid或udid 33 //3、获取uid或udid
34 - int uid = MapUtils.getIntValue(paramMap, "uid", 1); 34 + int uid = MapUtils.getIntValue(paramMap, "uid", 0);
35 String udid = MapUtils.getString(paramMap, "udid", ""); 35 String udid = MapUtils.getString(paramMap, "udid", "");
36 - 36 + if(uid==0){
  37 + uid = (int)(Math.random() * Integer.MAX_VALUE);
  38 + }
37 return new RecallSknParams(queryFilter,pageSize, firstProductSkns , uid, udid); 39 return new RecallSknParams(queryFilter,pageSize, firstProductSkns , uid, udid);
38 } 40 }
39 } 41 }
1 package com.yoho.search.recall.scene.builder.response; 1 package com.yoho.search.recall.scene.builder.response;
2 2
3 -import com.yoho.search.recall.scene.beans.CacheRecallRequestResponse; 3 +import com.yoho.search.recall.scene.cache.beans.CacheRecallRequestResponse;
4 import com.yoho.search.recall.scene.models.RecallRequest; 4 import com.yoho.search.recall.scene.models.RecallRequest;
5 import com.yoho.search.recall.scene.models.RecallResponse; 5 import com.yoho.search.recall.scene.models.RecallResponse;
6 import com.yoho.search.recall.scene.models.RecallResponseBatch; 6 import com.yoho.search.recall.scene.models.RecallResponseBatch;
@@ -5,12 +5,10 @@ import com.yoho.search.base.utils.CollectionUtils; @@ -5,12 +5,10 @@ import com.yoho.search.base.utils.CollectionUtils;
5 import com.yoho.search.base.utils.Transfer; 5 import com.yoho.search.base.utils.Transfer;
6 import com.yoho.search.common.cache.impls.EhCache; 6 import com.yoho.search.common.cache.impls.EhCache;
7 import com.yoho.search.core.redis.components.YohoSearchRedisComponent; 7 import com.yoho.search.core.redis.components.YohoSearchRedisComponent;
8 -import com.yoho.search.recall.scene.beans.CacheSknInfoRequestResponse;  
9 import org.apache.commons.lang.StringUtils; 8 import org.apache.commons.lang.StringUtils;
10 import org.slf4j.Logger; 9 import org.slf4j.Logger;
11 import org.slf4j.LoggerFactory; 10 import org.slf4j.LoggerFactory;
12 import org.springframework.beans.factory.annotation.Autowired; 11 import org.springframework.beans.factory.annotation.Autowired;
13 -import org.springframework.stereotype.Component;  
14 12
15 import java.util.*; 13 import java.util.*;
16 14
  1 +package com.yoho.search.recall.scene.cache.beans;
  2 +
  3 +import com.alibaba.fastjson.JSON;
  4 +import com.yoho.core.redis.cluster.operations.serializer.RedisKeyBuilder;
  5 +import com.yoho.search.base.utils.Transfer;
  6 +import com.yoho.search.recall.scene.cache.CacheRequestResponse;
  7 +import com.yoho.search.recall.scene.models.RecallRequest;
  8 +import com.yoho.search.recall.scene.models.RecallResponse;
  9 +
  10 +public class CacheRecallRequestResponse extends CacheRequestResponse<RecallRequest,RecallResponse> {
  11 +
  12 + public CacheRecallRequestResponse(RecallRequest request) {
  13 + super(request);
  14 + }
  15 +
  16 + @Override
  17 + public Transfer<String, RecallResponse> getToResponseTransfer() {
  18 + return toResponseTransfer;
  19 + }
  20 +
  21 + @Override
  22 + public Transfer<RecallResponse, String> getFromResponseTransfer() {
  23 + return fromResponseTransfer;
  24 + }
  25 +
  26 + private static Transfer<String,RecallResponse> toResponseTransfer = new Transfer<String, RecallResponse>() {
  27 + @Override
  28 + public RecallResponse transfer(String jsonValue) {
  29 + return JSON.parseObject(jsonValue, RecallResponse.class);
  30 + }
  31 + };
  32 +
  33 + private static Transfer<RecallResponse,String> fromResponseTransfer = new Transfer<RecallResponse, String>() {
  34 + @Override
  35 + public String transfer(RecallResponse recallResponse) {
  36 + return JSON.toJSONString(recallResponse);
  37 + }
  38 + };
  39 +}
  1 +package com.yoho.search.recall.scene.cache.beans;
  2 +
  3 +import com.yoho.search.base.utils.ISearchConstants;
  4 +import com.yoho.search.base.utils.ProductIndexEsField;
  5 +import com.yoho.search.core.es.model.SearchParam;
  6 +import com.yoho.search.core.es.model.SearchResult;
  7 +import com.yoho.search.recall.scene.cache.CacheRequestResponseComponent;
  8 +import com.yoho.search.recall.scene.models.RecallRequest;
  9 +import com.yoho.search.recall.scene.models.RecallResponse;
  10 +import com.yoho.search.service.base.SearchCommonService;
  11 +import org.apache.commons.collections.MapUtils;
  12 +import org.springframework.beans.factory.annotation.Autowired;
  13 +import org.springframework.stereotype.Component;
  14 +
  15 +import java.util.ArrayList;
  16 +import java.util.HashMap;
  17 +import java.util.List;
  18 +import java.util.Map;
  19 +
  20 +@Component
  21 +public class CacheRecallRequestResponseBean extends CacheRequestResponseComponent<RecallRequest,RecallResponse,CacheRecallRequestResponse>{
  22 +
  23 + @Autowired
  24 + private SearchCommonService searchCommonService;
  25 +
  26 + private static final int maxEsRequestCountPerTime = 10;
  27 +
  28 + /**
  29 + * 批量召回入口
  30 + *
  31 + * @param batchRequests
  32 + * @return
  33 + */
  34 + public List<CacheRecallRequestResponse> batchRecallAndCache(final List<RecallRequest> batchRequests) {
  35 + //1、构造请求
  36 + final List<CacheRecallRequestResponse> results = new ArrayList<>();
  37 + for (RecallRequest request : batchRequests) {
  38 + results.add(new CacheRecallRequestResponse(request));
  39 + }
  40 + //2、执行查询
  41 + this.bacthFillResponseWithCache(results,false);
  42 +
  43 + //3、返回结果
  44 + return results;
  45 + }
  46 +
  47 + @Override
  48 + public Map<RecallRequest, RecallResponse> queryMissCacheRequestResults(List<CacheRecallRequestResponse> missCacheRequests) {
  49 + //1、构造请求参数
  50 + List<SearchParam> searchParams = new ArrayList<>();
  51 + for (CacheRecallRequestResponse requestResponse : missCacheRequests) {
  52 + searchParams.add(requestResponse.getRequest().searchParam());
  53 + //控制每次请求es的数量
  54 + if(searchParams.size()>=maxEsRequestCountPerTime){
  55 + break;
  56 + }
  57 + }
  58 + //2、执行搜索
  59 + List<SearchResult> searchResults = searchCommonService.doMutiSearch(ISearchConstants.INDEX_NAME_PRODUCT_INDEX, searchParams);
  60 + //3、构造返回结果
  61 + Map<RecallRequest,RecallResponse> notCachedResults = new HashMap<>();
  62 + for (int i = 0; i < missCacheRequests.size(); i++) {
  63 + RecallRequest request = missCacheRequests.get(i).getRequest();
  64 + SearchResult searchResult = searchResults.get(i);
  65 + RecallResponse response = this.buildResonse(searchResult);
  66 + notCachedResults.put(request,response);
  67 + }
  68 + return notCachedResults;
  69 + }
  70 +
  71 + private RecallResponse buildResonse(SearchResult searchResult) {
  72 + List<Map<String, Object>> results = searchResult.getResultList();
  73 + List<RecallResponse.RecallSkn> recallSkns = new ArrayList<>();
  74 + for (Map<String, Object> result : results) {
  75 + Integer productSkn = MapUtils.getInteger(result, ProductIndexEsField.productSkn, 0);
  76 + Integer brandId = MapUtils.getInteger(result, ProductIndexEsField.brandId, 0);
  77 + Integer middleSortId = MapUtils.getInteger(result, ProductIndexEsField.middleSortId, 0);
  78 + recallSkns.add(new RecallResponse.RecallSkn(productSkn, brandId, middleSortId));
  79 + }
  80 + return new RecallResponse(searchResult.getTotal(), recallSkns);
  81 + }
  82 +
  83 +}
  1 +package com.yoho.search.recall.scene.cache.beans;
  2 +
  3 +import com.alibaba.fastjson.JSON;
  4 +import com.yoho.search.base.utils.Transfer;
  5 +import com.yoho.search.recall.scene.cache.CacheRequestResponse;
  6 +import com.yoho.search.recall.scene.models.RecallSknParams;
  7 +import com.yoho.search.recall.scene.models.RecallSknResult;
  8 +
  9 +public class CacheRecallSknRequestResponse extends CacheRequestResponse<RecallSknParams,RecallSknResult> {
  10 +
  11 + public CacheRecallSknRequestResponse(RecallSknParams request) {
  12 + super(request);
  13 + }
  14 +
  15 + private static Transfer<String,RecallSknResult> toResponseTransfer = new Transfer<String, RecallSknResult>() {
  16 + @Override
  17 + public RecallSknResult transfer(String jsonValue) {
  18 + return JSON.parseObject(jsonValue, RecallSknResult.class);
  19 + }
  20 + };
  21 +
  22 + private static Transfer<RecallSknResult,String> fromResponseTransfer = new Transfer<RecallSknResult, String>() {
  23 + @Override
  24 + public String transfer(RecallSknResult recallSknResult) {
  25 + return JSON.toJSONString(recallSknResult);
  26 + }
  27 + };
  28 +
  29 + @Override
  30 + public Transfer<String, RecallSknResult> getToResponseTransfer() {
  31 + return toResponseTransfer;
  32 + }
  33 +
  34 + @Override
  35 + public Transfer<RecallSknResult, String> getFromResponseTransfer() {
  36 + return fromResponseTransfer;
  37 + }
  38 +}
  1 +package com.yoho.search.recall.scene.cache.beans;
  2 +
  3 +import com.yoho.search.recall.scene.builder.request.BrandRecallRequestBuilder;
  4 +import com.yoho.search.recall.scene.builder.request.CommonRecallRequestBuilder;
  5 +import com.yoho.search.recall.scene.builder.request.SortPriceRecallRequestBuilder;
  6 +import com.yoho.search.recall.scene.builder.response.RecallResponseBatchBuilder;
  7 +import com.yoho.search.recall.scene.builder.response.RecallSknResultBuilder;
  8 +import com.yoho.search.recall.scene.cache.CacheRequestResponseComponent;
  9 +import com.yoho.search.recall.scene.models.RecallRequest;
  10 +import com.yoho.search.recall.scene.models.RecallResponseBatch;
  11 +import com.yoho.search.recall.scene.models.RecallSknParams;
  12 +import com.yoho.search.recall.scene.models.RecallSknResult;
  13 +import com.yoho.search.recall.scene.persional.PersionalFactor;
  14 +import com.yoho.search.recall.scene.persional.RecallPersionalService;
  15 +import org.springframework.beans.factory.annotation.Autowired;
  16 +import org.springframework.stereotype.Component;
  17 +
  18 +import java.util.ArrayList;
  19 +import java.util.HashMap;
  20 +import java.util.List;
  21 +import java.util.Map;
  22 +
  23 +@Component
  24 +public class CacheRecallSknRequestResponseBean extends CacheRequestResponseComponent<RecallSknParams,RecallSknResult,CacheRecallSknRequestResponse>{
  25 +
  26 + @Autowired
  27 + private RecallPersionalService recallPersionalService;
  28 + @Autowired
  29 + private CacheRecallRequestResponseBean cacheRecallRequestResponseBean;
  30 + @Autowired
  31 + private RecallResponseBatchBuilder recallResponseBatchBuilder;
  32 + @Autowired
  33 + private RecallSknResultBuilder recallSknResultBuilder;
  34 + @Autowired
  35 + private CommonRecallRequestBuilder commonRequestBuilder;
  36 + @Autowired
  37 + private BrandRecallRequestBuilder brandRequestBuilder;
  38 + @Autowired
  39 + private SortPriceRecallRequestBuilder sortPriceRequestBuilder;
  40 +
  41 + /**
  42 + * 召回入口
  43 + * @param recallSknParams
  44 + * @return
  45 + */
  46 + public RecallSknResult doRecallSknResult(RecallSknParams recallSknParams){
  47 + //1、构建请求
  48 + List<CacheRecallSknRequestResponse> requests = new ArrayList<>();
  49 + requests.add(new CacheRecallSknRequestResponse(recallSknParams));
  50 +
  51 + //2、执行父类方法
  52 + this.bacthFillResponseWithCache(requests,false);
  53 +
  54 + //3、判断
  55 + if(requests.size()==1 && requests.get(0).getResponse()!=null){
  56 + return requests.get(0).getResponse();
  57 + }
  58 + return null;
  59 + }
  60 +
  61 + @Override
  62 + public Map<RecallSknParams, RecallSknResult> queryMissCacheRequestResults(List<CacheRecallSknRequestResponse> missCachseRequests) {
  63 + Map<RecallSknParams, RecallSknResult> results = new HashMap<>();
  64 + for (CacheRecallSknRequestResponse request: missCachseRequests) {
  65 + RecallSknResult response = this.doRealRecall(request.getRequest());
  66 + results.put(request.getRequest(),response);
  67 + }
  68 + return results;
  69 + }
  70 +
  71 + /**
  72 + * 真正的召回入口
  73 + * @param param
  74 + * @return
  75 + */
  76 + private RecallSknResult doRealRecall(RecallSknParams param) {
  77 + //1、获取个性化因子
  78 + PersionalFactor persionalFactor = recallPersionalService.queryPersionalFactor(param);
  79 + //2、构造请求
  80 + List<RecallRequest> batchRequests = this.buildBatchRequests(param, persionalFactor);
  81 + //3、批量召回
  82 + List<CacheRecallRequestResponse> requestResponses = cacheRecallRequestResponseBean.batchRecallAndCache(batchRequests);
  83 + //4、获取skn列表[去重]
  84 + RecallResponseBatch recallResponseBatch = recallResponseBatchBuilder.buildRecallResponseBatch(requestResponses);
  85 + //5、构造真实结果[排序,截取skn]
  86 + RecallSknResult recallSknResult = recallSknResultBuilder.builderRecallResult(recallResponseBatch, param, persionalFactor);
  87 + return recallSknResult;
  88 + }
  89 +
  90 + /**
  91 + * 批量构造请求
  92 + * @param param
  93 + * @param persionalFactor
  94 + * @return
  95 + */
  96 + private List<RecallRequest> buildBatchRequests(RecallSknParams param, PersionalFactor persionalFactor) {
  97 + //1、构造召回请求
  98 + List<RecallRequest> allRequests = new ArrayList<>();
  99 + //2、构造非个性化的请求
  100 + List<RecallRequest> commonRequests = commonRequestBuilder.buildCommonRecallRequests(param.getParamQueryFilter(), param.getFirstProductSkns());
  101 + allRequests.addAll(commonRequests);
  102 + //4、构建个性化品牌的召回请求
  103 + List<RecallRequest> brandRequests = brandRequestBuilder.buildBrandRecallRequests(param.getParamQueryFilter(), persionalFactor.getBrandIds());
  104 + allRequests.addAll(brandRequests);
  105 + //5、构建个性化品牌的召回请求
  106 + List<RecallRequest> sortPriceRequests = sortPriceRequestBuilder.buildSortPriceRecallRequests(param.getParamQueryFilter(), persionalFactor.getSortPriceAreas());
  107 + allRequests.addAll(sortPriceRequests);
  108 + return allRequests;
  109 + }
  110 +
  111 +
  112 +}
  1 +package com.yoho.search.recall.scene.cache.beans;
  2 +
  3 +import com.alibaba.fastjson.JSON;
  4 +import com.alibaba.fastjson.JSONObject;
  5 +import com.yoho.core.redis.cluster.operations.serializer.RedisKeyBuilder;
  6 +import com.yoho.search.base.utils.Transfer;
  7 +import com.yoho.search.recall.scene.cache.CacheRequestResponse;
  8 +import com.yoho.search.recall.scene.models.SknInfoRequest;
  9 +
  10 +import java.util.HashMap;
  11 +import java.util.Map;
  12 +
  13 +public class CacheSknInfoRequestResponse extends CacheRequestResponse<SknInfoRequest, Map<String, Object>> {
  14 +
  15 + public CacheSknInfoRequestResponse(SknInfoRequest sknInfoRequest) {
  16 + super(sknInfoRequest);
  17 + }
  18 +
  19 + static Transfer<String, Map<String, Object>> toResponseTransfer = new Transfer<String, Map<String, Object>>() {
  20 + @Override
  21 + public Map<String, Object> transfer(String value) {
  22 + Map<String, Object> product = new HashMap<>();
  23 + product.putAll(JSONObject.parseObject(value));
  24 + return product;
  25 + }
  26 + };
  27 +
  28 + static Transfer<Map<String, Object>, String> fromResponseTransfer = new Transfer<Map<String, Object>, String>() {
  29 + @Override
  30 + public String transfer(Map<String, Object> product) {
  31 + return JSON.toJSONString(product);
  32 + }
  33 + };
  34 +
  35 + @Override
  36 + public Transfer<String, Map<String, Object>> getToResponseTransfer() {
  37 + return toResponseTransfer;
  38 + }
  39 +
  40 + @Override
  41 + public Transfer<Map<String, Object>, String> getFromResponseTransfer() {
  42 + return fromResponseTransfer;
  43 + }
  44 +}
  1 +package com.yoho.search.recall.scene.cache.beans;
  2 +
  3 +
  4 +import com.yoho.search.base.utils.ISearchConstants;
  5 +import com.yoho.search.base.utils.ProductIndexEsField;
  6 +import com.yoho.search.core.es.model.SearchParam;
  7 +import com.yoho.search.core.es.model.SearchResult;
  8 +import com.yoho.search.recall.scene.cache.CacheRequestResponseComponent;
  9 +import com.yoho.search.recall.scene.models.SknInfoRequest;
  10 +import com.yoho.search.service.base.SearchCommonService;
  11 +import com.yoho.search.service.base.index.ProductIndexBaseService;
  12 +import org.apache.commons.collections.MapUtils;
  13 +import org.elasticsearch.index.query.QueryBuilders;
  14 +import org.springframework.beans.factory.annotation.Autowired;
  15 +import org.springframework.stereotype.Component;
  16 +
  17 +import java.util.ArrayList;
  18 +import java.util.HashMap;
  19 +import java.util.List;
  20 +import java.util.Map;
  21 +
  22 +@Component
  23 +public class CacheSknInfoRequestResponseBean extends CacheRequestResponseComponent<SknInfoRequest,Map<String, Object>,CacheSknInfoRequestResponse>{
  24 +
  25 + @Autowired
  26 + private SearchCommonService searchCommonService;
  27 + @Autowired
  28 + private ProductIndexBaseService productIndexBaseService;
  29 +
  30 + /**
  31 + * 按skn查询并按顺序返回
  32 + *
  33 + * @param productSkns
  34 + * @return
  35 + */
  36 + public List<Map<String, Object>> queryProductListBySkn(List<Integer> productSkns,int size){
  37 + //1、批量查询SKN信息
  38 + List<CacheSknInfoRequestResponse> sknInfoCacheRequestRespons = this.batchQuery(productSkns);
  39 + //2、构造返回结果
  40 + List<Map<String, Object>> finalResults = new ArrayList<>();
  41 + for (CacheSknInfoRequestResponse sknInfoCacheRequestResponse : sknInfoCacheRequestRespons) {
  42 + if(sknInfoCacheRequestResponse !=null && sknInfoCacheRequestResponse.getResponse()!=null){
  43 + finalResults.add(sknInfoCacheRequestResponse.getResponse());
  44 + }
  45 + if(finalResults.size()>=size){
  46 + break;
  47 + }
  48 + }
  49 + return finalResults;
  50 + }
  51 +
  52 + private List<CacheSknInfoRequestResponse> batchQuery(List<Integer> productSkns){
  53 + //1、构建请求与返回结果
  54 + final List<CacheSknInfoRequestResponse> requests = new ArrayList<>();
  55 + for (Integer productSkn : productSkns) {
  56 + requests.add(new CacheSknInfoRequestResponse(new SknInfoRequest(productSkn)));
  57 + }
  58 + //2、调父类方法
  59 + this.bacthFillResponseWithCache(requests,true);
  60 +
  61 + //3、返回结果
  62 + return requests;
  63 + }
  64 +
  65 + @Override
  66 + public Map<SknInfoRequest, Map<String, Object>> queryMissCacheRequestResults(List<CacheSknInfoRequestResponse> missCacheRequests) {
  67 + //1、合法性判断
  68 + Map<SknInfoRequest,Map<String, Object>> results = new HashMap<>();
  69 + if(missCacheRequests==null||missCacheRequests.isEmpty()){
  70 + return results;
  71 + }
  72 + //2、获取skn
  73 + List<Integer> productSkns = new ArrayList<>();
  74 + for (CacheSknInfoRequestResponse sknInfoCacheRequestResponse : missCacheRequests) {
  75 + productSkns.add(sknInfoCacheRequestResponse.getRequest().getProductSkn());
  76 + }
  77 + //3、构建SearchParam
  78 + SearchParam searchParam = new SearchParam();
  79 + searchParam.setOffset(0);
  80 + searchParam.setSize(productSkns.size());
  81 + searchParam.setFiter(QueryBuilders.termsQuery(ProductIndexEsField.productSkn, productSkns));
  82 + searchParam.setIncludeFields(productIndexBaseService.getProductIndexIncludeFields());
  83 + SearchResult searchResult = searchCommonService.doSearch(ISearchConstants.INDEX_NAME_PRODUCT_INDEX, searchParam);
  84 + List<Map<String, Object>> productList = productIndexBaseService.getProductListWithPricePlan(searchResult.getResultList());
  85 + //4、构建SKN临时结果
  86 + Map<Integer,Map<String, Object>> productTempMap = new HashMap<>();
  87 + for (Map<String, Object> product: productList) {
  88 + productTempMap.put(MapUtils.getIntValue(product,"product_skn",0),product);
  89 + }
  90 + //5、构造最终结果
  91 + for (CacheSknInfoRequestResponse requestResponse :missCacheRequests ) {
  92 + results.put(requestResponse.getRequest(),productTempMap.get(requestResponse.getRequest().getProductSkn()));
  93 + }
  94 + return results;
  95 + }
  96 +
  97 +
  98 +
  99 +
  100 +
  101 +
  102 +}
@@ -22,7 +22,7 @@ class PersionalFactorUserComponent { @@ -22,7 +22,7 @@ class PersionalFactorUserComponent {
22 } 22 }
23 List<PersionalFactor.SortPriceArea> sortPriceArea = new ArrayList<PersionalFactor.SortPriceArea>(); 23 List<PersionalFactor.SortPriceArea> sortPriceArea = new ArrayList<PersionalFactor.SortPriceArea>();
24 for (int i = 0; i < 50; i++) { 24 for (int i = 0; i < 50; i++) {
25 - sortPriceArea.add(new PersionalFactor.SortPriceArea((int) (Math.random() * 1000), (int) (Math.random() * 3))); 25 + sortPriceArea.add(new PersionalFactor.SortPriceArea((int) (Math.random() * 1000), (int) (Math.random() *10)));
26 } 26 }
27 String factor = ""; 27 String factor = "";
28 return new PersionalFactor(brandIds, sortPriceArea,factor); 28 return new PersionalFactor(brandIds, sortPriceArea,factor);