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;
7
import in.shop2020.metamodel.core.Slide;
72 naveen 8
import in.shop2020.metamodel.definitions.CMPBucketDefinition;
70 naveen 9
import in.shop2020.metamodel.definitions.Catalog;
10
import in.shop2020.metamodel.definitions.DefinitionsContainer;
1050 rajveer 11
import in.shop2020.metamodel.util.CreationUtils;
70 naveen 12
import in.shop2020.metamodel.util.ExpandedCMPSlideRuleDefinition;
13
import in.shop2020.metamodel.util.ExpandedSlide;
14
 
457 rajveer 15
import java.io.File;
70 naveen 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);
56
 
110 naveen 57
		// Entity ID > Map(Slide ID > Score)
70 naveen 58
		Map<Long, Map<Long, Integer>> slideScoresByEntity = 
59
			cmp.getSlideScores();
72 naveen 60
		Utils.info("slideScoresByEntity=" + slideScoresByEntity);
70 naveen 61
 
1050 rajveer 62
		CreationUtils.storeSlideScores(slideScoresByEntity);
70 naveen 63
 
64
		// Entity ID > Final Score 
65
		Map<Long, Integer> finalScoreByEntityID = cmp.getFinalScores(
66
				slideScoresByEntity);
72 naveen 67
		Utils.info("finalScoreByEntityID=" + finalScoreByEntityID);
70 naveen 68
 
1050 rajveer 69
		CreationUtils.storeDefaultEntityScores(finalScoreByEntityID);
70
 
70 naveen 71
	}
72
 
73
	/**
74
	 * 
75
	 * @param categoryID
76
	 */
77
	public CMP(long categoryID) {
78
		this.categoryID = categoryID;
79
	}
80
 
81
	/**
82
	 * 
83
	 * @return Map<Long, Map<Long, Integer>>
84
	 * @throws Exception 
85
	 */
344 rajveer 86
	public Map<Long, Map<Long, Integer>> getSlideScores() throws Exception {
70 naveen 87
		Map<Long, Map<Long, Integer>> slideScoresByEntityID = 
88
			new TreeMap<Long, Map<Long, Integer>>();
89
 
90
		// Calculate scores based on rule
1050 rajveer 91
		Map<Long, Entity> entitiesMap = CreationUtils.getEntities();
70 naveen 92
 
93
		for(Long entityID : entitiesMap.keySet()) {
94
			Entity entity = entitiesMap.get(entityID);
95
 
96
			// If provided, filter by category
97
			if(this.categoryID != 0L && 
98
					(this.categoryID != entity.getCategoryID())) {
99
				continue;
100
			}
101
 
102
			Map<Long, Integer> slideScores = this.getSlideScores(entity);
103
 
104
			slideScoresByEntityID.put(entityID, slideScores);
105
		}
106
 
107
		return slideScoresByEntityID;
108
	}
109
 
110
	/**
111
	 * 
112
	 * @param entity
113
	 * @return Map<Long, Integer>
114
	 * @throws Exception 
115
	 */
116
	private Map<Long, Integer> getSlideScores(Entity entity) throws Exception {
117
		Map<Long, Integer> slideScores = new HashMap<Long, Integer>();
118
 
119
		DefinitionsContainer defs = 
120
			Catalog.getInstance().getDefinitionsContainer();
121
 
122
		// Python wrapper for executing rule in python script
123
		CMPJythonWrapper cmpJW = new CMPJythonWrapper();
124
 
125
		// Scores are required for parent slides only
126
		List<Slide> slides = entity.getSlides();
1362 rajveer 127
		if(slides==null){
128
			return slideScores;
129
		}
70 naveen 130
		for(Slide slide : slides) {
131
			ExpandedSlide expSlide = new ExpandedSlide(slide);
71 naveen 132
			cmpJW.reset();
133
			cmpJW.initialize();
134
 
70 naveen 135
			cmpJW.setExpandedSlide(expSlide);
136
 
137
			long slideDefinitionID = slide.getSlideDefinitionID();
138
			ExpandedCMPSlideRuleDefinition expCMPSlideRuleDef = 
139
				defs.getExpandedComparisonSlideRuleDefinition(
140
						slideDefinitionID);
141
 
71 naveen 142
			if(expCMPSlideRuleDef == null) {
143
				Utils.warning("Could not find comparison definition for " + 
144
						"slide definition ID " + slideDefinitionID);
145
				continue;
146
			}
147
 
70 naveen 148
			cmpJW.setExpandedCMPSlideRuleDefinition(expCMPSlideRuleDef);
149
 
82 naveen 150
			cmpJW.executeRule();
70 naveen 151
 
152
			int score = cmpJW.getScore();
153
			Utils.info("score=" + score);
154
 
155
			slideScores.put(new Long(slideDefinitionID), new Integer(score));
156
		}
157
 
158
		return slideScores;
159
	}
160
 
161
	/**
162
	 * 
163
	 * @param slideScoresByEntity
164
	 * @return Map<Long, Integer>
72 naveen 165
	 * @throws Exception 
70 naveen 166
	 */
