/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.search.query.factory; import java.util.ArrayList; import java.util.List; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.sort.FieldSortBuilder; import org.elasticsearch.search.sort.ScoreSortBuilder; import org.elasticsearch.search.sort.SortBuilder; import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortOrder; import com.enonic.cms.core.content.index.queryexpression.FieldExpr; import com.enonic.cms.core.content.index.queryexpression.OrderByExpr; import com.enonic.cms.core.content.index.queryexpression.OrderFieldExpr; import com.enonic.cms.core.search.query.QueryFieldNameResolver; import com.enonic.cms.core.structure.menuitem.MenuItemKey; public class OrderQueryBuilderFactory extends BaseQueryBuilderFactory { private final static boolean createDefaultSortExpression = false; public void buildOrderByExpr( final SearchSourceBuilder builder, final OrderByExpr expr ) { List<SortBuilder> sorts; if ( expr != null ) { sorts = buildOrderFieldExpr( expr.getFields() ); for ( SortBuilder sort : sorts ) { builder.sort( sort ); } } else if ( createDefaultSortExpression ) { sorts = new ArrayList<SortBuilder>(); sorts.add( getDefaultSorting() ); } } public void buildOrderBySection( final SearchSourceBuilder builder, final MenuItemKey section ) { final String orderBySectionName = CONTENT_SECTION_ORDER_PREFIX + section.toString(); final OrderFieldExpr orderFieldExpr = new OrderFieldExpr( new FieldExpr( orderBySectionName ), false ); builder.sort( buildOrderFieldExpr( orderFieldExpr ) ); } private ScoreSortBuilder getDefaultSorting() { return SortBuilders.scoreSort(); } private List<SortBuilder> buildOrderFieldExpr( final OrderFieldExpr[] expr ) { List<SortBuilder> sort = new ArrayList<SortBuilder>(); for ( final OrderFieldExpr anExpr : expr ) { sort.add( buildOrderFieldExpr( anExpr ) ); } return sort; } private SortBuilder buildOrderFieldExpr( final OrderFieldExpr expr ) { final String name = QueryFieldNameResolver.resolveOrderFieldName( expr.getField() ); SortOrder order = SortOrder.DESC; if ( expr.isAscending() ) { order = SortOrder.ASC; } return new FieldSortBuilder( name ).order( order ).ignoreUnmapped( true ); } }