Subversion Repositories SmartDukaan

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
70 naveen 1
/**
2
 * 
3
 */
4
package in.shop2020.util;
5
 
6
import in.shop2020.metamodel.core.Entity;
1918 rajveer 7
import in.shop2020.metamodel.core.EntityStatus;
70 naveen 8
import in.shop2020.metamodel.core.Slide;
72 naveen 9
import in.shop2020.metamodel.definitions.CMPBucketDefinition;
70 naveen 10
import in.shop2020.metamodel.definitions.Catalog;
11
import in.shop2020.metamodel.definitions.DefinitionsContainer;
1050 rajveer 12
import in.shop2020.metamodel.util.CreationUtils;
70 naveen 13
import in.shop2020.metamodel.util.ExpandedCMPSlideRuleDefinition;
14
import in.shop2020.metamodel.util.ExpandedSlide;
15
 
16
import java.util.HashMap;
17
import java.util.List;
18
import java.util.Map;
19
import java.util.TreeMap;
20
 
21
/**
22
 * @author naveen
23
 *
24
 */
25
public class CMP {
26
 
27
	/**
28
	 * 
29
	 */
30
	private long categoryID;
31
 
32
	/**
33
	 * @param args
34
	 * @throws Exception 
35
	 */
36
	public static void main(String[] args) throws Exception {
37
		String usage = "Usage: CMP {Category ID}";
38
 
39
		if(args.length > 1) {
40
			System.out.println(usage);
41
			System.exit(-1);
42
		}
43
 
44
		long categoryID = 0L;
45
		if(args.length > 0) {
46
			try {
47
				categoryID = Long.parseLong(args[0]);
48
			}
49
			catch (NumberFormatException nfe) {
50
				System.out.println(usage);
51
				System.exit(-1);
52
			}
53
		}
54
 
55
		CMP cmp = new CMP(categoryID);
1918 rajveer 56
//		
57
//		Entity entity = CreationUtils.getEntity(1000165);
58
//		 Map<Long, Double> slideScores = cmp.getSlideScores(entity);
59
//		 Utils.info(slideScores);
60
 
61
 
110 naveen 62
		// Entity ID > Map(Slide ID > Score)
1918 rajveer 63
		Map<Long, Map<Long, Double>> slideScoresByEntity = cmp.getSlideScores();
72 naveen 64
		Utils.info("slideScoresByEntity=" + slideScoresByEntity);
70 naveen 65
 
1050 rajveer 66
		CreationUtils.storeSlideScores(slideScoresByEntity);
70 naveen 67
 
68
		// Entity ID > Final Score 
1918 rajveer 69
		Map<Long, Double> finalScoreByEntityID = cmp.getFinalScores(
70 naveen 70
				slideScoresByEntity);
72 naveen 71
		Utils.info("finalScoreByEntityID=" + finalScoreByEntityID);
70 naveen 72
 
1050 rajveer 73
		CreationUtils.storeDefaultEntityScores(finalScoreByEntityID);
74
 
70 naveen 75
	}
76
 
77
	/**
78
	 * 
79
	 * @param categoryID
80
	 */
81
	public CMP(long categoryID) {
82
		this.categoryID = categoryID;
83
	}
84
 
85
	/**
86
	 * 
1918 rajveer 87
	 * @return Map<Long, Map<Long, Double>>
70 naveen 88
	 * @throws Exception 
89
	 */
1918 rajveer 90
	public Map<Long, Map<Long, Double>> getSlideScores() throws Exception {
91
		Map<Long, Map<Long, Double>> slideScoresByEntityID = 
92
			new TreeMap<Long, Map<Long, Double>>();
70 naveen 93
 
94
		// Calculate scores based on rule
1050 rajveer 95
		Map<Long, Entity> entitiesMap = CreationUtils.getEntities();
70 naveen 96
 
97
		for(Long entityID : entitiesMap.keySet()) {
98
			Entity entity = entitiesMap.get(entityID);
99
 
1918 rajveer 100
			if(CreationUtils.getEntityState(entityID).getStatus() != EntityStatus.READY){
101
			    continue;
102
			}
103
			//Skip categories with value as -1 or categories except mobile phones
104
			if(entity.getCategoryID() == -1 || Catalog.getInstance().getDefinitionsContainer().getCategory(entity.getCategoryID()).getParentCategory().getID() != 10001){
105
			    continue;
106
			}
70 naveen 107
			// If provided, filter by category
108
			if(this.categoryID != 0L && 
109
					(this.categoryID != entity.getCategoryID())) {
110
				continue;
111
			}
112
 
1918 rajveer 113
			Map<Long, Double> slideScores = this.getSlideScores(entity);
70 naveen 114
 
115
			slideScoresByEntityID.put(entityID, slideScores);
116
		}
117
 
118
		return slideScoresByEntityID;
119
	}
120
 
121
	/**
122
	 * 
123
	 * @param entity
1918 rajveer 124
	 * @return Map<Long, Double>
70 naveen 125
	 * @throws Exception 
126
	 */
1918 rajveer 127
	private Map<Long, Double> getSlideScores(Entity entity) throws Exception {
128
		Map<Long, Double> slideScores = new HashMap<Long, Double>();
70 naveen 129
 
130
		DefinitionsContainer defs = 
131
			Catalog.getInstance().getDefinitionsContainer();
132
 
133
		// Python wrapper for executing rule in python script
134
		CMPJythonWrapper cmpJW = new CMPJythonWrapper();
135
 
136
		// Scores are required for parent slides only
137
		List<Slide> slides = entity.getSlides();
1362 rajveer 138
		if(slides==null){
139
			return slideScores;
140
		}
70 naveen 141
		for(Slide slide : slides) {
142
			ExpandedSlide expSlide = new ExpandedSlide(slide);
71 naveen 143
			cmpJW.reset();
144
			cmpJW.initialize();
145
 
70 naveen 146
			cmpJW.setExpandedSlide(expSlide);
147
 
148
			long slideDefinitionID = slide.getSlideDefinitionID();
149
			ExpandedCMPSlideRuleDefinition expCMPSlideRuleDef = 
150
				defs.getExpandedComparisonSlideRuleDefinition(
151
						slideDefinitionID);
152
 
71 naveen 153
			if(expCMPSlideRuleDef == null) {
154
				Utils.warning("Could not find comparison definition for " + 
155
						"slide definition ID " + slideDefinitionID);
156
				continue;
157
			}
158
 
70 naveen 159
			cmpJW.setExpandedCMPSlideRuleDefinition(expCMPSlideRuleDef);
160
 
82 naveen 161
			cmpJW.executeRule();
70 naveen 162
 
1918 rajveer 163
			double score = cmpJW.getScore();
70 naveen 164
			Utils.info("score=" + score);
165
 
1918 rajveer 166
			slideScores.put(new Long(slideDefinitionID), new Double(score));
70 naveen 167
		}
168
 
169
		return slideScores;
170
	}
171
 
172
	/**
173
	 * 
174
	 * @param slideScoresByEntity
1918 rajveer 175
	 * @return Map<Long, Double>
72 naveen 176
	 * @throws Exception 
70 naveen 177
	 */
1918 rajveer 178
	public Map<Long, Double> getFinalScores(
179
			Map<Long, Map<Long, Double>> slideScoresByEntity) throws Exception {
180
		Map<Long, Double> finalScoreByEntityID = new TreeMap<Long, Double>();
70 naveen 181
 
182
		// Considering default Weights per Slide bucket
183
		// Slide buckets > List(Very Important, Regular, Not-so-Important)
184
		// Default Weights > List(70%, 20%, 10%)
72 naveen 185
		DefinitionsContainer defs = 
186
			Catalog.getInstance().getDefinitionsContainer();
70 naveen 187
 
72 naveen 188
		for(Long entityID : slideScoresByEntity.keySet()) {
1918 rajveer 189
			Map<Long, Double> slideScores = slideScoresByEntity.get(entityID);
72 naveen 190
 
1050 rajveer 191
			Entity entity = CreationUtils.getEntity(entityID);
72 naveen 192
			long categoryID = entity.getCategoryID();
1362 rajveer 193
			if(categoryID == -1){
194
				continue;
195
			}
1443 rajveer 196
			if(categoryID>10010){
197
				continue;
198
			}
199
 
72 naveen 200
			List<CMPBucketDefinition> bucketDefs = 
201
				defs.getComparisonBucketDefinitions(categoryID);
202
 
1918 rajveer 203
			Map<String, Double> bucketScores = new HashMap<String, Double>();
204
			Map<String, Double> bucketSlideCounts = 
205
				new HashMap<String, Double>();
72 naveen 206
 
207
			for(Long slideDefinitionID : slideScores.keySet()) {
1918 rajveer 208
				Double slideScore = slideScores.get(slideDefinitionID);
72 naveen 209
 
1153 rajveer 210
				Slide slide = CreationUtils.getSlide(entityID, slideDefinitionID);
90 naveen 211
 
212
				String bucketName = null;
1165 rajveer 213
				if(CreationUtils.isBorrowedSlide(slide.getSlideDefinitionID(), entity.getCategoryID())) {
214
					long borrowedCategoryID = CreationUtils.getBorrowedCategoryID(slide.getSlideDefinitionID(), entity.getCategoryID());
90 naveen 215
 
1165 rajveer 216
					bucketName = defs.getComparisonBucketName(borrowedCategoryID, slideDefinitionID.longValue());
90 naveen 217
				}
218
				else {
219
					bucketName = defs.getComparisonBucketName(categoryID, 
72 naveen 220
						slideDefinitionID.longValue());
90 naveen 221
				}
72 naveen 222
 
223
				if(bucketName == null) {
90 naveen 224
					Utils.warning("Comparison bucket not defined for " +
225
							"Category ID=" + categoryID + 
226
							" Slide Definition ID=" + slideDefinitionID);
72 naveen 227
 
228
					continue;
229
				}
90 naveen 230
 
231
				if(!bucketScores.containsKey(bucketName)) {
1918 rajveer 232
					bucketScores.put(bucketName, new Double(0));
90 naveen 233
				}
72 naveen 234
 
90 naveen 235
				if(!bucketSlideCounts.containsKey(bucketName)) {
1918 rajveer 236
					bucketSlideCounts.put(bucketName, new Double(0));
90 naveen 237
				}
238
 
1918 rajveer 239
				Double bucketScore = bucketScores.get(bucketName);
240
				Double bucketSlideCount = bucketSlideCounts.get(bucketName);
72 naveen 241
 
90 naveen 242
 
1918 rajveer 243
				Double newBucketScore =  new Double(
72 naveen 244
						bucketScore.intValue() + slideScore.intValue());
245
 
1918 rajveer 246
				Double newBucketSlideCount =  new Double(
72 naveen 247
						bucketSlideCount.intValue() + 1);
248
 
249
				bucketScores.put(bucketName, newBucketScore);
250
				bucketSlideCounts.put(bucketName, newBucketSlideCount);
251
			}
252
 
253
			int finalEntityScore = 0;
254
 
255
			// Apply weights and sum up
256
			for(CMPBucketDefinition bucketDef : bucketDefs) {
257
				String bucketName = bucketDef.getName();
258
				Utils.info("bucketName=" + bucketName);
259
 
1362 rajveer 260
				if(bucketScores.get(bucketName)==null){
261
					continue;
262
				}
1918 rajveer 263
				double aggregateBucketScore = bucketScores.get(bucketName);
72 naveen 264
				Utils.info("aggregateBucketScore=" + aggregateBucketScore);
265
 
1918 rajveer 266
				double bucketSlideCount = bucketSlideCounts.get(bucketName);
72 naveen 267
				Utils.info("bucketSlideCount=" + bucketSlideCount);
268
 
1918 rajveer 269
				double defaultWeight = bucketDef.getDefaultWeight();
72 naveen 270
				Utils.info("defaultWeight=" + defaultWeight);
271
 
272
				float percentageBucketScore = 
273
					(((float)aggregateBucketScore/
274
							((float)bucketSlideCount * 10))) * 100;
275
 
276
				Utils.info("percentageBucketScore=" + percentageBucketScore);
277
 
278
				float weightedBucketScore = 
279
					(float)percentageBucketScore * ((float)defaultWeight / 100);
280
				Utils.info("weightedBucketScore=" + weightedBucketScore);
281
 
282
				finalEntityScore += Math.round(weightedBucketScore);
283
			}
284
			Utils.info("finalEntityScore=" + finalEntityScore);
285
 
1918 rajveer 286
			finalScoreByEntityID.put(entityID, new Double(finalEntityScore));
72 naveen 287
		}
70 naveen 288
 
289
		return finalScoreByEntityID;
290
	}
291
}