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