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();
127
		for(Slide slide : slides) {
128
			ExpandedSlide expSlide = new ExpandedSlide(slide);
71 naveen 129
			cmpJW.reset();
130
			cmpJW.initialize();
131
 
70 naveen 132
			cmpJW.setExpandedSlide(expSlide);
133
 
134
			long slideDefinitionID = slide.getSlideDefinitionID();
135
			ExpandedCMPSlideRuleDefinition expCMPSlideRuleDef = 
136
				defs.getExpandedComparisonSlideRuleDefinition(
137
						slideDefinitionID);
138
 
71 naveen 139
			if(expCMPSlideRuleDef == null) {
140
				Utils.warning("Could not find comparison definition for " + 
141
						"slide definition ID " + slideDefinitionID);
142
				continue;
143
			}
144
 
70 naveen 145
			cmpJW.setExpandedCMPSlideRuleDefinition(expCMPSlideRuleDef);
146
 
82 naveen 147
			cmpJW.executeRule();
70 naveen 148
 
149
			int score = cmpJW.getScore();
150
			Utils.info("score=" + score);
151
 
152
			slideScores.put(new Long(slideDefinitionID), new Integer(score));
153
		}
154
 
155
		return slideScores;
156
	}
157
 
158
	/**
159
	 * 
160
	 * @param slideScoresByEntity
161
	 * @return Map<Long, Integer>
72 naveen 162
	 * @throws Exception 
70 naveen 163
	 */
344 rajveer 164
	public Map<Long, Integer> getFinalScores(
72 naveen 165
			Map<Long, Map<Long, Integer>> slideScoresByEntity) throws Exception {
70 naveen 166
		Map<Long, Integer> finalScoreByEntityID = new TreeMap<Long, Integer>();
167
 
168
		// Considering default Weights per Slide bucket
169
		// Slide buckets > List(Very Important, Regular, Not-so-Important)
170
		// Default Weights > List(70%, 20%, 10%)
72 naveen 171
		DefinitionsContainer defs = 
172
			Catalog.getInstance().getDefinitionsContainer();
70 naveen 173
 
72 naveen 174
		for(Long entityID : slideScoresByEntity.keySet()) {
175
			Map<Long, Integer> slideScores = slideScoresByEntity.get(entityID);
176
 
1050 rajveer 177
			Entity entity = CreationUtils.getEntity(entityID);
72 naveen 178
			long categoryID = entity.getCategoryID();
179
 
180
			List<CMPBucketDefinition> bucketDefs = 
181
				defs.getComparisonBucketDefinitions(categoryID);
182
 
183
			Map<String, Integer> bucketScores = new HashMap<String, Integer>();
184
			Map<String, Integer> bucketSlideCounts = 
185
				new HashMap<String, Integer>();
186
 
187
			for(Long slideDefinitionID : slideScores.keySet()) {
188
				Integer slideScore = slideScores.get(slideDefinitionID);
189
 
1153 rajveer 190
				Slide slide = CreationUtils.getSlide(entityID, slideDefinitionID);
90 naveen 191
 
192
				String bucketName = null;
1165 rajveer 193
				if(CreationUtils.isBorrowedSlide(slide.getSlideDefinitionID(), entity.getCategoryID())) {
194
					long borrowedCategoryID = CreationUtils.getBorrowedCategoryID(slide.getSlideDefinitionID(), entity.getCategoryID());
90 naveen 195
 
1165 rajveer 196
					bucketName = defs.getComparisonBucketName(borrowedCategoryID, slideDefinitionID.longValue());
90 naveen 197
				}
198
				else {
199
					bucketName = defs.getComparisonBucketName(categoryID, 
72 naveen 200
						slideDefinitionID.longValue());
90 naveen 201
				}
72 naveen 202
 
203
				if(bucketName == null) {
90 naveen 204
					Utils.warning("Comparison bucket not defined for " +
205
							"Category ID=" + categoryID + 
206
							" Slide Definition ID=" + slideDefinitionID);
72 naveen 207
 
208
					continue;
209
				}
90 naveen 210
 
211
				if(!bucketScores.containsKey(bucketName)) {
212
					bucketScores.put(bucketName, new Integer(0));
213
				}
72 naveen 214
 
90 naveen 215
				if(!bucketSlideCounts.containsKey(bucketName)) {
216
					bucketSlideCounts.put(bucketName, new Integer(0));
217
				}
218
 
72 naveen 219
				Integer bucketScore = bucketScores.get(bucketName);
220
				Integer bucketSlideCount = bucketSlideCounts.get(bucketName);
221
 
90 naveen 222
 
72 naveen 223
				Integer newBucketScore =  new Integer(
224
						bucketScore.intValue() + slideScore.intValue());
225
 
226
				Integer newBucketSlideCount =  new Integer(
227
						bucketSlideCount.intValue() + 1);
228
 
229
				bucketScores.put(bucketName, newBucketScore);
230
				bucketSlideCounts.put(bucketName, newBucketSlideCount);
231
			}
232
 
233
			int finalEntityScore = 0;
234
 
235
			// Apply weights and sum up
236
			for(CMPBucketDefinition bucketDef : bucketDefs) {
237
				String bucketName = bucketDef.getName();
238
				Utils.info("bucketName=" + bucketName);
239
 
240
				int aggregateBucketScore = bucketScores.get(bucketName);
241
				Utils.info("aggregateBucketScore=" + aggregateBucketScore);
242
 
243
				int bucketSlideCount = bucketSlideCounts.get(bucketName);
244
				Utils.info("bucketSlideCount=" + bucketSlideCount);
245
 
246
				int defaultWeight = bucketDef.getDefaultWeight();
247
				Utils.info("defaultWeight=" + defaultWeight);
248
 
249
				float percentageBucketScore = 
250
					(((float)aggregateBucketScore/
251
							((float)bucketSlideCount * 10))) * 100;
252
 
253
				Utils.info("percentageBucketScore=" + percentageBucketScore);
254
 
255
				float weightedBucketScore = 
256
					(float)percentageBucketScore * ((float)defaultWeight / 100);
257
				Utils.info("weightedBucketScore=" + weightedBucketScore);
258
 
259
				finalEntityScore += Math.round(weightedBucketScore);
260
			}
261
			Utils.info("finalEntityScore=" + finalEntityScore);
262
 
263
			finalScoreByEntityID.put(entityID, new Integer(finalEntityScore));
264
		}
70 naveen 265
 
266
		return finalScoreByEntityID;
267
	}
268
}