| 
					
				 | 
			
			
				@@ -1,5 +1,8 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 package com.tzld.longarticle.recommend.server.service.recommend.filter.strategy; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.google.common.collect.Lists; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.google.common.util.concurrent.ThreadFactoryBuilder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.tzld.longarticle.recommend.server.common.CommonThreadPoolExecutor; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.tzld.longarticle.recommend.server.model.dto.Content; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.tzld.longarticle.recommend.server.model.dto.ContentHisPublishArticle; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.tzld.longarticle.recommend.server.service.recommend.config.AccountContentPoolConfigService; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -13,6 +16,9 @@ import org.springframework.beans.factory.annotation.Autowired; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.stereotype.Component; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.ArrayList; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.Collections; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.List; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.concurrent.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @Component 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @Slf4j 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -23,42 +29,63 @@ public class LowScoreStrategy implements FilterStrategy { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     AccountContentPoolConfigService accountContentPoolConfigService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private final static ExecutorService pool = new CommonThreadPoolExecutor( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            5, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            5, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            0L, TimeUnit.SECONDS, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            new LinkedBlockingQueue<>(100), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            new ThreadFactoryBuilder().setNameFormat("LowScoreStrategy-%d").build(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            new ThreadPoolExecutor.AbortPolicy()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public FilterResult filter(FilterParam param) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        long start = System.currentTimeMillis(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         FilterResult filterResult = new FilterResult(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        filterResult.setContentIds(new ArrayList<>()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        filterResult.setFilterContent(new ArrayList<>()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        for (Content content : param.getContents()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            String[] contentPools = accountContentPoolConfigService.getContentPools(param.getAccountName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (!contentPools[2].equals(content.getContentPoolType())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                filterResult.getContentIds().add(content.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (CollectionUtils.isEmpty(content.getHisPublishArticleList())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                filterResult.getContentIds().add(content.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            long publishCount = content.getHisPublishArticleList().stream().filter(ContentHisPublishArticle::isInnerAccount).count(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (publishCount == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                filterResult.getContentIds().add(content.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            int hisViewCount = content.getHisPublishArticleList().stream().filter(ContentHisPublishArticle::isInnerAccount) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    .mapToInt(ContentHisPublishArticle::getViewCount).sum(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            int hisAvgViewCount = content.getHisPublishArticleList().stream().filter(ContentHisPublishArticle::isInnerAccount) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    .mapToInt(ContentHisPublishArticle::getAvgViewCount).sum(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            double rate = (hisViewCount * 1.0) / hisAvgViewCount; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            int sumAvgViewCount = content.getHisPublishArticleList().stream().filter(ContentHisPublishArticle::isInnerAccount) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    .mapToInt(ContentHisPublishArticle::getAvgViewCount).sum(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (((publishCount >= 2 && rate < 0.8) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    || (publishCount == 1 && rate < 0.5)) && sumAvgViewCount > 100) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                content.setFilterReason("低评分内容"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                filterResult.getFilterContent().add(content); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                filterResult.getContentIds().add(content.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<String> result = Collections.synchronizedList(new ArrayList<>(param.getContents().size())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<Content> filterContents = Collections.synchronizedList(new ArrayList<>()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<List<Content>> partitions = Lists.partition(param.getContents(), 1000); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        CountDownLatch cdl = new CountDownLatch(partitions.size()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (List<Content> partition : partitions) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            pool.submit(() -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for (Content content : partition) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        String[] contentPools = accountContentPoolConfigService.getContentPools(param.getAccountName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (!contentPools[2].equals(content.getContentPoolType()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                || CollectionUtils.isEmpty(content.getHisPublishArticleList())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            result.add(content.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        long publishCount = content.getHisPublishArticleList().stream().filter(ContentHisPublishArticle::isInnerAccount).count(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (publishCount == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            result.add(content.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        int hisViewCount = content.getHisPublishArticleList().stream().filter(ContentHisPublishArticle::isInnerAccount) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                .mapToInt(ContentHisPublishArticle::getViewCount).sum(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        int hisAvgViewCount = content.getHisPublishArticleList().stream().filter(ContentHisPublishArticle::isInnerAccount) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                .mapToInt(ContentHisPublishArticle::getAvgViewCount).sum(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        double rate = (hisViewCount * 1.0) / hisAvgViewCount; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        int sumAvgViewCount = content.getHisPublishArticleList().stream().filter(ContentHisPublishArticle::isInnerAccount) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                .mapToInt(ContentHisPublishArticle::getAvgViewCount).sum(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (((publishCount >= 2 && rate < 0.8) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                || (publishCount == 1 && rate < 0.5)) && sumAvgViewCount > 100) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            content.setFilterReason("低评分内容"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            filterContents.add(content); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            result.add(content.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } finally { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    cdl.countDown(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            cdl.await(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (InterruptedException e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.error("LowScoreStrategy filter error", e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        filterResult.setContentIds(result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        filterResult.setFilterContent(filterContents); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return filterResult; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |