/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.search.query;
import org.elasticsearch.index.query.FilterBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import com.enonic.cms.core.content.index.queryexpression.FieldExpr;
import com.enonic.cms.core.search.query.factory.FilterQueryBuilderFactory;
public class IndexValueQueryTranslator
{
private final FilterQueryBuilderFactory filterQueryBuilderFactory = new FilterQueryBuilderFactory();
public SearchSourceBuilder build( final IndexValueQuery query, QueryField queryField, int count )
{
return doBuild( query, queryField, count );
}
// Selects the values from a given field in index for all contents matching filter
public SearchSourceBuilder build( final IndexValueQuery query, QueryField queryField )
{
return doBuild( query, queryField, query.getCount() );
}
private SearchSourceBuilder doBuild( final IndexValueQuery query, final QueryField queryField, final int size )
{
final SearchSourceBuilder builder = new SearchSourceBuilder();
builder.size( size );
builder.from( query.getIndex() );
//builder.fields( queryField.getFieldName() );
builder.query( QueryBuilders.matchAllQuery() );
final FilterBuilder filterToApply = filterQueryBuilderFactory.buildFilter( query );
if ( filterToApply != null )
{
builder.filter( filterToApply );
}
applySorting( builder, queryField, query.isDescOrder() );
return builder;
}
private void applySorting( final SearchSourceBuilder builder, final QueryField queryField, final boolean isDescOrder )
{
final String sortFieldName = queryField.getFieldName();
final String name = QueryFieldNameResolver.resolveOrderFieldName( new FieldExpr( sortFieldName ) );
final SortOrder sortOrder = isDescOrder ? SortOrder.DESC : SortOrder.ASC;
final FieldSortBuilder sorting = new FieldSortBuilder( name ).order( sortOrder ).ignoreUnmapped( true );
builder.sort( sorting );
}
}