From 9f5fe9943cd92b61467f720eef473bb41918e3ab Mon Sep 17 00:00:00 2001 From: SJ Date: Fri, 28 Oct 2022 15:29:35 +0530 Subject: [PATCH] refactor(explore): expression context in handlers --- .../explore/ExploreRequestContext.java | 35 +++++---- .../service/explore/ExploreService.java | 38 +++++----- .../service/explore/IRequestHandler.java | 4 +- .../service/explore/RequestHandler.java | 19 +++-- .../explore/TheRestGroupRequestHandler.java | 30 ++++++-- .../TimeAggregationsRequestHandler.java | 5 +- ...AggregationsWithGroupByRequestHandler.java | 30 +++++++- .../explore/entity/EntityRequestHandler.java | 16 ++-- .../entity/EntityRequestHandlerTest.java | 73 ++++++++++++------- 9 files changed, 152 insertions(+), 98 deletions(-) diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/ExploreRequestContext.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/ExploreRequestContext.java index 85c141a2..2ef726ee 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/ExploreRequestContext.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/ExploreRequestContext.java @@ -9,25 +9,24 @@ import org.hypertrace.gateway.service.v1.explore.ExploreRequest; public class ExploreRequestContext extends QueryRequestContext { - private final ExploreRequest exploreRequest; + private final ExploreRequest request; private boolean hasGroupBy = false; private List orderByExpressions; - public ExploreRequestContext(RequestContext grpcRequestContext, ExploreRequest exploreRequest) { - super( - grpcRequestContext, exploreRequest.getStartTimeMillis(), exploreRequest.getEndTimeMillis()); + public ExploreRequestContext(RequestContext grpcRequestContext, ExploreRequest request) { + super(grpcRequestContext, request.getStartTimeMillis(), request.getEndTimeMillis()); - this.exploreRequest = exploreRequest; - this.orderByExpressions = exploreRequest.getOrderByList(); + this.request = request; + this.orderByExpressions = request.getOrderByList(); } - public ExploreRequest getExploreRequest() { - return this.exploreRequest; + public ExploreRequest getRequest() { + return this.request; } public String getContext() { - return this.exploreRequest.getContext(); + return this.request.getContext(); } /** @@ -77,19 +76,19 @@ public int getRowLimitAfterRest() { } public int getOffset() { - return this.exploreRequest.getOffset(); + return this.request.getOffset(); } public boolean getIncludeRestGroup() { - return this.exploreRequest.getIncludeRestGroup(); + return this.request.getIncludeRestGroup(); } private int getGroupByLimit() { // If a request has no group limit, default to row limit if (this.providedGroupLimitUnset()) { - return this.exploreRequest.getLimit(); + return this.request.getLimit(); } - return this.exploreRequest.getGroupLimit(); + return this.request.getGroupLimit(); } /** @@ -100,21 +99,21 @@ private int getBackwardsCompatibleRowLimit() { // Row limit previously was the number of groups for a grouped + time series request. If group // limit isn't set, assume the old format and expand the row limit to default limit if (this.providedGroupLimitUnset() && this.hasGroupBy() && this.hasTimeAggregations()) { - return Math.max(this.exploreRequest.getLimit(), DEFAULT_QUERY_SERVICE_GROUP_BY_LIMIT); + return Math.max(this.request.getLimit(), DEFAULT_QUERY_SERVICE_GROUP_BY_LIMIT); } // Previously, a rest group would not count against the limit if (this.providedGroupLimitUnset() && this.hasGroupBy() && this.getIncludeRestGroup()) { - return this.exploreRequest.getLimit() + 1; + return this.request.getLimit() + 1; } - return this.exploreRequest.getLimit(); + return this.request.getLimit(); } private boolean providedGroupLimitUnset() { - return this.exploreRequest.getGroupLimit() == 0; + return this.request.getGroupLimit() == 0; } private boolean hasTimeAggregations() { - return !this.exploreRequest.getTimeAggregationList().isEmpty(); + return !this.request.getTimeAggregationList().isEmpty(); } } diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/ExploreService.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/ExploreService.java index f444c7fe..8601c765 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/ExploreService.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/ExploreService.java @@ -72,9 +72,6 @@ public ExploreResponse explore(RequestContext requestContext, ExploreRequest req final Instant start = Instant.now(); try { - ExploreRequestContext exploreRequestContext = - new ExploreRequestContext(requestContext.getGrpcContext(), request); - // Add extra filters based on the scope. request = ExploreRequest.newBuilder(request) @@ -83,21 +80,28 @@ public ExploreResponse explore(RequestContext requestContext, ExploreRequest req request.getContext(), request.getFilter(), attributeMetadataProvider, - exploreRequestContext)) + requestContext)) .build(); - ExploreRequestContext newExploreRequestContext = - new ExploreRequestContext(requestContext.getGrpcContext(), request); - Map attributeMetadataMap = - attributeMetadataProvider.getAttributesMetadata( - newExploreRequestContext, request.getContext()); + attributeMetadataProvider.getAttributesMetadata(requestContext, request.getContext()); + exploreRequestValidator.validate(request, attributeMetadataMap); - IRequestHandler requestHandler = getRequestHandler(request, attributeMetadataMap); + ExploreRequestContext exploreRequestContext = + new ExploreRequestContext(requestContext.getGrpcContext(), request); + ExpressionContext expressionContext = + new ExpressionContext( + attributeMetadataMap, + request.getFilter(), + request.getSelectionList(), + request.getTimeAggregationList(), + request.getOrderByList(), + request.getGroupByList()); + + IRequestHandler requestHandler = getRequestHandler(request, expressionContext); ExploreResponse.Builder responseBuilder = - requestHandler.handleRequest(newExploreRequestContext, request); - + requestHandler.handleRequest(exploreRequestContext, expressionContext); return responseBuilder.build(); } finally { queryExecutionTimer.record( @@ -111,18 +115,10 @@ private boolean isContextAnEntityType(ExploreRequest request) { } private IRequestHandler getRequestHandler( - ExploreRequest request, Map attributeMetadataMap) { + ExploreRequest request, ExpressionContext expressionContext) { if (isContextAnEntityType(request) && !hasTimeAggregations(request) && !request.getGroupByList().isEmpty()) { - ExpressionContext expressionContext = - new ExpressionContext( - attributeMetadataMap, - request.getFilter(), - request.getSelectionList(), - request.getTimeAggregationList(), - request.getOrderByList(), - request.getGroupByList()); Optional source = ExpressionContext.getSingleSourceForAllAttributes(expressionContext); if ((source.isPresent() && EDS.toString().equals(source.get())) || !hasTimeRange(request)) { diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/IRequestHandler.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/IRequestHandler.java index 96ac411e..acae0b30 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/IRequestHandler.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/IRequestHandler.java @@ -1,6 +1,6 @@ package org.hypertrace.gateway.service.explore; -import org.hypertrace.gateway.service.v1.explore.ExploreRequest; +import org.hypertrace.gateway.service.common.ExpressionContext; import org.hypertrace.gateway.service.v1.explore.ExploreResponse; /** @@ -17,5 +17,5 @@ */ interface IRequestHandler { ExploreResponse.Builder handleRequest( - ExploreRequestContext requestContext, ExploreRequest request); + ExploreRequestContext requestContext, ExpressionContext expressionContext); } diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/RequestHandler.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/RequestHandler.java index 9e3f5b67..105eb295 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/RequestHandler.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/RequestHandler.java @@ -18,6 +18,7 @@ import org.hypertrace.core.query.service.api.Row; import org.hypertrace.core.query.service.api.Value; import org.hypertrace.gateway.service.common.AttributeMetadataProvider; +import org.hypertrace.gateway.service.common.ExpressionContext; import org.hypertrace.gateway.service.common.converters.QueryAndGatewayDtoConverter; import org.hypertrace.gateway.service.common.util.AttributeMetadataUtil; import org.hypertrace.gateway.service.common.util.DataCollectionUtil; @@ -44,14 +45,14 @@ public RequestHandler( QueryServiceClient queryServiceClient, AttributeMetadataProvider attributeMetadataProvider) { this.queryServiceClient = queryServiceClient; this.attributeMetadataProvider = attributeMetadataProvider; - this.theRestGroupRequestHandler = new TheRestGroupRequestHandler(this); + this.theRestGroupRequestHandler = + new TheRestGroupRequestHandler(this, attributeMetadataProvider); } @Override public ExploreResponse.Builder handleRequest( - ExploreRequestContext requestContext, ExploreRequest request) { - QueryRequest queryRequest = - buildQueryRequest(requestContext, request, attributeMetadataProvider); + ExploreRequestContext requestContext, ExpressionContext expressionContext) { + QueryRequest queryRequest = buildQueryRequest(requestContext, attributeMetadataProvider); Iterator resultSetChunkIterator = executeQuery(requestContext, queryRequest); @@ -60,11 +61,10 @@ public ExploreResponse.Builder handleRequest( } QueryRequest buildQueryRequest( - ExploreRequestContext requestContext, - ExploreRequest request, - AttributeMetadataProvider attributeMetadataProvider) { + ExploreRequestContext requestContext, AttributeMetadataProvider attributeMetadataProvider) { // Track if we have Group By so we can determine if we need to do Order By, Limit and Offset // ourselves. + ExploreRequest request = requestContext.getRequest(); if (!request.getGroupByList().isEmpty()) { requestContext.setHasGroupBy(true); } @@ -221,7 +221,7 @@ private ExploreResponse.Builder handleQueryServiceResponse( if (requestContext.hasGroupBy() && requestContext.getIncludeRestGroup()) { theRestGroupRequestHandler.getRowsForTheRestGroup( - context, requestContext.getExploreRequest(), builder); + context, requestContext.getRequest(), builder); } return builder; @@ -273,8 +273,7 @@ void handleQueryServiceResponseSingleColumn( attributeMetadataProvider.getAttributesMetadata( requestContext, requestContext.getContext()); Map resultKeyToAttributeMetadataMap = - this.remapAttributeMetadataByResultName( - requestContext.getExploreRequest(), attributeMetadataMap); + this.remapAttributeMetadataByResultName(requestContext.getRequest(), attributeMetadataMap); org.hypertrace.gateway.service.v1.common.Value gwValue; if (function != null) { // Function expression value gwValue = diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/TheRestGroupRequestHandler.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/TheRestGroupRequestHandler.java index e410e2d8..12933af6 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/TheRestGroupRequestHandler.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/TheRestGroupRequestHandler.java @@ -6,6 +6,9 @@ import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; +import org.hypertrace.core.attribute.service.v1.AttributeMetadata; +import org.hypertrace.gateway.service.common.AttributeMetadataProvider; +import org.hypertrace.gateway.service.common.ExpressionContext; import org.hypertrace.gateway.service.common.util.ExpressionReader; import org.hypertrace.gateway.service.v1.common.Expression; import org.hypertrace.gateway.service.v1.common.Filter; @@ -30,13 +33,17 @@ public class TheRestGroupRequestHandler { private static final String OTHER_COLUMN_VALUE = "__Other"; private final RequestHandlerWithSorting requestHandler; + private final AttributeMetadataProvider attributeMetadataProvider; - TheRestGroupRequestHandler(RequestHandlerWithSorting requestHandler) { + TheRestGroupRequestHandler( + RequestHandlerWithSorting requestHandler, + AttributeMetadataProvider attributeMetadataProvider) { this.requestHandler = requestHandler; + this.attributeMetadataProvider = attributeMetadataProvider; } public void getRowsForTheRestGroup( - ExploreRequestContext context, + ExploreRequestContext requestContext, ExploreRequest originalRequest, ExploreResponse.Builder originalResponse) { // Return if there was no data in the original request @@ -44,12 +51,23 @@ public void getRowsForTheRestGroup( return; } + Map attributeMetadataMap = + attributeMetadataProvider.getAttributesMetadata( + requestContext, originalRequest.getContext()); + ExploreRequest theRestRequest = createRequest(originalRequest, originalResponse); ExploreRequestContext theRestRequestContext = - new ExploreRequestContext(context.getGrpcContext(), theRestRequest); - + new ExploreRequestContext(requestContext.getGrpcContext(), theRestRequest); + ExpressionContext theRestExpressionContext = + new ExpressionContext( + attributeMetadataMap, + theRestRequest.getFilter(), + theRestRequest.getSelectionList(), + theRestRequest.getTimeAggregationList(), + theRestRequest.getOrderByList(), + theRestRequest.getGroupByList()); ExploreResponse.Builder theRestGroupResponse = - requestHandler.handleRequest(theRestRequestContext, theRestRequest); + requestHandler.handleRequest(theRestRequestContext, theRestExpressionContext); List orderByExpressions = requestHandler.getRequestOrderByExpressions(theRestRequest); @@ -57,7 +75,7 @@ public void getRowsForTheRestGroup( originalResponse, theRestGroupResponse, orderByExpressions, - context.getRowLimitAfterRest(), // check how many rows expected from original request + requestContext.getRowLimitAfterRest(), // check how many rows expected from original request originalRequest.getOffset(), requestHandler, originalRequest.getGroupByList()); diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/TimeAggregationsRequestHandler.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/TimeAggregationsRequestHandler.java index 80eef853..d1e8b01b 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/TimeAggregationsRequestHandler.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/TimeAggregationsRequestHandler.java @@ -39,11 +39,10 @@ public class TimeAggregationsRequestHandler extends RequestHandler { @Override QueryRequest buildQueryRequest( - ExploreRequestContext requestContext, - ExploreRequest request, - AttributeMetadataProvider attributeMetadataProvider) { + ExploreRequestContext requestContext, AttributeMetadataProvider attributeMetadataProvider) { // Set hasGroupBy=true in the request context since we will group by the timestamp column // regardless of the presence of a groupBy or not. + ExploreRequest request = requestContext.getRequest(); requestContext.setHasGroupBy(true); QueryRequest.Builder builder = QueryRequest.newBuilder(); diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/TimeAggregationsWithGroupByRequestHandler.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/TimeAggregationsWithGroupByRequestHandler.java index e88c149c..3f86d85d 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/TimeAggregationsWithGroupByRequestHandler.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/TimeAggregationsWithGroupByRequestHandler.java @@ -1,8 +1,11 @@ package org.hypertrace.gateway.service.explore; import com.google.common.collect.ImmutableSet; +import java.util.Map; import java.util.Set; +import org.hypertrace.core.attribute.service.v1.AttributeMetadata; import org.hypertrace.gateway.service.common.AttributeMetadataProvider; +import org.hypertrace.gateway.service.common.ExpressionContext; import org.hypertrace.gateway.service.common.util.ExpressionReader; import org.hypertrace.gateway.service.common.util.QueryServiceClient; import org.hypertrace.gateway.service.v1.common.Expression; @@ -16,11 +19,13 @@ public class TimeAggregationsWithGroupByRequestHandler implements IRequestHandler { + private final AttributeMetadataProvider attributeMetadataProvider; private final RequestHandler normalRequestHandler; private final TimeAggregationsRequestHandler timeAggregationsRequestHandler; TimeAggregationsWithGroupByRequestHandler( QueryServiceClient queryServiceClient, AttributeMetadataProvider attributeMetadataProvider) { + this.attributeMetadataProvider = attributeMetadataProvider; this.normalRequestHandler = new RequestHandler(queryServiceClient, attributeMetadataProvider); this.timeAggregationsRequestHandler = new TimeAggregationsRequestHandler(queryServiceClient, attributeMetadataProvider); @@ -28,15 +33,26 @@ public class TimeAggregationsWithGroupByRequestHandler implements IRequestHandle @Override public ExploreResponse.Builder handleRequest( - ExploreRequestContext requestContext, ExploreRequest request) { + ExploreRequestContext requestContext, ExpressionContext expressionContext) { // This type of handler is always a group by + ExploreRequest request = requestContext.getRequest(); requestContext.setHasGroupBy(true); + Map attributeMetadataMap = + attributeMetadataProvider.getAttributesMetadata(requestContext, request.getContext()); // 1. Create a GroupBy request and get the response for the GroupBy ExploreRequest groupByRequest = buildGroupByRequest(request); ExploreRequestContext groupByRequestContext = new ExploreRequestContext(requestContext.getGrpcContext(), groupByRequest); + ExpressionContext groupByExpressionContext = + new ExpressionContext( + attributeMetadataMap, + groupByRequest.getFilter(), + groupByRequest.getSelectionList(), + groupByRequest.getTimeAggregationList(), + groupByRequest.getOrderByList(), + groupByRequest.getGroupByList()); ExploreResponse.Builder groupByResponse = - normalRequestHandler.handleRequest(groupByRequestContext, groupByRequest); + normalRequestHandler.handleRequest(groupByRequestContext, groupByExpressionContext); // No need for a second query if no results. if (groupByResponse.getRowBuilderList().isEmpty()) { @@ -48,9 +64,17 @@ public ExploreResponse.Builder handleRequest( ExploreRequest timeAggregationsRequest = buildTimeAggregationsRequest(request, groupByResponse); ExploreRequestContext timeAggregationsRequestContext = new ExploreRequestContext(requestContext.getGrpcContext(), timeAggregationsRequest); + ExpressionContext timeAggregationsExpressionContext = + new ExpressionContext( + attributeMetadataMap, + timeAggregationsRequest.getFilter(), + timeAggregationsRequest.getSelectionList(), + timeAggregationsRequest.getTimeAggregationList(), + timeAggregationsRequest.getOrderByList(), + timeAggregationsRequest.getGroupByList()); ExploreResponse.Builder timeAggregationsResponse = timeAggregationsRequestHandler.handleRequest( - timeAggregationsRequestContext, timeAggregationsRequest); + timeAggregationsRequestContext, timeAggregationsExpressionContext); // 3. If includeRestGroup is set, invoke TheRestGroupRequestHandler if (request.getIncludeRestGroup()) { diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/entity/EntityRequestHandler.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/entity/EntityRequestHandler.java index 6e7c899a..77faaefd 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/entity/EntityRequestHandler.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/entity/EntityRequestHandler.java @@ -14,6 +14,7 @@ import org.hypertrace.entity.query.service.v1.Row; import org.hypertrace.entity.query.service.v1.Value; import org.hypertrace.gateway.service.common.AttributeMetadataProvider; +import org.hypertrace.gateway.service.common.ExpressionContext; import org.hypertrace.gateway.service.common.converters.EntityServiceAndGatewayServiceConverter; import org.hypertrace.gateway.service.common.datafetcher.EntityFetcherResponse; import org.hypertrace.gateway.service.common.datafetcher.QueryServiceEntityFetcher; @@ -83,14 +84,15 @@ public EntityRequestHandler( @Override public ExploreResponse.Builder handleRequest( - ExploreRequestContext requestContext, ExploreRequest exploreRequest) { + ExploreRequestContext requestContext, ExpressionContext expressionContext) { // Track if we have Group By so we can determine if we need to do Order By, Limit and Offset // ourselves. - if (!exploreRequest.getGroupByList().isEmpty()) { + ExploreRequest request = requestContext.getRequest(); + if (!request.getGroupByList().isEmpty()) { requestContext.setHasGroupBy(true); } - Set entityIds = getEntityIds(requestContext, exploreRequest); + Set entityIds = getEntityIds(requestContext, request); ExploreResponse.Builder builder = ExploreResponse.newBuilder(); if (entityIds.isEmpty()) { @@ -98,7 +100,7 @@ public ExploreResponse.Builder handleRequest( } Iterator resultSetChunkIterator = - entityServiceEntityFetcher.getResults(requestContext, exploreRequest, entityIds); + entityServiceEntityFetcher.getResults(requestContext, request, entityIds); while (resultSetChunkIterator.hasNext()) { org.hypertrace.entity.query.service.v1.ResultSetChunk chunk = resultSetChunkIterator.next(); @@ -135,8 +137,7 @@ public ExploreResponse.Builder handleRequest( } if (requestContext.hasGroupBy() && requestContext.getIncludeRestGroup()) { - getTheRestGroupRequestHandler() - .getRowsForTheRestGroup(requestContext, exploreRequest, builder); + getTheRestGroupRequestHandler().getRowsForTheRestGroup(requestContext, request, builder); } return builder; @@ -214,8 +215,7 @@ void handleColumn( attributeMetadataProvider.getAttributesMetadata( requestContext, requestContext.getContext()); Map resultKeyToAttributeMetadataMap = - this.remapAttributeMetadataByResultName( - requestContext.getExploreRequest(), attributeMetadataMap); + this.remapAttributeMetadataByResultName(requestContext.getRequest(), attributeMetadataMap); org.hypertrace.gateway.service.v1.common.Value gwValue; if (function != null) { // Function expression value diff --git a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/explore/entity/EntityRequestHandlerTest.java b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/explore/entity/EntityRequestHandlerTest.java index 7b5aaa31..034ab1e0 100644 --- a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/explore/entity/EntityRequestHandlerTest.java +++ b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/explore/entity/EntityRequestHandlerTest.java @@ -7,6 +7,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -19,6 +20,7 @@ import org.hypertrace.entity.query.service.v1.ResultSetMetadata; import org.hypertrace.entity.query.service.v1.Row; import org.hypertrace.gateway.service.common.AttributeMetadataProvider; +import org.hypertrace.gateway.service.common.ExpressionContext; import org.hypertrace.gateway.service.common.datafetcher.EntityFetcherResponse; import org.hypertrace.gateway.service.common.datafetcher.QueryServiceEntityFetcher; import org.hypertrace.gateway.service.common.util.QueryServiceClient; @@ -82,19 +84,20 @@ void shouldBuildEntityResponse_multipleDataSources() { when(attributeMetadataProvider.getAttributeMetadata(exploreRequestContext, "API", "startTime")) .thenReturn(Optional.of(AttributeMetadata.newBuilder().setKey("API.startTime").build())); + Map attributeMetadataMap = + Map.of( + "API.type", + AttributeMetadata.newBuilder() + .setKey("API.type") + .setValueKind(AttributeKind.TYPE_STRING) + .build(), + "API.external", + AttributeMetadata.newBuilder() + .setKey("API.external") + .setValueKind(AttributeKind.TYPE_STRING) + .build()); when(attributeMetadataProvider.getAttributesMetadata(exploreRequestContext, "API")) - .thenReturn( - Map.of( - "API.type", - AttributeMetadata.newBuilder() - .setKey("API.type") - .setValueKind(AttributeKind.TYPE_STRING) - .build(), - "API.external", - AttributeMetadata.newBuilder() - .setKey("API.external") - .setValueKind(AttributeKind.TYPE_STRING) - .build())); + .thenReturn(attributeMetadataMap); EntitiesRequest entitiesRequest = EntitiesRequest.newBuilder() @@ -108,9 +111,16 @@ void shouldBuildEntityResponse_multipleDataSources() { when(entityServiceEntityFetcher.getResults( exploreRequestContext, exploreRequest, Set.of("api1", "api2"))) .thenReturn(mockResults()); - + ExpressionContext expressionContext = + new ExpressionContext( + attributeMetadataMap, + entitiesRequest.getFilter(), + entitiesRequest.getSelectionList(), + entitiesRequest.getTimeAggregationList(), + entitiesRequest.getOrderByList(), + Collections.emptyList()); ExploreResponse exploreResponse = - entityRequestHandler.handleRequest(exploreRequestContext, exploreRequest).build(); + entityRequestHandler.handleRequest(exploreRequestContext, expressionContext).build(); assertEquals(2, exploreResponse.getRowCount()); assertEquals( Map.of( @@ -147,19 +157,20 @@ void testHandleRequest_emptyEntityIds() { when(attributeMetadataProvider.getAttributeMetadata(exploreRequestContext, "API", "startTime")) .thenReturn(Optional.of(AttributeMetadata.newBuilder().setKey("API.startTime").build())); + Map attributeMetadataMap = + Map.of( + "API.type", + AttributeMetadata.newBuilder() + .setKey("API.type") + .setValueKind(AttributeKind.TYPE_STRING) + .build(), + "API.external", + AttributeMetadata.newBuilder() + .setKey("API.external") + .setValueKind(AttributeKind.TYPE_STRING) + .build()); when(attributeMetadataProvider.getAttributesMetadata(exploreRequestContext, "API")) - .thenReturn( - Map.of( - "API.type", - AttributeMetadata.newBuilder() - .setKey("API.type") - .setValueKind(AttributeKind.TYPE_STRING) - .build(), - "API.external", - AttributeMetadata.newBuilder() - .setKey("API.external") - .setValueKind(AttributeKind.TYPE_STRING) - .build())); + .thenReturn(attributeMetadataMap); EntitiesRequest entitiesRequest = EntitiesRequest.newBuilder() @@ -171,8 +182,16 @@ void testHandleRequest_emptyEntityIds() { any(EntitiesRequestContext.class), eq(entitiesRequest))) .thenReturn(new EntityFetcherResponse()); + ExpressionContext expressionContext = + new ExpressionContext( + attributeMetadataMap, + entitiesRequest.getFilter(), + entitiesRequest.getSelectionList(), + entitiesRequest.getTimeAggregationList(), + entitiesRequest.getOrderByList(), + Collections.emptyList()); ExploreResponse exploreResponse = - entityRequestHandler.handleRequest(exploreRequestContext, exploreRequest).build(); + entityRequestHandler.handleRequest(exploreRequestContext, expressionContext).build(); assertEquals(0, exploreResponse.getRowCount()); }