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 a51139ee0d..a2f8de3398 100644 --- a/source/java/org/alfresco/rest/api/search/impl/SearchMapper.java +++ b/source/java/org/alfresco/rest/api/search/impl/SearchMapper.java @@ -32,6 +32,7 @@ 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; @@ -112,6 +113,7 @@ public class SearchMapper fromFacetFields(sp, searchQuery.getFacetFields()); fromSpellCheck(sp, searchQuery.getSpellcheck()); fromScope(sp, searchQuery.getScope()); + fromLimits(sp, searchQuery.getLimits()); return sp; } @@ -429,4 +431,29 @@ public class SearchMapper } } } + + /** + * SearchParameters from the Limits object + * @param sp SearchParameters + * @param paging Paging + */ + public void fromLimits(SearchParameters sp, Limits limits) + { + if (limits != null) + { + if (limits.getPermissionEvaluationCount() != null) + { + sp.setMaxItems(-1); + sp.setLimitBy(LimitBy.NUMBER_OF_PERMISSION_EVALUATIONS); + sp.setMaxPermissionChecks(limits.getPermissionEvaluationCount()); + } + + if (limits.getPermissionEvaluationTime() != null) + { + sp.setMaxItems(-1); + sp.setLimitBy(LimitBy.NUMBER_OF_PERMISSION_EVALUATIONS); + sp.setMaxPermissionCheckTimeMillis(limits.getPermissionEvaluationTime()); + } + } + } } diff --git a/source/java/org/alfresco/rest/api/search/model/Limits.java b/source/java/org/alfresco/rest/api/search/model/Limits.java new file mode 100644 index 0000000000..ea8f3a5b63 --- /dev/null +++ b/source/java/org/alfresco/rest/api/search/model/Limits.java @@ -0,0 +1,58 @@ +/*- + * #%L + * Alfresco Remote API + * %% + * Copyright (C) 2005 - 2016 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.model; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonProperty; + +/** + * POJO class representing the query Limits + **/ +public class Limits +{ + + private final Integer permissionEvaluationTime; + private final Integer permissionEvaluationCount; + + @JsonCreator + public Limits(@JsonProperty("permissionEvaluationTime") Integer permissionEvaluationTime, + @JsonProperty("permissionEvaluationCount") Integer permissionEvaluationCount) + { + this.permissionEvaluationTime = permissionEvaluationTime; + this.permissionEvaluationCount = permissionEvaluationCount; + } + + public Integer getPermissionEvaluationTime() + { + return permissionEvaluationTime; + } + + public Integer getPermissionEvaluationCount() + { + return permissionEvaluationCount; + } +} 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 fe48d7c64d..e9e3217a4a 100644 --- a/source/java/org/alfresco/rest/api/search/model/SearchQuery.java +++ b/source/java/org/alfresco/rest/api/search/model/SearchQuery.java @@ -51,8 +51,9 @@ public class SearchQuery private final FacetFields facetFields; private final Spelling spellcheck; private final Scope scope; + private final Limits limits; - public static final SearchQuery EMPTY = new SearchQuery(null, null, null, null, null,null, null, null, null, null, null); + public static final SearchQuery EMPTY = new SearchQuery(null, null, null, null, null,null, null, null,null, null, null, null); @JsonCreator public SearchQuery(@JsonProperty("query") Query query, @@ -65,7 +66,8 @@ public class SearchQuery @JsonProperty("facetFields") FacetFields facetFields, @JsonProperty("facetQueries") List facetQueries, @JsonProperty("spellcheck") Spelling spellcheck, - @JsonProperty("scope") Scope scope) + @JsonProperty("scope") Scope scope, + @JsonProperty("limits")Limits limits) { this.query = query; this.paging = paging; @@ -78,6 +80,7 @@ public class SearchQuery this.spellcheck = spellcheck; this.scope = scope; this.facetFields = facetFields; + this.limits = limits; } public Query getQuery() @@ -132,4 +135,9 @@ public class SearchQuery { return facetFields; } + + public Limits getLimits() + { + return limits; + } } 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 76e8bfcc9e..ba65c4e556 100644 --- a/source/test-java/org/alfresco/rest/api/search/SearchMapperTests.java +++ b/source/test-java/org/alfresco/rest/api/search/SearchMapperTests.java @@ -42,6 +42,7 @@ 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; @@ -474,10 +475,40 @@ public class SearchMapperTests assertEquals("ENUM" ,ff.getMethod().toString()); } + @Test + public void fromLimits() throws Exception + { + SearchParameters searchParameters = new SearchParameters(); + searchMapper.setDefaults(searchParameters); + + //Doesn't error + searchMapper.fromLimits(searchParameters, null); + assertEquals(LimitBy.FINAL_SIZE, searchParameters.getLimitBy()); + assertEquals(100, searchParameters.getMaxItems()); + + searchMapper.fromLimits(searchParameters, new Limits(null, null)); + assertEquals(LimitBy.FINAL_SIZE, searchParameters.getLimitBy()); + assertEquals(100, searchParameters.getMaxItems()); + + searchMapper.fromLimits(searchParameters, new Limits(null, 34)); + assertEquals(LimitBy.NUMBER_OF_PERMISSION_EVALUATIONS, searchParameters.getLimitBy()); + assertEquals(34, searchParameters.getMaxPermissionChecks()); + assertEquals(-1, searchParameters.getMaxItems()); + assertEquals(-1, searchParameters.getMaxPermissionCheckTimeMillis()); + + searchParameters = new SearchParameters(); + searchMapper.setDefaults(searchParameters); + searchMapper.fromLimits(searchParameters, new Limits(1000, null)); + assertEquals(LimitBy.NUMBER_OF_PERMISSION_EVALUATIONS, searchParameters.getLimitBy()); + assertEquals(1000, searchParameters.getMaxPermissionCheckTimeMillis()); + assertEquals(-1, searchParameters.getMaxItems()); + assertEquals(-1, searchParameters.getMaxPermissionChecks()); + } + private SearchQuery minimalQuery() { Query query = new Query("cmis", "foo", ""); - SearchQuery sq = new SearchQuery(query,null, null, null, null, null, null, null, null, null, null); + SearchQuery sq = new SearchQuery(query,null, null, null, null, null, null, null, null, null, null, null); return sq; } } 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 ebb69de481..0036479ebc 100644 --- a/source/test-java/org/alfresco/rest/api/search/SearchQuerySerializerTests.java +++ b/source/test-java/org/alfresco/rest/api/search/SearchQuerySerializerTests.java @@ -104,9 +104,10 @@ public class SearchQuerySerializerTests assertEquals("mylabel", ff.getLabel()); assertEquals("FC", ff.getMethod()); assertEquals(Integer.valueOf(5), ff.getMincount()); + assertEquals(2000, searchQuery.getLimits().getPermissionEvaluationCount().intValue()); + assertEquals(5000, searchQuery.getLimits().getPermissionEvaluationTime().intValue()); } - @Test public void testSerializeContext() throws IOException { 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 92cbaaddb6..63f56330c3 100644 --- a/source/test-java/org/alfresco/rest/api/search/SerializerTestHelper.java +++ b/source/test-java/org/alfresco/rest/api/search/SerializerTestHelper.java @@ -63,6 +63,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\"}]}," + "\"facetQueries\": [{\"query\": \"facquery\",\"label\": \"facnoused\"}]," + "\"spellcheck\": {\"query\": \"alfrezco\"}," + + "\"limits\": {\"permissionEvaluationCount\": \"2000\",\"permissionEvaluationTime\": \"5000\"}," + "\"scope\": { \"stores\": [\"workspace://SpacesStore\"]}," + "\"include\": [\"aspectNames\", \"properties\"]}";