| 
					
				 | 
			
			
				@@ -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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |