|
@@ -1,6 +1,6 @@
|
|
|
package com.tzld.piaoquan.recommend.server.service.filter;
|
|
|
|
|
|
-import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
|
|
|
import com.google.common.base.Stopwatch;
|
|
|
import com.google.common.collect.Lists;
|
|
|
import com.tzld.piaoquan.recommend.server.common.ThreadPoolFactory;
|
|
@@ -12,6 +12,8 @@ import com.tzld.piaoquan.recommend.server.util.CommonCollectionUtils;
|
|
|
import com.tzld.piaoquan.recommend.server.util.JSONUtils;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
|
+import org.apache.commons.collections4.MapUtils;
|
|
|
+import org.apache.commons.lang.math.NumberUtils;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
@@ -41,6 +43,15 @@ public abstract class AbstractFilterService {
|
|
|
@Value("${newFilterAbExpCode:}")
|
|
|
private String newFilterAbExpCode;
|
|
|
|
|
|
+ @ApolloJsonValue("${supply.exp.list:[6]}")
|
|
|
+ private Set<Integer> supplyExps;
|
|
|
+
|
|
|
+ @Value("${supply.exp.id:666}")
|
|
|
+ private int supplyExpId;
|
|
|
+
|
|
|
+ @ApolloJsonValue("${supply.exp.video.list:[]}")
|
|
|
+ private Set<Long> supplyExpVideos;
|
|
|
+
|
|
|
|
|
|
private List<Long> viewFilterOld(FilterParam param) {
|
|
|
// log.info("filterParam={}", JSONUtils.toJson(param));
|
|
@@ -48,30 +59,48 @@ public abstract class AbstractFilterService {
|
|
|
List<Long> videoIds = filterWithRiskVideo(param.getRiskFilterFlag(),
|
|
|
param.getAppType(), param.getRegionCode(), param.getAppRegionFiltered(), param.getVideosWithRisk(),
|
|
|
param.getVideoIds(), param.getForceTruncation());
|
|
|
- // log.info("filterByRiskVideos videoIds={}", JSONUtils.toJson(videoIds));
|
|
|
-// JSONObject obj = new JSONObject();
|
|
|
-// obj.put("zhangbotest", "");
|
|
|
-// obj.put("concurrent", param.concurrent);
|
|
|
-// obj.put("notUsePreView", param.notUsePreView);
|
|
|
-// obj.put("size1", videoIds.size());
|
|
|
+
|
|
|
+ // TODO 供给实验
|
|
|
+ Map<String, String> obj = new HashMap<>();
|
|
|
+ obj.put("before", JSONUtils.toJson(videoIds));
|
|
|
+
|
|
|
+ videoIds = filterBySupplyExp(param.getAppType(), param.getExpIdMap(), videoIds);
|
|
|
+
|
|
|
+ obj.put("after", JSONUtils.toJson(videoIds));
|
|
|
+ log.info("supply filter {}", JSONUtils.toJson(obj));
|
|
|
+
|
|
|
if (param.isNotUsePreView()) {
|
|
|
- ;
|
|
|
+
|
|
|
} else {
|
|
|
videoIds = filterByPreViewed(param.getAppType(), param.getMid(), videoIds);
|
|
|
}
|
|
|
-// obj.put("size2", videoIds.size());
|
|
|
- // log.info("filterByPreViewed videoIds={}", JSONUtils.toJson(videoIds));
|
|
|
if (param.isConcurrent()) {
|
|
|
videoIds = filterByViewedConcurrent(param.getAppType(), param.getMid(), param.getUid(), videoIds);
|
|
|
} else {
|
|
|
videoIds = filterByViewed(param.getAppType(), param.getMid(), param.getUid(), videoIds);
|
|
|
}
|
|
|
-// obj.put("size3", videoIds.size());
|
|
|
-// log.info(obj.toString());
|
|
|
- // log.info("filterByViewed videoIds={}", JSONUtils.toJson(videoIds));
|
|
|
return videoIds;
|
|
|
}
|
|
|
|
|
|
+ private List<Long> filterBySupplyExp(int appType, Map<String, String> expIdMap, List<Long> videoIds) {
|
|
|
+ if (!supplyExps.contains(appType)) {
|
|
|
+ return videoIds;
|
|
|
+ }
|
|
|
+ if (MapUtils.isEmpty(expIdMap)) {
|
|
|
+ return videoIds;
|
|
|
+ }
|
|
|
+ // A VS A+B 模式:供给实验的视频只在实验组出
|
|
|
+ if (supplyExpId == NumberUtils.toInt(expIdMap.get("supply"), -1)) {
|
|
|
+ // 命中实验,都可以出
|
|
|
+ return videoIds;
|
|
|
+ }
|
|
|
+ // 对照组,需要过滤掉视频
|
|
|
+ return videoIds.stream()
|
|
|
+ .filter(l -> !supplyExpVideos.contains(l))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
private List<Long> filterByViewedConcurrent(int appType, String mid, String uid, List<Long> videoIds) {
|
|
|
// TODO uid为空时,还需要过滤么?
|
|
|
if (StringUtils.isBlank(mid)
|
|
@@ -79,11 +108,6 @@ public abstract class AbstractFilterService {
|
|
|
return videoIds;
|
|
|
}
|
|
|
|
|
|
-// int chunkSize = 20;
|
|
|
-// Collection<List<Long>> chunks = videoIds.stream()
|
|
|
-// .collect(Collectors.groupingBy(it -> it / chunkSize))
|
|
|
-// .values();
|
|
|
-
|
|
|
int chunkSize = 20;
|
|
|
List<List<Long>> chunks = new ArrayList<>();
|
|
|
int size = videoIds.size();
|