diff --git a/data-model/src/main/java/org/alfresco/service/cmr/search/SearchParameters.java b/data-model/src/main/java/org/alfresco/service/cmr/search/SearchParameters.java index edc776a204..d66915b7b4 100644 --- a/data-model/src/main/java/org/alfresco/service/cmr/search/SearchParameters.java +++ b/data-model/src/main/java/org/alfresco/service/cmr/search/SearchParameters.java @@ -201,6 +201,11 @@ public class SearchParameters implements BasicSearchParameters private String timezone; + /** + * Configure the limit to track the total hits on search results + */ + private int trackTotalHits; + /** * Default constructor */ @@ -251,6 +256,7 @@ public class SearchParameters implements BasicSearchParameters sp.stats = this.stats; sp.ranges = this.ranges; sp.timezone = this.timezone; + sp.trackTotalHits = this.trackTotalHits; return sp; } @@ -1641,6 +1647,21 @@ public class SearchParameters implements BasicSearchParameters { this.includeMetadata = includeMetadata; } - + + public int getTrackTotalHits() + { + return trackTotalHits; + } + + /** + * Set a maximum value for the report of total hits. The reported number of hits will never exceed this limit even + * if more are found. If unset, the engine’s default tracking limit is applied. To remove any limit, set to -1. + * + * @param trackTotalHits int + */ + public void setTrackTotalHits(int trackTotalHits) + { + this.trackTotalHits = trackTotalHits; + } } diff --git a/packaging/tests/tas-restapi/src/main/java/org/alfresco/rest/search/RestRequestLimitsModel.java b/packaging/tests/tas-restapi/src/main/java/org/alfresco/rest/search/RestRequestLimitsModel.java new file mode 100644 index 0000000000..7f246bc339 --- /dev/null +++ b/packaging/tests/tas-restapi/src/main/java/org/alfresco/rest/search/RestRequestLimitsModel.java @@ -0,0 +1,82 @@ +/*- + * #%L + * alfresco-tas-restapi + * %% + * Copyright (C) 2005 - 2023 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.search; + +import org.alfresco.rest.core.IRestModel; +import org.alfresco.utility.model.TestModel; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class RestRequestLimitsModel extends TestModel implements IRestModel +{ + @JsonProperty + RestRequestLimitsModel model; + + private Integer permissionEvaluationTime; + private Integer permissionEvaluationCount; + private Integer trackTotalHitsLimit; + + @Override + public RestRequestLimitsModel onModel() + { + return model; + } + + public RestRequestLimitsModel(Integer permissionEvaluationTime, Integer permissionEvaluationCount, + Integer trackTotalHitsLimit) + { + super(); + this.permissionEvaluationTime = permissionEvaluationTime; + this.permissionEvaluationCount = permissionEvaluationCount; + this.trackTotalHitsLimit = trackTotalHitsLimit; + } + + public Integer getPermissionEvaluationTime() + { + return permissionEvaluationTime; + } + public void setPermissionEvaluationTime(Integer permissionEvaluationTime) + { + this.permissionEvaluationTime = permissionEvaluationTime; + } + public Integer getPermissionEvaluationCount() + { + return permissionEvaluationCount; + } + public void setPermissionEvaluationCount(Integer permissionEvaluationCount) + { + this.permissionEvaluationCount = permissionEvaluationCount; + } + public Integer getTrackTotalHitsLimit() + { + return trackTotalHitsLimit; + } + public void setTrackTotalHitsLimit(Integer trackTotalHitsLimit) + { + this.trackTotalHitsLimit = trackTotalHitsLimit; + } +} + diff --git a/packaging/tests/tas-restapi/src/main/java/org/alfresco/rest/search/SearchRequest.java b/packaging/tests/tas-restapi/src/main/java/org/alfresco/rest/search/SearchRequest.java index 90d1dd61d0..243fe89cd8 100644 --- a/packaging/tests/tas-restapi/src/main/java/org/alfresco/rest/search/SearchRequest.java +++ b/packaging/tests/tas-restapi/src/main/java/org/alfresco/rest/search/SearchRequest.java @@ -79,6 +79,7 @@ public class SearchRequest extends TestModel List sort; RestRequestDefaultsModel defaults; List templates; + RestRequestLimitsModel limits; public SearchRequest() { @@ -302,4 +303,15 @@ public class SearchRequest extends TestModel return this; } + + public RestRequestLimitsModel getLimits() + { + return limits; + } + + public void setLimits(RestRequestLimitsModel limits) + { + this.limits = limits; + } + } diff --git a/remote-api/src/main/java/org/alfresco/rest/api/search/impl/SearchMapper.java b/remote-api/src/main/java/org/alfresco/rest/api/search/impl/SearchMapper.java index 2df9fe4e0a..d4c82ad128 100644 --- a/remote-api/src/main/java/org/alfresco/rest/api/search/impl/SearchMapper.java +++ b/remote-api/src/main/java/org/alfresco/rest/api/search/impl/SearchMapper.java @@ -823,6 +823,11 @@ public class SearchMapper sp.setLimitBy(LimitBy.NUMBER_OF_PERMISSION_EVALUATIONS); sp.setMaxPermissionCheckTimeMillis(limits.getPermissionEvaluationTime()); } + + if(limits.getTrackTotalHitsLimit() != null) + { + sp.setTrackTotalHits(limits.getTrackTotalHitsLimit()); + } } } diff --git a/remote-api/src/main/java/org/alfresco/rest/api/search/model/Limits.java b/remote-api/src/main/java/org/alfresco/rest/api/search/model/Limits.java index 113d119153..315a984c50 100644 --- a/remote-api/src/main/java/org/alfresco/rest/api/search/model/Limits.java +++ b/remote-api/src/main/java/org/alfresco/rest/api/search/model/Limits.java @@ -37,13 +37,16 @@ public class Limits private final Integer permissionEvaluationTime; private final Integer permissionEvaluationCount; + private final Integer trackTotalHitsLimit; @JsonCreator public Limits(@JsonProperty("permissionEvaluationTime") Integer permissionEvaluationTime, - @JsonProperty("permissionEvaluationCount") Integer permissionEvaluationCount) + @JsonProperty("permissionEvaluationCount") Integer permissionEvaluationCount, + @JsonProperty("trackTotalHitsLimit") Integer trackTotalHitsLimit) { this.permissionEvaluationTime = permissionEvaluationTime; this.permissionEvaluationCount = permissionEvaluationCount; + this.trackTotalHitsLimit = trackTotalHitsLimit; } public Integer getPermissionEvaluationTime() @@ -55,4 +58,9 @@ public class Limits { return permissionEvaluationCount; } + + public Integer getTrackTotalHitsLimit() + { + return trackTotalHitsLimit; + } } diff --git a/remote-api/src/test/java/org/alfresco/rest/api/search/SearchMapperTests.java b/remote-api/src/test/java/org/alfresco/rest/api/search/SearchMapperTests.java index 25aa4fada4..a67a9f6814 100644 --- a/remote-api/src/test/java/org/alfresco/rest/api/search/SearchMapperTests.java +++ b/remote-api/src/test/java/org/alfresco/rest/api/search/SearchMapperTests.java @@ -745,33 +745,56 @@ public class SearchMapperTests } @Test - public void fromLimits() throws Exception + public void fromLimits_setNull() throws Exception { SearchParameters searchParameters = new SearchParameters(); searchMapper.setDefaults(searchParameters); - - //Doesn't error searchMapper.fromLimits(searchParameters, null); - assertEquals(500, searchParameters.getLimit()); - assertEquals(LimitBy.UNLIMITED, searchParameters.getLimitBy()); + assertEquals("LimitBy default value should be unlimited", LimitBy.UNLIMITED, searchParameters.getLimitBy()); + assertEquals("Limit default value should be 500", 500, searchParameters.getLimit()); + } - searchMapper.fromLimits(searchParameters, new Limits(null, null)); - assertEquals(LimitBy.UNLIMITED, searchParameters.getLimitBy()); - assertEquals(500, searchParameters.getLimit()); - - searchMapper.fromLimits(searchParameters, new Limits(null, 34)); - assertEquals(LimitBy.NUMBER_OF_PERMISSION_EVALUATIONS, searchParameters.getLimitBy()); - assertEquals(34, searchParameters.getMaxPermissionChecks()); - assertEquals(-1, searchParameters.getLimit()); - assertEquals(-1, searchParameters.getMaxPermissionCheckTimeMillis()); - - searchParameters = new SearchParameters(); + @Test + public void fromLimits_setAllLimitsAsNull() throws Exception + { + SearchParameters searchParameters = new SearchParameters(); searchMapper.setDefaults(searchParameters); - searchMapper.fromLimits(searchParameters, new Limits(1000, null)); + searchMapper.fromLimits(searchParameters, new Limits(null, null, null)); + assertEquals("LimitBy default value should be unlimited", LimitBy.UNLIMITED, searchParameters.getLimitBy()); + assertEquals("Limit default value should be 500", 500, searchParameters.getLimit()); + } + + @Test + public void fromLimits_setPermissionEvaluationCount() throws Exception + { + SearchParameters searchParameters = new SearchParameters(); + searchMapper.setDefaults(searchParameters); + searchMapper.fromLimits(searchParameters, new Limits(null, 34, null)); assertEquals(LimitBy.NUMBER_OF_PERMISSION_EVALUATIONS, searchParameters.getLimitBy()); - assertEquals(1000, searchParameters.getMaxPermissionCheckTimeMillis()); - assertEquals(-1, searchParameters.getLimit()); - assertEquals(-1, searchParameters.getMaxPermissionChecks()); + assertEquals("MaxPermissionChecks should be set", 34, searchParameters.getMaxPermissionChecks()); + assertEquals("Limit should be -1", -1, searchParameters.getLimit()); + assertEquals("MaxPermissionCheckTimeMillis should be -1", -1, searchParameters.getMaxPermissionCheckTimeMillis()); + } + + @Test + public void fromLimits_setPermissionEvaluationTime() throws Exception + { + SearchParameters searchParameters = new SearchParameters(); + searchMapper.setDefaults(searchParameters); + searchMapper.fromLimits(searchParameters, new Limits(1000, null, null)); + assertEquals(LimitBy.NUMBER_OF_PERMISSION_EVALUATIONS, searchParameters.getLimitBy()); + assertEquals("MaxPermissionCheckTimeMillis should be set", 1000, searchParameters.getMaxPermissionCheckTimeMillis()); + assertEquals("Limit should be -1", -1, searchParameters.getLimit()); + assertEquals("MaxPermissionChecks should be -1", -1, searchParameters.getMaxPermissionChecks()); + } + + @Test + public void fromLimits_setTrackTotalHitsLimit() throws Exception + { + SearchParameters searchParameters = new SearchParameters(); + searchMapper.setDefaults(searchParameters); + searchMapper.fromLimits(searchParameters, new Limits(null, null, 10)); + assertEquals("TrackTotalHits should be set", 10, searchParameters.getTrackTotalHits()); } @Test