From 7161a8ec563ae925ed157c502ab0b96355774632 Mon Sep 17 00:00:00 2001 From: Gethin James Date: Thu, 1 Jun 2017 11:10:46 +0000 Subject: [PATCH] Merged searchrep (5.2.1) to 5.2.N (5.2.1) 136805 msuzuki: Search-340, changed range to a collection as it may handle many range facets git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/DEV/5.2.N/root@137058 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../rest/api/search/impl/ResultMapper.java | 2 +- .../rest/api/search/impl/SearchMapper.java | 55 ++++++++++--------- .../rest/api/search/model/SearchQuery.java | 6 +- .../rest/api/search/ResultMapperTests.java | 49 ++++++++++------- .../api/search/SearchApiWebscriptTests.java | 34 ++---------- .../rest/api/search/SearchMapperTests.java | 14 ++++- .../search/SearchQuerySerializerTests.java | 16 +++--- .../rest/api/search/SerializerTestHelper.java | 2 +- 8 files changed, 87 insertions(+), 91 deletions(-) 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 a32547803b..243d85140e 100644 --- a/source/java/org/alfresco/rest/api/search/impl/ResultMapper.java +++ b/source/java/org/alfresco/rest/api/search/impl/ResultMapper.java @@ -495,9 +495,9 @@ public class ResultMapper List ffcs = new ArrayList<>(facetFields.size()); if (facetFields != null && !facetFields.isEmpty() && searchQuery.getQuery() != null) { - List buckets = new ArrayList<>(); for (Entry>> facet : facetFields.entrySet()) { + List buckets = new ArrayList<>(); facet.getValue().forEach(action -> buckets.add(buildGenericBucketFromRange(facet.getKey(), (Map) action))); ffcs.add(new GenericFacetResponse(FACET_TYPE.range, facet.getKey(), buckets)); } diff --git a/source/java/org/alfresco/rest/api/search/impl/SearchMapper.java b/source/java/org/alfresco/rest/api/search/impl/SearchMapper.java index 1b0ec4944d..67111da09c 100644 --- a/source/java/org/alfresco/rest/api/search/impl/SearchMapper.java +++ b/source/java/org/alfresco/rest/api/search/impl/SearchMapper.java @@ -26,6 +26,24 @@ package org.alfresco.rest.api.search.impl; +import static org.alfresco.rest.api.Nodes.PARAM_INCLUDE_ALLOWABLEOPERATIONS; +import static org.alfresco.rest.api.Nodes.PARAM_INCLUDE_ASPECTNAMES; +import static org.alfresco.rest.api.Nodes.PARAM_INCLUDE_ASSOCIATION; +import static org.alfresco.rest.api.Nodes.PARAM_INCLUDE_ISLINK; +import static org.alfresco.rest.api.Nodes.PARAM_INCLUDE_PATH; +import static org.alfresco.rest.api.Nodes.PARAM_INCLUDE_PROPERTIES; +import static org.alfresco.service.cmr.search.SearchService.LANGUAGE_CMIS_ALFRESCO; +import static org.alfresco.service.cmr.search.SearchService.LANGUAGE_FTS_ALFRESCO; +import static org.alfresco.service.cmr.search.SearchService.LANGUAGE_LUCENE; + +import java.time.ZoneId; +import java.util.Arrays; +import java.util.List; +import java.util.ListIterator; +import java.util.Optional; +import java.util.Set; +import java.util.regex.Matcher; + import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.repo.search.impl.lucene.LuceneQueryLanguageSPI; import org.alfresco.rest.api.search.context.SearchRequestContext; @@ -61,24 +79,6 @@ import org.alfresco.service.cmr.search.SearchParameters.SortDefinition; import org.alfresco.service.cmr.search.SearchParameters.SortDefinition.SortType; import org.alfresco.service.cmr.search.StatsRequestParameters; import org.alfresco.util.ParameterCheck; -import sun.util.calendar.ZoneInfo; - -import static org.alfresco.rest.api.Nodes.PARAM_INCLUDE_ALLOWABLEOPERATIONS; -import static org.alfresco.rest.api.Nodes.PARAM_INCLUDE_ASSOCIATION; -import static org.alfresco.rest.api.Nodes.PARAM_INCLUDE_ISLINK; -import static org.alfresco.rest.api.Nodes.PARAM_INCLUDE_PATH; -import static org.alfresco.rest.api.Nodes.PARAM_INCLUDE_ASPECTNAMES; -import static org.alfresco.rest.api.Nodes.PARAM_INCLUDE_PROPERTIES; -import static org.alfresco.service.cmr.search.SearchService.*; - -import java.time.ZoneId; -import java.util.Arrays; -import java.util.List; -import java.util.ListIterator; -import java.util.Optional; -import java.util.Set; -import java.util.TimeZone; -import java.util.regex.Matcher; /** * Maps from a json request and a solr SearchParameters object. @@ -530,16 +530,19 @@ public class SearchMapper * @param sp SearchParameters * @param rangeParams RangeParameters */ - public void fromRange(SearchParameters sp, RangeParameters rangeParams) + public void fromRange(SearchParameters sp, List ranges) { - if(rangeParams != null) + if(ranges != null && !ranges.isEmpty()) { - ParameterCheck.mandatory("ranges", rangeParams); - ParameterCheck.mandatory("field", rangeParams.getField()); - ParameterCheck.mandatory("start", rangeParams.getStart()); - ParameterCheck.mandatory("end", rangeParams.getEnd()); - ParameterCheck.mandatory("gap", rangeParams.getGap()); - sp.setRanges(rangeParams); + for(RangeParameters rangeParams : ranges) + { + ParameterCheck.mandatory("ranges", rangeParams); + ParameterCheck.mandatory("field", rangeParams.getField()); + ParameterCheck.mandatory("start", rangeParams.getStart()); + ParameterCheck.mandatory("end", rangeParams.getEnd()); + ParameterCheck.mandatory("gap", rangeParams.getGap()); + } + sp.setRanges(ranges); } } diff --git a/source/java/org/alfresco/rest/api/search/model/SearchQuery.java b/source/java/org/alfresco/rest/api/search/model/SearchQuery.java index a680966493..cd42b9c999 100644 --- a/source/java/org/alfresco/rest/api/search/model/SearchQuery.java +++ b/source/java/org/alfresco/rest/api/search/model/SearchQuery.java @@ -61,7 +61,7 @@ public class SearchQuery private final boolean includeRequest; private final List pivots; private final List stats; - private final RangeParameters ranges; + private final List ranges; private final String timezone; public static final SearchQuery EMPTY = new SearchQuery(null, null, null, null, null, null, @@ -87,7 +87,7 @@ public class SearchQuery @JsonProperty("facetIntervals")IntervalParameters facetIntervals, @JsonProperty("pivots") List pivots, @JsonProperty("stats") List stats, - @JsonProperty("ranges") RangeParameters ranges, + @JsonProperty("ranges") List ranges, @JsonProperty("timezone") String timezone) { this.query = query; @@ -201,7 +201,7 @@ public class SearchQuery return stats; } - public RangeParameters getFacetRanges() + public List getFacetRanges() { return ranges; } 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 3d81b6435c..e8ebe2c90e 100644 --- a/source/test-java/org/alfresco/rest/api/search/ResultMapperTests.java +++ b/source/test-java/org/alfresco/rest/api/search/ResultMapperTests.java @@ -118,7 +118,9 @@ public class ResultMapperTests + "\"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\":{\"content.size\": {\"counts\": [\"0\",4,\"100\",6,\"200\",3],\"gap\": 100,\"start\": 0,\"end\": 300}}," + +"\"facet_ranges\":{" + + "\"created\": { \"counts\": [\"2015-09-29T10:45:15.729Z\",0,\"2016-01-07T10:45:15.729Z\",0,\"2016-04-16T10:45:15.729Z\",0,\"2016-07-25T10:45:15.729Z\",0],\"gap\": \"+100DAY\",\"start\": \"2015-09-29T10:45:15.729Z\",\"end\": \"2016-11-02T10:45:15.729Z\"}," + + "\"content.size\": {\"counts\": [\"0\",4,\"100\",6,\"200\",3],\"gap\": 100,\"start\": 0,\"end\": 300}}," +"\"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},\"TheCreated\":{\"earlier\":5,\"lastYear\":0,\"currentYear\":854}}" + "}," @@ -322,8 +324,8 @@ public class ResultMapperTests assertEquals("great", searchContext.getRequest().getQuery().getUserQuery()); //Pivot - assertEquals(6, searchContext.getFacets().size()); - GenericFacetResponse pivotFacet = searchContext.getFacets().get(3); + assertEquals(7, searchContext.getFacets().size()); + GenericFacetResponse pivotFacet = searchContext.getFacets().get(4); assertEquals(FACET_TYPE.pivot,pivotFacet.getType()); assertEquals("creator",pivotFacet.getLabel()); assertEquals(2, pivotFacet.getBuckets().size()); @@ -350,7 +352,7 @@ public class ResultMapperTests assertEquals("{count=4}",metrics[0].getValue().toString()); //Stats - GenericFacetResponse statsFacet = searchContext.getFacets().get(4); + GenericFacetResponse statsFacet = searchContext.getFacets().get(5); assertEquals(FACET_TYPE.stats,statsFacet.getType()); assertEquals("created",statsFacet.getLabel()); Set statsMetrics = statsFacet.getBuckets().get(0).getMetrics(); @@ -364,7 +366,7 @@ public class ResultMapperTests assertTrue(statsMetrics.contains(new SimpleMetric(METRIC_TYPE.sum, 1.458318720769983E15))); assertTrue(statsMetrics.contains(new SimpleMetric(METRIC_TYPE.stddev, 5.6250677994522545E10))); - statsFacet = searchContext.getFacets().get(5); + statsFacet = searchContext.getFacets().get(6); assertEquals("numericLabel",statsFacet.getLabel()); statsMetrics = statsFacet.getBuckets().get(0).getMetrics(); assertEquals(7,statsMetrics.size()); @@ -473,33 +475,40 @@ public class ResultMapperTests //Numeric facet range List rangeFacets = searchContext.getFacets().stream() .filter(f -> f.getType().equals(FACET_TYPE.range)).collect(Collectors.toList()); - assertEquals(1, rangeFacets.size()); - assertEquals(3, rangeFacets.get(0).getBuckets().size()); - assertEquals("content.size",rangeFacets.get(0).getLabel()); - assertEquals("0 - 100",rangeFacets.get(0).getBuckets().get(0).getLabel()); - Object[] metrics = rangeFacets.get(0).getBuckets().get(0).getMetrics().toArray(); + assertEquals(2, rangeFacets.size()); + assertEquals(4, rangeFacets.get(0).getBuckets().size()); + assertEquals("created",rangeFacets.get(0).getLabel()); + assertEquals("2015-09-29T10:45:15.729Z - 2016-01-07T10:45:15.729Z",rangeFacets.get(0).getBuckets().get(0).getLabel()); + Object[] metrics1 = rangeFacets.get(0).getBuckets().get(0).getMetrics().toArray(); + assertEquals("0",((SimpleMetric) metrics1[0]).getValue().get("count")); + assertEquals("created:(2015-09-29T10:45:15.729Z TO 2016-01-07T10:45:15.729Z)", rangeFacets.get(0).getBuckets().get(0).getFilterQuery()); + + assertEquals(3, rangeFacets.get(1).getBuckets().size()); + assertEquals("content.size",rangeFacets.get(1).getLabel()); + assertEquals("0 - 100",rangeFacets.get(1).getBuckets().get(0).getLabel()); + Object[] metrics = rangeFacets.get(1).getBuckets().get(0).getMetrics().toArray(); assertEquals("4",((SimpleMetric) metrics[0]).getValue().get("count")); - assertEquals("content.size:(0 TO 100)", rangeFacets.get(0).getBuckets().get(0).getFilterQuery()); + assertEquals("content.size:(0 TO 100)", rangeFacets.get(1).getBuckets().get(0).getFilterQuery()); - Map facetInfo = rangeFacets.get(0).getBuckets().get(0).getBucketInfo(); + Map facetInfo = rangeFacets.get(1).getBuckets().get(0).getBucketInfo(); assertEquals("0",facetInfo.get("from")); assertEquals("100",facetInfo.get("to")); - assertEquals("100 - 200",rangeFacets.get(0).getBuckets().get(1).getLabel()); - metrics = rangeFacets.get(0).getBuckets().get(1).getMetrics().toArray(); + assertEquals("100 - 200",rangeFacets.get(1).getBuckets().get(1).getLabel()); + metrics = rangeFacets.get(1).getBuckets().get(1).getMetrics().toArray(); assertEquals("6",((SimpleMetric) metrics[0]).getValue().get("count")); - facetInfo = rangeFacets.get(0).getBuckets().get(1).getBucketInfo(); + facetInfo = rangeFacets.get(1).getBuckets().get(1).getBucketInfo(); assertEquals("100",facetInfo.get("from")); assertEquals("200",facetInfo.get("to")); - assertEquals("content.size:(100 TO 200)", rangeFacets.get(0).getBuckets().get(1).getFilterQuery()); + assertEquals("content.size:(100 TO 200)", rangeFacets.get(1).getBuckets().get(1).getFilterQuery()); - assertEquals("200 - 300",rangeFacets.get(0).getBuckets().get(2).getLabel()); - metrics = rangeFacets.get(0).getBuckets().get(2).getMetrics().toArray(); + assertEquals("200 - 300",rangeFacets.get(1).getBuckets().get(2).getLabel()); + metrics = rangeFacets.get(1).getBuckets().get(2).getMetrics().toArray(); assertEquals("3",((SimpleMetric) metrics[0]).getValue().get("count")); - facetInfo = rangeFacets.get(0).getBuckets().get(2).getBucketInfo(); + facetInfo = rangeFacets.get(1).getBuckets().get(2).getBucketInfo(); assertEquals("200",facetInfo.get("from")); assertEquals("300",facetInfo.get("to")); - assertEquals("content.size:(200 TO 300)", rangeFacets.get(0).getBuckets().get(2).getFilterQuery()); + assertEquals("content.size:(200 TO 300)", rangeFacets.get(1).getBuckets().get(2).getFilterQuery()); } @Test diff --git a/source/test-java/org/alfresco/rest/api/search/SearchApiWebscriptTests.java b/source/test-java/org/alfresco/rest/api/search/SearchApiWebscriptTests.java index 979307fb13..a80e3501a0 100644 --- a/source/test-java/org/alfresco/rest/api/search/SearchApiWebscriptTests.java +++ b/source/test-java/org/alfresco/rest/api/search/SearchApiWebscriptTests.java @@ -28,40 +28,14 @@ package org.alfresco.rest.api.search; import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertNotNull; import static junit.framework.TestCase.assertTrue; -import static junit.framework.TestCase.fail; -import static org.alfresco.service.cmr.repository.StoreRef.PROTOCOL_DELETED; -import static org.alfresco.service.cmr.repository.StoreRef.PROTOCOL_TEST; -import static org.alfresco.service.cmr.search.SearchService.LANGUAGE_CMIS_ALFRESCO; -import static org.alfresco.service.cmr.search.SearchService.LANGUAGE_FTS_ALFRESCO; -import static org.alfresco.service.cmr.search.SearchService.LANGUAGE_LUCENE; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import org.alfresco.rest.api.search.impl.SearchMapper; -import org.alfresco.rest.api.search.model.Default; -import org.alfresco.rest.api.search.model.FacetField; -import org.alfresco.rest.api.search.model.FacetFields; -import org.alfresco.rest.api.search.model.FacetQuery; -import org.alfresco.rest.api.search.model.FilterQuery; -import org.alfresco.rest.api.search.model.Limits; -import org.alfresco.rest.api.search.model.Query; -import org.alfresco.rest.api.search.model.Scope; -import org.alfresco.rest.api.search.model.SearchQuery; -import org.alfresco.rest.api.search.model.SortDef; -import org.alfresco.rest.api.search.model.Spelling; -import org.alfresco.rest.api.search.model.Template; -import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException; -import org.alfresco.rest.framework.resource.parameters.Paging; -import org.alfresco.rest.framework.resource.parameters.Params; -import org.alfresco.service.cmr.repository.StoreRef; -import org.alfresco.service.cmr.search.LimitBy; -import org.alfresco.service.cmr.search.SearchParameters; -import org.alfresco.service.cmr.search.SearchParameters.FieldFacet; -import org.alfresco.service.cmr.search.SearchService; -import org.junit.Assert; -import org.junit.Test; import java.util.Arrays; +import org.alfresco.rest.framework.resource.parameters.Paging; +import org.alfresco.rest.framework.resource.parameters.Params; +import org.junit.Test; + /** * Tests the SearchApiWebscript class * diff --git a/source/test-java/org/alfresco/rest/api/search/SearchMapperTests.java b/source/test-java/org/alfresco/rest/api/search/SearchMapperTests.java index c085b60001..65731ca016 100644 --- a/source/test-java/org/alfresco/rest/api/search/SearchMapperTests.java +++ b/source/test-java/org/alfresco/rest/api/search/SearchMapperTests.java @@ -889,7 +889,8 @@ public class SearchMapperTests public void facetRange() { SearchParameters searchParameters = new SearchParameters(); - RangeParameters rangeParams = new RangeParameters(null, null, null, null,false,null,null,null,null); + List rangeParams = new ArrayList(); + rangeParams.add(new RangeParameters(null, null, null, null,false,null,null,null,null)); try { searchMapper.fromRange(searchParameters, rangeParams); @@ -899,14 +900,21 @@ public class SearchMapperTests { assertNotNull(iae); } - rangeParams = new RangeParameters("content.size", "0", "100000", "1000",true,null,null,null,null); + rangeParams.clear(); + rangeParams.add(new RangeParameters("content.size", "0", "100000", "1000",true,null,null,null,null)); searchMapper.fromRange(searchParameters, rangeParams); assertEquals(searchParameters.getRanges(), rangeParams); - rangeParams = new RangeParameters("content.size", "0", "100000", "1000",true,"before","lower",null,null); + rangeParams.clear(); + rangeParams.add(new RangeParameters("content.size", "0", "100000", "1000",true,"before","lower",null,null)); searchMapper.fromRange(searchParameters, rangeParams); assertEquals(searchParameters.getRanges(), rangeParams); + //Assert multiple ranges + rangeParams.add(new RangeParameters("created", "2015-09-29T10:45:15.729Z", "2016-09-29T10:45:15.729Z", "+100DAY", true, "before", "lower", null, null)); + searchMapper.fromRange(searchParameters, rangeParams); + assertEquals(searchParameters.getRanges(), rangeParams); + assertEquals(2,searchParameters.getRanges().size()); } private SearchQuery minimalQuery() diff --git a/source/test-java/org/alfresco/rest/api/search/SearchQuerySerializerTests.java b/source/test-java/org/alfresco/rest/api/search/SearchQuerySerializerTests.java index 8f4e5f7699..6c936aa176 100644 --- a/source/test-java/org/alfresco/rest/api/search/SearchQuerySerializerTests.java +++ b/source/test-java/org/alfresco/rest/api/search/SearchQuerySerializerTests.java @@ -29,8 +29,15 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + 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.SpellCheckContext; import org.alfresco.rest.api.search.impl.StoreMapper; import org.alfresco.rest.api.search.model.Default; @@ -38,8 +45,6 @@ import org.alfresco.rest.api.search.model.FacetField; import org.alfresco.rest.api.search.model.SearchQuery; import org.alfresco.rest.framework.jacksonextensions.ExecutionResult; import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo; -import org.alfresco.rest.api.search.context.SearchContext; -import org.alfresco.rest.api.search.context.FacetQueryContext; import org.alfresco.rest.framework.tests.api.mocks.Farmer; import org.alfresco.service.cmr.search.FieldHighlightParameters; import org.alfresco.service.cmr.search.Interval; @@ -49,9 +54,6 @@ import org.alfresco.service.cmr.search.RangeParameters; import org.junit.BeforeClass; import org.junit.Test; -import java.io.IOException; -import java.util.Arrays; - /** * Tests json -> SearchQuery deserialization * @@ -164,8 +166,8 @@ public class SearchQuerySerializerTests assertEquals("cm:creator",searchQuery.getStats().get(0).getField()); assertEquals("mylabel",searchQuery.getStats().get(0).getLabel()); //Range Facet - RangeParameters range = searchQuery.getFacetRanges(); - assertNotNull(range); + List ranges = searchQuery.getFacetRanges(); + assertNotNull(ranges); } 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 10ed2d8c94..06df10a888 100644 --- a/source/test-java/org/alfresco/rest/api/search/SerializerTestHelper.java +++ b/source/test-java/org/alfresco/rest/api/search/SerializerTestHelper.java @@ -64,7 +64,7 @@ public class SerializerTestHelper implements RequestReader + "\"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\"}]," - + "\"ranges\": {\"field\": \"content.size\",\"start\": \"0\",\"end\": \"300\",\"gap\": \"100\"}," + + "\"ranges\": [{\"field\": \"content.size\",\"start\": \"0\",\"end\": \"300\",\"gap\": \"100\"}]," + "\"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}]"