/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.search.query.factory;
import org.elasticsearch.index.query.QueryBuilder;
import org.joda.time.DateTime;
import com.enonic.cms.core.search.query.QueryField;
import com.enonic.cms.core.search.query.QueryValue;
import static org.elasticsearch.index.query.QueryBuilders.rangeQuery;
public class RangeQueryBuilderFactory
extends BaseQueryBuilderFactory
{
public QueryBuilder buildRangeQuery( final QueryField queryField, final QueryValue lower, final QueryValue upper,
final boolean lowerInclusive, final boolean upperInclusive )
{
final boolean isNumericComparison = ( lower != null && lower.isNumeric() ) || ( upper != null && upper.isNumeric() );
final boolean isDateComparison =
!isNumericComparison && ( ( lower != null && lower.isDateTime() ) || ( upper != null && upper.isDateTime() ) );
final boolean doStringComparison = !( isNumericComparison || isDateComparison );
if ( doStringComparison )
{
return buildRangeQueryString( queryField, lower, upper, lowerInclusive, upperInclusive );
}
else if ( isNumericComparison )
{
Number lowerNumeric = lower != null ? lower.getNumericValue() : null;
Number upperNumeric = upper != null ? upper.getNumericValue() : null;
return buildRangeQueryNumeric( queryField, lowerNumeric, upperNumeric, lowerInclusive, upperInclusive );
}
else
{
DateTime lowerDateTime = lower != null ? lower.getDateTime().toDateTime() : null;
DateTime upperDateTime = upper != null ? upper.getDateTime().toDateTime() : null;
return buildRangeQueryDateTime( queryField, lowerDateTime, upperDateTime, lowerInclusive, upperInclusive );
}
}
private QueryBuilder buildRangeQueryDateTime( final QueryField queryField, final DateTime lowerDateTime, final DateTime upperDateTime,
final boolean lowerInclusive, final boolean upperInclusive )
{
if ( lowerDateTime == null && upperDateTime == null )
{
throw new IllegalArgumentException( "Invalid lower and upper - values in range query" );
}
final String fieldName = queryField.isWildcardQueryField() ? ALL_USERDATA_FIELDNAME_DATE : queryField.getFieldNameForDateQueries();
return rangeQuery( fieldName ).
from( lowerDateTime ).
to( upperDateTime ).
includeLower( lowerInclusive ).
includeUpper( upperInclusive );
}
private QueryBuilder buildRangeQueryNumeric( final QueryField queryField, final Number lowerNumeric, final Number upperNumeric,
final boolean lowerInclusive, final boolean upperInclusive )
{
if ( lowerNumeric == null && upperNumeric == null )
{
throw new IllegalArgumentException( "Invalid lower and upper - values in range query" );
}
final String queryName =
queryField.isWildcardQueryField() ? ALL_USERDATA_FIELDNAME_NUMBER : queryField.getFieldNameForNumericQueries();
return rangeQuery( queryName ).
from( lowerNumeric ).
to( upperNumeric ).
includeLower( lowerInclusive ).
includeUpper( upperInclusive );
}
private QueryBuilder buildRangeQueryString( final QueryField queryField, final QueryValue lower, final QueryValue upper,
final boolean lowerInclusive, final boolean upperInclusive )
{
if ( lower == null && upper == null )
{
throw new IllegalArgumentException( "Invalid lower and upper - values in range query" );
}
final String queryName = queryField.isWildcardQueryField() ? ALL_USERDATA_FIELDNAME : queryField.getFieldName();
return rangeQuery( queryName ).
from( lower != null ? lower.getStringValueNormalized() : null ).
to( upper != null ? upper.getStringValueNormalized() : null ).
includeLower( lowerInclusive ).
includeUpper( upperInclusive );
}
}