/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.search.builder; import java.util.Date; import java.util.Set; import com.enonic.cms.core.search.ElasticSearchFormatter; import com.enonic.cms.core.search.IndexFieldnameNormalizer; import com.enonic.cms.core.search.IndexValueNormalizer; public class ContentIndexDataElementFactory extends IndexFieldNameConstants { public static ContentIndexDataElement create( final String fieldBaseName, final Set<Object> values, boolean addOrderBy ) { return doCreateContentIndexDataElement( fieldBaseName, values, addOrderBy ); } public static ContentIndexDataElement create( final String fieldBaseName, final Set<Object> values ) { return doCreateContentIndexDataElement( fieldBaseName, values, true ); } private static ContentIndexDataElement doCreateContentIndexDataElement( final String fieldBaseName, final Set<Object> values, boolean addOrderBy ) { ContentIndexDataElement contentIndexDataElement = new ContentIndexDataElement(); contentIndexDataElement.setFieldBaseName( IndexFieldnameNormalizer.normalizeFieldName( fieldBaseName ) ); if ( values == null || values.isEmpty() ) { return contentIndexDataElement; } for ( final Object value : values ) { if ( value == null ) { continue; } if ( value instanceof Number ) { contentIndexDataElement.addNumericValue( ( (Number) value ).doubleValue() ); contentIndexDataElement.addStringValue( IndexValueNormalizer.normalizeStringValue( value.toString() ) ); } else if ( value instanceof Date ) { contentIndexDataElement.addDateValue( (Date) value ); contentIndexDataElement.addStringValue( ElasticSearchFormatter.formatDateAsStringIgnoreTimezone( (Date) value ) ); } else { contentIndexDataElement.addStringValue( IndexValueNormalizer.normalizeStringValue( value.toString() ) ); addNumberOrDateIfPossible( contentIndexDataElement, value ); } if ( addOrderBy ) { setOrderBy( contentIndexDataElement, value ); } } return contentIndexDataElement; } private static void setOrderBy( final ContentIndexDataElement element, final Object value ) { if ( element.getOrderBy() == null ) { element.setOrderBy( ContentIndexOrderbyValueResolver.getOrderbyValue( value ) ); } } private static void addNumberOrDateIfPossible( final ContentIndexDataElement element, final Object value ) { final Double doubleValue = ContentIndexNumberValueResolver.resolveNumberValue( value ); if ( doubleValue != null ) { element.addNumericValue( doubleValue ); return; } final Date dateValue = ContentIndexDateValueResolver.resolveDateValue( value ); if ( dateValue != null ) { element.addDateValue( dateValue ); } } }