|
@@ -0,0 +1,99 @@
|
|
|
+package com.tzld.piaoquan.recommend.server.service;
|
|
|
+
|
|
|
+import com.google.common.base.Strings;
|
|
|
+import com.tzld.piaoquan.recommend.server.framework.common.User;
|
|
|
+import com.tzld.piaoquan.recommend.server.gen.common.Result;
|
|
|
+import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendRequest;
|
|
|
+import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendResponse;
|
|
|
+import com.tzld.piaoquan.recommend.server.gen.recommend.VideoProto;
|
|
|
+import com.tzld.piaoquan.recommend.server.implement.FlowPoolRecommendPipeline;
|
|
|
+import com.tzld.piaoquan.recommend.server.implement.TopRecommendPipeline;
|
|
|
+import com.tzld.piaoquan.recommend.server.model.RecommendParam;
|
|
|
+import com.tzld.piaoquan.recommend.server.model.Video;
|
|
|
+import com.tzld.piaoquan.recommend.server.service.rank.RankParam;
|
|
|
+import com.tzld.piaoquan.recommend.server.service.rank.RankResult;
|
|
|
+import com.tzld.piaoquan.recommend.server.service.rank.strategy.RankStrategy4RegionMergeModelV6;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author sunxy
|
|
|
+ */
|
|
|
+@Service
|
|
|
+@Slf4j
|
|
|
+public class VideoRecommendService {
|
|
|
+
|
|
|
+ private final Boolean newRecommendSwitch = true;
|
|
|
+ @Resource
|
|
|
+ private RecommendService recommendService;
|
|
|
+ @Resource
|
|
|
+ private TopRecommendPipeline topRecommendPipeline;
|
|
|
+ @Resource
|
|
|
+ private FlowPoolRecommendPipeline flowPoolRecommendPipeline;
|
|
|
+ @Resource
|
|
|
+ private RankStrategy4RegionMergeModelV6 rankStrategy4RegionMergeModelV6;
|
|
|
+
|
|
|
+ public RecommendResponse homepageRecommend(RecommendRequest request) {
|
|
|
+ return newRecommendSwitch ? recommendNew(request, 0) : recommend(request, 0);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public RecommendResponse relevantRecommend(RecommendRequest request) {
|
|
|
+ return newRecommendSwitch ? recommendNew(request, 1) : recommend(request, 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ private RecommendResponse recommendNew(RecommendRequest request, int recommendType) {
|
|
|
+ User user = getUser(request);
|
|
|
+ List<Video> topRecommendVideoList = topRecommendPipeline.feeds(request, 0, user);
|
|
|
+ List<Video> flowPoolRecommendVideoList = flowPoolRecommendPipeline.feedByRec(request, recommendType);
|
|
|
+ RecommendParam recommendParam = recommendService.genRecommendParam(request, recommendType);
|
|
|
+ RankParam rankParam = recommendService.convertToRankParam(recommendParam, null);
|
|
|
+
|
|
|
+ RankResult rankResult = rankStrategy4RegionMergeModelV6.mergeAndSort(rankParam, topRecommendVideoList, flowPoolRecommendVideoList);
|
|
|
+
|
|
|
+ // 只返回size条数据
|
|
|
+ List<Video> videos = rankResult.getVideos();
|
|
|
+ if (recommendParam.getSize() < rankResult.getVideos().size()) {
|
|
|
+ videos = rankResult.getVideos().subList(0, recommendParam.getSize());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新position
|
|
|
+ List<VideoProto> vps = new ArrayList<>();
|
|
|
+ for (int i = 0; i < videos.size(); i++) {
|
|
|
+ vps.add(VideoProto.newBuilder()
|
|
|
+ .setPosition(i + 1)
|
|
|
+ .setPushFrom(Strings.nullToEmpty(videos.get(i).getPushFrom()))
|
|
|
+ .setAbCode(Strings.nullToEmpty(videos.get(i).getAbCode()))
|
|
|
+ .setVideoId(videos.get(i).getVideoId())
|
|
|
+ .setRovScore(videos.get(i).getRovScore())
|
|
|
+ .setSortScore(videos.get(i).getSortScore())
|
|
|
+ .setFlowPool(Strings.nullToEmpty(videos.get(i).getFlowPool()))
|
|
|
+ .setIsInFlowPool(videos.get(i).isInFlowPool() ? 1 : 0)
|
|
|
+ .setRand(videos.get(i).getRand())
|
|
|
+ .build());
|
|
|
+ }
|
|
|
+
|
|
|
+ return RecommendResponse.newBuilder()
|
|
|
+ .setResult(Result.newBuilder().setCode(1).setMessage("success"))
|
|
|
+ .addAllVideo(vps)
|
|
|
+ .build();
|
|
|
+ }
|
|
|
+
|
|
|
+ private User getUser(RecommendRequest request) {
|
|
|
+ User user = new User();
|
|
|
+ // TODO 从request中获取用户信息
|
|
|
+ user.setMid(request.getMid());
|
|
|
+ user.setUid(request.getUid());
|
|
|
+ user.setRegion(request.getCityCode());
|
|
|
+ return user;
|
|
|
+ }
|
|
|
+
|
|
|
+ private RecommendResponse recommend(RecommendRequest request, int recommendType) {
|
|
|
+ return recommendService.recommend(request, recommendType);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|