Subversion Repositories SmartDukaan

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
62 naveen 1
/**
2
 * 
3
 */
4
package in.shop2020.util;
5
 
102 naveen 6
import in.shop2020.metamodel.core.Bullet;
63 naveen 7
import in.shop2020.metamodel.core.Entity;
8
import in.shop2020.metamodel.core.Feature;
102 naveen 9
import in.shop2020.metamodel.core.PrimitiveDataObject;
63 naveen 10
import in.shop2020.metamodel.core.Slide;
102 naveen 11
import in.shop2020.metamodel.definitions.BulletDefinition;
63 naveen 12
import in.shop2020.metamodel.definitions.Catalog;
64 naveen 13
import in.shop2020.metamodel.definitions.Category;
83 naveen 14
import in.shop2020.metamodel.definitions.DatatypeDefinition;
63 naveen 15
import in.shop2020.metamodel.definitions.DefinitionsContainer;
82 naveen 16
import in.shop2020.metamodel.definitions.FacetDefinition;
1314 rajveer 17
import in.shop2020.metamodel.definitions.FacetSlideDefinition;
63 naveen 18
import in.shop2020.metamodel.definitions.FeatureDefinition;
1050 rajveer 19
import in.shop2020.metamodel.util.CreationUtils;
67 naveen 20
import in.shop2020.metamodel.util.ExpandedBullet;
83 naveen 21
import in.shop2020.metamodel.util.ExpandedBulletDefinition;
64 naveen 22
import in.shop2020.metamodel.util.ExpandedEntity;
82 naveen 23
import in.shop2020.metamodel.util.ExpandedFacetDefinition;
1314 rajveer 24
import in.shop2020.metamodel.util.ExpandedFacetSlideDefinition;
65 naveen 25
import in.shop2020.metamodel.util.ExpandedFeature;
83 naveen 26
import in.shop2020.metamodel.util.ExpandedFeatureDefinition;
65 naveen 27
import in.shop2020.metamodel.util.ExpandedSlide;
451 rajveer 28
import in.shop2020.model.v1.catalog.Item;
897 rajveer 29
import in.shop2020.model.v1.catalog.status;
451 rajveer 30
import in.shop2020.thrift.clients.CatalogServiceClient;
63 naveen 31
 
341 rajveer 32
import java.io.File;
33
import java.io.FileOutputStream;
81 naveen 34
import java.util.ArrayList;
897 rajveer 35
import java.util.Date;
91 naveen 36
import java.util.HashMap;
81 naveen 37
import java.util.List;
82 naveen 38
import java.util.Map;
81 naveen 39
 
341 rajveer 40
import javax.xml.transform.TransformerFactory;
41
import javax.xml.transform.Transformer;
42
import javax.xml.transform.stream.StreamResult;
43
import javax.xml.transform.stream.StreamSource;
44
 
81 naveen 45
import org.apache.commons.lang.StringEscapeUtils;
46
import org.apache.commons.lang.StringUtils;
47
 
341 rajveer 48
 
62 naveen 49
/**
50
 * Command line utility to convert IR Definitions into IR Data and IR Meta-data
51
 * 
1314 rajveer 52
 * @author rajveer
62 naveen 53
 *
54
 */
