| 
					
				 | 
			
			
				@@ -0,0 +1,106 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+package com.tzld.piaoquan.ad.engine.commons.helper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.google.common.reflect.TypeToken; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.tzld.piaoquan.ad.engine.commons.util.JSONUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import lombok.Data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.commons.collections4.CollectionUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.slf4j.Logger; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.slf4j.LoggerFactory; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.beans.factory.annotation.Value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.stereotype.Component; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@Component 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+public class NewExpHelper { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private final static Logger log = LoggerFactory.getLogger(NewExpHelper.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static Map<String, Set<String>> appExpIdCache = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static Map<String, Exp> expIdAndRangeCache = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static String flagId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Value("${ad.new.exp.flag.id:0}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private void setFlagId(String flagId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        NewExpHelper.flagId = flagId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Value("${new.exp,config.v2:[]}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private void setNewExpInfo(String str) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<ExpConfig> expConfigs = JSONUtils.fromJson(str, new TypeToken<List<ExpConfig>>() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }, Collections.emptyList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (ExpConfig expConfig : expConfigs) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String appId = expConfig.getAppType(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (Layer layer : expConfig.layers) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (layer.layerId.equals("ad-server")) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Set<String> expIdSet = new HashSet<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for (Exp exp : layer.getExps()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        expIdSet.add(exp.getExpId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        expIdAndRangeCache.put(exp.getExpId(), exp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    appExpIdCache.put(appId, expIdSet); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static boolean checkInNewExpGroup(String appId, int groupNumber, String expId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (appExpIdCache.get(appId) == null || !appExpIdCache.get(appId).contains(expId)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (expIdAndRangeCache.get(expId).isAllEnter() && groupNumber < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return expIdAndRangeCache.get(expId).getRange()[0] <= groupNumber && expIdAndRangeCache.get(expId).getRange()[1] >= groupNumber; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static boolean checkInNewExpGroup(String appId, int groupNumber, Collection<String> expIds) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (CollectionUtils.isEmpty(expIds)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (String expId : expIds) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (appExpIdCache.get(appId) == null || !appExpIdCache.get(appId).contains(expId)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (expIdAndRangeCache.get(expId).isAllEnter() && groupNumber < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (expIdAndRangeCache.get(expId).getRange()[0] <= groupNumber && expIdAndRangeCache.get(expId).getRange()[1] >= groupNumber) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                log.warn("svc=checkInNewExpGroup appId={} groupNumber={} expId={}", appId, groupNumber, expId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static class ExpConfig { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private String appType; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private List<Layer> layers; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static class Layer { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private String layerId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private int bucketNum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private List<Exp> exps; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private Map<String, String> groupRule; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static class Exp { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private String expId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private int[] range; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private boolean allEnter = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private Map<String, Object> param; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |