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