Rev 1050 | Blame | Last modification | View Log | RSS feed
/****/package in.shop2020.util;import in.shop2020.metamodel.core.Entity;import in.shop2020.metamodel.core.Slide;import in.shop2020.metamodel.definitions.CMPBucketDefinition;import in.shop2020.metamodel.definitions.Catalog;import in.shop2020.metamodel.definitions.DefinitionsContainer;import in.shop2020.metamodel.definitions.EntityContainer;import in.shop2020.metamodel.util.CreationUtils;import in.shop2020.metamodel.util.ExpandedCMPSlideRuleDefinition;import in.shop2020.metamodel.util.ExpandedSlide;import java.io.File;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.TreeMap;/*** @author naveen**/public class CMP {/****/private long categoryID;/*** @param args* @throws Exception*/public static void main(String[] args) throws Exception {String usage = "Usage: CMP {Category ID}";if(args.length > 1) {System.out.println(usage);System.exit(-1);}long categoryID = 0L;if(args.length > 0) {try {categoryID = Long.parseLong(args[0]);}catch (NumberFormatException nfe) {System.out.println(usage);System.exit(-1);}}CMP cmp = new CMP(categoryID);// Entity ID > Map(Slide ID > Score)Map<Long, Map<Long, Integer>> slideScoresByEntity =cmp.getSlideScores();Utils.info("slideScoresByEntity=" + slideScoresByEntity);CreationUtils.storeSlideScores(slideScoresByEntity);// Entity ID > Final ScoreMap<Long, Integer> finalScoreByEntityID = cmp.getFinalScores(slideScoresByEntity);Utils.info("finalScoreByEntityID=" + finalScoreByEntityID);CreationUtils.storeDefaultEntityScores(finalScoreByEntityID);}/**** @param categoryID*/public CMP(long categoryID) {this.categoryID = categoryID;}/**** @return Map<Long, Map<Long, Integer>>* @throws Exception*/public Map<Long, Map<Long, Integer>> getSlideScores() throws Exception {Map<Long, Map<Long, Integer>> slideScoresByEntityID =new TreeMap<Long, Map<Long, Integer>>();// Calculate scores based on ruleMap<Long, Entity> entitiesMap = CreationUtils.getEntities();for(Long entityID : entitiesMap.keySet()) {Entity entity = entitiesMap.get(entityID);// If provided, filter by categoryif(this.categoryID != 0L &&(this.categoryID != entity.getCategoryID())) {continue;}Map<Long, Integer> slideScores = this.getSlideScores(entity);slideScoresByEntityID.put(entityID, slideScores);}return slideScoresByEntityID;}/**** @param entity* @return Map<Long, Integer>* @throws Exception*/private Map<Long, Integer> getSlideScores(Entity entity) throws Exception {Map<Long, Integer> slideScores = new HashMap<Long, Integer>();DefinitionsContainer defs =Catalog.getInstance().getDefinitionsContainer();// Python wrapper for executing rule in python scriptCMPJythonWrapper cmpJW = new CMPJythonWrapper();// Scores are required for parent slides onlyList<Slide> slides = entity.getSlides();for(Slide slide : slides) {ExpandedSlide expSlide = new ExpandedSlide(slide);cmpJW.reset();cmpJW.initialize();cmpJW.setExpandedSlide(expSlide);long slideDefinitionID = slide.getSlideDefinitionID();ExpandedCMPSlideRuleDefinition expCMPSlideRuleDef =defs.getExpandedComparisonSlideRuleDefinition(slideDefinitionID);if(expCMPSlideRuleDef == null) {Utils.warning("Could not find comparison definition for " +"slide definition ID " + slideDefinitionID);continue;}cmpJW.setExpandedCMPSlideRuleDefinition(expCMPSlideRuleDef);cmpJW.executeRule();int score = cmpJW.getScore();Utils.info("score=" + score);slideScores.put(new Long(slideDefinitionID), new Integer(score));}return slideScores;}/**** @param slideScoresByEntity* @return Map<Long, Integer>* @throws Exception*/public Map<Long, Integer> getFinalScores(Map<Long, Map<Long, Integer>> slideScoresByEntity) throws Exception {Map<Long, Integer> finalScoreByEntityID = new TreeMap<Long, Integer>();// Considering default Weights per Slide bucket// Slide buckets > List(Very Important, Regular, Not-so-Important)// Default Weights > List(70%, 20%, 10%)EntityContainer ents = Catalog.getInstance().getEntityContainer();DefinitionsContainer defs =Catalog.getInstance().getDefinitionsContainer();for(Long entityID : slideScoresByEntity.keySet()) {Map<Long, Integer> slideScores = slideScoresByEntity.get(entityID);Entity entity = CreationUtils.getEntity(entityID);long categoryID = entity.getCategoryID();List<CMPBucketDefinition> bucketDefs =defs.getComparisonBucketDefinitions(categoryID);Map<String, Integer> bucketScores = new HashMap<String, Integer>();Map<String, Integer> bucketSlideCounts =new HashMap<String, Integer>();for(Long slideDefinitionID : slideScores.keySet()) {Integer slideScore = slideScores.get(slideDefinitionID);Slide slide = ents.getSlide(entityID, slideDefinitionID);String bucketName = null;if(slide.isBorrowed()) {long borrowedCategoryID = slide.getBorrowedCategoryID();bucketName = defs.getComparisonBucketName(borrowedCategoryID, slideDefinitionID.longValue());}else {bucketName = defs.getComparisonBucketName(categoryID,slideDefinitionID.longValue());}if(bucketName == null) {Utils.warning("Comparison bucket not defined for " +"Category ID=" + categoryID +" Slide Definition ID=" + slideDefinitionID);continue;}if(!bucketScores.containsKey(bucketName)) {bucketScores.put(bucketName, new Integer(0));}if(!bucketSlideCounts.containsKey(bucketName)) {bucketSlideCounts.put(bucketName, new Integer(0));}Integer bucketScore = bucketScores.get(bucketName);Integer bucketSlideCount = bucketSlideCounts.get(bucketName);Integer newBucketScore = new Integer(bucketScore.intValue() + slideScore.intValue());Integer newBucketSlideCount = new Integer(bucketSlideCount.intValue() + 1);bucketScores.put(bucketName, newBucketScore);bucketSlideCounts.put(bucketName, newBucketSlideCount);}int finalEntityScore = 0;// Apply weights and sum upfor(CMPBucketDefinition bucketDef : bucketDefs) {String bucketName = bucketDef.getName();Utils.info("bucketName=" + bucketName);int aggregateBucketScore = bucketScores.get(bucketName);Utils.info("aggregateBucketScore=" + aggregateBucketScore);int bucketSlideCount = bucketSlideCounts.get(bucketName);Utils.info("bucketSlideCount=" + bucketSlideCount);int defaultWeight = bucketDef.getDefaultWeight();Utils.info("defaultWeight=" + defaultWeight);float percentageBucketScore =(((float)aggregateBucketScore/((float)bucketSlideCount * 10))) * 100;Utils.info("percentageBucketScore=" + percentageBucketScore);float weightedBucketScore =(float)percentageBucketScore * ((float)defaultWeight / 100);Utils.info("weightedBucketScore=" + weightedBucketScore);finalEntityScore += Math.round(weightedBucketScore);}Utils.info("finalEntityScore=" + finalEntityScore);finalScoreByEntityID.put(entityID, new Integer(finalEntityScore));}return finalScoreByEntityID;}}