From a093d239972ac6c7a377e423a5bd3d388ef00ae8 Mon Sep 17 00:00:00 2001 From: saxenakshitiz Date: Fri, 24 Dec 2021 10:57:11 +0530 Subject: [PATCH 1/3] Changes to get entities and services count associated with label --- .../graphql/label/fetcher/LabelFetcher.java | 11 +- .../graphql/label/joiner/LabelJoiner.java | 12 + .../label/joiner/LabelJoinerBuilder.java | 4 + .../label/joiner/LabeledEntitiesRequest.java | 11 + .../build.gradle.kts | 2 + .../label/dao/LabelResponseConverter.java | 37 ++- .../joiner/DefaultLabelJoinerBuilder.java | 234 +++++++++++++++++- 7 files changed, 298 insertions(+), 13 deletions(-) create mode 100644 hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/joiner/LabeledEntitiesRequest.java diff --git a/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/fetcher/LabelFetcher.java b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/fetcher/LabelFetcher.java index 604fbb18..c1d7d5da 100644 --- a/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/fetcher/LabelFetcher.java +++ b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/fetcher/LabelFetcher.java @@ -5,8 +5,8 @@ import java.util.concurrent.CompletableFuture; import javax.inject.Inject; import org.hypertrace.core.graphql.common.fetcher.InjectableDataFetcher; -import org.hypertrace.core.graphql.common.request.ContextualRequestBuilder; import org.hypertrace.graphql.label.dao.LabelDao; +import org.hypertrace.graphql.label.joiner.LabelJoinerBuilder; import org.hypertrace.graphql.label.schema.LabelResultSet; public class LabelFetcher extends InjectableDataFetcher { @@ -16,19 +16,20 @@ public LabelFetcher() { } static final class LabelFetcherImpl implements DataFetcher> { - private final ContextualRequestBuilder requestBuilder; + private final LabelJoinerBuilder requestBuilder; private final LabelDao labelDao; @Inject - LabelFetcherImpl(ContextualRequestBuilder requestBuilder, LabelDao labelDao) { + LabelFetcherImpl(LabelJoinerBuilder requestBuilder, LabelDao labelDao) { this.requestBuilder = requestBuilder; this.labelDao = labelDao; } @Override public CompletableFuture get(DataFetchingEnvironment environment) { - return this.labelDao - .getLabels(this.requestBuilder.build(environment.getContext())) + return this.requestBuilder + .build(environment.getContext(), environment.getSelectionSet()) + .flatMap(request -> request.joinLabelsWithEntities()) .toCompletionStage() .toCompletableFuture(); } diff --git a/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/joiner/LabelJoiner.java b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/joiner/LabelJoiner.java index e9f413e3..9c4a2cfb 100644 --- a/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/joiner/LabelJoiner.java +++ b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/joiner/LabelJoiner.java @@ -17,6 +17,11 @@ public Single> joinLabels( Collection joinSources, LabelIdGetter labelIdGetter) { return Single.just(Collections.emptyMap()); } + + @Override + public Single joinLabelsWithEntities() { + throw new UnsupportedOperationException(); + } }; /** @@ -30,6 +35,13 @@ public Single> joinLabels( Single> joinLabels( Collection joinSources, LabelIdGetter labelIdGetter); + /** + * Produces a map of label result set to source ids + * + * @return A map of each source to its matching label result set + */ + Single joinLabelsWithEntities(); + @FunctionalInterface interface LabelIdGetter { Single> getLabelIds(T source); diff --git a/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/joiner/LabelJoinerBuilder.java b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/joiner/LabelJoinerBuilder.java index acb554d2..3f5f9533 100644 --- a/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/joiner/LabelJoinerBuilder.java +++ b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/joiner/LabelJoinerBuilder.java @@ -1,8 +1,12 @@ package org.hypertrace.graphql.label.joiner; +import graphql.schema.DataFetchingFieldSelectionSet; import io.reactivex.rxjava3.core.Single; import org.hypertrace.core.graphql.context.GraphQlRequestContext; public interface LabelJoinerBuilder { Single build(GraphQlRequestContext context); + + Single build( + GraphQlRequestContext context, DataFetchingFieldSelectionSet selectionSet); } diff --git a/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/joiner/LabeledEntitiesRequest.java b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/joiner/LabeledEntitiesRequest.java new file mode 100644 index 00000000..9f3fd0eb --- /dev/null +++ b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/joiner/LabeledEntitiesRequest.java @@ -0,0 +1,11 @@ +package org.hypertrace.graphql.label.joiner; + +import graphql.schema.DataFetchingFieldSelectionSet; + +public interface LabeledEntitiesRequest { + String entityType(); + + int limit(); + + DataFetchingFieldSelectionSet selectionSet(); +} diff --git a/hypertrace-graphql-labels-schema-impl/build.gradle.kts b/hypertrace-graphql-labels-schema-impl/build.gradle.kts index 641f70ec..99128c02 100644 --- a/hypertrace-graphql-labels-schema-impl/build.gradle.kts +++ b/hypertrace-graphql-labels-schema-impl/build.gradle.kts @@ -27,6 +27,8 @@ dependencies { implementation("org.hypertrace.core.graphql:hypertrace-core-graphql-rx-utils") implementation("org.hypertrace.core.graphql:hypertrace-core-graphql-deserialization") + implementation(project(":hypertrace-graphql-entity-schema")) + implementation(project(":hypertrace-graphql-service-config")) } diff --git a/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/dao/LabelResponseConverter.java b/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/dao/LabelResponseConverter.java index 703ead87..08f0775c 100644 --- a/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/dao/LabelResponseConverter.java +++ b/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/dao/LabelResponseConverter.java @@ -8,6 +8,9 @@ import java.util.stream.Collectors; import lombok.Value; import lombok.experimental.Accessors; +import org.hypertrace.core.graphql.common.utils.CollectorUtils; +import org.hypertrace.graphql.entity.schema.Entity; +import org.hypertrace.graphql.entity.schema.EntityResultSet; import org.hypertrace.graphql.label.schema.Label; import org.hypertrace.graphql.label.schema.LabelResultSet; import org.hypertrace.graphql.label.schema.LabeledEntity; @@ -51,6 +54,30 @@ private Label convertLabel(org.hypertrace.label.config.service.v1.Label label) { Collections.emptyMap()); } + public Single