/** * Builds a query that will select all documents that use any of the specified certificates. */ private static Query buildCertLinkClause(Collection<String> trustCertLinks) { if (trustCertLinks == null || trustCertLinks.isEmpty()) { return null; } Builder builder = Query.Builder.create(Occurance.MUST_OCCUR); TRUST_CERT_CUSTOM_PROPERTY_NAMES.forEach(propName -> { builder.addInClause( QuerySpecification.buildCompositeFieldName( ResourceState.FIELD_NAME_CUSTOM_PROPERTIES, propName), trustCertLinks, Occurance.SHOULD_OCCUR); }); return builder.build(); }
/** * With the given compute links, finds which ones are not already retrieved as part of a * resource pool, and loads the corresponding ComputeState documents into the result. */ private DeferredResult<Void> handleMissingComputes(Collection<String> allComputeLinks) { Collection<String> missingComputeLinks = new HashSet<>(allComputeLinks); missingComputeLinks.removeAll(this.result.computesByLink.keySet()); if (missingComputeLinks.isEmpty()) { return DeferredResult.completed(null); } Query query = Query.Builder.create() .addKindFieldClause(ComputeState.class) .addInClause(ServiceDocument.FIELD_NAME_SELF_LINK, missingComputeLinks) .build(); return new QueryByPages<>(this.host, query, ComputeState.class, null) .setMaxPageSize(PAGE_SIZE) .collectDocuments(Collectors.toMap(cs -> cs.documentSelfLink, cs -> cs)) .thenAccept(computesMap -> storeComputes(null, computesMap)); }
/** * Builds a query that will select all documents that are not present in the ignored list */ private static Query buildSelfLinkExclusionClause(Collection<String> ignoredUsageLinks) { if (ignoredUsageLinks == null || ignoredUsageLinks.isEmpty()) { return null; } return Query.Builder.create(Occurance.MUST_NOT_OCCUR) .addInClause(ServiceDocument.FIELD_NAME_SELF_LINK, ignoredUsageLinks) .build(); }
private GraphQueryTask createTwoStageTaskWithSelfLinks(String name, boolean isDirect, List<String> idsForFirstStage) throws Throwable { // Stage one is a query for example service instances Query.Builder qBuilder = Query.Builder.create() .addKindFieldClause(ExampleServiceState.class) .addFieldClause(ExampleServiceState.FIELD_NAME_NAME, name); if (idsForFirstStage != null) { qBuilder.addInClause(ServiceDocument.FIELD_NAME_SELF_LINK, idsForFirstStage); } QueryTask stageOneTask = QueryTask.Builder.create() .setQuery(qBuilder.build()) .build(); // Add the linkTerm for the second stage query QueryTask stageTwoTask = QueryTask.Builder.create() .addLinkTerm(QueryValidationServiceState.FIELD_NAME_SERVICE_LINK) .setQuery(Query.Builder.create() .addKindFieldClause(QueryValidationServiceState.class).build()) .build(); GraphQueryTask initialState = GraphQueryTask.Builder.create(2) .setDirect(true) .addQueryStage(stageOneTask) .addQueryStage(stageTwoTask) .addOption(GraphQueryOption.USE_LINK_TERM) .build(); initialState = createTask(initialState); return initialState; }
private void retrieveContainers( Map<String, HostSelection> hostSelectionMap, HostSelectionFilterCompletion callback) { QueryTask.Query.Builder queryBuilder = QueryTask.Query.Builder.create() .addKindFieldClause(ContainerState.class) .addInClause(ContainerState.FIELD_NAME_PARENT_LINK, hostSelectionMap.keySet()); QueryTask q = QueryTask.Builder.create().setQuery(queryBuilder.build()).build(); q.querySpec.resultLimit = ServiceDocumentQuery.DEFAULT_QUERY_RESULT_LIMIT; QueryUtil.addExpandOption(q); new ServiceDocumentQuery<>(host, ContainerState.class).query(q, (r) -> { if (r.hasException()) { host.log(Level.WARNING, "Exception while quering containers during 'Spread' filtering." + "Error: [%s]", r.getException().getMessage()); callback.complete(null, r.getException()); return; } else if (r.hasResult()) { HostSelection hostSelection = hostSelectionMap .get(r.getResult().parentLink); hostSelection.resourceCount += 1; } else { // Return the host with minimum number of containers. completeFilter(hostSelectionMap, callback); } }); }
private void doNotInQuery(String fieldName, String fieldValue, long documentCount, long expectedResultCount) throws Throwable { QuerySpecification spec = new QuerySpecification(); spec.query = Query.Builder.create().addInClause( fieldName, Arrays.asList( UUID.randomUUID().toString(), fieldValue, UUID.randomUUID().toString()), Occurance.MUST_NOT_OCCUR) .addFieldClause(ServiceDocument.FIELD_NAME_KIND, Utils.buildKind(QueryValidationServiceState.class)) .build(); this.host.createAndWaitSimpleDirectQuery(spec, documentCount, expectedResultCount); // Additional Test to verify that InClause with Array[1] is treated as TERM Query QuerySpecification spec1 = new QuerySpecification(); spec1.query = Query.Builder.create().addInClause( fieldName, Arrays.asList(fieldValue), Occurance.MUST_NOT_OCCUR) .addFieldClause(ServiceDocument.FIELD_NAME_KIND, Utils.buildKind(QueryValidationServiceState.class)) .build(); this.host.createAndWaitSimpleDirectQuery(spec1, documentCount, expectedResultCount); }
private GraphQueryTask createTwoStageTaskWithSelfLinks(String name, boolean isDirect, List<String> idsForFirstStage) throws Throwable { // Stage one is a query for example service instances Query.Builder qBuilder = Query.Builder.create() .addKindFieldClause(ExampleServiceState.class) .addFieldClause(ExampleServiceState.FIELD_NAME_NAME, name); if (idsForFirstStage != null) { qBuilder.addInClause(ServiceDocument.FIELD_NAME_SELF_LINK, idsForFirstStage); } QueryTask stageOneTask = QueryTask.Builder.create() .setQuery(qBuilder.build()) .build(); // Add the linkTerm for the second stage query QueryTask stageTwoTask = QueryTask.Builder.create() .addLinkTerm(QueryValidationServiceState.FIELD_NAME_SERVICE_LINK) .setQuery(Query.Builder.create() .addKindFieldClause(QueryValidationServiceState.class).build()) .build(); GraphQueryTask initialState = GraphQueryTask.Builder.create(2) .setDirect(true) .addQueryStage(stageOneTask) .addQueryStage(stageTwoTask) .addOption(GraphQueryOption.USE_LINK_TERM) .build(); initialState = createTask(initialState); return initialState; }
/** * With the given compute links, finds which ones are not already retrieved as part of a * resource pool, and loads the corresponding ComputeState documents into the result. */ private DeferredResult<Void> handleMissingComputes(Collection<String> allComputeLinks) { Collection<String> missingComputeLinks = new HashSet<>(allComputeLinks); missingComputeLinks.removeAll(this.result.computesByLink.keySet()); if (missingComputeLinks.isEmpty()) { return DeferredResult.completed(null); } Query query = Query.Builder.create() .addKindFieldClause(ComputeState.class) .addInClause(ServiceDocument.FIELD_NAME_SELF_LINK, missingComputeLinks) .build(); QueryByPages<ComputeState> queryByPages = new QueryByPages<>(this.host, query, ComputeState.class, this.tenantLinks); queryByPages.setClusterType(ServiceTypeCluster.INVENTORY_SERVICE); return queryByPages .setMaxPageSize(PAGE_SIZE) .collectDocuments(Collectors.toMap(cs -> cs.documentSelfLink, cs -> cs)) .thenAccept(computesMap -> storeComputes(null, computesMap)); }
@Test public void testWithAdditionalQuery() throws Throwable { ResourcePoolQueryHelper helper = ResourcePoolQueryHelper.create(getHost()); helper.setAdditionalQueryClausesProvider(qb -> { qb.addInClause(ServiceDocument.FIELD_NAME_SELF_LINK, Arrays.asList(this.c1.documentSelfLink, this.c4.documentSelfLink)); }); ResourcePoolQueryHelper.QueryResult qr = runHelperSynchronously(getHost(), helper); assertThat(qr.resourcesPools.size(), is(3)); assertThat(qr.resourcesPools.get(this.rp1.documentSelfLink).computeStateLinks, hasSize(1)); assertThat(qr.resourcesPools.get(this.rp2.documentSelfLink).computeStateLinks, is(empty())); assertThat(qr.resourcesPools.get(this.rp3.documentSelfLink).computeStateLinks, is(empty())); assertThat(qr.computesByLink.size(), is(2)); assertThat(qr.rpLinksByComputeLink.size(), is(2)); assertThat(qr.rpLinksByComputeLink.get(this.c1.documentSelfLink), contains(this.rp1.documentSelfLink)); assertThat(qr.rpLinksByComputeLink.get(this.c4.documentSelfLink), is(empty())); }
private void scopeNextStageQueryToSelectedLinks(GraphQueryTask graphTask, ServiceDocumentQueryResult lastResults, QueryTask task) { if (!hasInlineResults(graphTask, lastResults)) { return; } Query.Builder qBuilder = Query.Builder.create(); String propertyName = null; Collection<String> matchDocuments = null; if (graphTask.options.contains(GraphQueryTask.GraphQueryOption.USE_LINK_TERM)) { //TODO: Support multiple linkTerms propertyName = task.querySpec.linkTerms.get(0).propertyName; matchDocuments = lastResults.documentLinks; } else { propertyName = ServiceDocument.FIELD_NAME_SELF_LINK; matchDocuments = lastResults.selectedLinks; } Query inClause = qBuilder.addInClause(propertyName, matchDocuments).build(); task.querySpec.query.addBooleanClause(inClause); }
/** * Retrieves the requested resource pools documents. */ private DeferredResult<Void> retrieveResourcePools() { Query.Builder queryBuilder = Query.Builder.create() .addKindFieldClause(ResourcePoolState.class); if (this.resourcePoolLinks != null && !this.resourcePoolLinks.isEmpty()) { queryBuilder.addInClause(ServiceDocument.FIELD_NAME_SELF_LINK, this.resourcePoolLinks); } else if (this.additionalResourcePoolQueryClausesProvider != null) { this.additionalResourcePoolQueryClausesProvider.accept(queryBuilder); } QueryByPages<ResourcePoolState> queryByPages = new QueryByPages<>( this.host, queryBuilder.build(), ResourcePoolState.class, this.tenantLinks); queryByPages.setClusterType(ServiceTypeCluster.INVENTORY_SERVICE); return queryByPages.setMaxPageSize(PAGE_SIZE).queryDocuments(rp -> storeResourcePool(rp)); }
private Query getAssociatedDocumentsQuery(EndpointRemovalTaskState state, Collection<String> documentKinds) { Query resourceQuery = Query.Builder.create() .addInClause(ServiceDocument.FIELD_NAME_KIND, documentKinds) .addClause(Query.Builder.create() .addFieldClause(FIELD_NAME_ENDPOINT_LINK, state.endpoint.documentSelfLink, QueryTask.Query.Occurance.SHOULD_OCCUR) .addCompositeFieldClause(FIELD_NAME_CUSTOM_PROPERTIES, ComputeProperties.ENDPOINT_LINK_PROP_NAME, state.endpoint.documentSelfLink, QueryTask.Query.Occurance.SHOULD_OCCUR) .build()) .build(); return resourceQuery; }
/** * Add a clause with the given occurance which matches a collection containing at least one of several * specified values (analogous to a SQL "IN" or "NOT IN" statements). * @param collectionFieldName the collection field name. * @param itemNames the item names in the collection to match. * @param occurance the occurance for this clause. * @return a reference to this object. */ public Builder addInCollectionItemClause(String collectionFieldName, Collection<String> itemNames, Occurance occurance) { String collectionItemFieldName = QuerySpecification.buildCollectionItemName( collectionFieldName); return addInClause(collectionItemFieldName, itemNames, occurance); }
/** * Retrieves the requested resource pools documents. */ private DeferredResult<Void> retrieveResourcePools() { Query.Builder queryBuilder = Query.Builder.create() .addKindFieldClause(ResourcePoolState.class); if (this.resourcePoolLinks != null && !this.resourcePoolLinks.isEmpty()) { queryBuilder.addInClause(ServiceDocument.FIELD_NAME_SELF_LINK, this.resourcePoolLinks); } else if (this.additionalResourcePoolQueryClausesProvider != null) { this.additionalResourcePoolQueryClausesProvider.accept(queryBuilder); } return new QueryByPages<>(this.host, queryBuilder.build(), ResourcePoolState.class, null) .setMaxPageSize(PAGE_SIZE) .queryDocuments(rp -> storeResourcePool(rp)); }
private void doInQuery(String fieldName, String fieldValue, long documentCount, long expectedResultCount) throws Throwable { QuerySpecification spec = new QuerySpecification(); spec.query = Query.Builder.create().addInClause( fieldName, Arrays.asList( UUID.randomUUID().toString(), fieldValue, UUID.randomUUID().toString())) .build(); this.host.createAndWaitSimpleDirectQuery(spec, documentCount, expectedResultCount); }
private void doInQuery(String fieldName, String fieldValue, long documentCount, long expectedResultCount) throws Throwable { QuerySpecification spec = new QuerySpecification(); spec.query = Query.Builder.create().addInClause( fieldName, Arrays.asList( UUID.randomUUID().toString(), fieldValue, UUID.randomUUID().toString())) .build(); this.host.createAndWaitSimpleDirectQuery(spec, documentCount, expectedResultCount); }
/** * Add a clause which matches a collection containing at least one of several specified * values (analogous to a SQL "IN" or "NOT IN" statements). * @param collectionFieldName the collection field name. * @param itemNames the item names in the collection to match. * @return a reference to this object. */ public Builder addInCollectionItemClause(String collectionFieldName, Collection<String> itemNames) { String collectionItemFieldName = QuerySpecification.buildCollectionItemName( collectionFieldName); return addInClause(collectionItemFieldName, itemNames); }
/** * Add a clause which matches a property with at least one of several specified * values (analogous to a SQL "IN" statement). * @param fieldName the field name. * @param itemNames the item names in the collection to match. * @return a reference to this object. */ public Builder addInClause(String fieldName, Collection<String> itemNames) { return addInClause(fieldName, itemNames, Occurance.MUST_OCCUR); }
private Query getAssociatedDocumentsQuery(EndpointRemovalTaskState state, Collection<String> documentKinds) { Query resourceQuery = Query.Builder.create() .addInClause(ServiceDocument.FIELD_NAME_KIND, documentKinds) .addInCollectionItemClause(FIELD_NAME_ENDPOINT_LINKS, Collections .singleton(state.endpoint.documentSelfLink), Query.Occurance.MUST_OCCUR) .build(); return resourceQuery; }
private void assertDocumentCount(long expectedCount, Collection<String> documentLinks) throws Throwable { Query query = Query.Builder.create() .addInClause(ServiceDocument.FIELD_NAME_SELF_LINK, documentLinks).build(); QueryTask queryTask = QueryTask.Builder.createDirectTask().setQuery(query) .addOption(QueryOption.COUNT).build(); QueryTask returnedTask = querySynchronously(queryTask); assertThat(returnedTask.results.documentCount, is(expectedCount)); }