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;
193
				if(slide.isBorrowed()) {
194
					long borrowedCategoryID = slide.getBorrowedCategoryID();
195
 
196
					bucketName = defs.getComparisonBucketName(
197
							borrowedCategoryID, slideDefinitionID.longValue());
198
				}
199
				else {
200
					bucketName = defs.getComparisonBucketName(categoryID, 
72 naveen 201
						slideDefinitionID.longValue());
90 naveen 202
				}
72 naveen 203
 
204
				if(bucketName == null) {
90 naveen 205
					Utils.warning("Comparison bucket not defined for " +
206
							"Category ID=" + categoryID + 
207
							" Slide Definition ID=" + slideDefinitionID);
72 naveen 208
 
209
					continue;
210
				}
90 naveen 211
 
212
				if(!bucketScores.containsKey(bucketName)) {
213
					bucketScores.put(bucketName, new Integer(0));
214
				}
72 naveen 215
 
90 naveen 216
				if(!bucketSlideCounts.containsKey(bucketName)) {
217
					bucketSlideCounts.put(bucketName, new Integer(0));
218
				}
219
 
72 naveen 220
				Integer bucketScore = bucketScores.get(bucketName);
221
				Integer bucketSlideCount = bucketSlideCounts.get(bucketName);
222
 
90 naveen 223
 
72 naveen 224
				Integer newBucketScore =  new Integer(
225
						bucketScore.intValue() + slideScore.intValue());
226
 
227
				Integer newBucketSlideCount =  new Integer(
228
						bucketSlideCount.intValue() + 1);
229
 
230
				bucketScores.put(bucketName, newBucketScore);
231
				bucketSlideCounts.put(bucketName, newBucketSlideCount);
232
			}
233
 
234
			int finalEntityScore = 0;
235
 
236
			// Apply weights and sum up
237
			for(CMPBucketDefinition bucketDef : bucketDefs) {
238
				String bucketName = bucketDef.getName();
239
				Utils.info("bucketName=" + bucketName);
240
 
241
				int aggregateBucketScore = bucketScores.get(bucketName);
242
				Utils.info("aggregateBucketScore=" + aggregateBucketScore);
243
 
244
				int bucketSlideCount = bucketSlideCounts.get(bucketName);
245
				Utils.info("bucketSlideCount=" + bucketSlideCount);
246
 
247
				int defaultWeight = bucketDef.getDefaultWeight();
248
				Utils.info("defaultWeight=" + defaultWeight);
249
 
250
				float percentageBucketScore = 
251
					(((float)aggregateBucketScore/
252
							((float)bucketSlideCount * 10))) * 100;
253
 
254
				Utils.info("percentageBucketScore=" + percentageBucketScore);
255
 
256
				float weightedBucketScore = 
257
					(float)percentageBucketScore * ((float)defaultWeight / 100);
258
				Utils.info("weightedBucketScore=" + weightedBucketScore);
259
 
260
				finalEntityScore += Math.round(weightedBucketScore);
261
			}
262
			Utils.info("finalEntityScore=" + finalEntityScore);
263
 
264
			finalScoreByEntityID.put(entityID, new Integer(finalEntityScore));
265
		}
70 naveen 266
 
267
		return finalScoreByEntityID;
268
	}
269
}