diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/joiner/DefaultEntityJoinerBuilder.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/joiner/DefaultEntityJoinerBuilder.java index da4055c5..e7a233a3 100644 --- a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/joiner/DefaultEntityJoinerBuilder.java +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/joiner/DefaultEntityJoinerBuilder.java @@ -60,6 +60,7 @@ import org.hypertrace.graphql.entity.schema.argument.EntityTypeStringArgument; import org.hypertrace.graphql.metric.request.MetricAggregationRequest; import org.hypertrace.graphql.metric.request.MetricRequest; +import org.hypertrace.graphql.metric.request.MetricRequestBuilder; import org.hypertrace.graphql.metric.schema.argument.AggregatableOrderArgument; @Slf4j @@ -70,6 +71,7 @@ class DefaultEntityJoinerBuilder implements EntityJoinerBuilder { private final GraphQlSelectionFinder selectionFinder; private final ArgumentDeserializer argumentDeserializer; private final ResultSetRequestBuilder resultSetRequestBuilder; + private final MetricRequestBuilder metricRequestBuilder; private final FilterRequestBuilder filterRequestBuilder; private final Scheduler boundedIoScheduler; private final EntityLabelRequestBuilder entityLabelRequestBuilder; @@ -80,6 +82,7 @@ class DefaultEntityJoinerBuilder implements EntityJoinerBuilder { GraphQlSelectionFinder selectionFinder, ArgumentDeserializer argumentDeserializer, ResultSetRequestBuilder resultSetRequestBuilder, + MetricRequestBuilder metricRequestBuilder, FilterRequestBuilder filterRequestBuilder, @BoundedIoScheduler Scheduler boundedIoScheduler, EntityLabelRequestBuilder entityLabelRequestBuilder) { @@ -88,6 +91,7 @@ class DefaultEntityJoinerBuilder implements EntityJoinerBuilder { this.selectionFinder = selectionFinder; this.argumentDeserializer = argumentDeserializer; this.resultSetRequestBuilder = resultSetRequestBuilder; + this.metricRequestBuilder = metricRequestBuilder; this.filterRequestBuilder = filterRequestBuilder; this.boundedIoScheduler = boundedIoScheduler; this.entityLabelRequestBuilder = entityLabelRequestBuilder; @@ -268,6 +272,8 @@ private Single buildEntityRequest( String entityType, int entityIdsToFilterSize, List> filterArguments) { + Collection selections = this.entityFieldsByType.get(entityType); + return zip( resultSetRequestBuilder.build( context, @@ -277,12 +283,14 @@ private Single buildEntityRequest( timeRange, List.>of(), // Order does not matter filterArguments, - this.entityFieldsByType.get(entityType).stream(), + selections.stream(), Optional.empty()), + metricRequestBuilder.build(context, entityType, selections.stream()), entityLabelRequestBuilder.buildLabelRequestIfPresentInAnyEntity( context, entityType, this.entityFieldsByType.get(entityType)), - (resultSetRequest, optionalLabelRequest) -> - new DefaultEntityRequest(entityType, resultSetRequest, optionalLabelRequest)); + (resultSetRequest, metricRequestList, optionalLabelRequest) -> + new DefaultEntityRequest( + entityType, resultSetRequest, metricRequestList, optionalLabelRequest)); } private Single>> buildIdFilter( @@ -297,7 +305,7 @@ private Single>> buildIdFilter( private static class DefaultEntityRequest implements EntityRequest { String entityType; ResultSetRequest resultSetRequest; - List metricRequests = Collections.emptyList(); // Only support attributes for now + List metricRequests; boolean fetchTotal = false; // Not needed for a single entity EdgeSetGroupRequest incomingEdgeRequests = new EmptyEdgeSetGroupRequest(); EdgeSetGroupRequest outgoingEdgeRequests = new EmptyEdgeSetGroupRequest(); diff --git a/hypertrace-graphql-entity-schema/src/test/java/org/hypertrace/graphql/entity/joiner/DefaultEntityJoinerBuilderTest.java b/hypertrace-graphql-entity-schema/src/test/java/org/hypertrace/graphql/entity/joiner/DefaultEntityJoinerBuilderTest.java index 1cecb488..2af2ba3f 100644 --- a/hypertrace-graphql-entity-schema/src/test/java/org/hypertrace/graphql/entity/joiner/DefaultEntityJoinerBuilderTest.java +++ b/hypertrace-graphql-entity-schema/src/test/java/org/hypertrace/graphql/entity/joiner/DefaultEntityJoinerBuilderTest.java @@ -48,6 +48,8 @@ import org.hypertrace.graphql.entity.schema.EntityType; import org.hypertrace.graphql.entity.schema.argument.EntityTypeStringArgument; import org.hypertrace.graphql.label.schema.LabelResultSet; +import org.hypertrace.graphql.metric.request.MetricRequest; +import org.hypertrace.graphql.metric.request.MetricRequestBuilder; import org.hypertrace.graphql.metric.schema.MetricContainer; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -64,11 +66,13 @@ class DefaultEntityJoinerBuilderTest { @Mock GraphQlSelectionFinder mockSelectionFinder; @Mock ArgumentDeserializer mockDeserializer; @Mock ResultSetRequestBuilder mockResultSetRequestBuilder; + @Mock MetricRequestBuilder mockMetricRequestBuilder; @Mock FilterRequestBuilder mockFilterRequestBuilder; @Mock GraphQlRequestContext mockRequestContext; @Mock DataFetchingFieldSelectionSet mockSelectionSet; @Mock AttributeAssociation mockFilter; @Mock ResultSetRequest mockResultSetRequest; + @Mock List mockMetricRequests; @Mock EntityLabelRequestBuilder mockEntityLabelRequestBuilder; Scheduler testScheduler = Schedulers.single(); @@ -83,6 +87,7 @@ void beforeEach() { mockSelectionFinder, mockDeserializer, mockResultSetRequestBuilder, + mockMetricRequestBuilder, mockFilterRequestBuilder, testScheduler, mockEntityLabelRequestBuilder); @@ -278,6 +283,9 @@ private void mockRequestBuilding() { any(Stream.class), eq(Optional.empty()))) .thenReturn(Single.just(mockResultSetRequest)); + when(mockMetricRequestBuilder.build( + eq(mockRequestContext), any(String.class), any(Stream.class))) + .thenReturn(Single.just(mockMetricRequests)); } private void mockResult(Map> resultsByEntityType) {