/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.search.facet.builder;
import org.elasticsearch.search.facet.range.RangeFacetBuilder;
import com.google.common.base.Strings;
import com.enonic.cms.core.search.facet.FacetQueryException;
import com.enonic.cms.core.search.facet.model.FacetRange;
import com.enonic.cms.core.search.facet.model.FacetRangeValue;
import com.enonic.cms.core.search.facet.model.RangeFacetModel;
public class ElasticsearchRangeFacetBuilder
extends AbstractElasticsearchFacetBuilder
{
final RangeFacetBuilder build( RangeFacetModel rangeFacetModel )
{
try
{
rangeFacetModel.validate();
}
catch ( Exception e )
{
throw new FacetQueryException( "Error in range-facet definition", e );
}
RangeFacetBuilder builder = new RangeFacetBuilder( rangeFacetModel.getName() );
setField( rangeFacetModel, builder );
setRanges( rangeFacetModel, builder );
return builder;
}
private void setRanges( final RangeFacetModel rangeFacetModel, final RangeFacetBuilder builder )
{
for ( final FacetRange facetRange : rangeFacetModel.getRanges() )
{
final FacetRangeValue fromRangeValue = facetRange.getFromRangeValue();
final FacetRangeValue toRangeValue = facetRange.getToRangeValue();
addRange( builder, fromRangeValue, toRangeValue );
}
}
private void addRange( final RangeFacetBuilder builder, final FacetRangeValue fromRangeValue, final FacetRangeValue toRangeValue )
{
String from = fromRangeValue != null ? fromRangeValue.getStringValue() : null;
String to = toRangeValue != null ? toRangeValue.getStringValue() : null;
builder.addRange( from, to );
}
protected void setField( final RangeFacetModel rangeFacetModel, final RangeFacetBuilder builder )
{
final String indexName = rangeFacetModel.getIndex();
if ( !Strings.isNullOrEmpty( rangeFacetModel.getValueIndex() ) )
{
if ( rangeFacetModel.isNumericRanges() )
{
builder.keyField( createNumericFieldName( indexName ) );
builder.valueField( createNumericFieldName( rangeFacetModel.getValueIndex() ) );
}
else
{
builder.keyField( createDateFieldName( indexName ) );
builder.valueField( createDateFieldName( rangeFacetModel.getValueIndex() ) );
}
}
else
{
if ( rangeFacetModel.isNumericRanges() )
{
builder.field( createNumericFieldName( rangeFacetModel.getIndex() ) );
}
else
{
builder.field( createDateFieldName( rangeFacetModel.getIndex() ) );
}
}
}
}