Subversion Repositories SmartDukaan

Rev

Rev 2367 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2171 rajveer 1
/**
2
 * 
3
 */
4
package in.shop2020.util;
5
 
6
import in.shop2020.metamodel.core.Entity;
7
import in.shop2020.metamodel.core.EntityStatus;
8
import in.shop2020.metamodel.core.Slide;
9
import in.shop2020.metamodel.definitions.CMPBucketDefinition;
10
import in.shop2020.metamodel.definitions.Catalog;
11
import in.shop2020.metamodel.definitions.DefinitionsContainer;
12
import in.shop2020.metamodel.util.CreationUtils;
13
import in.shop2020.metamodel.util.ExpandedCMPSlideRuleDefinition;
14
import in.shop2020.metamodel.util.ExpandedSlide;
15
import in.shop2020.model.v1.catalog.Item;
16
 
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 NewCMP {
27
 
28
	/**
29
	 * 
30
	 */
31
	//private long categoryID;
32
 
33
	Map<Long, List<Item>> entityIdItemMap;
34
 
35
 
36
	/**
37
	 * @param args
38
	 * @throws Exception 
39
	 */
40
	public static void main(String[] args) throws Exception {
41
		String usage = "Usage: CMP {Category ID}";
42
 
43
		if(args.length > 1) {
44
			System.out.println(usage);
45
			System.exit(-1);
46
		}
47
 
48
		long categoryID = 0L;
49
		if(args.length > 0) {
50
			try {
51
				categoryID = Long.parseLong(args[0]);
52
			}
53
			catch (NumberFormatException nfe) {
54
				System.out.println(usage);
55
				System.exit(-1);
56
			}
57
		}
58
		/*
59
		NewCMP cmp = new NewCMP(entityIdItemMap);
60
//		
61
//		Entity entity = CreationUtils.getEntity(1000165);
62
//		 Map<Long, Double> slideScores = cmp.getSlideScores(entity);
63
//		 Utils.info(slideScores);
64
 
65
 
66
		// Entity ID > Map(Slide ID > Score)
67
		Map<Long, Map<Long, Double>> slideScoresByEntity = cmp.getSlideScores();
68
		Utils.info("slideScoresByEntity=" + slideScoresByEntity);
69
 
70
		CreationUtils.storeSlideScores(slideScoresByEntity);
71
 
72
		// Entity ID > Final Score 
73
		Map<Long, Double> finalScoreByEntityID = cmp.getFinalScores(
74
				slideScoresByEntity);
75
		Utils.info("finalScoreByEntityID=" + finalScoreByEntityID);
76
 
77
		CreationUtils.storeDefaultEntityScores(finalScoreByEntityID);
78
	*/
79
	}
80
 
81
	/**
82
	 * 
83
	 * @param entityIdItemMap
84
	 */
85
	public NewCMP(Map<Long, List<Item>> entityIdItemMap) {
86
	    this.entityIdItemMap = entityIdItemMap;
87
	}
88
 
89
	/**
90
	 * 
91
	 * @return Map<Long, Map<Long, Double>>
92
	 * @throws Exception 
93
	 */
94
	public Map<Long, Map<Long, Double>> getSlideScores() throws Exception {
95
		Map<Long, Map<Long, Double>> slideScoresByEntityID = 
96
			new TreeMap<Long, Map<Long, Double>>();
97
 
98
 
99
 
100
		for(Long entityID : entityIdItemMap.keySet()) {
101
			Entity entity = CreationUtils.getEntity(entityID);
102
 
103
			//Skip categories with value as -1 or categories except mobile phones
104
			if(entity.getCategoryID() == -1 || Catalog.getInstance().getDefinitionsContainer().getCategory(entity.getCategoryID()).getParentCategory().getID() != Utils.MOBILE_PHONES_CATAGOEY){
105
			    continue;
106
			}
107
 
108
			Map<Long, Double> slideScores = this.getSlideScores(entity);
109
 
110
			slideScoresByEntityID.put(entityID, slideScores);
111
		}
112
 
113
		return slideScoresByEntityID;
114
	}
115
 
116
	/**
117
	 * 
118
	 * @param entity
119
	 * @return Map<Long, Double>
120
	 * @throws Exception 
121
	 */
122
	private Map<Long, Double> getSlideScores(Entity entity) throws Exception {
123
		Map<Long, Double> slideScores = new HashMap<Long, Double>();
124
 
125
		DefinitionsContainer defs = 
126
			Catalog.getInstance().getDefinitionsContainer();
127
 
128
		// Python wrapper for executing rule in python script
129
		CMPJythonWrapper cmpJW = new CMPJythonWrapper();
130
 
131
		// Scores are required for parent slides only
132
		List<Slide> slides = entity.getSlides();
133
		if(slides==null){
134
			return slideScores;
135
		}
136
		for(Slide slide : slides) {
137
			ExpandedSlide expSlide = new ExpandedSlide(slide);
138
			cmpJW.reset();
139
			cmpJW.initialize();
140
 
141
			cmpJW.setExpandedSlide(expSlide);
142
 
143
			long slideDefinitionID = slide.getSlideDefinitionID();
144
			ExpandedCMPSlideRuleDefinition expCMPSlideRuleDef = 
145
				defs.getExpandedComparisonSlideRuleDefinition(
146
						slideDefinitionID);
147
 
148
			if(expCMPSlideRuleDef == null) {
149
				Utils.warning("Could not find comparison definition for " + 
150
						"slide definition ID " + slideDefinitionID);
151
				continue;
152
			}
153
 
154
			cmpJW.setExpandedCMPSlideRuleDefinition(expCMPSlideRuleDef);
155
 
156
			cmpJW.executeRule();
157
 
158
			double score = cmpJW.getScore();
159
			Utils.info("score=" + score);
160
 
161
			slideScores.put(new Long(slideDefinitionID), new Double(score));
162
		}
163
 
164
		return slideScores;
165
	}
166
 
167
	/**
168
	 * 
169
	 * @param slideScoresByEntity
170
	 * @return Map<Long, Double>
171
	 * @throws Exception 
172
	 */
173
	public Map<Long, Double> getFinalScores(
174
			Map<Long, Map<Long, Double>> slideScoresByEntity) throws Exception {
175
		Map<Long, Double> finalScoreByEntityID = new TreeMap<Long, Double>();
176
 
177
		// Considering default Weights per Slide bucket
178
		// Slide buckets > List(Very Important, Regular, Not-so-Important)
179
		// Default Weights > List(70%, 20%, 10%)
180
		DefinitionsContainer defs = 
181
			Catalog.getInstance().getDefinitionsContainer();
182
 
183
		for(Long entityID : slideScoresByEntity.keySet()) {
184
			Map<Long, Double> slideScores = slideScoresByEntity.get(entityID);
185
 
186
			Entity entity = CreationUtils.getEntity(entityID);
187
			long categoryID = entity.getCategoryID();
188
			if(categoryID == -1){
189
				continue;
190
			}
191
			if(categoryID>10010){
192
				continue;
193
			}
194
 
195
			List<CMPBucketDefinition> bucketDefs = 
196
				defs.getComparisonBucketDefinitions(categoryID);
197
 
198
			Map<String, Double> bucketScores = new HashMap<String, Double>();
199
			Map<String, Double> bucketSlideCounts = 
200
				new HashMap<String, Double>();
201
 
202
			for(Long slideDefinitionID : slideScores.keySet()) {
203
				Double slideScore = slideScores.get(slideDefinitionID);
204
 
205
				Slide slide = CreationUtils.getSlide(entityID, slideDefinitionID);
206
 
207
				String bucketName = null;
208
				if(CreationUtils.isBorrowedSlide(slide.getSlideDefinitionID(), entity.getCategoryID())) {
209
					long borrowedCategoryID = CreationUtils.getBorrowedCategoryID(slide.getSlideDefinitionID(), entity.getCategoryID());
210
 
211
					bucketName = defs.getComparisonBucketName(borrowedCategoryID, slideDefinitionID.longValue());
212
				}
213
				else {
214
					bucketName = defs.getComparisonBucketName(categoryID, 
215
						slideDefinitionID.longValue());
216
				}
217
 
218
				if(bucketName == null) {
219
					Utils.warning("Comparison bucket not defined for " +
220
							"Category ID=" + categoryID + 
221
							" Slide Definition ID=" + slideDefinitionID);
222
 
223
					continue;
224
				}
225
 
226
				if(!bucketScores.containsKey(bucketName)) {
227
					bucketScores.put(bucketName, new Double(0));
228
				}
229
 
230
				if(!bucketSlideCounts.containsKey(bucketName)) {
231
					bucketSlideCounts.put(bucketName, new Double(0));
232
				}
233
 
234
				Double bucketScore = bucketScores.get(bucketName);
235
				Double bucketSlideCount = bucketSlideCounts.get(bucketName);
236
 
237
 
238
				Double newBucketScore =  new Double(
239
						bucketScore.intValue() + slideScore.intValue());
240
 
241
				Double newBucketSlideCount =  new Double(
242
						bucketSlideCount.intValue() + 1);
243
 
244
				bucketScores.put(bucketName, newBucketScore);
245
				bucketSlideCounts.put(bucketName, newBucketSlideCount);
246
			}
247
 
248
			int finalEntityScore = 0;
249
 
250
			// Apply weights and sum up
251
			for(CMPBucketDefinition bucketDef : bucketDefs) {
252
				String bucketName = bucketDef.getName();
253
				Utils.info("bucketName=" + bucketName);
254
 
255
				if(bucketScores.get(bucketName)==null){
256
					continue;
257
				}
258
				double aggregateBucketScore = bucketScores.get(bucketName);
259
				Utils.info("aggregateBucketScore=" + aggregateBucketScore);
260
 
261
				double bucketSlideCount = bucketSlideCounts.get(bucketName);
262
				Utils.info("bucketSlideCount=" + bucketSlideCount);
263
 
264
				double defaultWeight = bucketDef.getDefaultWeight();
265
				Utils.info("defaultWeight=" + defaultWeight);
266
 
267
				float percentageBucketScore = 
268
					(((float)aggregateBucketScore/
269
							((float)bucketSlideCount * 10))) * 100;
270
 
271
				Utils.info("percentageBucketScore=" + percentageBucketScore);
272
 
273
				float weightedBucketScore = 
274
					(float)percentageBucketScore * ((float)defaultWeight / 100);
275
				Utils.info("weightedBucketScore=" + weightedBucketScore);
276
 
277
				finalEntityScore += Math.round(weightedBucketScore);
278
			}
279
			Utils.info("finalEntityScore=" + finalEntityScore);
280
 
281
			finalScoreByEntityID.put(entityID, new Double(finalEntityScore));
282
		}
283
 
284
		return finalScoreByEntityID;
285
	}
286
}