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;
1050 rajveer 12
import in.shop2020.metamodel.util.CreationUtils;
70 naveen 13
import in.shop2020.metamodel.util.ExpandedCMPSlideRuleDefinition;
14
import in.shop2020.metamodel.util.ExpandedSlide;
15
 
457 rajveer 16
import java.io.File;
70 naveen 17
import java.util.HashMap;
18
import java.util.List;
19
import java.util.Map;
20
import java.util.TreeMap;
21
 
22
/**
23
 * @author naveen
24
 *
25
 */
26
public class CMP {
27
 
28
	/**
29
	 * 
30
	 */
31
	private long categoryID;
32
 
33
	/**
34
	 * @param args
35
	 * @throws Exception 
36
	 */
37
	public static void main(String[] args) throws Exception {
38
		String usage = "Usage: CMP {Category ID}";
39
 
40
		if(args.length > 1) {
41
			System.out.println(usage);
42
			System.exit(-1);
43
		}
44
 
45
		long categoryID = 0L;
46
		if(args.length > 0) {
47
			try {
48
				categoryID = Long.parseLong(args[0]);
49
			}
50
			catch (NumberFormatException nfe) {
51
				System.out.println(usage);
52
				System.exit(-1);
53
			}
54
		}
55
 
56
		CMP cmp = new CMP(categoryID);
57
 
110 naveen 58
		// Entity ID > Map(Slide ID > Score)
70 naveen 59
		Map<Long, Map<Long, Integer>> slideScoresByEntity = 
60
			cmp.getSlideScores();
72 naveen 61
		Utils.info("slideScoresByEntity=" + slideScoresByEntity);
70 naveen 62
 
1050 rajveer 63
		CreationUtils.storeSlideScores(slideScoresByEntity);
70 naveen 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
 
1050 rajveer 70
		CreationUtils.storeDefaultEntityScores(finalScoreByEntityID);
71
 
70 naveen 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
1050 rajveer 92
		Map<Long, Entity> entitiesMap = CreationUtils.getEntities();
70 naveen 93
 
94
		for(Long entityID : entitiesMap.keySet()) {
95
			Entity entity = entitiesMap.get(entityID);
96
 
97
			// If provided, filter by category
98
			if(this.categoryID != 0L && 
99
					(this.categoryID != entity.getCategoryID())) {
100
				continue;
101
			}
102
 
103
			Map<Long, Integer> slideScores = this.getSlideScores(entity);
104
 
105
			slideScoresByEntityID.put(entityID, slideScores);
106
		}
107
 
108
		return slideScoresByEntityID;
109
	}
110
 
111
	/**
112
	 * 
113
	 * @param entity
114
	 * @return Map<Long, Integer>
115
	 * @throws Exception 
116
	 */
117
	private Map<Long, Integer> getSlideScores(Entity entity) throws Exception {
118
		Map<Long, Integer> slideScores = new HashMap<Long, Integer>();
119
 
120
		DefinitionsContainer defs = 
121
			Catalog.getInstance().getDefinitionsContainer();
122
 
123
		// Python wrapper for executing rule in python script
124
		CMPJythonWrapper cmpJW = new CMPJythonWrapper();
125
 
126
		// Scores are required for parent slides only
127
		List<Slide> slides = entity.getSlides();
128
		for(Slide slide : slides) {
129
			ExpandedSlide expSlide = new ExpandedSlide(slide);
71 naveen 130
			cmpJW.reset();
131
			cmpJW.initialize();
132
 
70 naveen 133
			cmpJW.setExpandedSlide(expSlide);
134
 
135
			long slideDefinitionID = slide.getSlideDefinitionID();
136
			ExpandedCMPSlideRuleDefinition expCMPSlideRuleDef = 
137
				defs.getExpandedComparisonSlideRuleDefinition(
138
						slideDefinitionID);
139
 
71 naveen 140
			if(expCMPSlideRuleDef == null) {
141
				Utils.warning("Could not find comparison definition for " + 
142
						"slide definition ID " + slideDefinitionID);
143
				continue;
144
			}
145
 
70 naveen 146
			cmpJW.setExpandedCMPSlideRuleDefinition(expCMPSlideRuleDef);
147
 
82 naveen 148
			cmpJW.executeRule();
70 naveen 149
 
150
			int score = cmpJW.getScore();
151
			Utils.info("score=" + score);
152
 
153
			slideScores.put(new Long(slideDefinitionID), new Integer(score));
154
		}
155
 
156
		return slideScores;
157
	}
158
 
159
	/**
160
	 * 
161
	 * @param slideScoresByEntity
162
	 * @return Map<Long, Integer>
72 naveen 163
	 * @throws Exception 
70 naveen 164
	 */
344 rajveer 165
	public Map<Long, Integer> getFinalScores(
72 naveen 166
			Map<Long, Map<Long, Integer>> slideScoresByEntity) throws Exception {
70 naveen 167
		Map<Long, Integer> finalScoreByEntityID = new TreeMap<Long, Integer>();
168
 
169
		// Considering default Weights per Slide bucket
170
		// Slide buckets > List(Very Important, Regular, Not-so-Important)
171
		// Default Weights > List(70%, 20%, 10%)
72 naveen 172
		EntityContainer ents = Catalog.getInstance().getEntityContainer();
173
		DefinitionsContainer defs = 
174
			Catalog.getInstance().getDefinitionsContainer();
70 naveen 175
 
72 naveen 176
		for(Long entityID : slideScoresByEntity.keySet()) {
177
			Map<Long, Integer> slideScores = slideScoresByEntity.get(entityID);
178
 
1050 rajveer 179
			Entity entity = CreationUtils.getEntity(entityID);
72 naveen 180
			long categoryID = entity.getCategoryID();
181
 
182
			List<CMPBucketDefinition> bucketDefs = 
183
				defs.getComparisonBucketDefinitions(categoryID);
184
 
185
			Map<String, Integer> bucketScores = new HashMap<String, Integer>();
186
			Map<String, Integer> bucketSlideCounts = 
187
				new HashMap<String, Integer>();
188
 
189
			for(Long slideDefinitionID : slideScores.keySet()) {
190
				Integer slideScore = slideScores.get(slideDefinitionID);
191
 
90 naveen 192
				Slide slide = ents.getSlide(entityID, slideDefinitionID);
193
 
194
				String bucketName = null;
195
				if(slide.isBorrowed()) {
196
					long borrowedCategoryID = slide.getBorrowedCategoryID();
197
 
198
					bucketName = defs.getComparisonBucketName(
199
							borrowedCategoryID, slideDefinitionID.longValue());
200
				}
201
				else {
202
					bucketName = defs.getComparisonBucketName(categoryID, 
72 naveen 203
						slideDefinitionID.longValue());
90 naveen 204
				}
72 naveen 205
 
206
				if(bucketName == null) {
90 naveen 207
					Utils.warning("Comparison bucket not defined for " +
208
							"Category ID=" + categoryID + 
209
							" Slide Definition ID=" + slideDefinitionID);
72 naveen 210
 
211
					continue;
212
				}
90 naveen 213
 
214
				if(!bucketScores.containsKey(bucketName)) {
215
					bucketScores.put(bucketName, new Integer(0));
216
				}
72 naveen 217
 
90 naveen 218
				if(!bucketSlideCounts.containsKey(bucketName)) {
219
					bucketSlideCounts.put(bucketName, new Integer(0));
220
				}
221
 
72 naveen 222
				Integer bucketScore = bucketScores.get(bucketName);
223
				Integer bucketSlideCount = bucketSlideCounts.get(bucketName);
224
 
90 naveen 225
 
72 naveen 226
				Integer newBucketScore =  new Integer(
227
						bucketScore.intValue() + slideScore.intValue());
228
 
229
				Integer newBucketSlideCount =  new Integer(
230
						bucketSlideCount.intValue() + 1);
231
 
232
				bucketScores.put(bucketName, newBucketScore);
233
				bucketSlideCounts.put(bucketName, newBucketSlideCount);
234
			}
235
 
236
			int finalEntityScore = 0;
237
 
238
			// Apply weights and sum up
239
			for(CMPBucketDefinition bucketDef : bucketDefs) {
240
				String bucketName = bucketDef.getName();
241
				Utils.info("bucketName=" + bucketName);
242
 
243
				int aggregateBucketScore = bucketScores.get(bucketName);
244
				Utils.info("aggregateBucketScore=" + aggregateBucketScore);
245
 
246
				int bucketSlideCount = bucketSlideCounts.get(bucketName);
247
				Utils.info("bucketSlideCount=" + bucketSlideCount);
248
 
249
				int defaultWeight = bucketDef.getDefaultWeight();
250
				Utils.info("defaultWeight=" + defaultWeight);
251
 
252
				float percentageBucketScore = 
253
					(((float)aggregateBucketScore/
254
							((float)bucketSlideCount * 10))) * 100;
255
 
256
				Utils.info("percentageBucketScore=" + percentageBucketScore);
257
 
258
				float weightedBucketScore = 
259
					(float)percentageBucketScore * ((float)defaultWeight / 100);
260
				Utils.info("weightedBucketScore=" + weightedBucketScore);
261
 
262
				finalEntityScore += Math.round(weightedBucketScore);
263
			}
264
			Utils.info("finalEntityScore=" + finalEntityScore);
265
 
266
			finalScoreByEntityID.put(entityID, new Integer(finalEntityScore));
267
		}
70 naveen 268
 
269
		return finalScoreByEntityID;
270
	}
271
}