/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.search;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.elasticsearch.index.get.GetField;
import org.joda.time.DateTime;
import com.enonic.cms.core.content.ContentKey;
import com.enonic.cms.core.content.category.CategoryKey;
import com.enonic.cms.core.content.contenttype.ContentTypeKey;
import com.enonic.cms.core.search.query.ContentIndexFieldSet;
import static com.enonic.cms.core.search.builder.IndexFieldNameConstants.ALL_USERDATA_FIELDNAME;
import static com.enonic.cms.core.search.builder.IndexFieldNameConstants.CATEGORY_KEY_FIELDNAME;
import static com.enonic.cms.core.search.builder.IndexFieldNameConstants.CONTENTDATA_PREFIX;
import static com.enonic.cms.core.search.builder.IndexFieldNameConstants.CONTENTTYPE_KEY_FIELDNAME;
import static com.enonic.cms.core.search.builder.IndexFieldNameConstants.CONTENT_KEY_FIELDNAME;
import static com.enonic.cms.core.search.builder.IndexFieldNameConstants.DATE_FIELD_POSTFIX;
import static com.enonic.cms.core.search.builder.IndexFieldNameConstants.INDEX_FIELD_TYPE_SEPARATOR;
import static com.enonic.cms.core.search.builder.IndexFieldNameConstants.NUMBER_FIELD_POSTFIX;
import static com.enonic.cms.core.search.builder.IndexFieldNameConstants.STATUS_FIELDNAME;
public class ElasticSearchIndexedFieldsTranslator
{
public List<ContentIndexedFields> generateContentIndexFieldSet( ContentKey contentKey, Map<String, GetField> fields )
{
if ( fields.isEmpty() )
{
return Collections.emptyList();
}
final CategoryKey categoryKey = new CategoryKey( (String) fields.get( CATEGORY_KEY_FIELDNAME ).getValue() );
final ContentIndexFieldSet indexFieldSet = new ContentIndexFieldSet();
indexFieldSet.setCategoryKey( categoryKey );
indexFieldSet.setKey( contentKey );
final String statusFieldName = STATUS_FIELDNAME + INDEX_FIELD_TYPE_SEPARATOR + NUMBER_FIELD_POSTFIX;
indexFieldSet.setStatus( getFieldAsInt( fields.get( statusFieldName ) ) );
final String ctypeFieldName = CONTENTTYPE_KEY_FIELDNAME + INDEX_FIELD_TYPE_SEPARATOR + NUMBER_FIELD_POSTFIX;
indexFieldSet.setContentTypeKey( new ContentTypeKey( getFieldAsInt( fields.get( ctypeFieldName ) ) ) );
for ( final String name : fields.keySet() )
{
if ( skipField( name ) )
{
continue;
}
if ( name.startsWith( CONTENTDATA_PREFIX ) && ( !name.contains( INDEX_FIELD_TYPE_SEPARATOR ) ) )
{
final GetField field = fields.get( name );
final String value = StringUtils.join( field.getValues(), ',' );
if ( StringUtils.isNotEmpty( value ) )
{
final String customFieldName = StringUtils.substringAfter( name, CONTENTDATA_PREFIX );
indexFieldSet.addFieldWithStringValue( "data#" + customFieldName, value );
}
}
else if ( ( !name.startsWith( CONTENTDATA_PREFIX ) ) && ( !name.contains( INDEX_FIELD_TYPE_SEPARATOR ) ) )
{
addIndexEntityField( indexFieldSet, name, fields );
}
}
return indexFieldSet.getEntitites();
}
private void addIndexEntityField( ContentIndexFieldSet indexFieldSet, String name, Map<String, GetField> fields )
{
final GetField field;
final String fieldPath = name.replace( "_", "/" );
if ( fields.containsKey( name + INDEX_FIELD_TYPE_SEPARATOR + DATE_FIELD_POSTFIX ) )
{
field = fields.get( name + INDEX_FIELD_TYPE_SEPARATOR + DATE_FIELD_POSTFIX );
final DateTime dateTime = DateTime.parse( (String) field.getValue() );
indexFieldSet.addFieldWithDateValue( fieldPath, dateTime.toDate(), "" );
}
else
{
field = fields.get( name );
indexFieldSet.addFieldWithAnyValue( fieldPath, StringUtils.join( field.getValues(), ',' ) );
}
}
private int getFieldAsInt( GetField field )
{
final Double valueNum = (Double) field.getValue();
return valueNum.intValue();
}
private boolean skipField( String fieldName )
{
return STATUS_FIELDNAME.equals( fieldName ) || CONTENT_KEY_FIELDNAME.equals( fieldName ) ||
fieldName.contains( INDEX_FIELD_TYPE_SEPARATOR ) ||
ALL_USERDATA_FIELDNAME.equals( fieldName ) || fieldName.startsWith( "access_" ) ||
fieldName.endsWith( "_name" );
}
}