diff options
author | Tor Brede Vekterli <vekterli@yahoo-inc.com> | 2017-09-26 17:36:19 +0200 |
---|---|---|
committer | Tor Brede Vekterli <vekterli@yahoo-inc.com> | 2017-09-28 13:54:00 +0200 |
commit | d22de4479f1a87a07f07d769bf7fb34e204be7ea (patch) | |
tree | b373bb9d44fffdbd70618bea512bd9875eca95c5 /vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java | |
parent | 85e3ec191db3d843bfe0d8d58d3c0bbd7b082514 (diff) |
Add wantedDocumentCount parameter to Document V1 visiting API
Visiting will continue until the provided number of documents has
been returned, or the session times out.
Parameter is bounded by an implementation defined maximum.
Remove old visit() interface method, as it should not have been covered
by an ExportPackage and therefore no one should have managed to
actually use it externally.
This fixes #3394
Diffstat (limited to 'vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java')
-rw-r--r-- | vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java index 482a39c60e5..46678ea67e3 100644 --- a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java +++ b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java @@ -49,6 +49,7 @@ public class OperationHandlerImpl implements OperationHandler { } public static final int VISIT_TIMEOUT_MS = 120000; + public static final int WANTED_DOCUMENT_COUNT_UPPER_BOUND = 1000; // Approximates the max default size of a bucket private final DocumentAccess documentAccess; private final DocumentApiMetrics metricsHelper; private final ClusterEnumerator clusterEnumerator; @@ -109,13 +110,8 @@ public class OperationHandlerImpl implements OperationHandler { } @Override - public VisitResult visit( - RestUri restUri, - String documentSelection, - Optional<String> cluster, - Optional<String> continuation) throws RestApiException { - - VisitorParameters visitorParameters = createVisitorParameters(restUri, documentSelection, cluster, continuation); + public VisitResult visit(RestUri restUri, String documentSelection, VisitOptions options) throws RestApiException { + VisitorParameters visitorParameters = createVisitorParameters(restUri, documentSelection, options); VisitorControlHandler visitorControlHandler = new VisitorControlHandler(); visitorParameters.setControlHandler(visitorControlHandler); @@ -326,13 +322,13 @@ public class OperationHandlerImpl implements OperationHandler { private VisitorParameters createVisitorParameters( RestUri restUri, String documentSelection, - Optional<String> clusterName, - Optional<String> continuation) + VisitOptions options) throws RestApiException { StringBuilder selection = new StringBuilder(); if (! documentSelection.isEmpty()) { + // TODO shouldn't selection be wrapped in () itself ? selection.append("(").append(documentSelection).append(" and "); } selection.append(restUri.getDocumentType()).append(" and (id.namespace=='").append(restUri.getNamespace()).append("')"); @@ -346,24 +342,26 @@ public class OperationHandlerImpl implements OperationHandler { params.setMaxBucketsPerVisitor(1); params.setMaxPending(32); params.setMaxFirstPassHits(1); - params.setMaxTotalHits(1); + params.setMaxTotalHits(options.wantedDocumentCount + .map(n -> Math.min(Math.max(n, 1), WANTED_DOCUMENT_COUNT_UPPER_BOUND)) + .orElse(1)); params.setThrottlePolicy(new StaticThrottlePolicy().setMaxPendingCount(1)); params.setToTimestamp(0L); params.setFromTimestamp(0L); params.setSessionTimeoutMs(VISIT_TIMEOUT_MS); - params.visitInconsistentBuckets(true); + params.visitInconsistentBuckets(true); // TODO document this as part of consistency doc params.setVisitorOrdering(VisitorOrdering.ASCENDING); - params.setRoute(resolveClusterRoute(clusterName)); + params.setRoute(resolveClusterRoute(options.cluster)); params.setTraceLevel(0); params.setPriority(DocumentProtocol.Priority.NORMAL_4); params.setVisitRemoves(false); - if (continuation.isPresent()) { + if (options.continuation.isPresent()) { try { - params.setResumeToken(ContinuationHit.getToken(continuation.get())); + params.setResumeToken(ContinuationHit.getToken(options.continuation.get())); } catch (Exception e) { throw new RestApiException(Response.createErrorResponse(500, ExceptionUtils.getStackTrace(e), restUri, RestUri.apiErrorCodes.UNSPECIFIED)); } |