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;
11
import in.shop2020.metamodel.definitions.EntityContainer;
12
import in.shop2020.metamodel.util.ExpandedCMPSlideRuleDefinition;
13
import in.shop2020.metamodel.util.ExpandedSlide;
14
 
15
import java.util.HashMap;
16
import java.util.List;
17
import java.util.Map;
18
import java.util.TreeMap;
19
 
20
/**
21
 * @author naveen
22
 *
23
 */
24
public class CMP {
25
 
26
	/**
27
	 * 
28
	 */
29
	private long categoryID;
30
 
31
	/**
32
	 * @param args
33
	 * @throws Exception 
34
	 */
35
	public static void main(String[] args) throws Exception {
36
		String usage = "Usage: CMP {Category ID}";
37
 
38
		if(args.length > 1) {
39
			System.out.println(usage);
40
			System.exit(-1);
41
		}
42
 
43
		long categoryID = 0L;
44
		if(args.length > 0) {
45
			try {
46
				categoryID = Long.parseLong(args[0]);
47
			}
48
			catch (NumberFormatException nfe) {
49
				System.out.println(usage);
50
				System.exit(-1);
51
			}
52
		}
53
 
54
		CMP cmp = new CMP(categoryID);
55
 
56
		// Entity ID > List(Slide ID > Score)
57
		Map<Long, Map<Long, Integer>> slideScoresByEntity = 
58
			cmp.getSlideScores();
72 naveen 59
		Utils.info("slideScoresByEntity=" + slideScoresByEntity);
70 naveen 60
 
61
		String dbFile = Utils.COMPARISONS_DB_PATH + "slidescores.ser";
62
		DBUtils.store(slideScoresByEntity, dbFile);
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
 
69
		dbFile = Utils.COMPARISONS_DB_PATH + "defaultentityscores.ser";
70
		DBUtils.store(finalScoreByEntityID, dbFile);
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
	 */
86
	private Map<Long, Map<Long, Integer>> getSlideScores() throws Exception {
87
		Map<Long, Map<Long, Integer>> slideScoresByEntityID = 
88
			new TreeMap<Long, Map<Long, Integer>>();
89
 
90
		// Calculate scores based on rule
91
		EntityContainer ents = 
92
			Catalog.getInstance().getEntityContainer();
93
 
94
		Map<Long, Entity> entitiesMap = ents.getEntities();
95
 
96
		for(Long entityID : entitiesMap.keySet()) {
97
			Entity entity = entitiesMap.get(entityID);
98
 
99
			// If provided, filter by category
100
			if(this.categoryID != 0L && 
101
					(this.categoryID != entity.getCategoryID())) {
102
				continue;
103
			}
104
 
105
			Map<Long, Integer> slideScores = this.getSlideScores(entity);
106
 
107
			slideScoresByEntityID.put(entityID, slideScores);
108
		}
109
 
110
		return slideScoresByEntityID;
111
	}
112
 
113
	/**
114
	 * 
115
	 * @param entity
116
	 * @return Map<Long, Integer>
117
	 * @throws Exception 
118
	 */
119
	private Map<Long, Integer> getSlideScores(Entity entity) throws Exception {
120
		Map<Long, Integer> slideScores = new HashMap<Long, Integer>();
121
 
122
		DefinitionsContainer defs = 
123
			Catalog.getInstance().getDefinitionsContainer();
124
 
125
		// Python wrapper for executing rule in python script
126
		CMPJythonWrapper cmpJW = new CMPJythonWrapper();
127
 
128
		// Scores are required for parent slides only
129
		List<Slide> slides = entity.getSlides();
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
	 */
167
	private 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
		EntityContainer ents = Catalog.getInstance().getEntityContainer();
175
		DefinitionsContainer defs = 
176
			Catalog.getInstance().getDefinitionsContainer();
70 naveen 177
 
72 naveen 178
		for(Long entityID : slideScoresByEntity.keySet()) {
179
			Map<Long, Integer> slideScores = slideScoresByEntity.get(entityID);
180
 
181
			Entity entity = ents.getEntity(entityID);
182
			long categoryID = entity.getCategoryID();
183
 
184
			List<CMPBucketDefinition> bucketDefs = 
185
				defs.getComparisonBucketDefinitions(categoryID);
186
 
187
			Map<String, Integer> bucketScores = new HashMap<String, Integer>();
188
			Map<String, Integer> bucketSlideCounts = 
189
				new HashMap<String, Integer>();
190
 
191
			for(Long slideDefinitionID : slideScores.keySet()) {
192
				Integer slideScore = slideScores.get(slideDefinitionID);
193
 
90 naveen 194
				Slide slide = ents.getSlide(entityID, slideDefinitionID);
195
 
196
				String bucketName = null;
197
				if(slide.isBorrowed()) {
198
					long borrowedCategoryID = slide.getBorrowedCategoryID();
199
 
200
					bucketName = defs.getComparisonBucketName(
201
							borrowedCategoryID, slideDefinitionID.longValue());
202
				}
203
				else {
204
					bucketName = defs.getComparisonBucketName(categoryID, 
72 naveen 205
						slideDefinitionID.longValue());
90 naveen 206
				}
72 naveen 207
 
208
				if(bucketName == null) {
90 naveen 209
					Utils.warning("Comparison bucket not defined for " +
210
							"Category ID=" + categoryID + 
211
							" Slide Definition ID=" + slideDefinitionID);
72 naveen 212
 
213
					continue;
214
				}
90 naveen 215
 
216
				if(!bucketScores.containsKey(bucketName)) {
217
					bucketScores.put(bucketName, new Integer(0));
218
				}
72 naveen 219
 
90 naveen 220
				if(!bucketSlideCounts.containsKey(bucketName)) {
221
					bucketSlideCounts.put(bucketName, new Integer(0));
222
				}
223
 
72 naveen 224
				Integer bucketScore = bucketScores.get(bucketName);
225
				Integer bucketSlideCount = bucketSlideCounts.get(bucketName);
226
 
90 naveen 227
 
72 naveen 228
				Integer newBucketScore =  new Integer(
229
						bucketScore.intValue() + slideScore.intValue());
230
 
231
				Integer newBucketSlideCount =  new Integer(
232
						bucketSlideCount.intValue() + 1);
233
 
234
				bucketScores.put(bucketName, newBucketScore);
235
				bucketSlideCounts.put(bucketName, newBucketSlideCount);
236
			}
237
 
238
			int finalEntityScore = 0;
239
 
240
			// Apply weights and sum up
241
			for(CMPBucketDefinition bucketDef : bucketDefs) {
242
				String bucketName = bucketDef.getName();
243
				Utils.info("bucketName=" + bucketName);
244
 
245
				int aggregateBucketScore = bucketScores.get(bucketName);
246
				Utils.info("aggregateBucketScore=" + aggregateBucketScore);
247
 
248
				int bucketSlideCount = bucketSlideCounts.get(bucketName);
249
				Utils.info("bucketSlideCount=" + bucketSlideCount);
250
 
251
				int defaultWeight = bucketDef.getDefaultWeight();
252
				Utils.info("defaultWeight=" + defaultWeight);
253
 
254
				float percentageBucketScore = 
255
					(((float)aggregateBucketScore/
256
							((float)bucketSlideCount * 10))) * 100;
257
 
258
				Utils.info("percentageBucketScore=" + percentageBucketScore);
259
 
260
				float weightedBucketScore = 
261
					(float)percentageBucketScore * ((float)defaultWeight / 100);
262
				Utils.info("weightedBucketScore=" + weightedBucketScore);
263
 
264
				finalEntityScore += Math.round(weightedBucketScore);
265
			}
266
			Utils.info("finalEntityScore=" + finalEntityScore);
267
 
268
			finalScoreByEntityID.put(entityID, new Integer(finalEntityScore));
269
		}
70 naveen 270
 
271
		return finalScoreByEntityID;
272
	}
273
}