From 725604db4689bfc9a6663bdca136c2a56a4ae689 Mon Sep 17 00:00:00 2001 From: Gethin James Date: Fri, 24 Mar 2017 13:18:36 +0000 Subject: [PATCH] Merged searchbcr (5.2.1) to 5.2.N (5.2.1) 136072 gjames: SEARCH-334: Adding SearchRequestContext and pivot logic git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/DEV/5.2.N/root@136102 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../rest/api/search/SearchApiWebscript.java | 11 +-- .../search/context/SearchRequestContext.java | 90 +++++++++++++++++++ .../rest/api/search/impl/ResultMapper.java | 47 +++++++--- .../rest/api/search/ResultMapperTests.java | 63 +++++++++++-- .../rest/api/search/SerializerTestHelper.java | 3 +- 5 files changed, 190 insertions(+), 24 deletions(-) create mode 100644 source/java/org/alfresco/rest/api/search/context/SearchRequestContext.java diff --git a/source/java/org/alfresco/rest/api/search/SearchApiWebscript.java b/source/java/org/alfresco/rest/api/search/SearchApiWebscript.java index 390856a886..44000aaf5f 100644 --- a/source/java/org/alfresco/rest/api/search/SearchApiWebscript.java +++ b/source/java/org/alfresco/rest/api/search/SearchApiWebscript.java @@ -25,8 +25,8 @@ */ package org.alfresco.rest.api.search; -import org.alfresco.rest.api.Nodes; import org.alfresco.rest.api.model.Node; +import org.alfresco.rest.api.search.context.SearchRequestContext; import org.alfresco.rest.api.search.impl.ResultMapper; import org.alfresco.rest.api.search.impl.SearchMapper; import org.alfresco.rest.api.search.model.SearchQuery; @@ -39,7 +39,6 @@ import org.alfresco.rest.framework.tools.RecognizedParamsExtractor; import org.alfresco.rest.framework.tools.RequestReader; import org.alfresco.rest.framework.tools.ResponseWriter; import org.alfresco.rest.framework.webscripts.ResourceWebScriptHelper; -import org.alfresco.rest.framework.webscripts.WithResponse; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.search.ResultSet; import org.alfresco.service.cmr.search.SearchParameters; @@ -53,7 +52,6 @@ import org.springframework.extensions.webscripts.WebScriptResponse; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; /** @@ -92,14 +90,17 @@ public class SearchApiWebscript extends AbstractWebScript implements RecognizedP //Parse the parameters Params params = getParams(webScriptRequest, searchQuery.getFields(), searchQuery.getInclude(), searchQuery.getPaging()); + //Make a copy of the request + SearchRequestContext searchRequestContext = SearchRequestContext.from(searchQuery); + //Turn the SearchQuery json into the Java SearchParameters object - SearchParameters searchParams = searchMapper.toSearchParameters(params, searchQuery); + SearchParameters searchParams = searchMapper.toSearchParameters(params, searchQuery, searchRequestContext); //Call searchService ResultSet results = searchService.query(searchParams); //Turn solr results into JSON - CollectionWithPagingInfo resultJson = resultMapper.toCollectionWithPagingInfo(params, searchQuery, results); + CollectionWithPagingInfo resultJson = resultMapper.toCollectionWithPagingInfo(params, searchRequestContext, searchQuery, results); //Post-process the request and pass in params, eg. params.getFilter() Object toRender = helper.processAdditionsToTheResponse(null, null, null, params, resultJson); diff --git a/source/java/org/alfresco/rest/api/search/context/SearchRequestContext.java b/source/java/org/alfresco/rest/api/search/context/SearchRequestContext.java new file mode 100644 index 0000000000..737b711a22 --- /dev/null +++ b/source/java/org/alfresco/rest/api/search/context/SearchRequestContext.java @@ -0,0 +1,90 @@ +/*- + * #%L + * Alfresco Remote API + * %% + * Copyright (C) 2005 - 2017 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +package org.alfresco.rest.api.search.context; + +import static java.util.stream.Collectors.*; +import org.alfresco.rest.api.search.model.FacetFields; +import org.alfresco.rest.api.search.model.FacetQuery; +import org.alfresco.rest.api.search.model.Pivot; +import org.alfresco.rest.api.search.model.Query; +import org.alfresco.rest.api.search.model.SearchQuery; +import org.alfresco.service.cmr.search.IntervalParameters; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * This is a snapshot of the SearchQuery before the request is made. + * It isn't a complete copy of SearchQuery but only has fields that are useful when building + * the response + */ +public class SearchRequestContext +{ + + private final Query query; + private final boolean includeRequest; + private final Map pivotKeys; + + private SearchRequestContext(Query query, boolean includeRequest) + { + this.query = query; + this.includeRequest = includeRequest; + this.pivotKeys = new HashMap<>(); + /** + this.facetQueries = facetQueries!=null?Collections.unmodifiableList(facetQueries): Collections.emptyList(); + this.facetFields = new FacetFields(facetFields!=null?Collections.unmodifiableList(facetFields.getFacets()):Collections.emptyList()); + this.facetIntervals = facetIntervals!=null? + new IntervalParameters(Collections.unmodifiableList(facetIntervals.getSets()), + Collections.unmodifiableList(facetIntervals.getIntervals())) + : + new IntervalParameters(Collections.emptyList(),Collections.emptyList()); + this.pivots = pivots!=null?Collections.unmodifiableList(pivots): Collections.emptyList();**/ + } + + public static final SearchRequestContext from(SearchQuery searchQuery) + { + return new SearchRequestContext(searchQuery.getQuery(), searchQuery.includeRequest()); + } + + public Query getQuery() + { + return query; + } + public boolean includeRequest() + { + return includeRequest; + } + + public Map getPivotKeys() + { + return pivotKeys; + } +} diff --git a/source/java/org/alfresco/rest/api/search/impl/ResultMapper.java b/source/java/org/alfresco/rest/api/search/impl/ResultMapper.java index 1d737ec715..ed7af83ef9 100644 --- a/source/java/org/alfresco/rest/api/search/impl/ResultMapper.java +++ b/source/java/org/alfresco/rest/api/search/impl/ResultMapper.java @@ -30,6 +30,10 @@ import static org.alfresco.rest.api.search.impl.StoreMapper.DELETED; import static org.alfresco.rest.api.search.impl.StoreMapper.LIVE_NODES; import static org.alfresco.rest.api.search.impl.StoreMapper.VERSIONS; import org.alfresco.repo.search.impl.lucene.SolrJSONResultSet; +import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericBucket; +import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericFacetResponse; +import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericFacetResponse.FACET_TYPE; +import org.alfresco.repo.search.impl.solr.facet.facetsresponse.MetricCount; import org.alfresco.repo.version.Version2Model; import org.alfresco.rest.api.DeletedNodes; import org.alfresco.rest.api.Nodes; @@ -41,11 +45,8 @@ import org.alfresco.rest.api.search.context.FacetFieldContext; import org.alfresco.rest.api.search.context.FacetFieldContext.Bucket; import org.alfresco.rest.api.search.context.FacetQueryContext; import org.alfresco.rest.api.search.context.SearchContext; +import org.alfresco.rest.api.search.context.SearchRequestContext; import org.alfresco.rest.api.search.context.SpellCheckContext; -import org.alfresco.rest.api.search.context.facetsresponse.GenericBucket; -import org.alfresco.rest.api.search.context.facetsresponse.GenericFacetResponse; -import org.alfresco.rest.api.search.context.facetsresponse.GenericFacetResponse.FACET_TYPE; -import org.alfresco.rest.api.search.context.facetsresponse.MetricCount; import org.alfresco.rest.api.search.model.FacetField; import org.alfresco.rest.api.search.model.FacetQuery; import org.alfresco.rest.api.search.model.HighlightEntry; @@ -77,7 +78,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Optional; - +import java.util.stream.Collectors; /** * Maps from a ResultSet to a json public api representation. @@ -134,7 +135,7 @@ public class ResultMapper * @param searchQuery *@param results @return CollectionWithPagingInfo */ - public CollectionWithPagingInfo toCollectionWithPagingInfo(Params params, SearchQuery searchQuery, ResultSet results) + public CollectionWithPagingInfo toCollectionWithPagingInfo(Params params, SearchRequestContext searchRequestContext, SearchQuery searchQuery, ResultSet results) { SearchContext context = null; Integer total = null; @@ -176,7 +177,7 @@ public class ResultMapper if (solrResultSet != null) { //We used Solr for this query - context = toSearchContext(solrResultSet, searchQuery, notFound); + context = toSearchContext(solrResultSet, searchRequestContext, searchQuery, notFound); total = setTotal(solrResultSet); } else @@ -273,7 +274,7 @@ public class ResultMapper * @param searchQuery * @return SearchContext */ - public SearchContext toSearchContext(SolrJSONResultSet solrResultSet, SearchQuery searchQuery, int notFound) + public SearchContext toSearchContext(SolrJSONResultSet solrResultSet, SearchRequestContext searchRequestContext, SearchQuery searchQuery, int notFound) { SearchContext context = null; Map facetQueries = solrResultSet.getFacetQueries(); @@ -316,6 +317,9 @@ public class ResultMapper Map>> facetInterval = solrResultSet.getFacetIntervals(); facets.addAll(getGenericFacetsForIntervals(facetInterval, searchQuery)); + List pimped = getPivots(searchRequestContext, solrResultSet.getPivotFacets()); + facets.addAll(pimped); + //Spelling SpellCheckResult spell = solrResultSet.getSpellCheckResult(); if (spell != null && spell.getResultName() != null && !spell.getResults().isEmpty()) @@ -324,7 +328,7 @@ public class ResultMapper } //Put it all together - context = new SearchContext(solrResultSet.getLastIndexedTxId(), facets, facetResults, ffcs, spellCheckContext, searchQuery.includeRequest()?searchQuery:null); + context = new SearchContext(solrResultSet.getLastIndexedTxId(), facets, facetResults, ffcs, spellCheckContext, searchRequestContext.includeRequest()?searchQuery:null); return isNullContext(context)?null:context; } /** @@ -371,6 +375,29 @@ public class ResultMapper return facetResults; } + protected List getPivots(SearchRequestContext searchRequest, List pivots) + { + if(pivots != null && !pivots.isEmpty()) + { + Map pivotKeys = searchRequest.getPivotKeys(); + + return pivots.stream().map(aFacet -> { + + String pivotLabel = pivotKeys.containsKey(aFacet.getLabel())?pivotKeys.get(aFacet.getLabel()):aFacet.getLabel(); + + List bucks = aFacet.getBuckets().stream().map(genericBucket -> { + Object display = propertyLookup.lookup(aFacet.getLabel(), genericBucket.getLabel()); + return new GenericBucket(genericBucket.getLabel(), genericBucket.getFilterQuery(), + display,genericBucket.getMetrics(), getPivots(searchRequest, genericBucket.getFacets())); + }).collect(Collectors.toList()); + + return new GenericFacetResponse(aFacet.getType(), pivotLabel, bucks); + }).collect(Collectors.toList()); + } + + return Collections.emptyList(); + } + protected List getFacetBucketsForFacetFields(Map>> facetFields, SearchQuery searchQuery) { if (facetFields != null && !facetFields.isEmpty()) @@ -448,7 +475,7 @@ public class ResultMapper } } } - GenericBucket bucket = new GenericBucket(buck.getFirst(), filterQuery, null , Arrays.asList(new MetricCount(buck.getSecond()))); + GenericBucket bucket = new GenericBucket(buck.getFirst(), filterQuery, null , Arrays.asList(new MetricCount(buck.getSecond())), null); buckets.add(bucket); } ffcs.add(new GenericFacetResponse(FACET_TYPE.interval, facet.getKey(), buckets)); diff --git a/source/test-java/org/alfresco/rest/api/search/ResultMapperTests.java b/source/test-java/org/alfresco/rest/api/search/ResultMapperTests.java index 668af7425e..6e7234d7f4 100644 --- a/source/test-java/org/alfresco/rest/api/search/ResultMapperTests.java +++ b/source/test-java/org/alfresco/rest/api/search/ResultMapperTests.java @@ -38,11 +38,16 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.alfresco.repo.search.EmptyResultSet; import org.alfresco.repo.search.impl.lucene.SolrJSONResultSet; +import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericBucket; +import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericFacetResponse; +import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericFacetResponse.FACET_TYPE; +import org.alfresco.repo.search.impl.solr.facet.facetsresponse.Metric.METRIC_TYPE; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.version.Version2Model; import org.alfresco.repo.version.common.VersionImpl; import org.alfresco.rest.api.DeletedNodes; import org.alfresco.rest.api.impl.NodesImpl; +import org.alfresco.rest.api.lookups.PersonPropertyLookup; import org.alfresco.rest.api.lookups.PropertyLookupRegistry; import org.alfresco.rest.api.model.Node; import org.alfresco.rest.api.model.UserInfo; @@ -50,11 +55,10 @@ import org.alfresco.rest.api.nodes.NodeVersionsRelation; import org.alfresco.rest.api.search.context.FacetFieldContext; import org.alfresco.rest.api.search.context.FacetQueryContext; import org.alfresco.rest.api.search.context.SearchContext; +import org.alfresco.rest.api.search.context.SearchRequestContext; import org.alfresco.rest.api.search.context.SpellCheckContext; -import org.alfresco.rest.api.search.context.facetsresponse.GenericFacetResponse; -import org.alfresco.rest.api.search.context.facetsresponse.GenericFacetResponse.FACET_TYPE; -import org.alfresco.rest.api.search.context.facetsresponse.Metric.METRIC_TYPE; import org.alfresco.rest.api.search.impl.ResultMapper; +import org.alfresco.rest.api.search.impl.SearchMapper; import org.alfresco.rest.api.search.impl.StoreMapper; import org.alfresco.rest.api.search.model.HighlightEntry; import org.alfresco.rest.api.search.model.SearchQuery; @@ -92,6 +96,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Tests the ResultMapper class @@ -101,11 +106,13 @@ import java.util.stream.Collectors; public class ResultMapperTests { static ResultMapper mapper; + static SearchMapper searchMapper = new SearchMapper(); public static final String JSON_REPONSE = "{\"responseHeader\":{\"status\":0,\"QTime\":9},\"_original_parameters_\":\"org.apache.solr.common.params.DefaultSolrParams:{params(df=TEXT&alternativeDic=DEFAULT_DICTIONARY&fl=DBID,score&start=0&fq={!afts}AUTHORITY_FILTER_FROM_JSON&fq={!afts}TENANT_FILTER_FROM_JSON&rows=1000&locale=en_US&wt=json),defaults(carrot.url=id&spellcheck.collateExtendedResults=true&carrot.produceSummary=true&spellcheck.maxCollations=3&spellcheck.maxCollationTries=5&spellcheck.alternativeTermCount=2&spellcheck.extendedResults=false&defType=afts&spellcheck.maxResultsForSuggest=5&spellcheck=false&carrot.outputSubClusters=false&spellcheck.count=5&carrot.title=mltext@m___t@{http://www.alfresco.org/model/content/1.0}title&carrot.snippet=content@s___t@{http://www.alfresco.org/model/content/1.0}content&spellcheck.collate=true)}\",\"_field_mappings_\":{},\"_date_mappings_\":{},\"_range_mappings_\":{},\"_pivot_mappings_\":{},\"_interval_mappings_\":{},\"_stats_field_mappings_\":{},\"_stats_facet_mappings_\":{},\"_facet_function_mappings_\":{},\"response\":{\"numFound\":6,\"start\":0,\"maxScore\":0.7849362,\"docs\":[{\"DBID\":565,\"score\":0.7849362},{\"DBID\":566,\"score\":0.7849362},{\"DBID\":521,\"score\":0.3540957},{\"DBID\":514,\"score\":0.33025497},{\"DBID\":420,\"score\":0.32440513},{\"DBID\":415,\"score\":0.2780319}]}," + "\"facet_counts\":{\"facet_queries\":{\"small\":0,\"large\":0,\"xtra small\":3,\"xtra large\":0,\"medium\":8,\"XX large\":0}," + "\"facet_fields\":{\"content.size\":[\"Big\",8,\"Brown\",3,\"Fox\",5,\"Jumped\",2,\"somewhere\",3]}," +"\"facet_dates\":{}," +"\"facet_ranges\":{}," + +"\"facet_pivot\":{\"creator,modifier\":[{\"field\":\"creator\",\"count\":7,\"pivot\":[{\"field\":\"modifier\",\"count\":3,\"value\":\"mjackson\"},{\"field\":\"modifier\",\"count\":4,\"value\":\"admin\"}],\"value\":\"mjackson\"}]}," +"\"facet_intervals\":{\"creator\":{\"last\":4,\"first\":0},\"datetime@sd@{http://www.alfresco.org/model/content/1.0}created\":{\"earlier\":5,\"lastYear\":0,\"currentYear\":0}}" + "}," + "\"spellcheck\":{\"searchInsteadFor\":\"alfresco\"}," @@ -205,10 +212,21 @@ public class ResultMapperTests return new Node(aNode, new NodeRef(StoreRef.STORE_REF_ARCHIVE_SPACESSTORE,"unknown"), nodeProps, mapUserInfo, sr); } }); + + PersonPropertyLookup propertyLookups = mock(PersonPropertyLookup.class); + when(propertyLookups.supports()).thenReturn(Stream.of("creator","modifier").collect(Collectors.toSet())); + when(propertyLookups.lookup(notNull(String.class))).thenAnswer(invocation -> { + Object[] args = invocation.getArguments(); + String value = (String)args[0]; + if ("mjackson".equals(value)) return "Michael Jackson"; + return null; + }); + PropertyLookupRegistry propertyLookupRegistry = new PropertyLookupRegistry(); + propertyLookupRegistry.setLookups(Arrays.asList(propertyLookups)); mapper = new ResultMapper(); mapper.setNodes(nodes); mapper.setStoreMapper(new StoreMapper()); - mapper.setPropertyLookup(new PropertyLookupRegistry()); + mapper.setPropertyLookup(propertyLookupRegistry); mapper.setDeletedNodes(deletedNodes); mapper.setServiceRegistry(sr); NodeVersionsRelation nodeVersionsRelation = new NodeVersionsRelation(); @@ -218,12 +236,13 @@ public class ResultMapperTests mapper.setNodeVersions(nodeVersionsRelation); helper = new SerializerTestHelper(); + searchMapper.setStoreMapper(new StoreMapper()); } @Test public void testNoResults() throws Exception { - CollectionWithPagingInfo collection = mapper.toCollectionWithPagingInfo(EMPTY_PARAMS, null, new EmptyResultSet()); + CollectionWithPagingInfo collection = mapper.toCollectionWithPagingInfo(EMPTY_PARAMS, null, null, new EmptyResultSet()); assertNotNull(collection); assertFalse(collection.hasMoreItems()); assertTrue(collection.getTotalItems() < 1); @@ -234,7 +253,8 @@ public class ResultMapperTests public void testToCollectionWithPagingInfo() throws Exception { ResultSet results = mockResultset(Arrays.asList(514l), Arrays.asList(566l, VERSIONED_ID)); - CollectionWithPagingInfo collectionWithPage = mapper.toCollectionWithPagingInfo(EMPTY_PARAMS, SearchQuery.EMPTY, results); + SearchRequestContext searchRequest = SearchRequestContext.from(SearchQuery.EMPTY); + CollectionWithPagingInfo collectionWithPage = mapper.toCollectionWithPagingInfo(EMPTY_PARAMS, searchRequest, SearchQuery.EMPTY, results); assertNotNull(collectionWithPage); Long found = results.getNumberFound(); assertEquals(found.intValue(), collectionWithPage.getTotalItems().intValue()); @@ -263,7 +283,9 @@ public class ResultMapperTests { ResultSet results = mockResultset(Collections.emptyList(),Collections.emptyList()); SearchQuery searchQuery = helper.searchQueryFromJson(); - SearchContext searchContext = mapper.toSearchContext((SolrJSONResultSet) results, searchQuery, 0); + SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery); + SearchParameters searchParams = searchMapper.toSearchParameters(EMPTY_PARAMS, searchQuery, searchRequest); + SearchContext searchContext = mapper.toSearchContext((SolrJSONResultSet) results, searchRequest, searchQuery, 0); assertEquals(34l, searchContext.getConsistency().getlastTxId()); assertEquals(6, searchContext.getFacetQueries().size()); assertEquals(0,searchContext.getFacetQueries().get(0).getCount()); @@ -288,6 +310,30 @@ public class ResultMapperTests //Requests search Query assertNotNull(searchContext.getRequest()); assertEquals("great", searchContext.getRequest().getQuery().getUserQuery()); + + //Pivot + assertEquals(3, searchContext.getFacets().size()); + GenericFacetResponse pivotFacet = searchContext.getFacets().get(2); + assertEquals(FACET_TYPE.pivot,pivotFacet.getType()); + assertEquals("creator",pivotFacet.getLabel()); + assertEquals(1, pivotFacet.getBuckets().size()); + GenericBucket pivotBucket = pivotFacet.getBuckets().get(0); + assertEquals("mjackson",pivotBucket.getLabel()); + assertEquals("creator:mjackson",pivotBucket.getFilterQuery()); + assertEquals("{count=7}",pivotBucket.getMetrics().get(0).getValue().toString()); + assertEquals(1,pivotBucket.getFacets().size()); + GenericFacetResponse nestedFacet = pivotBucket.getFacets().get(0); + assertEquals(FACET_TYPE.pivot,nestedFacet.getType()); + assertEquals("mylabel",nestedFacet.getLabel()); + assertEquals(2,nestedFacet.getBuckets().size()); + GenericBucket nestedBucket = nestedFacet.getBuckets().get(0); + assertEquals("mjackson",nestedBucket.getLabel()); + assertEquals("modifier:mjackson",nestedBucket.getFilterQuery()); + assertEquals("{count=3}",nestedBucket.getMetrics().get(0).getValue().toString()); + GenericBucket nestedBucket2 = nestedFacet.getBuckets().get(1); + assertEquals("admin",nestedBucket2.getLabel()); + assertEquals("modifier:admin",nestedBucket2.getFilterQuery()); + assertEquals("{count=4}",nestedBucket2.getMetrics().get(0).getValue().toString()); } @Test @@ -347,7 +393,8 @@ public class ResultMapperTests ResultSet results = mockResultset(expectedResponse); SearchQuery searchQuery = helper.extractFromJson(jsonQuery); - SearchContext searchContext = mapper.toSearchContext((SolrJSONResultSet) results, searchQuery, 0); + SearchRequestContext searchRequest = SearchRequestContext.from(searchQuery); + SearchContext searchContext = mapper.toSearchContext((SolrJSONResultSet) results, searchRequest, searchQuery, 0); assertEquals(34l, searchContext.getConsistency().getlastTxId()); assertEquals(null, searchContext.getFacetQueries()); assertEquals(1, searchContext.getFacetsFields().size()); diff --git a/source/test-java/org/alfresco/rest/api/search/SerializerTestHelper.java b/source/test-java/org/alfresco/rest/api/search/SerializerTestHelper.java index f5356c0d36..1c3067d279 100644 --- a/source/test-java/org/alfresco/rest/api/search/SerializerTestHelper.java +++ b/source/test-java/org/alfresco/rest/api/search/SerializerTestHelper.java @@ -61,8 +61,9 @@ public class SerializerTestHelper implements RequestReader + "\"templates\": [{\"name\": \"mytemp\",\"template\": \"ATEMP\"}, {\"name\": \"yourtemp\",\"template\": \"%cm:content\"}]," + "\"defaults\": {\"namespace\": \"namesp\",\"defaultFieldName\": \"myfield\",\"defaultFTSOperator\": \"AND\", \"textAttributes\": [\"roy\", \"king\"]}," + "\"filterQueries\": [{\"query\": \"myquery\",\"tags\": [\"tag1\", \"tag2\"]},{\"query\": \"myquery2\"}]," - + "\"facetFields\": {\"facets\": [{\"field\": \"cm:creator\",\"prefix\": \"myquery2\",\"sort\": \"COUNT\",\"missing\": \"false\"}, {\"field\": \"modifier\",\"label\": \"mylabel\",\"method\": \"FC\",\"mincount\": \"5\"}]}," + + "\"facetFields\": {\"facets\": [{\"field\": \"cm:creator\",\"prefix\": \"myquery2\",\"sort\": \"COUNT\",\"missing\": \"false\"}, {\"field\": \"modifier\",\"label\": \"mylabel\",\"method\": \"FC\",\"mincount\": \"5\"}, {\"field\": \"owner\",\"label\": \"ownerLabel\"}]}," + "\"facetQueries\": [{\"query\": \"cm:created:bob\",\"label\": \"small\"}]," + + "\"pivots\": [{\"key\": \"mylabel\"}]," + "\"facetIntervals\": {\"sets\": [{ \"label\": \"king\", \"start\": \"1\", \"end\": \"2\",\"startInclusive\": true,\"endInclusive\": false}]" + ",\"intervals\": [{\"field\": \"cm:creator\",\"label\": \"creator\"," + "\"sets\": [{\"label\": \"last\",\"start\": \"a\",\"end\": \"b\",\"startInclusive\": false}]"