/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.search.query; import java.util.ArrayList; import java.util.Collection; import org.elasticsearch.index.query.FilterBuilder; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.junit.Test; import com.google.common.collect.Lists; import com.enonic.cms.core.content.category.CategoryAccessType; import com.enonic.cms.core.content.index.ContentIndexQuery; import com.enonic.cms.core.search.query.factory.FilterQueryBuilderFactory; import com.enonic.cms.core.security.group.GroupKey; public class QueryTranslator_filterCategoryAccessFilterTest extends QueryTranslatorTestBase { FilterQueryBuilderFactory filterQueryBuilderFactory = new FilterQueryBuilderFactory(); @Test public void testCategoryAccessFilter_single() { String expected = "{\n" + " \"post_filter\" : {\n" + " \"bool\" : {\n" + " \"must\" : [ {\n" + " \"terms\" : {\n" + " \"access_read\" : [ \"group_a\", \"group_b\" ]\n" + " }\n" + " }, {\n" + " \"terms\" : {\n" + " \"access_category_browse\" : [ \"group_a\", \"group_b\" ]\n" + " }\n" + " } ]\n" + " }\n" + " }\n" + "}"; SearchSourceBuilder builder = new SearchSourceBuilder(); ContentIndexQuery query = new ContentIndexQuery( "" ); query.setCategoryAccessTypeFilter( Lists.newArrayList( CategoryAccessType.ADMIN_BROWSE ), ContentIndexQuery.CategoryAccessTypeFilterPolicy.AND ); Collection<GroupKey> securityFilter = getSecurityFilter(); query.setSecurityFilter( securityFilter ); final FilterBuilder filterToApply = filterQueryBuilderFactory.buildFilter( query ); if ( filterToApply != null ) { builder.filter( filterToApply ); } compareStringsIgnoreFormatting( expected, builder.toString() ); } @Test public void testCategoryAccessFilter_two_and() { String expected = "{\n" + " \"post_filter\" : {\n" + " \"bool\" : {\n" + " \"must\" : [ {\n" + " \"terms\" : {\n" + " \"access_read\" : [ \"group_a\", \"group_b\" ]\n" + " }\n" + " }, {\n" + " \"bool\" : {\n" + " \"must\" : [ {\n" + " \"terms\" : {\n" + " \"access_category_browse\" : [ \"group_a\", \"group_b\" ]\n" + " }\n" + " }, {\n" + " \"terms\" : {\n" + " \"access_category_approve\" : [ \"group_a\", \"group_b\" ]\n" + " }\n" + " } ]\n" + " }\n" + " } ]\n" + " }\n" + " }\n" + "}"; SearchSourceBuilder builder = new SearchSourceBuilder(); ContentIndexQuery query = new ContentIndexQuery( "" ); query.setCategoryAccessTypeFilter( Lists.newArrayList( CategoryAccessType.ADMIN_BROWSE, CategoryAccessType.APPROVE ), ContentIndexQuery.CategoryAccessTypeFilterPolicy.AND ); Collection<GroupKey> securityFilter = getSecurityFilter(); query.setSecurityFilter( securityFilter ); final FilterBuilder filterToApply = filterQueryBuilderFactory.buildFilter( query ); if ( filterToApply != null ) { builder.filter( filterToApply ); } compareStringsIgnoreFormatting( expected, builder.toString() ); } @Test public void testCategoryAccessFilter_two_or() { String expected = "{\n" + " \"post_filter\" : {\n" + " \"bool\" : {\n" + " \"must\" : [ {\n" + " \"terms\" : {\n" + " \"access_read\" : [ \"group_a\", \"group_b\" ]\n" + " }\n" + " }, {\n" + " \"bool\" : {\n" + " \"should\" : [ {\n" + " \"terms\" : {\n" + " \"access_category_browse\" : [ \"group_a\", \"group_b\" ]\n" + " }\n" + " }, {\n" + " \"terms\" : {\n" + " \"access_category_approve\" : [ \"group_a\", \"group_b\" ]\n" + " }\n" + " } ]\n" + " }\n" + " } ]\n" + " }\n" + " }\n" + "}"; SearchSourceBuilder builder = new SearchSourceBuilder(); ContentIndexQuery query = new ContentIndexQuery( "" ); query.setCategoryAccessTypeFilter( Lists.newArrayList( CategoryAccessType.ADMIN_BROWSE, CategoryAccessType.APPROVE ), ContentIndexQuery.CategoryAccessTypeFilterPolicy.OR ); Collection<GroupKey> securityFilter = getSecurityFilter(); query.setSecurityFilter( securityFilter ); final FilterBuilder filterToApply = filterQueryBuilderFactory.buildFilter( query ); if ( filterToApply != null ) { builder.filter( filterToApply ); } compareStringsIgnoreFormatting( expected, builder.toString() ); } private Collection<GroupKey> getSecurityFilter() { Collection<GroupKey> securityFilter = new ArrayList<GroupKey>(); GroupKey groupA = new GroupKey( "group_A" ); securityFilter.add( groupA ); GroupKey groupB = new GroupKey( "group_B" ); securityFilter.add( groupB ); return securityFilter; } }