344 rajveer 167
	public Map<Long, Integer> getFinalScores(
72 naveen 168
			Map<Long, Map<Long, Integer>> slideScoresByEntity) throws Exception {
70 naveen 169
		Map<Long, Integer> finalScoreByEntityID = new TreeMap<Long, Integer>();
170
 
171
		// Considering default Weights per Slide bucket
172
		// Slide buckets > List(Very Important, Regular, Not-so-Important)
173
		// Default Weights > List(70%, 20%, 10%)
72 naveen 174
		DefinitionsContainer defs = 
175
			Catalog.getInstance().getDefinitionsContainer();
70 naveen 176
 
72 naveen 177
		for(Long entityID : slideScoresByEntity.keySet()) {
178
			Map<Long, Integer> slideScores = slideScoresByEntity.get(entityID);
179
 
1050 rajveer 180
			Entity entity = CreationUtils.getEntity(entityID);
72 naveen 181
			long categoryID = entity.getCategoryID();
1362 rajveer 182
			if(categoryID == -1){
183
				continue;
184
			}
1443 rajveer 185
			if(categoryID>10010){
186
				continue;
187
			}
188
 
72 naveen 189
			List<CMPBucketDefinition> bucketDefs = 
190
				defs.getComparisonBucketDefinitions(categoryID);
191
 
192
			Map<String, Integer> bucketScores = new HashMap<String, Integer>();
193
			Map<String, Integer> bucketSlideCounts = 
194
				new HashMap<String, Integer>();
195
 
196
			for(Long slideDefinitionID : slideScores.keySet()) {
197
				Integer slideScore = slideScores.get(slideDefinitionID);
198
 
1153 rajveer 199
				Slide slide = CreationUtils.getSlide(entityID, slideDefinitionID);
90 naveen 200
 
201
				String bucketName = null;
1165 rajveer 202
				if(CreationUtils.isBorrowedSlide(slide.getSlideDefinitionID(), entity.getCategoryID())) {
203
					long borrowedCategoryID = CreationUtils.getBorrowedCategoryID(slide.getSlideDefinitionID(), entity.getCategoryID());
90 naveen 204
 
1165 rajveer 205
					bucketName = defs.getComparisonBucketName(borrowedCategoryID, slideDefinitionID.longValue());
90 naveen 206
				}
207
				else {
208
					bucketName = defs.getComparisonBucketName(categoryID, 
72 naveen 209
						slideDefinitionID.longValue());
90 naveen 210
				}
72 naveen 211
 
212
				if(bucketName == null) {
90 naveen 213
					Utils.warning("Comparison bucket not defined for " +
214
							"Category ID=" + categoryID + 
215
							" Slide Definition ID=" + slideDefinitionID);
72 naveen 216
 
217
					continue;
218
				}
90 naveen 219
 
220
				if(!bucketScores.containsKey(bucketName)) {
221
					bucketScores.put(bucketName, new Integer(0));
222
				}
72 naveen 223
 
90 naveen 224
				if(!bucketSlideCounts.containsKey(bucketName)) {
225
					bucketSlideCounts.put(bucketName, new Integer(0));
226
				}
227
 
72 naveen 228
				Integer bucketScore = bucketScores.get(bucketName);
229
				Integer bucketSlideCount = bucketSlideCounts.get(bucketName);
230
 
90 naveen 231
 
72 naveen 232
				Integer newBucketScore =  new Integer(
233
						bucketScore.intValue() + slideScore.intValue());
234
 
235
				Integer newBucketSlideCount =  new Integer(
236
						bucketSlideCount.intValue() + 1);
237
 
238
				bucketScores.put(bucketName, newBucketScore);
239
				bucketSlideCounts.put(bucketName, newBucketSlideCount);
240
			}
241
 
242
			int finalEntityScore = 0;
243
 
244
			// Apply weights and sum up
245
			for(CMPBucketDefinition bucketDef : bucketDefs) {
246
				String bucketName = bucketDef.getName();
247
				Utils.info("bucketName=" + bucketName);
248
 
1362 rajveer 249
				if(bucketScores.get(bucketName)==null){
250
					continue;
251
				}
72 naveen 252
				int aggregateBucketScore = bucketScores.get(bucketName);
253
				Utils.info("aggregateBucketScore=" + aggregateBucketScore);
254
 
255
				int bucketSlideCount = bucketSlideCounts.get(bucketName);
256
				Utils.info("bucketSlideCount=" + bucketSlideCount);
257
 
258
				int defaultWeight = bucketDef.getDefaultWeight();
259
				Utils.info("defaultWeight=" + defaultWeight);
260
 
261
				float percentageBucketScore = 
262
					(((float)aggregateBucketScore/
263
							((float)bucketSlideCount * 10))) * 100;
264
 
265
				Utils.info("percentageBucketScore=" + percentageBucketScore);
266
 
267
				float weightedBucketScore = 
268
					(float)percentageBucketScore * ((float)defaultWeight / 100);
269
				Utils.info("weightedBucketScore=" + weightedBucketScore);
270
 
271
				finalEntityScore += Math.round(weightedBucketScore);
272
			}
273
			Utils.info("finalEntityScore=" + finalEntityScore);
274
 
275
			finalScoreByEntityID.put(entityID, new Integer(finalEntityScore));
276
		}
70 naveen 277
 
278
		return finalScoreByEntityID;
279
	}
280
}