private void initializeQuery(StatsAggregationTaskState currentState) { int resultLimit = Integer.getInteger(STATS_QUERY_RESULT_LIMIT, DEFAULT_QUERY_RESULT_LIMIT); QueryTask.Builder queryTaskBuilder = QueryTask.Builder.createDirectTask() .setQuery(currentState.query).setResultLimit(resultLimit); QueryTask qTask = queryTaskBuilder.build(); QueryUtils.startQueryTask(this, qTask, ServiceTypeCluster.DISCOVERY_SERVICE) .whenComplete((queryRsp, queryEx) -> { if (queryEx != null) { sendSelfFailurePatch(currentState, queryEx.getMessage()); return; } StatsAggregationTaskState patchBody = new StatsAggregationTaskState(); if (queryRsp.results.nextPageLink == null) { patchBody.taskInfo = TaskUtils.createTaskState(TaskStage.FINISHED); } else { patchBody.taskInfo = TaskUtils.createTaskState(TaskStage.STARTED); patchBody.taskSubStage = StatsAggregationStage.GET_RESOURCES; patchBody.queryResultLink = queryRsp.results.nextPageLink; } sendSelfPatch(patchBody); }); }
private void initializeQuery(StatsAggregationTaskState currentState) { int resultLimit = Integer.getInteger(STATS_QUERY_RESULT_LIMIT, DEFAULT_QUERY_RESULT_LIMIT); QueryTask.Builder queryTaskBuilder = QueryTask.Builder.createDirectTask() .setQuery(currentState.query).setResultLimit(resultLimit); QueryTask qTask = queryTaskBuilder.build(); QueryUtils.startInventoryQueryTask(this, qTask) .whenComplete((queryRsp, queryEx) -> { if (queryEx != null) { sendSelfFailurePatch(currentState, queryEx.getMessage()); return; } StatsAggregationTaskState patchBody = new StatsAggregationTaskState(); if (queryRsp.results.nextPageLink == null) { patchBody.taskInfo = TaskUtils.createTaskState(TaskStage.FINISHED); } else { patchBody.taskInfo = TaskUtils.createTaskState(TaskStage.STARTED); patchBody.taskSubStage = StatsAggregationStage.GET_RESOURCES; patchBody.queryResultLink = queryRsp.results.nextPageLink; } sendSelfPatch(patchBody); }); }
@Test public void testQueryGetAllWithPagination() throws Throwable { int numberOfServices = 20; this.services = this.host.doThroughputServiceStart(numberOfServices, MinimalTestService.class, this.host.buildMinimalTestState(), EnumSet.of(ServiceOption.PERSISTENCE), null); Query query = Builder.create().addKindFieldClause(MinimalTestServiceState.class).build(); QueryTask q = QueryTask.Builder.createDirectTask() .setResultLimit(numberOfServices / 4) .setQuery(query).build(); List<String> resultLinks = new ArrayList<>(); query(q, (r, e) -> { if (e != null) { this.host.failIteration(e); } else if (!r.hasResult()) { this.host.completeIteration(); } else { resultLinks.add(r.getDocumentSelfLink()); } }); assertEquals(20, resultLinks.size()); assertNotNull(resultLinks.get(0)); }
/** * Disassociate associated resource, e.g. enumeration task if started. */ private void disassociateAssociatedDocuments(EndpointRemovalTaskState state, Collection<String> documentKinds, SubStage next) { Query resourceQuery = getAssociatedDocumentsQuery(state, documentKinds); QueryTask resourceQueryTask = QueryTask.Builder.createDirectTask() .setQuery(resourceQuery) .setResultLimit(QueryUtils.DEFAULT_RESULT_LIMIT) .addOption(QueryOption.EXPAND_CONTENT) .build(); resourceQueryTask.tenantLinks = state.tenantLinks; QueryUtils.startInventoryQueryTask(this, resourceQueryTask) .whenComplete((queryTask, throwable) -> { if (throwable != null) { logWarning(throwable.getMessage()); sendFailureSelfPatch(throwable); return; } if (queryTask.results.nextPageLink == null) { sendSelfPatch(TaskStage.STARTED, next); return; } disassociateResourceHelper(queryTask.results.nextPageLink, next, state.endpointLink); }); }
public void doAllDocsTest(int serviceCount) throws Throwable { // issue a query that matches all docs both as a WILDCARD query and a PREFIX query Query query = Query.Builder.create() .addFieldClause( ServiceDocument.FIELD_NAME_SELF_LINK, UriUtils.URI_WILDCARD_CHAR, MatchType.WILDCARD) .build(); QueryTask queryTask = QueryTask.Builder.create() .setQuery(query).addOption(QueryOption.TOP_RESULTS) .setResultLimit(serviceCount).build(); URI u = this.host.createQueryTaskService(queryTask, false); QueryTask finishedTaskState = this.host.waitForQueryTaskCompletion( queryTask.querySpec, serviceCount, 0, u, false, true); assertTrue(finishedTaskState.results.documentLinks.size() == serviceCount); query = Query.Builder.create() .addFieldClause(ServiceDocument.FIELD_NAME_SELF_LINK, UriUtils.URI_PATH_CHAR, MatchType.PREFIX) .build(); queryTask = QueryTask.Builder.create().setQuery(query) .addOption(QueryOption.TOP_RESULTS) .setResultLimit(serviceCount).build(); u = this.host.createQueryTaskService(queryTask, false); finishedTaskState = this.host.waitForQueryTaskCompletion( queryTask.querySpec, serviceCount, 0, u, false, true); assertTrue(finishedTaskState.results.documentLinks.size() == serviceCount); }
/** * Query for a list of expanded documents extending {@link ServiceDocument}s that * are updated or deleted since given time in the past. The result will include * both updated and deleted documents. * * @param documentSinceUpdateTimeMicros * Indicating a time since the document was last updated matching the property * {@link ServiceDocument#documentUpdateTimeMicros}. */ public QueryTaskClientHelper<T> setUpdatedSince(long documentSinceUpdateTimeMicros) { long nowMicrosUtc = Utils.getNowMicrosUtc(); if (nowMicrosUtc < documentSinceUpdateTimeMicros) { throw new IllegalArgumentException( "'documentSinceUpdateTimeMicros' must be in the past."); } Query query = Builder.create().addKindFieldClause(this.type) .addClause(createUpdatedSinceTimeRange(documentSinceUpdateTimeMicros)).build(); QueryTask q = QueryTask.Builder.createDirectTask() .addOption(QueryOption.EXPAND_CONTENT) .addOption(QueryOption.INCLUDE_DELETED) .setResultLimit(DEFAULT_QUERY_RESULT_LIMIT) .setQuery(query).build(); setQueryTask(q); return this; }
@Test public void testQueryGetAllWithPagination() throws Throwable { int numberOfServices = 20; this.services = this.host.doThroughputServiceStart(numberOfServices, MinimalTestService.class, this.host.buildMinimalTestState(), EnumSet.of(ServiceOption.PERSISTENCE), null); Query query = Builder.create().addKindFieldClause(MinimalTestServiceState.class).build(); QueryTask q = QueryTask.Builder.createDirectTask() .setResultLimit(numberOfServices / 4) .setQuery(query).build(); List<String> resultLinks = new ArrayList<>(); query(q, (r, e) -> { if (e != null) { this.host.failIteration(e); } else if (!r.hasResult()) { this.host.completeIteration(); } else { resultLinks.add(r.getDocumentSelfLink()); } }); assertEquals(20, resultLinks.size()); assertNotNull(resultLinks.get(0)); }
private void verifyNumericGroupQueryPaginatedAcrossGroups(VerificationHost targetHost, List<Long> groups) throws Throwable { Query query = Query.Builder.create() .addKindFieldClause(ExampleServiceState.class) .build(); // two pagination across two dimensions: number of groups, and documents per group QueryTask queryTask = QueryTask.Builder.create() .addOption(QueryOption.GROUP_BY) .addOption(QueryOption.EXPAND_CONTENT) .setResultLimit(this.serviceCount / 5) .setGroupResultLimit(2) .orderAscending(ExampleServiceState.FIELD_NAME_NAME, TypeName.STRING) .groupOrder(ExampleServiceState.FIELD_NAME_SORTED_COUNTER, TypeName.LONG, SortOrder.DESC) .setQuery(query).build(); URI queryTaskURI = this.host.createQueryTaskService(queryTask); QueryTask finalState = this.host.waitForQueryTask(queryTaskURI, TaskStage.FINISHED); int expectedCountPerPage = queryTask.querySpec.resultLimit; validateNumericGroupByResults(targetHost, groups, null, finalState, null, expectedCountPerPage); }
private void verifyGroupQueryPaginatedAcrossGroups(VerificationHost targetHost, List<String> groups) throws Throwable { Query query = Query.Builder.create() .addKindFieldClause(ExampleServiceState.class) .build(); // two pagination across two dimensions: number of groups, and documents per group QueryTask queryTask = QueryTask.Builder.create() .addOption(QueryOption.GROUP_BY) .addOption(QueryOption.EXPAND_CONTENT) .setResultLimit(this.serviceCount / 5) .setGroupResultLimit(2) .orderAscending(ExampleServiceState.FIELD_NAME_ID, TypeName.STRING) .groupOrder(ExampleServiceState.FIELD_NAME_NAME, TypeName.STRING, SortOrder.ASC) .setQuery(query).build(); URI queryTaskURI = this.host.createQueryTaskService(queryTask); QueryTask finalState = this.host.waitForQueryTask(queryTaskURI, TaskStage.FINISHED); int expectedCountPerPage = queryTask.querySpec.resultLimit; validateGroupByResults(targetHost, groups, null, finalState, null, expectedCountPerPage); }
private void verifyNumericGroupQueryPaginatedAcrossGroups(VerificationHost targetHost, List<Long> groups) throws Throwable { Query query = Query.Builder.create() .addKindFieldClause(ExampleServiceState.class) .build(); // two pagination across two dimensions: number of groups, and documents per group QueryTask queryTask = QueryTask.Builder.create() .addOption(QueryOption.GROUP_BY) .addOption(QueryOption.EXPAND_CONTENT) .setResultLimit(this.serviceCount / 5) .setGroupResultLimit(2) .orderAscending(ExampleServiceState.FIELD_NAME_NAME, TypeName.STRING) .groupOrder(ExampleServiceState.FIELD_NAME_SORTED_COUNTER, TypeName.LONG, SortOrder.DESC) .setQuery(query).build(); URI queryTaskURI = this.host.createQueryTaskService(queryTask); QueryTask finalState = this.host.waitForQueryTask(queryTaskURI, TaskStage.FINISHED); int expectedCountPerPage = queryTask.querySpec.resultLimit; validateNumericGroupByResults(targetHost, groups, null, finalState, null, expectedCountPerPage); }
private void verifyGroupQueryPaginatedAcrossGroups(VerificationHost targetHost, List<String> groups) throws Throwable { Query query = Query.Builder.create() .addKindFieldClause(ExampleServiceState.class) .build(); // two pagination across two dimensions: number of groups, and documents per group QueryTask queryTask = QueryTask.Builder.create() .addOption(QueryOption.GROUP_BY) .addOption(QueryOption.EXPAND_CONTENT) .setResultLimit(this.serviceCount / 5) .setGroupResultLimit(2) .orderAscending(ExampleServiceState.FIELD_NAME_ID, TypeName.STRING) .groupOrder(ExampleServiceState.FIELD_NAME_NAME, TypeName.STRING, SortOrder.ASC) .setQuery(query).build(); URI queryTaskURI = this.host.createQueryTaskService(queryTask); QueryTask finalState = this.host.waitForQueryTask(queryTaskURI, TaskStage.FINISHED); int expectedCountPerPage = queryTask.querySpec.resultLimit; validateGroupByResults(targetHost, groups, null, finalState, null, expectedCountPerPage); }
private void verifyNumericGroupQueryPaginatedPerGroup(VerificationHost targetHost, List<Long> groups) throws Throwable { Query query = Query.Builder.create() .addKindFieldClause(ExampleServiceState.class) .build(); QueryTask queryTask = QueryTask.Builder.create() .addOption(QueryOption.GROUP_BY) .addOption(QueryOption.EXPAND_CONTENT) .setResultLimit(this.serviceCount / 5) .orderAscending(ExampleServiceState.FIELD_NAME_NAME, TypeName.STRING) .groupOrder(ExampleServiceState.FIELD_NAME_SORTED_COUNTER, TypeName.LONG, SortOrder.ASC) .setQuery(query).build(); URI queryTaskURI = this.host.createQueryTaskService(queryTask); QueryTask finalState = this.host.waitForQueryTask(queryTaskURI, TaskStage.FINISHED); int expectedCountPerPage = queryTask.querySpec.resultLimit; validateNumericGroupByResults(targetHost, groups, null, finalState, null, expectedCountPerPage); }
private void verifyGroupQueryPaginatedPerGroup(VerificationHost targetHost, List<String> groups) throws Throwable { Query query = Query.Builder.create() .addKindFieldClause(ExampleServiceState.class) .build(); QueryTask queryTask = QueryTask.Builder.create() .addOption(QueryOption.GROUP_BY) .addOption(QueryOption.EXPAND_CONTENT) .setResultLimit(this.serviceCount / 5) .orderAscending(ExampleServiceState.FIELD_NAME_ID, TypeName.STRING) .groupOrder(ExampleServiceState.FIELD_NAME_NAME, TypeName.STRING, SortOrder.ASC) .setQuery(query).build(); URI queryTaskURI = this.host.createQueryTaskService(queryTask); QueryTask finalState = this.host.waitForQueryTask(queryTaskURI, TaskStage.FINISHED); int expectedCountPerPage = queryTask.querySpec.resultLimit; validateGroupByResults(targetHost, groups, null, finalState, null, expectedCountPerPage); }
private void verifyNumericGroupQueryPaginatedPerGroup(VerificationHost targetHost, List<Long> groups) throws Throwable { Query query = Query.Builder.create() .addKindFieldClause(ExampleServiceState.class) .build(); QueryTask queryTask = QueryTask.Builder.create() .addOption(QueryOption.GROUP_BY) .addOption(QueryOption.EXPAND_CONTENT) .setResultLimit(this.serviceCount / 5) .orderAscending(ExampleServiceState.FIELD_NAME_NAME, TypeName.STRING) .groupOrder(ExampleServiceState.FIELD_NAME_SORTED_COUNTER, TypeName.LONG, SortOrder.ASC) .setQuery(query).build(); URI queryTaskURI = this.host.createQueryTaskService(queryTask); QueryTask finalState = this.host.waitForQueryTask(queryTaskURI, TaskStage.FINISHED); int expectedCountPerPage = queryTask.querySpec.resultLimit; validateNumericGroupByResults(targetHost, groups, null, finalState, null, expectedCountPerPage); }
private void verifyGroupQueryPaginatedPerGroup(VerificationHost targetHost, List<String> groups) throws Throwable { Query query = Query.Builder.create() .addKindFieldClause(ExampleServiceState.class) .build(); QueryTask queryTask = QueryTask.Builder.create() .addOption(QueryOption.GROUP_BY) .addOption(QueryOption.EXPAND_CONTENT) .setResultLimit(this.serviceCount / 5) .orderAscending(ExampleServiceState.FIELD_NAME_ID, TypeName.STRING) .groupOrder(ExampleServiceState.FIELD_NAME_NAME, TypeName.STRING, SortOrder.ASC) .setQuery(query).build(); URI queryTaskURI = this.host.createQueryTaskService(queryTask); QueryTask finalState = this.host.waitForQueryTask(queryTaskURI, TaskStage.FINISHED); int expectedCountPerPage = queryTask.querySpec.resultLimit; validateGroupByResults(targetHost, groups, null, finalState, null, expectedCountPerPage); }
private QueryTask makeQueryTask() { return QueryTask.Builder.createDirectTask() .setQuery(QueryTask.Query.Builder.create() .addKindFieldClause(ExampleServiceState.class) .addFieldClause(ExampleServiceState.FIELD_NAME_NAME, "a", MatchType.WILDCARD, Occurance.MUST_NOT_OCCUR) .addFieldClause(ExampleServiceState.FIELD_NAME_NAME, "c", MatchType.WILDCARD, Occurance.MUST_NOT_OCCUR) .addFieldClause(ExampleServiceState.FIELD_NAME_NAME, "5", MatchType.WILDCARD, Occurance.MUST_NOT_OCCUR) .build()) .setResultLimit(50) .build(); }
@Test public void maxExpirationTimeForPaginatedQuery() throws Throwable { setUpHost(false); Query query = Query.Builder.create() .addFieldClause(ServiceDocument.FIELD_NAME_KIND, Utils.buildKind(ExampleServiceState.class)) .build(); // create a paginated query with MAX expiration time QueryTask queryTask = QueryTask.Builder.createDirectTask().setQuery(query).setResultLimit(2).build(); queryTask.documentExpirationTimeMicros = Long.MAX_VALUE; this.host.createQueryTaskService(queryTask, false, true, queryTask, null); assertThat(this.indexService.getPaginatedSearchersByExpirationTime()) .hasSize(1) .containsOnlyKeys(Long.MAX_VALUE); }
private QueryTask makeQueryTask() { return QueryTask.Builder.createDirectTask() .setQuery(QueryTask.Query.Builder.create() .addKindFieldClause(ExampleServiceState.class) .addFieldClause(ExampleServiceState.FIELD_NAME_NAME, "a", MatchType.WILDCARD, Occurance.MUST_NOT_OCCUR) .addFieldClause(ExampleServiceState.FIELD_NAME_NAME, "c", MatchType.WILDCARD, Occurance.MUST_NOT_OCCUR) .addFieldClause(ExampleServiceState.FIELD_NAME_NAME, "5", MatchType.WILDCARD, Occurance.MUST_NOT_OCCUR) .build()) .setResultLimit(50) .build(); }
/** * Descendants might override this method to customize the default query task build logic. * For example add option such as {@link QueryOption#TOP_RESULTS}. */ protected QueryTask.Builder newQueryTaskBuilder() { QueryTask.Builder qtBuilder = this.isDirectQuery ? QueryTask.Builder.createDirectTask() : QueryTask.Builder.create(); return qtBuilder .setQuery(this.query) .setResultLimit(getResultLimit()); }
/** * Descendants might override this method to customize the default query task build logic. * For example add option such as {@link QueryOption#TOP_RESULTS}. */ protected QueryTask.Builder newQueryTaskBuilder() { return QueryTask.Builder.createDirectTask() .setQuery(this.query) .setResultLimit(getResultLimit()); }