55
public class IR {
63 naveen 56
 
62 naveen 57
	/**
64 naveen 58
	 * Level - 4, 8, 12, 16
59
	 */
1314 rajveer 60
	private String[] xmlIndentation = {"", "    ", "        ", "            ","                "};
83 naveen 61
 
1314 rajveer 62
	private String[] xmlTabIndentation = {"", "\t", "\t\t", "\t\t\t", "\t\t\t\t", "\t\t\t\t\t", "\t\t\t\t\t\t"};
91 naveen 63
 
1314 rajveer 64
	private Map<Long, List<String>> facetIDFacetValues = new HashMap<Long, List<String>>();
733 rajveer 65
 
66
	CatalogServiceClient catalogServiceClient = null;
67
	in.shop2020.model.v1.catalog.InventoryService.Client client = null;
64 naveen 68
 
69
	/**
62 naveen 70
	 * @param args
63 naveen 71
	 * @throws Exception 
62 naveen 72
	 */
63 naveen 73
	public static void main(String[] args) throws Exception {
62 naveen 74
 
1314 rajveer 75
		IR ir = new IR();
76
		ir.exportIRData();
77
		ir.transformIrDataXMLtoSolrXML();
78
		ir.exportIRMetaData();
79
		ir.transformIrMetaDataXMLSolrSchemaXML();
81 naveen 80
 
62 naveen 81
	}
63 naveen 82
 
83
	/**
84
	 * 
85
	 * @param categoryID
1314 rajveer 86
	 * @return 
733 rajveer 87
	 * @throws Exception 
63 naveen 88
	 */
1314 rajveer 89
	public IR() throws Exception {
733 rajveer 90
		catalogServiceClient = new CatalogServiceClient();
91
		client = catalogServiceClient.getClient();
63 naveen 92
	}
93
 
341 rajveer 94
 
63 naveen 95
	/**
81 naveen 96
	 * 
341 rajveer 97
	 * @param inXMLFilename
98
	 * @param xslFilename
99
	 * @param outXMLFilename
100
	 * @throws Exception 
101
	 */
102
 
103
	public void xsltTransformation(String inXMLFilename, String xslFilename, String outXMLFilename) throws Exception{
104
		// Use the static TransformerFactory.newInstance() method to instantiate 
105
		  // a TransformerFactory. The javax.xml.transform.TransformerFactory 
106
		  // system property setting determines the actual class to instantiate --
107
		  // org.apache.xalan.transformer.TransformerImpl.
108
		TransformerFactory tFactory = TransformerFactory.newInstance();
109
 
110
			// Use the TransformerFactory to instantiate a Transformer that will work with  
111
			// the stylesheet you specify. This method call also processes the stylesheet
112
		  // into a compiled Templates object.
113
		Transformer transformer = tFactory.newTransformer(new StreamSource(xslFilename));
114
 
115
			// Use the Transformer to apply the associated Templates object to an XML document
116
			// (foo.xml) and write the output to a file (foo.out).
117
		transformer.transform(new StreamSource(inXMLFilename), new StreamResult(new FileOutputStream(outXMLFilename)));
118
 
119
	}
120
 
121
	/**
122
	 * 
81 naveen 123
	 * @throws Exception
124
	 */
341 rajveer 125
	public void transformIrDataXMLtoSolrXML() throws Exception {
126
		String irDataFilename = Utils.EXPORT_IR_PATH + "irdata.xml";
127
		String irSolrDataFilename = Utils.EXPORT_SOLR_PATH + "irdata_solr.xml";
128
		String irXslFilename = "src/xsl/irdata_solrdata.xsl";
129
		System.out.println(irSolrDataFilename);
130
		File solrFile = new File(irSolrDataFilename);
131
		if(!solrFile.exists()){
132
			solrFile.createNewFile();
133
		}
134
		xsltTransformation(irDataFilename, irXslFilename, irSolrDataFilename);
135
	}
136
 
137
 
138
	/**
139
	 * 
140
	 * @throws Exception
141
	 */
142
	public void transformIrMetaDataXMLSolrSchemaXML() throws Exception {
143
		String irDataFilename = Utils.EXPORT_IR_PATH + "irmetadata.xml";
144
		String irSolrDataFilename = Utils.EXPORT_SOLR_PATH + "irmetadata_solrschema.xml";
145
		String irXslFilename = "src/xsl/irmetadata_solrschema.xsl";
146
		System.out.println(irSolrDataFilename);
147
		File solrFile = new File(irSolrDataFilename);
148
		if(!solrFile.exists()){
149
			solrFile.createNewFile();
150
		}
151
		xsltTransformation(irDataFilename, irXslFilename, irSolrDataFilename);
152
	}
153
 
154
 
155
 
156
	/**
157
	 * 
158
	 * @throws Exception
159
	 */
81 naveen 160
	public void exportIRMetaData() throws Exception {
161
		DefinitionsContainer defs = 
162
			Catalog.getInstance().getDefinitionsContainer();
82 naveen 163
 
81 naveen 164
		// <IRMetaData>
82 naveen 165
		List<String> xmlSnippets = new ArrayList<String>();
166
		xmlSnippets.add("<IRMetaData>");
83 naveen 167
		xmlSnippets.add("\t<Facets>");
81 naveen 168
 
82 naveen 169
		IRMetaDataJythonWrapper jy = new IRMetaDataJythonWrapper();
81 naveen 170
 
171
		// Iterate over all facet definitions
82 naveen 172
		Map<Long, FacetDefinition> facetDefs = defs.getFacetDefinitions();
173
		for(FacetDefinition facetDef : facetDefs.values()) {
174
 
175
			jy.reset();
176
			jy.initialize();
177
 
178
			ExpandedFacetDefinition expFacetDef = 
179
				new ExpandedFacetDefinition(facetDef);
180
 
181
			jy.setExpandedFacetDefinition(expFacetDef);
182
 
1314 rajveer 183
			jy.setPossibleValues(facetIDFacetValues.get(facetDef.getID()));
184
 
82 naveen 185
			jy.executeRule();
186
 
187
			String facetXMLSnip = jy.getXMLSnippet();
188
			Utils.info("facetXMLSnip=" + facetXMLSnip);
189
 
190
			xmlSnippets.add(facetXMLSnip);
83 naveen 191
 
82 naveen 192
		}
83 naveen 193
		xmlSnippets.add("\t</Facets>");
81 naveen 194
 
1314 rajveer 195
 
83 naveen 196
 
197
		xmlSnippets.add("\n\t<Properties>");
198
 
81 naveen 199
		// Iterate over all feature definitions
83 naveen 200
		Map<Long, FeatureDefinition> featureDefs = defs.getFeatureDefinitions();
201
		for(FeatureDefinition featureDef : featureDefs.values()) {
202
			String propertyXMLSnip = this.getPropertyXMLSnippet(featureDef);
203
			Utils.info("propertyXMLSnip=" + propertyXMLSnip);
204
 
205
			xmlSnippets.add(propertyXMLSnip);
206
		}
81 naveen 207
 
83 naveen 208
		xmlSnippets.add("\t</Properties>");
209
 
210
		xmlSnippets.add("\n\t<Categories>");
211
 
212
		// Iterate over all categories
580 rajveer 213
		/*
1050 rajveer 214
		Category rootCategory = defs.getCategory(Catalog.getInstance().getRootCategory().getID());
83 naveen 215
		List<Category> children = rootCategory.getChildrenCategory();
216
		for (Category child : children) {
516 rajveer 217
 
83 naveen 218
			String categoryXMLSnip = this.getCategoryXMLSnippet(child, 2);
219
			Utils.info("categoryXMLSnip=" + categoryXMLSnip);
220
 
221
			xmlSnippets.add(categoryXMLSnip);
222
		}
580 rajveer 223
		*/
224
 
1050 rajveer 225
		Category rootCategory = defs.getCategory(Catalog.getInstance().getRootCategory().getID());
580 rajveer 226
		String categoryXMLSnip = this.getCategoryXMLSnippet(rootCategory, 2);
227
		Utils.info("categoryXMLSnip=" + categoryXMLSnip);
228
 
229
		xmlSnippets.add(categoryXMLSnip);
230
 
231
 
83 naveen 232
		xmlSnippets.add("\t</Categories>");
233
 
81 naveen 234
		// </IRMetaData>
82 naveen 235
		xmlSnippets.add("</IRMetaData>");
81 naveen 236
 
82 naveen 237
		String irMetaDataXML = StringUtils.join(xmlSnippets, "\n");
81 naveen 238
		Utils.info(irMetaDataXML);
239
 
240
		// Write it to file
241
		String irMetaDataFilename = Utils.EXPORT_IR_PATH + "irmetadata.xml";
242
		DBUtils.store(irMetaDataXML, irMetaDataFilename);
243
	}
244
 
245
	/**
83 naveen 246
	 * 
247
	 * @param category
248
	 * @return
63 naveen 249
	 * @throws Exception 
83 naveen 250
	 */
251
	private String getCategoryXMLSnippet(Category category, int indent) 
252
		throws Exception {
253
 
254
		DefinitionsContainer defs = 
255
			Catalog.getInstance().getDefinitionsContainer();
256
 
257
		String xmlSnip = this.xmlTabIndentation[indent] + "<Category";
258
 
259
		xmlSnip += " ID=\"" + category.getID() + "\"";
260
		xmlSnip += " label=\"" + category.getLabel() + "\"";
261
		xmlSnip += ">\n";
262
 
263
		List<Category> children = category.getChildrenCategory();
264
 
265
		if(children != null) {
266
			for(Category child : children) {
267
				xmlSnip += this.getCategoryXMLSnippet(child, indent+1);
268
			}
269
		}
270
		else {
271
			// Only leaf category will have entities
272
			// Facet IDs
273
			xmlSnip += this.xmlTabIndentation[indent+1] + "<Facets>\n";
274
 
275
			List<Long> facetDefIDs = 
276
				defs.getFacetDefinitionIDs(category.getID());
1229 rajveer 277
			//Utils.info("facetDefIDs=" + facetDefIDs);
83 naveen 278
 
516 rajveer 279
 
280
 
281
			if( facetDefIDs != null && !facetDefIDs.isEmpty() ){
282
					for(Long facetDefID : facetDefIDs) {
283
					xmlSnip += this.xmlTabIndentation[indent+2] + 
284
						"<FacetID>" + facetDefID + "</FacetID>\n";
285
				}
83 naveen 286
			}
287
 
516 rajveer 288
 
83 naveen 289
			xmlSnip += this.xmlTabIndentation[indent+1] + "</Facets>\n\n";
290
 
291
			// Feature IDs
292
			xmlSnip += this.xmlTabIndentation[indent+1] + "<Properties>\n";
293
 
294
			List<Long> featureDefIDs = 
295
				defs.getFeatureDefinitionIDs(category.getID());
1229 rajveer 296
			//Utils.info("featureDefIDs=" + featureDefIDs);
83 naveen 297
 
298
			for(Long featureDefID : featureDefIDs) {
299
				xmlSnip += this.xmlTabIndentation[indent+2] + 
300
					"<FeatureID>" + featureDefID + "</FeatureID>\n";
301
			}
302
 
303
			xmlSnip += this.xmlTabIndentation[indent+1] + "</Properties>\n";
304
		}
305
 
306
		xmlSnip += this.xmlTabIndentation[indent] + "</Category>\n";
307
 
308
		return xmlSnip;
309
	}
310
 
311
	/**
63 naveen 312
	 * 
83 naveen 313
	 * @param featureDef
314
	 * @return
315
	 * @throws Exception 
63 naveen 316
	 */
83 naveen 317
	private String getPropertyXMLSnippet(FeatureDefinition featureDef) 
318
		throws Exception {
319
		String xmlSnip = "\t\t<Property";
320
 
321
		xmlSnip += " ID=\"" + featureDef.getID() + "\"";
322
		xmlSnip += " label=\"" + featureDef.getLabel() + "\"";
323
 
324
		ExpandedFeatureDefinition expFeatureDef = 
325
			new ExpandedFeatureDefinition(featureDef);
326
 
327
		ExpandedBulletDefinition expBulletDef = 
328
			expFeatureDef.getExpandedBulletDefinition();
329
 
330
		String datatype = "string";
331
		if(expBulletDef.isComposite() || expBulletDef.isEnumerated()) {
332
			datatype = "string";
333
		}
334
		else {
335
			DatatypeDefinition datatypeDef = 
336
				expBulletDef.getDatatypeDefinition();
337
 
338
			datatype = datatypeDef.getName();
339
 
340
			// REVISIT
341
			if(datatype.equals("hours_mins") || datatype.equals("days_hours") ||
342
					datatype.equals("hours_mins") || 
343
					datatype.equals("days_hours")) {
344
				datatype = "string";
345
			}
346
		}
347
		xmlSnip += " datatype=\"" + datatype + "\"";
348
 
349
		String multivalue = "false";
350
		if (expBulletDef.isMultivalue()) {
351
			multivalue = "true";
352
		}
353
		xmlSnip += " isMultivalue=\"" + multivalue + "\"";
354
 
355
		xmlSnip += "/>";
356
		return xmlSnip;
357
	}
1314 rajveer 358
 
83 naveen 359
 
1314 rajveer 360
 
361
	private String processFacet(FacetDefinition facet, ExpandedSlide expSlide, ExpandedFacetSlideDefinition expFacetSlideDef, Long facetDefID) throws Exception {
362
 
363
		IRDataJythonWrapper jw = new IRDataJythonWrapper();
63 naveen 364
 
1314 rajveer 365
		jw.setExpandedSlide(expSlide);
366
		jw.setExpandedFacetSlideDefinition(expFacetSlideDef);
733 rajveer 367
 
1314 rajveer 368
		// Execute Python script
369
		jw.executeRule();
63 naveen 370
 
1314 rajveer 371
		//FIXME
372
		// Normalize
373
//		if(defs.needsNormalization(feature.getFeatureDefinitionID())) {
374
//			Utils.info("needsNormalization feature=" + feature.getFeatureDefinitionID());
375
//			
376
//			feature = this.normalize(feature);
377
//		}
63 naveen 378
 
516 rajveer 379
 
64 naveen 380
 
1314 rajveer 381
		List<Object> values = (List<Object>)jw.getValues();
382
		Utils.info("values=" + values);
64 naveen 383
 
1314 rajveer 384
		// Append to facet values
385
 
386
		Utils.info("facetDefID=" + facetDefID);
91 naveen 387
 
1314 rajveer 388
		List<String> facetValues = this.facetIDFacetValues.get(
389
				new Long(facetDefID));
91 naveen 390
 
1314 rajveer 391
		if(facetValues == null) {
392
			facetValues = new ArrayList<String>();
393
			this.facetIDFacetValues.put(new Long(facetDefID), facetValues);
394
		}
88 naveen 395
 
1314 rajveer 396
		if(values != null) {
397
			for(Object value : values) {
398
				String strValue = value.toString();
88 naveen 399
 
1314 rajveer 400
				if(!facetValues.contains(strValue)) {
401
					facetValues.add(strValue);
88 naveen 402
				}
403
			}
404
		}
405
 
1314 rajveer 406
		ExpandedFacetDefinition expFacet = new ExpandedFacetDefinition(facet);
407
		// Parse returned Python list
408
		String facetXMLSnip = null;
409
		if(values != null) {
410
			facetXMLSnip = this.getFacetXMLSnippet(expFacet, values, 2);
88 naveen 411
		}
412
 
1314 rajveer 413
		Utils.info("0 facetXMLSnip=" + facetXMLSnip);
414
		return facetXMLSnip;
88 naveen 415
	}
1314 rajveer 416
 
88 naveen 417
 
1314 rajveer 418
 
88 naveen 419
	/**
420
	 * 
1314 rajveer 421
	 * @param expFacetDef
422
	 * @param values
423
	 * @param indent
424
	 * @return String XML Snippet
88 naveen 425
	 */
1314 rajveer 426
	private String getFacetXMLSnippet(ExpandedFacetDefinition expFacetDef,	List<Object> values, int indent) {
88 naveen 427
 
1314 rajveer 428
		// <Facet Label="Form Factor">
429
		List<String> xmlSnippet = new ArrayList<String>();
430
		String target = expFacetDef.getTarget();
88 naveen 431
 
1314 rajveer 432
		xmlSnippet.add(this.xmlIndentation[indent] + "<Facet ID=\"" + expFacetDef.getID() + "\" Label=\"" + target + "\">");
88 naveen 433
 
1314 rajveer 434
		//<Value>Candybar</Value>
435
		for(Object value : values) {
436
			xmlSnippet.add(this.xmlIndentation[indent + 1] + "<Value>" + value.toString() + "</Value>");
88 naveen 437
		}
438
 
1314 rajveer 439
		//</Facet>
440
		xmlSnippet.add(this.xmlIndentation[indent] + "</Facet>");
88 naveen 441
 
1314 rajveer 442
		return StringUtils.join(xmlSnippet, "\n");
88 naveen 443
	}
1314 rajveer 444
 
88 naveen 445
	/**
1314 rajveer 446
	 * @throws Exception 
88 naveen 447
	 * 
448
	 */
1314 rajveer 449
	public void exportIRData() throws Exception {
450
		DefinitionsContainer defs = Catalog.getInstance().getDefinitionsContainer();
451
		Map<Long, List<FacetDefinition>> slideFacets = defs.getSlideFacetDefinitions();
88 naveen 452
 
1314 rajveer 453
		// <IRData>
454
		List<String> irDataXMLSnippets = new ArrayList<String>();
455
		irDataXMLSnippets.add("<IRData>");
456
 
457
		Map<Long, Entity> entities =  CreationUtils.getEntities();
458
		for(Entity entity: entities.values()){
459
			double itemPrice = 0;
460
			long entityID = entity.getID();
461
			List<Item> items = client.getItemsByCatalogId(entity.getID());
462
			if(items == null){
463
				continue;
88 naveen 464
			}
465
 
1314 rajveer 466
			Date todate = new Date();
467
			Boolean hasActiveItem = false;
468
			for(Item item: items){
469
				if(item.getItemStatus() != status.ACTIVE || todate.getTime() < item.getStartDate()){
470
					continue;
88 naveen 471
				}
1314 rajveer 472
				hasActiveItem = true;
473
				if(itemPrice == 0){
474
					itemPrice = item.getSellingPrice();
475
				}else if(itemPrice>item.getSellingPrice()){
476
					itemPrice = item.getSellingPrice();
88 naveen 477
				}
478
			}
1314 rajveer 479
			if(!hasActiveItem){
897 rajveer 480
				continue;
481
			}
1314 rajveer 482
			ExpandedEntity expEntity = new ExpandedEntity(entity);
483
			long categoryID = expEntity.getCategoryID();
484
			if(categoryID == -1){
485
				continue;
638 rajveer 486
			}
516 rajveer 487
 
1314 rajveer 488
 
64 naveen 489
 
1314 rajveer 490
			List<ExpandedSlide> expSlides = expEntity.getExpandedSlides();
491
			if(expSlides==null){continue;}
64 naveen 492
 
1314 rajveer 493
			List<String> entityXMLSnippets = new ArrayList<String>();
494
			entityXMLSnippets.add(this.xmlIndentation[1] + "<Entity ID=\""+ entityID +"\">");
64 naveen 495
 
1314 rajveer 496
			String parentCategory = expEntity.getCategory().getLabel();
497
			entityXMLSnippets.add(this.xmlIndentation[2] + "<Category>" + StringEscapeUtils.escapeXml(parentCategory) + "</Category>");
90 naveen 498
 
1314 rajveer 499
 
500
			String title = StringEscapeUtils.escapeXml(expEntity.getBrand()) + " " + StringEscapeUtils.escapeXml(expEntity.getModelName()) + 
501
				((expEntity.getModelNumber() != null) ? (" " +	StringEscapeUtils.escapeXml(expEntity.getModelNumber())): "");
346 rajveer 502
 
1314 rajveer 503
			entityXMLSnippets.add(this.xmlIndentation[2] +	"<Title>" + StringEscapeUtils.escapeXml(title) + "</Title>");
64 naveen 504
 
1314 rajveer 505
 
64 naveen 506
 
1314 rajveer 507
			String subCategory = defs.getCategory(categoryID).getLabel();
508
			String  mainCategory = defs.getCategory(categoryID).getParentCategory().getLabel();
88 naveen 509
 
1314 rajveer 510
			String brand = expEntity.getBrand();
88 naveen 511
 
64 naveen 512
 
88 naveen 513
 
1314 rajveer 514
			//Create zero slide
515
			Slide zeroSlide = createZeroSlide(brand, itemPrice, mainCategory, subCategory);
516
			ExpandedSlide expandedZeroSlide = new ExpandedSlide(zeroSlide);
517
			expSlides.add(expandedZeroSlide);
518
 
519
			for(ExpandedSlide expSlide: expSlides){
520
				System.out.println(expSlide.getSlideDefinitionID());
521
				if(slideFacets.containsKey(expSlide.getSlideDefinitionID())){
522
					List<FacetDefinition> facets = slideFacets.get(expSlide.getSlideDefinitionID());
523
					for(FacetDefinition facet: facets){
524
						for(FacetSlideDefinition facetSlides: facet.getFacetSlideDefinitions()){
525
							if(facetSlides.getSlideDefinitionID() != expSlide.getSlideDefinitionID()){continue;}
526
							ExpandedFacetSlideDefinition expFacetSlideDef = new ExpandedFacetSlideDefinition(facetSlides) ;
527
							for(ExpandedFeature expFeature: expSlide.getExpandedFeatures()){
528
								if(defs.needsNormalization(expFeature.getFeatureDefinitionID())) {
529
									Utils.info("needsNormalization feature=" + expFeature.getFeatureDefinitionID());
530
									//expFeature = this.normalize(expFeature);
531
								}
532
							}
533
							entityXMLSnippets.add(processFacet(facet, expSlide, expFacetSlideDef, facet.getID()));
534
						}
535
					}
536
				}
346 rajveer 537
			}
1314 rajveer 538
 
539
			// Collect PROPERTIES
540
			String propertiesXMLSnippetsStr = this.getPropertiesXMLSnippet(expEntity, new ArrayList<Long>(), 2);
541
			entityXMLSnippets.add(propertiesXMLSnippetsStr);
542
			entityXMLSnippets.add(this.xmlIndentation[1] + "</Entity>");
543
			System.out.println(entityXMLSnippets);
544
			irDataXMLSnippets.addAll(entityXMLSnippets);
545
 
346 rajveer 546
		}
547
 
1314 rajveer 548
		irDataXMLSnippets.add("</IRData>");
346 rajveer 549
 
1314 rajveer 550
		String irDataXML = StringUtils.join(irDataXMLSnippets, "\n");
551
		Utils.info(irDataXML);
64 naveen 552
 
1314 rajveer 553
		// Write it to file
554
		String irDataFilename = Utils.EXPORT_IR_PATH + "irdata.xml";
555
		DBUtils.store(irDataXML, irDataFilename);
556
	}
557
 
558
	private Slide createZeroSlide(String brand, double price, String mainCategory, String subCategory) {
559
		Slide zeroSlide = new Slide(130000);
560
		List<Feature> zeroSlideFeatures = new ArrayList<Feature>();
91 naveen 561
 
1314 rajveer 562
		Feature brandFeature = new Feature(120080);
563
		Bullet brandBullet = new Bullet(new PrimitiveDataObject(brand));
564
		List<Bullet> brandBullets = new ArrayList<Bullet>();
565
		brandBullets.add(brandBullet);
566
		brandFeature.setBullets(brandBullets);
567
		zeroSlideFeatures.add(brandFeature);
91 naveen 568
 
1314 rajveer 569
		Feature priceFeature = new Feature(120128);
570
		Bullet priceBullet = new Bullet(new PrimitiveDataObject((new Double(price)).toString()));
571
		List<Bullet> priceBullets = new ArrayList<Bullet>();
572
		priceBullets.add(priceBullet);
573
		priceFeature.setBullets(priceBullets);
574
		zeroSlideFeatures.add(priceFeature);
91 naveen 575
 
1314 rajveer 576
		Feature mainCategoryFeature = new Feature(120123);
577
		Bullet mainCategoryBullet = new Bullet(new PrimitiveDataObject(mainCategory));
578
		List<Bullet> mainCategoryBullets = new ArrayList<Bullet>();
579
		mainCategoryBullets.add(mainCategoryBullet);
580
		mainCategoryFeature.setBullets(mainCategoryBullets);
581
		zeroSlideFeatures.add(mainCategoryFeature);
64 naveen 582
 
1314 rajveer 583
		Feature subCategoryFeature = new Feature(120124);
584
		Bullet subCategoryBullet = new Bullet(new PrimitiveDataObject(subCategory));
585
		List<Bullet> subCategoryBullets = new ArrayList<Bullet>();
586
		subCategoryBullets.add(subCategoryBullet);
587
		subCategoryFeature.setBullets(subCategoryBullets);
588
		zeroSlideFeatures.add(subCategoryFeature);
589
 
590
		zeroSlide.setFeatures(zeroSlideFeatures);
591
		return zeroSlide;
64 naveen 592
	}
1314 rajveer 593
 
102 naveen 594
 
595
	/**
596
	 * 
597
	 * @param feature
598
	 * @return Feature
599
	 * @throws Exception 
600
	 */
1314 rajveer 601
	private ExpandedFeature normalize(ExpandedFeature expFeature) throws Exception {
102 naveen 602
		BulletDefinition bulletDef = 
603
			expFeature.getFeatureDefinition().getBulletDefinition();
604
 
605
		ExpandedBulletDefinition expBulletDef = new ExpandedBulletDefinition(
606
				bulletDef);
607
 
608
		if(expBulletDef.isPrimitive()) {
609
			PrimitiveNormalizationJythonWrapper jy = 
610
				new PrimitiveNormalizationJythonWrapper();
611
 
612
			jy.setExpandedFeature(expFeature);
613
 
614
			jy.excuteRule();
615
 
616
			String newValue = jy.getNewValue();
617
			long newUnitID = jy.getNewUnitID();
618
 
619
			List<Bullet> newBullets = new ArrayList<Bullet>();
620
			Bullet newBullet = new Bullet(new PrimitiveDataObject(newValue));
621
			newBullet.setUnitID(newUnitID);
622
 
623
			newBullets.add(newBullet);
624
 
1314 rajveer 625
			expFeature.setBullets(newBullets);
102 naveen 626
		}
627
		else {
628
			Utils.severe("Normalization not defined for non-primitives");
629
		}
630
 
1314 rajveer 631
		return expFeature;
102 naveen 632
	}
633
 
67 naveen 634
	/**
635
	 * 
636
	 * @param expEntity
637
	 * @param facetFeatureIDs
638
	 * @param indent
639
	 * @return
640
	 */
641
	private String getPropertiesXMLSnippet(ExpandedEntity expEntity, 
642
			List<Long> facetFeatureIDs, int indent) {
643
 
644
		List<String> xmlSnippet = new ArrayList<String>();
645
 
646
		// Collect all free-form content here
647
		List<String> ffc = new ArrayList<String>();
648
 
649
		// Features
650
		List<ExpandedSlide> expSlides = expEntity.getExpandedSlides();
651
 
652
		for(ExpandedSlide expSlide : expSlides) {
1314 rajveer 653
			if(expSlide.getSlideDefinitionID() == 13000){
654
				continue;
655
			}
67 naveen 656
			List<ExpandedFeature> expFeatures = expSlide.getExpandedFeatures();
657
 
658
			if(expSlide.getFreeformContent() != null) {
199 naveen 659
				ffc.add(expSlide.getFreeformContent().getFreeformText());
67 naveen 660
			}
661
 
662
			if(expFeatures == null) {
663
				continue;
664
			}
665
 
666
			for(ExpandedFeature expFeature : expFeatures) {
667
				Long featureDefID = 
668
					new Long(expFeature.getFeatureDefinitionID());
669
 
670
				// FFC at feature level
671
				if(expFeature.getFreeformContent() != null) {
199 naveen 672
					ffc.add(expFeature.getFreeformContent().getFreeformText());
67 naveen 673
				}
674
 
675
				// Exclude those who are already covered as facets
676
				if(facetFeatureIDs.contains(featureDefID)) {
677
					continue;
678
				}
679
 
680
				List<ExpandedBullet> expBullets = 
681
					expFeature.getExpandedBullets();
682
 
683
				if(expBullets == null) {
684
					continue;
685
				}
686
 
687
				//<Property Label="">
688
				xmlSnippet.add(this.xmlIndentation[indent] + 
83 naveen 689
						"<Property ID=\"" + expFeature.getFeatureDefinitionID() 
690
						+ "\" Label=\"" + StringEscapeUtils.escapeXml(
67 naveen 691
								expFeature.getFeatureDefinition().getLabel()) + 
692
						"\">");
693
 
694
				//<Value></Value>
695
				for(ExpandedBullet bullet : expBullets) {
696
 
697
					// FFC at bullet level
698
					if(bullet.getFreeformContent() != null) {
199 naveen 699
						ffc.add(bullet.getFreeformContent().getFreeformText());
67 naveen 700
					}
701
 
702
					xmlSnippet.add(this.xmlIndentation[indent + 1] + "<Value>" + 
703
							StringEscapeUtils.escapeXml(bullet.getValue()) + 
704
							"</Value>");
705
				}
706
 
707
				//</Property>
708
				xmlSnippet.add(this.xmlIndentation[indent] + "</Property>");
709
			}
710
		}
711
 
712
		// FFC as Label="Free-form Content"
713
		if(!ffc.isEmpty()) {
714
			xmlSnippet.add(this.xmlIndentation[indent] + 
108 naveen 715
					"<Property ID=\"000000\" Label=\"Free-form Content\">");
67 naveen 716
 
717
			for(String f : ffc) {
718
				if(f != null) {
719
					f = StringEscapeUtils.escapeXml(f);
720
 
721
					xmlSnippet.add(this.xmlIndentation[indent + 1] + "<Value>" + 
722
						f + "</Value>");
723
				}
724
			}
725
 
726
			xmlSnippet.add(this.xmlIndentation[indent] + "</Property>");
727
		}
728
 
729
		// Children slides
730
		// TODO
731
 
732
		return StringUtils.join(xmlSnippet, "\n");
733
	}
64 naveen 734
 
62 naveen 735
}