From f370fb59e38d5612dbefea3232e6a63cc0f9ca09 Mon Sep 17 00:00:00 2001 From: aman-bansal Date: Thu, 10 Nov 2022 08:47:03 +0530 Subject: [PATCH 1/9] chore | adding the support of edge filters in edges --- .../entity/dao/GatewayServiceEntityConverter.java | 10 ++++++++-- .../org/hypertrace/graphql/entity/schema/Entity.java | 8 ++++++-- .../entity/joiner/DefaultEntityJoinerBuilderTest.java | 6 ++++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityConverter.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityConverter.java index c8b5d183..81e18ee3 100644 --- a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityConverter.java +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityConverter.java @@ -16,6 +16,7 @@ import lombok.experimental.Accessors; import org.hypertrace.core.graphql.common.request.AttributeRequest; import org.hypertrace.core.graphql.common.schema.attributes.arguments.AttributeExpression; +import org.hypertrace.core.graphql.common.schema.results.arguments.filter.FilterArgument; import org.hypertrace.core.graphql.common.utils.BiConverter; import org.hypertrace.core.graphql.common.utils.TriConverter; import org.hypertrace.gateway.service.v1.baseline.BaselineEntitiesResponse; @@ -33,6 +34,7 @@ import org.hypertrace.graphql.metric.schema.MetricContainer; class GatewayServiceEntityConverter { + private final BiConverter< Collection, Map, Map> attributeMapConverter; @@ -143,6 +145,7 @@ private Single convertEntity( @lombok.Value @Accessors(fluent = true) private static class ConvertedEntity implements Entity { + String id; String type; Map attributeValues; @@ -161,13 +164,15 @@ public MetricContainer metric(AttributeExpression attributeExpression) { } @Override - public EdgeResultSet incomingEdges(EntityType neighborType, String neighborScope) { + public EdgeResultSet incomingEdges( + EntityType neighborType, String neighborScope, List filterBy) { return this.incomingEdges.getOrDefault( this.resolveEntityScope(neighborType, neighborScope), EMPTY_EDGE_RESULT_SET); } @Override - public EdgeResultSet outgoingEdges(EntityType neighborType, String neighborScope) { + public EdgeResultSet outgoingEdges( + EntityType neighborType, String neighborScope, List filterBy) { return this.outgoingEdges.getOrDefault( this.resolveEntityScope(neighborType, neighborScope), EMPTY_EDGE_RESULT_SET); @@ -188,6 +193,7 @@ private String resolveEntityScope( @lombok.Value @Accessors(fluent = true) private static class ConvertedEntityResultSet implements EntityResultSet { + List results; long total; long count; diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/schema/Entity.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/schema/Entity.java index cc381887..66492cd1 100644 --- a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/schema/Entity.java +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/schema/Entity.java @@ -3,8 +3,10 @@ import graphql.annotations.annotationTypes.GraphQLField; import graphql.annotations.annotationTypes.GraphQLName; import graphql.annotations.annotationTypes.GraphQLNonNull; +import java.util.List; import org.hypertrace.core.graphql.common.schema.attributes.AttributeQueryable; import org.hypertrace.core.graphql.common.schema.id.Identifiable; +import org.hypertrace.core.graphql.common.schema.results.arguments.filter.FilterArgument; import org.hypertrace.core.graphql.common.schema.type.Typed; import org.hypertrace.graphql.entity.schema.argument.NeighborEntityScopeArgument; import org.hypertrace.graphql.entity.schema.argument.NeighborEntityTypeArgument; @@ -29,14 +31,16 @@ public interface Entity extends AttributeQueryable, MetricQueryable, Identifiabl @GraphQLName(ENTITY_INCOMING_EDGES_KEY) EdgeResultSet incomingEdges( @GraphQLName(NeighborEntityTypeArgument.ARGUMENT_NAME) EntityType neighborType, - @GraphQLName(NeighborEntityScopeArgument.ARGUMENT_NAME) String neighborScope); + @GraphQLName(NeighborEntityScopeArgument.ARGUMENT_NAME) String neighborScope, + @GraphQLName(FilterArgument.ARGUMENT_NAME) List filterBy); @GraphQLField @GraphQLNonNull @GraphQLName(ENTITY_OUTGOING_EDGES_KEY) EdgeResultSet outgoingEdges( @GraphQLName(NeighborEntityTypeArgument.ARGUMENT_NAME) EntityType neighborType, - @GraphQLName(NeighborEntityScopeArgument.ARGUMENT_NAME) String neighborScope); + @GraphQLName(NeighborEntityScopeArgument.ARGUMENT_NAME) String neighborScope, + @GraphQLName(FilterArgument.ARGUMENT_NAME) List filterBy); @GraphQLField @GraphQLNonNull 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 9c359a7b..e5dcadeb 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 @@ -342,12 +342,14 @@ public Object attribute(AttributeExpression attributeExpression) { } @Override - public EdgeResultSet incomingEdges(EntityType neighborType, String neighborScope) { + public EdgeResultSet incomingEdges( + EntityType neighborType, String neighborScope, List filterBy) { return null; } @Override - public EdgeResultSet outgoingEdges(EntityType neighborType, String neighborScope) { + public EdgeResultSet outgoingEdges( + EntityType neighborType, String neighborScope, List filterBy) { return null; } From e99f6b686aa134ac48f58bf82ed715d104aa35f1 Mon Sep 17 00:00:00 2001 From: aman-bansal Date: Mon, 14 Nov 2022 16:06:46 +0530 Subject: [PATCH 2/9] starting to implement gql query --- .../entity/dao/GatewayServiceEntityDao.java | 8 +++- ...erviceEntityInteractionRequestBuilder.java | 8 +++- .../joiner/DefaultEntityJoinerBuilder.java | 1 + .../entity/request/EdgeRequestBuilder.java | 46 ++++++++++++++++--- .../entity/request/EdgeSetGroupRequest.java | 4 ++ .../DefaultEntityAndRuleJoinerBuilder.java | 1 + 6 files changed, 59 insertions(+), 9 deletions(-) diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityDao.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityDao.java index 9211674e..5e1866c8 100644 --- a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityDao.java +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityDao.java @@ -30,11 +30,13 @@ import org.hypertrace.graphql.label.joiner.LabelJoiner; import org.hypertrace.graphql.label.joiner.LabelJoinerBuilder; import org.hypertrace.graphql.label.schema.LabelResultSet; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Slf4j @Singleton class GatewayServiceEntityDao implements EntityDao { - + private static final Logger LOGGER = LoggerFactory.getLogger(GatewayServiceEntityDao.class); private final GatewayServiceFutureStub gatewayServiceStub; private final GrpcContextBuilder grpcContextBuilder; private final GatewayServiceEntityRequestBuilder requestBuilder; @@ -73,6 +75,9 @@ class GatewayServiceEntityDao implements EntityDao { @Override public Single getEntities(EntityRequest request) { GraphQlRequestContext context = request.resultSetRequest().context(); + Single entitiesRequestSingle = this.requestBuilder.buildRequest(request); + LOGGER.info( + "get entities request from context is as follows {}", entitiesRequestSingle.blockingGet()); return this.requestBuilder .buildRequest(request) .subscribeOn(this.boundedIoScheduler) @@ -81,6 +86,7 @@ public Single getEntities(EntityRequest request) { private Single fetchAndMapEntities( GraphQlRequestContext context, EntityRequest request, EntitiesRequest serverRequest) { + LOGGER.info("get entities request is as follows {}", serverRequest); return this.makeEntityRequest(context, serverRequest) .flatMap(serverResponse -> this.getEntityResultSet(request, serverRequest, serverResponse)); } diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityInteractionRequestBuilder.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityInteractionRequestBuilder.java index 777344b4..1b56e8c6 100644 --- a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityInteractionRequestBuilder.java +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityInteractionRequestBuilder.java @@ -7,6 +7,7 @@ import java.util.Collection; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.inject.Inject; import lombok.Value; import lombok.experimental.Accessors; @@ -66,6 +67,7 @@ private Single> collectSelectionsAndAggregations(EdgeSetGroupReq .collect(Collectors.toUnmodifiableSet()); } + // todo (aman) fix the name private Single buildEntityTypeFilter(EdgeSetGroupRequest request) { return Observable.fromIterable(request.entityTypes()) .collect(Collectors.toUnmodifiableSet()) @@ -76,7 +78,11 @@ private Single buildEntityTypeFilter(EdgeSetGroupRequest request) { new EntityNeighborTypeFilter( request.neighborTypeAttribute().attributeExpressionAssociation().value(), entityTypes))) - .flatMap(filterAssociation -> this.filterConverter.convert(Set.of(filterAssociation))); + .flatMap( + filterAssociation -> + this.filterConverter.convert( + Stream.concat(request.filterArguments().stream(), Stream.of(filterAssociation)) + .collect(Collectors.toSet()))); } @Value 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 08fde849..0a5a2daf 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 @@ -320,6 +320,7 @@ private static class EmptyEdgeSetGroupRequest implements EdgeSetGroupRequest { Set entityTypes = Collections.emptySet(); Collection attributeRequests = Collections.emptyList(); Collection metricAggregationRequests = Collections.emptyList(); + Collection> filterArguments = Collections.emptyList(); AttributeRequest neighborIdAttribute = null; AttributeRequest neighborTypeAttribute = null; diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java index 4cad1968..e9263bbb 100644 --- a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java @@ -4,6 +4,7 @@ import graphql.schema.SelectedField; import io.reactivex.rxjava3.core.Single; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; @@ -16,11 +17,14 @@ import javax.inject.Provider; import lombok.Value; import lombok.experimental.Accessors; +import org.hypertrace.core.graphql.common.request.AttributeAssociation; import org.hypertrace.core.graphql.common.request.AttributeRequest; import org.hypertrace.core.graphql.common.request.AttributeRequestBuilder; +import org.hypertrace.core.graphql.common.request.FilterRequestBuilder; import org.hypertrace.core.graphql.common.schema.arguments.TimeRangeArgument; import org.hypertrace.core.graphql.common.schema.attributes.arguments.AttributeExpression; import org.hypertrace.core.graphql.common.schema.results.ResultSet; +import org.hypertrace.core.graphql.common.schema.results.arguments.filter.FilterArgument; import org.hypertrace.core.graphql.context.GraphQlRequestContext; import org.hypertrace.core.graphql.deserialization.ArgumentDeserializer; import org.hypertrace.core.graphql.utils.schema.GraphQlSelectionFinder; @@ -31,8 +35,13 @@ import org.hypertrace.graphql.entity.schema.argument.NeighborEntityTypeArgument; import org.hypertrace.graphql.metric.request.MetricAggregationRequest; import org.hypertrace.graphql.metric.request.MetricAggregationRequestBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; class EdgeRequestBuilder { + + public static final Logger LOGGER = LoggerFactory.getLogger(EdgeRequestBuilder.class); + private final String INCOMING_ENTITY_ID_KEY = "fromEntityId"; private final String INCOMING_ENTITY_TYPE_KEY = "fromEntityType"; private final String OUTGOING_ENTITY_ID_KEY = "toEntityId"; @@ -40,6 +49,7 @@ class EdgeRequestBuilder { private final ArgumentDeserializer argumentDeserializer; private final GraphQlSelectionFinder selectionFinder; private final MetricAggregationRequestBuilder metricAggregationRequestBuilder; + private final FilterRequestBuilder filterRequestBuilder; private final AttributeRequestBuilder attributeRequestBuilder; // Use provider to avoid cycle private final Provider neighborEntitiesRequestBuilderProvider; @@ -49,6 +59,7 @@ class EdgeRequestBuilder { ArgumentDeserializer argumentDeserializer, GraphQlSelectionFinder selectionFinder, MetricAggregationRequestBuilder metricAggregationRequestBuilder, + FilterRequestBuilder filterRequestBuilder, AttributeRequestBuilder attributeRequestBuilder, Provider neighborEntitiesRequestBuilderProvider) { this.argumentDeserializer = argumentDeserializer; @@ -56,6 +67,7 @@ class EdgeRequestBuilder { this.metricAggregationRequestBuilder = metricAggregationRequestBuilder; this.attributeRequestBuilder = attributeRequestBuilder; this.neighborEntitiesRequestBuilderProvider = neighborEntitiesRequestBuilderProvider; + this.filterRequestBuilder = filterRequestBuilder; } Single buildIncomingEdgeRequest( @@ -63,8 +75,7 @@ Single buildIncomingEdgeRequest( TimeRangeArgument timeRange, Optional space, Stream edgeSetFields) { - return this.buildEdgeRequest( - context, timeRange, space, this.getEdgesByType(edgeSetFields), EdgeType.INCOMING); + return this.buildEdgeRequest(context, timeRange, space, edgeSetFields, EdgeType.INCOMING); } Single buildOutgoingEdgeRequest( @@ -72,17 +83,20 @@ Single buildOutgoingEdgeRequest( TimeRangeArgument timeRange, Optional space, Stream edgeSetFields) { - return this.buildEdgeRequest( - context, timeRange, space, this.getEdgesByType(edgeSetFields), EdgeType.OUTGOING); + return this.buildEdgeRequest(context, timeRange, space, edgeSetFields, EdgeType.OUTGOING); } private Single buildEdgeRequest( GraphQlRequestContext context, TimeRangeArgument timeRange, Optional space, - Map> edgesByType, + Stream edgeSetFields, EdgeType edgeType) { + Set edgeFields = edgeSetFields.collect(Collectors.toSet()); + List filterArguments = this.getFilters(edgeFields); + + Map> edgesByType = this.getEdgesByType(edgeFields.stream()); Set allEdges = edgesByType.values().stream() .flatMap(Collection::stream) @@ -94,7 +108,9 @@ private Single buildEdgeRequest( this.getNeighborTypeAttribute(context, edgeType), this.metricAggregationRequestBuilder.build( context, HypertraceAttributeScopeString.INTERACTION, allEdges.stream()), - (attributeRequests, neighborIdRequest, neighborTypeRequest, metricRequests) -> + this.filterRequestBuilder.build( + context, HypertraceAttributeScopeString.INTERACTION, filterArguments), + (attributeRequests, neighborIdRequest, neighborTypeRequest, metricRequests, filters) -> new DefaultEdgeSetGroupRequest( edgesByType.keySet(), attributeRequests, @@ -110,7 +126,8 @@ private Single buildEdgeRequest( timeRange, space, neighborIds, - edgesByType.get(entityType)))); + edgesByType.get(entityType)), + filters)); } private Map> getEdgesByType(Stream edgeSetStream) { @@ -165,6 +182,19 @@ private Single getNeighborIdAttribute( } } + // todo aman check this + private List getFilters(Set selectedFields) { + return selectedFields.stream() + .map( + selectedField -> { + return this.argumentDeserializer.deserializeObjectList( + selectedField.getArguments(), FilterArgument.class); + }) + .flatMap(arguments -> Stream.of(arguments.orElse(new ArrayList<>()))) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + } + private Single getNeighborTypeAttribute( GraphQlRequestContext context, EdgeType edgeType) { switch (edgeType) { @@ -191,12 +221,14 @@ private enum EdgeType { @Value @Accessors(fluent = true) private static class DefaultEdgeSetGroupRequest implements EdgeSetGroupRequest { + Set entityTypes; Collection attributeRequests; Collection metricAggregationRequests; AttributeRequest neighborIdAttribute; AttributeRequest neighborTypeAttribute; BiFunction, Single> neighborRequestBuilder; + Collection> filterArguments; @Override public Single buildNeighborRequest( diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeSetGroupRequest.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeSetGroupRequest.java index fc7d6bef..c6859008 100644 --- a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeSetGroupRequest.java +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeSetGroupRequest.java @@ -3,7 +3,9 @@ import io.reactivex.rxjava3.core.Single; import java.util.Collection; import java.util.Set; +import org.hypertrace.core.graphql.common.request.AttributeAssociation; import org.hypertrace.core.graphql.common.request.AttributeRequest; +import org.hypertrace.core.graphql.common.schema.results.arguments.filter.FilterArgument; import org.hypertrace.graphql.metric.request.MetricAggregationRequest; public interface EdgeSetGroupRequest { @@ -20,4 +22,6 @@ public interface EdgeSetGroupRequest { AttributeRequest neighborTypeAttribute(); Single buildNeighborRequest(String entityType, Collection neighborIds); + + Collection> filterArguments(); } diff --git a/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/joiner/DefaultEntityAndRuleJoinerBuilder.java b/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/joiner/DefaultEntityAndRuleJoinerBuilder.java index b2fbdddd..a15737a6 100644 --- a/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/joiner/DefaultEntityAndRuleJoinerBuilder.java +++ b/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/joiner/DefaultEntityAndRuleJoinerBuilder.java @@ -319,6 +319,7 @@ private static class EmptyEdgeSetGroupRequest implements EdgeSetGroupRequest { Set entityTypes = Collections.emptySet(); Collection attributeRequests = Collections.emptyList(); Collection metricAggregationRequests = Collections.emptyList(); + Collection> filterArguments = Collections.emptyList(); AttributeRequest neighborIdAttribute = null; AttributeRequest neighborTypeAttribute = null; From 75f62472d700332575f0571123f921527c7080ce Mon Sep 17 00:00:00 2001 From: aman-bansal Date: Tue, 15 Nov 2022 12:58:19 +0530 Subject: [PATCH 3/9] renaming things --- .../graphql/entity/dao/GatewayServiceEntityDao.java | 8 +------- ...tewayServiceEntityInteractionRequestBuilder.java | 12 +++++++----- .../graphql/entity/request/EdgeRequestBuilder.java | 13 +++---------- 3 files changed, 11 insertions(+), 22 deletions(-) diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityDao.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityDao.java index 5e1866c8..9211674e 100644 --- a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityDao.java +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityDao.java @@ -30,13 +30,11 @@ import org.hypertrace.graphql.label.joiner.LabelJoiner; import org.hypertrace.graphql.label.joiner.LabelJoinerBuilder; import org.hypertrace.graphql.label.schema.LabelResultSet; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; @Slf4j @Singleton class GatewayServiceEntityDao implements EntityDao { - private static final Logger LOGGER = LoggerFactory.getLogger(GatewayServiceEntityDao.class); + private final GatewayServiceFutureStub gatewayServiceStub; private final GrpcContextBuilder grpcContextBuilder; private final GatewayServiceEntityRequestBuilder requestBuilder; @@ -75,9 +73,6 @@ class GatewayServiceEntityDao implements EntityDao { @Override public Single getEntities(EntityRequest request) { GraphQlRequestContext context = request.resultSetRequest().context(); - Single entitiesRequestSingle = this.requestBuilder.buildRequest(request); - LOGGER.info( - "get entities request from context is as follows {}", entitiesRequestSingle.blockingGet()); return this.requestBuilder .buildRequest(request) .subscribeOn(this.boundedIoScheduler) @@ -86,7 +81,6 @@ public Single getEntities(EntityRequest request) { private Single fetchAndMapEntities( GraphQlRequestContext context, EntityRequest request, EntitiesRequest serverRequest) { - LOGGER.info("get entities request is as follows {}", serverRequest); return this.makeEntityRequest(context, serverRequest) .flatMap(serverResponse -> this.getEntityResultSet(request, serverRequest, serverResponse)); } diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityInteractionRequestBuilder.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityInteractionRequestBuilder.java index 1b56e8c6..330b2bb2 100644 --- a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityInteractionRequestBuilder.java +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityInteractionRequestBuilder.java @@ -26,6 +26,7 @@ import org.hypertrace.graphql.metric.request.MetricAggregationRequest; class GatewayServiceEntityInteractionRequestBuilder { + private static final Integer DEFAULT_INTERACTION_LIMIT = 1000; private final Converter, Set> selectionConverter; private final Converter, Set> @@ -49,7 +50,7 @@ Single build(EdgeSetGroupRequest edgeSetRequestGroup) { return zip( this.collectSelectionsAndAggregations(edgeSetRequestGroup), - this.buildEntityTypeFilter(edgeSetRequestGroup), + this.buildEntityInteractionFilter(edgeSetRequestGroup), (selections, filter) -> InteractionsRequest.newBuilder() .addAllSelection(selections) @@ -67,9 +68,8 @@ private Single> collectSelectionsAndAggregations(EdgeSetGroupReq .collect(Collectors.toUnmodifiableSet()); } - // todo (aman) fix the name - private Single buildEntityTypeFilter(EdgeSetGroupRequest request) { - return Observable.fromIterable(request.entityTypes()) + private Single buildEntityInteractionFilter(EdgeSetGroupRequest request) { + return Observable.fromIterable(request.entityTypes()) // add entity types filter .collect(Collectors.toUnmodifiableSet()) .map( entityTypes -> @@ -81,7 +81,9 @@ private Single buildEntityTypeFilter(EdgeSetGroupRequest request) { .flatMap( filterAssociation -> this.filterConverter.convert( - Stream.concat(request.filterArguments().stream(), Stream.of(filterAssociation)) + Stream.concat( + request.filterArguments().stream(), + Stream.of(filterAssociation)) // add all other filters .collect(Collectors.toSet()))); } diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java index e9263bbb..6bbce3d8 100644 --- a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java @@ -35,13 +35,8 @@ import org.hypertrace.graphql.entity.schema.argument.NeighborEntityTypeArgument; import org.hypertrace.graphql.metric.request.MetricAggregationRequest; import org.hypertrace.graphql.metric.request.MetricAggregationRequestBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; class EdgeRequestBuilder { - - public static final Logger LOGGER = LoggerFactory.getLogger(EdgeRequestBuilder.class); - private final String INCOMING_ENTITY_ID_KEY = "fromEntityId"; private final String INCOMING_ENTITY_TYPE_KEY = "fromEntityType"; private final String OUTGOING_ENTITY_ID_KEY = "toEntityId"; @@ -182,14 +177,12 @@ private Single getNeighborIdAttribute( } } - // todo aman check this private List getFilters(Set selectedFields) { return selectedFields.stream() .map( - selectedField -> { - return this.argumentDeserializer.deserializeObjectList( - selectedField.getArguments(), FilterArgument.class); - }) + selectedField -> + this.argumentDeserializer.deserializeObjectList( + selectedField.getArguments(), FilterArgument.class)) .flatMap(arguments -> Stream.of(arguments.orElse(new ArrayList<>()))) .flatMap(Collection::stream) .collect(Collectors.toList()); From e0d1fe0252446880179565cc7fc8629ba68d0778 Mon Sep 17 00:00:00 2001 From: aman-bansal Date: Thu, 17 Nov 2022 11:23:09 +0530 Subject: [PATCH 4/9] adding the custom data fetcher --- .../entity/dao/IncomingEdgesDataFetcher.java | 54 +++++++++++++++++++ .../entity/dao/OutgoingEdgesDataFetcher.java | 54 +++++++++++++++++++ .../graphql/entity/schema/Entity.java | 5 ++ 3 files changed, 113 insertions(+) create mode 100644 hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/IncomingEdgesDataFetcher.java create mode 100644 hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/OutgoingEdgesDataFetcher.java diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/IncomingEdgesDataFetcher.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/IncomingEdgesDataFetcher.java new file mode 100644 index 00000000..e94b16f6 --- /dev/null +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/IncomingEdgesDataFetcher.java @@ -0,0 +1,54 @@ +package org.hypertrace.graphql.entity.dao; + +import graphql.schema.DataFetcher; +import graphql.schema.DataFetchingEnvironment; +import java.util.Collections; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import javax.inject.Inject; +import org.hypertrace.core.graphql.common.fetcher.InjectableDataFetcher; +import org.hypertrace.core.graphql.deserialization.ArgumentDeserializer; +import org.hypertrace.graphql.entity.schema.EdgeResultSet; +import org.hypertrace.graphql.entity.schema.Entity; +import org.hypertrace.graphql.entity.schema.EntityType; +import org.hypertrace.graphql.entity.schema.argument.NeighborEntityScopeArgument; +import org.hypertrace.graphql.entity.schema.argument.NeighborEntityTypeArgument; + +public class IncomingEdgesDataFetcher extends InjectableDataFetcher { + public IncomingEdgesDataFetcher() { + super(IncomingEdgesDataFetcherImpl.class); + } + + private static class IncomingEdgesDataFetcherImpl + implements DataFetcher> { + + private final ArgumentDeserializer argumentDeserializer; + + @Inject + IncomingEdgesDataFetcherImpl(ArgumentDeserializer argumentDeserializer) { + this.argumentDeserializer = argumentDeserializer; + } + + @Override + public CompletableFuture get(DataFetchingEnvironment environment) { + return CompletableFuture.completedFuture( + environment + .getSource() + .incomingEdges( + getNeighbourEntityType(environment.getArguments()).orElse(null), + getNeighbourEntityScope(environment.getArguments()).orElse(null), + Collections.emptyList())); + } + + private Optional getNeighbourEntityScope(Map arguments) { + return this.argumentDeserializer + .deserializePrimitive(arguments, NeighborEntityScopeArgument.class); + } + + private Optional getNeighbourEntityType(Map arguments) { + return this.argumentDeserializer + .deserializePrimitive(arguments, NeighborEntityTypeArgument.class); + } + } +} diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/OutgoingEdgesDataFetcher.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/OutgoingEdgesDataFetcher.java new file mode 100644 index 00000000..96e48423 --- /dev/null +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/OutgoingEdgesDataFetcher.java @@ -0,0 +1,54 @@ +package org.hypertrace.graphql.entity.dao; + +import graphql.schema.DataFetcher; +import graphql.schema.DataFetchingEnvironment; +import java.util.Collections; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import javax.inject.Inject; +import org.hypertrace.core.graphql.common.fetcher.InjectableDataFetcher; +import org.hypertrace.core.graphql.deserialization.ArgumentDeserializer; +import org.hypertrace.graphql.entity.schema.EdgeResultSet; +import org.hypertrace.graphql.entity.schema.Entity; +import org.hypertrace.graphql.entity.schema.EntityType; +import org.hypertrace.graphql.entity.schema.argument.NeighborEntityScopeArgument; +import org.hypertrace.graphql.entity.schema.argument.NeighborEntityTypeArgument; + +public class OutgoingEdgesDataFetcher extends InjectableDataFetcher { + public OutgoingEdgesDataFetcher() { + super(OutgoingEdgesDataFetcherImpl.class); + } + + private static class OutgoingEdgesDataFetcherImpl + implements DataFetcher> { + + private final ArgumentDeserializer argumentDeserializer; + + @Inject + OutgoingEdgesDataFetcherImpl(ArgumentDeserializer argumentDeserializer) { + this.argumentDeserializer = argumentDeserializer; + } + + @Override + public CompletableFuture get(DataFetchingEnvironment environment) { + return CompletableFuture.completedFuture( + environment + .getSource() + .outgoingEdges( + getNeighbourEntityType(environment.getArguments()).orElse(null), + getNeighbourEntityScope(environment.getArguments()).orElse(null), + Collections.emptyList())); + } + + private Optional getNeighbourEntityScope(Map arguments) { + return this.argumentDeserializer + .deserializePrimitive(arguments, NeighborEntityScopeArgument.class); + } + + private Optional getNeighbourEntityType(Map arguments) { + return this.argumentDeserializer + .deserializePrimitive(arguments, NeighborEntityTypeArgument.class); + } + } +} diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/schema/Entity.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/schema/Entity.java index 66492cd1..8d9c8696 100644 --- a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/schema/Entity.java +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/schema/Entity.java @@ -1,5 +1,6 @@ package org.hypertrace.graphql.entity.schema; +import graphql.annotations.annotationTypes.GraphQLDataFetcher; import graphql.annotations.annotationTypes.GraphQLField; import graphql.annotations.annotationTypes.GraphQLName; import graphql.annotations.annotationTypes.GraphQLNonNull; @@ -8,6 +9,8 @@ import org.hypertrace.core.graphql.common.schema.id.Identifiable; import org.hypertrace.core.graphql.common.schema.results.arguments.filter.FilterArgument; import org.hypertrace.core.graphql.common.schema.type.Typed; +import org.hypertrace.graphql.entity.dao.IncomingEdgesDataFetcher; +import org.hypertrace.graphql.entity.dao.OutgoingEdgesDataFetcher; import org.hypertrace.graphql.entity.schema.argument.NeighborEntityScopeArgument; import org.hypertrace.graphql.entity.schema.argument.NeighborEntityTypeArgument; import org.hypertrace.graphql.label.schema.LabelResultSet; @@ -29,6 +32,7 @@ public interface Entity extends AttributeQueryable, MetricQueryable, Identifiabl @GraphQLField @GraphQLNonNull @GraphQLName(ENTITY_INCOMING_EDGES_KEY) + @GraphQLDataFetcher(IncomingEdgesDataFetcher.class) EdgeResultSet incomingEdges( @GraphQLName(NeighborEntityTypeArgument.ARGUMENT_NAME) EntityType neighborType, @GraphQLName(NeighborEntityScopeArgument.ARGUMENT_NAME) String neighborScope, @@ -37,6 +41,7 @@ EdgeResultSet incomingEdges( @GraphQLField @GraphQLNonNull @GraphQLName(ENTITY_OUTGOING_EDGES_KEY) + @GraphQLDataFetcher(OutgoingEdgesDataFetcher.class) EdgeResultSet outgoingEdges( @GraphQLName(NeighborEntityTypeArgument.ARGUMENT_NAME) EntityType neighborType, @GraphQLName(NeighborEntityScopeArgument.ARGUMENT_NAME) String neighborScope, From 1ccc1f03ca2b8f5ecba70d4b431e7590953acca3 Mon Sep 17 00:00:00 2001 From: aman-bansal Date: Thu, 17 Nov 2022 11:27:04 +0530 Subject: [PATCH 5/9] refactor a bit --- .../dao/GatewayServiceEntityInteractionRequestBuilder.java | 6 +++--- .../graphql/entity/request/EdgeRequestBuilder.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityInteractionRequestBuilder.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityInteractionRequestBuilder.java index 330b2bb2..d44cf876 100644 --- a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityInteractionRequestBuilder.java +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/GatewayServiceEntityInteractionRequestBuilder.java @@ -82,9 +82,9 @@ private Single buildEntityInteractionFilter(EdgeSetGroupRequest request) filterAssociation -> this.filterConverter.convert( Stream.concat( - request.filterArguments().stream(), - Stream.of(filterAssociation)) // add all other filters - .collect(Collectors.toSet()))); + request.filterArguments().stream(), // add all other filters + Stream.of(filterAssociation)) + .collect(Collectors.toUnmodifiableSet()))); } @Value diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java index 6bbce3d8..5545987d 100644 --- a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java @@ -88,7 +88,7 @@ private Single buildEdgeRequest( Stream edgeSetFields, EdgeType edgeType) { - Set edgeFields = edgeSetFields.collect(Collectors.toSet()); + Set edgeFields = edgeSetFields.collect(Collectors.toUnmodifiableSet()); List filterArguments = this.getFilters(edgeFields); Map> edgesByType = this.getEdgesByType(edgeFields.stream()); @@ -183,9 +183,9 @@ private List getFilters(Set selectedFields) { selectedField -> this.argumentDeserializer.deserializeObjectList( selectedField.getArguments(), FilterArgument.class)) - .flatMap(arguments -> Stream.of(arguments.orElse(new ArrayList<>()))) + .flatMap(Optional::stream) .flatMap(Collection::stream) - .collect(Collectors.toList()); + .collect(Collectors.toUnmodifiableList()); } private Single getNeighborTypeAttribute( From 97f48496116b831b35ea66f1d36a44dadbd92747 Mon Sep 17 00:00:00 2001 From: aman-bansal Date: Thu, 17 Nov 2022 11:49:53 +0530 Subject: [PATCH 6/9] erroring out --- .../graphql/entity/dao/IncomingEdgesDataFetcher.java | 8 ++++---- .../graphql/entity/dao/OutgoingEdgesDataFetcher.java | 8 ++++---- .../graphql/entity/request/EdgeRequestBuilder.java | 9 +++++++-- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/IncomingEdgesDataFetcher.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/IncomingEdgesDataFetcher.java index e94b16f6..858aef96 100644 --- a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/IncomingEdgesDataFetcher.java +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/IncomingEdgesDataFetcher.java @@ -42,13 +42,13 @@ public CompletableFuture get(DataFetchingEnvironment environment) } private Optional getNeighbourEntityScope(Map arguments) { - return this.argumentDeserializer - .deserializePrimitive(arguments, NeighborEntityScopeArgument.class); + return this.argumentDeserializer.deserializePrimitive( + arguments, NeighborEntityScopeArgument.class); } private Optional getNeighbourEntityType(Map arguments) { - return this.argumentDeserializer - .deserializePrimitive(arguments, NeighborEntityTypeArgument.class); + return this.argumentDeserializer.deserializePrimitive( + arguments, NeighborEntityTypeArgument.class); } } } diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/OutgoingEdgesDataFetcher.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/OutgoingEdgesDataFetcher.java index 96e48423..fa4d3fdb 100644 --- a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/OutgoingEdgesDataFetcher.java +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/OutgoingEdgesDataFetcher.java @@ -42,13 +42,13 @@ public CompletableFuture get(DataFetchingEnvironment environment) } private Optional getNeighbourEntityScope(Map arguments) { - return this.argumentDeserializer - .deserializePrimitive(arguments, NeighborEntityScopeArgument.class); + return this.argumentDeserializer.deserializePrimitive( + arguments, NeighborEntityScopeArgument.class); } private Optional getNeighbourEntityType(Map arguments) { - return this.argumentDeserializer - .deserializePrimitive(arguments, NeighborEntityTypeArgument.class); + return this.argumentDeserializer.deserializePrimitive( + arguments, NeighborEntityTypeArgument.class); } } } diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java index 5545987d..21d83303 100644 --- a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java @@ -3,8 +3,8 @@ import static io.reactivex.rxjava3.core.Single.zip; import graphql.schema.SelectedField; +import io.grpc.Status; import io.reactivex.rxjava3.core.Single; -import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; @@ -37,6 +37,7 @@ import org.hypertrace.graphql.metric.request.MetricAggregationRequestBuilder; class EdgeRequestBuilder { + private final String INCOMING_ENTITY_ID_KEY = "fromEntityId"; private final String INCOMING_ENTITY_TYPE_KEY = "fromEntityType"; private final String OUTGOING_ENTITY_ID_KEY = "toEntityId"; @@ -87,10 +88,14 @@ private Single buildEdgeRequest( Optional space, Stream edgeSetFields, EdgeType edgeType) { - Set edgeFields = edgeSetFields.collect(Collectors.toUnmodifiableSet()); List filterArguments = this.getFilters(edgeFields); + if (!filterArguments.isEmpty() && edgeFields.size() > 1) { + throw Status.UNIMPLEMENTED.withDescription( + "Cannot specify more than one edge if using edge filter arguments").asRuntimeException(); + } + Map> edgesByType = this.getEdgesByType(edgeFields.stream()); Set allEdges = edgesByType.values().stream() From 16511fdaa691be80472cfc768ab8fa9d0891c416 Mon Sep 17 00:00:00 2001 From: aman-bansal Date: Thu, 17 Nov 2022 12:04:42 +0530 Subject: [PATCH 7/9] making it pretty --- .../graphql/entity/request/EdgeRequestBuilder.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java index 21d83303..435504cf 100644 --- a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java @@ -92,8 +92,9 @@ private Single buildEdgeRequest( List filterArguments = this.getFilters(edgeFields); if (!filterArguments.isEmpty() && edgeFields.size() > 1) { - throw Status.UNIMPLEMENTED.withDescription( - "Cannot specify more than one edge if using edge filter arguments").asRuntimeException(); + throw Status.UNIMPLEMENTED + .withDescription("Cannot specify more than one edge if using edge filter arguments") + .asRuntimeException(); } Map> edgesByType = this.getEdgesByType(edgeFields.stream()); From e2dee5238fd1207f98c3c37327349058ecddf32d Mon Sep 17 00:00:00 2001 From: aman-bansal Date: Fri, 18 Nov 2022 09:38:46 +0530 Subject: [PATCH 8/9] refactor --- .../entity/dao/EdgesDataFetcherImpl.java | 48 +++++++++++++++++++ .../entity/dao/IncomingEdgesDataFetcher.java | 41 ++++------------ .../entity/dao/OutgoingEdgesDataFetcher.java | 42 +++++----------- .../entity/request/EdgeRequestBuilder.java | 2 +- 4 files changed, 70 insertions(+), 63 deletions(-) create mode 100644 hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/EdgesDataFetcherImpl.java diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/EdgesDataFetcherImpl.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/EdgesDataFetcherImpl.java new file mode 100644 index 00000000..2205f17d --- /dev/null +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/EdgesDataFetcherImpl.java @@ -0,0 +1,48 @@ +package org.hypertrace.graphql.entity.dao; + +import graphql.schema.DataFetcher; +import graphql.schema.DataFetchingEnvironment; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import org.hypertrace.core.graphql.common.schema.results.arguments.filter.FilterArgument; +import org.hypertrace.core.graphql.deserialization.ArgumentDeserializer; +import org.hypertrace.graphql.entity.schema.EdgeResultSet; +import org.hypertrace.graphql.entity.schema.Entity; +import org.hypertrace.graphql.entity.schema.EntityType; +import org.hypertrace.graphql.entity.schema.argument.NeighborEntityScopeArgument; +import org.hypertrace.graphql.entity.schema.argument.NeighborEntityTypeArgument; + +abstract class EdgesDataFetcherImpl implements DataFetcher> { + + private final ArgumentDeserializer argumentDeserializer; + + protected abstract EdgeResultSet getEdges( + Entity entity, EntityType neighborType, String neighborScope, List filterBy); + + EdgesDataFetcherImpl(ArgumentDeserializer argumentDeserializer) { + this.argumentDeserializer = argumentDeserializer; + } + + @Override + public CompletableFuture get(DataFetchingEnvironment environment) { + return CompletableFuture.completedFuture( + getEdges( + environment.getSource(), + getNeighborEntityType(environment.getArguments()).orElse(null), + getNeighborEntityScope(environment.getArguments()).orElse(null), + Collections.emptyList())); + } + + private Optional getNeighborEntityScope(Map arguments) { + return this.argumentDeserializer.deserializePrimitive( + arguments, NeighborEntityScopeArgument.class); + } + + private Optional getNeighborEntityType(Map arguments) { + return this.argumentDeserializer.deserializePrimitive( + arguments, NeighborEntityTypeArgument.class); + } +} diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/IncomingEdgesDataFetcher.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/IncomingEdgesDataFetcher.java index 858aef96..dd506853 100644 --- a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/IncomingEdgesDataFetcher.java +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/IncomingEdgesDataFetcher.java @@ -1,54 +1,33 @@ package org.hypertrace.graphql.entity.dao; -import graphql.schema.DataFetcher; -import graphql.schema.DataFetchingEnvironment; -import java.util.Collections; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; +import java.util.List; import javax.inject.Inject; import org.hypertrace.core.graphql.common.fetcher.InjectableDataFetcher; +import org.hypertrace.core.graphql.common.schema.results.arguments.filter.FilterArgument; import org.hypertrace.core.graphql.deserialization.ArgumentDeserializer; import org.hypertrace.graphql.entity.schema.EdgeResultSet; import org.hypertrace.graphql.entity.schema.Entity; import org.hypertrace.graphql.entity.schema.EntityType; -import org.hypertrace.graphql.entity.schema.argument.NeighborEntityScopeArgument; -import org.hypertrace.graphql.entity.schema.argument.NeighborEntityTypeArgument; public class IncomingEdgesDataFetcher extends InjectableDataFetcher { public IncomingEdgesDataFetcher() { super(IncomingEdgesDataFetcherImpl.class); } - private static class IncomingEdgesDataFetcherImpl - implements DataFetcher> { - - private final ArgumentDeserializer argumentDeserializer; + private static class IncomingEdgesDataFetcherImpl extends EdgesDataFetcherImpl { @Inject IncomingEdgesDataFetcherImpl(ArgumentDeserializer argumentDeserializer) { - this.argumentDeserializer = argumentDeserializer; + super(argumentDeserializer); } @Override - public CompletableFuture get(DataFetchingEnvironment environment) { - return CompletableFuture.completedFuture( - environment - .getSource() - .incomingEdges( - getNeighbourEntityType(environment.getArguments()).orElse(null), - getNeighbourEntityScope(environment.getArguments()).orElse(null), - Collections.emptyList())); - } - - private Optional getNeighbourEntityScope(Map arguments) { - return this.argumentDeserializer.deserializePrimitive( - arguments, NeighborEntityScopeArgument.class); - } - - private Optional getNeighbourEntityType(Map arguments) { - return this.argumentDeserializer.deserializePrimitive( - arguments, NeighborEntityTypeArgument.class); + protected EdgeResultSet getEdges( + Entity entity, + EntityType neighborType, + String neighborScope, + List filterBy) { + return entity.incomingEdges(neighborType, neighborScope, filterBy); } } } diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/OutgoingEdgesDataFetcher.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/OutgoingEdgesDataFetcher.java index fa4d3fdb..04541efb 100644 --- a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/OutgoingEdgesDataFetcher.java +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/OutgoingEdgesDataFetcher.java @@ -1,54 +1,34 @@ package org.hypertrace.graphql.entity.dao; -import graphql.schema.DataFetcher; -import graphql.schema.DataFetchingEnvironment; -import java.util.Collections; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; +import java.util.List; import javax.inject.Inject; import org.hypertrace.core.graphql.common.fetcher.InjectableDataFetcher; +import org.hypertrace.core.graphql.common.schema.results.arguments.filter.FilterArgument; import org.hypertrace.core.graphql.deserialization.ArgumentDeserializer; import org.hypertrace.graphql.entity.schema.EdgeResultSet; import org.hypertrace.graphql.entity.schema.Entity; import org.hypertrace.graphql.entity.schema.EntityType; -import org.hypertrace.graphql.entity.schema.argument.NeighborEntityScopeArgument; -import org.hypertrace.graphql.entity.schema.argument.NeighborEntityTypeArgument; public class OutgoingEdgesDataFetcher extends InjectableDataFetcher { + public OutgoingEdgesDataFetcher() { super(OutgoingEdgesDataFetcherImpl.class); } - private static class OutgoingEdgesDataFetcherImpl - implements DataFetcher> { - - private final ArgumentDeserializer argumentDeserializer; + private static class OutgoingEdgesDataFetcherImpl extends EdgesDataFetcherImpl { @Inject OutgoingEdgesDataFetcherImpl(ArgumentDeserializer argumentDeserializer) { - this.argumentDeserializer = argumentDeserializer; + super(argumentDeserializer); } @Override - public CompletableFuture get(DataFetchingEnvironment environment) { - return CompletableFuture.completedFuture( - environment - .getSource() - .outgoingEdges( - getNeighbourEntityType(environment.getArguments()).orElse(null), - getNeighbourEntityScope(environment.getArguments()).orElse(null), - Collections.emptyList())); - } - - private Optional getNeighbourEntityScope(Map arguments) { - return this.argumentDeserializer.deserializePrimitive( - arguments, NeighborEntityScopeArgument.class); - } - - private Optional getNeighbourEntityType(Map arguments) { - return this.argumentDeserializer.deserializePrimitive( - arguments, NeighborEntityTypeArgument.class); + protected EdgeResultSet getEdges( + Entity entity, + EntityType neighborType, + String neighborScope, + List filterBy) { + return entity.outgoingEdges(neighborType, neighborScope, filterBy); } } } diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java index 435504cf..34611e5f 100644 --- a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/request/EdgeRequestBuilder.java @@ -93,7 +93,7 @@ private Single buildEdgeRequest( if (!filterArguments.isEmpty() && edgeFields.size() > 1) { throw Status.UNIMPLEMENTED - .withDescription("Cannot specify more than one edge if using edge filter arguments") + .withDescription("Cannot specify more than one edge type with edge filters") .asRuntimeException(); } From 32c4d8e558ccce8cb56e495f545578e6faa61481 Mon Sep 17 00:00:00 2001 From: aman-bansal Date: Fri, 18 Nov 2022 09:54:44 +0530 Subject: [PATCH 9/9] adding comment --- .../graphql/entity/dao/EdgesDataFetcherImpl.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/EdgesDataFetcherImpl.java b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/EdgesDataFetcherImpl.java index 2205f17d..9b116665 100644 --- a/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/EdgesDataFetcherImpl.java +++ b/hypertrace-graphql-entity-schema/src/main/java/org/hypertrace/graphql/entity/dao/EdgesDataFetcherImpl.java @@ -28,6 +28,13 @@ protected abstract EdgeResultSet getEdges( @Override public CompletableFuture get(DataFetchingEnvironment environment) { + // TODO: Edges when used with filters have two limitations for now + // 1. We can only have one entityType incoming/outgoing edge + // 2. If different filters for same entity type, filters will be merged into one AND filter. + // + // We are passing the empty filter as argument to query the edges. + // This will work for now because we have restricted multiple edges selection in a request + // Fix this when we will solve the above two limitations. return CompletableFuture.completedFuture( getEdges( environment.getSource(),