diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/GatewayServiceImpl.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/GatewayServiceImpl.java index 47770444..42fb4d56 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/GatewayServiceImpl.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/GatewayServiceImpl.java @@ -29,13 +29,11 @@ import org.hypertrace.gateway.service.baseline.BaselineServiceQueryParser; import org.hypertrace.gateway.service.common.AttributeMetadataProvider; import org.hypertrace.gateway.service.common.RequestContext; -import org.hypertrace.gateway.service.common.config.ScopeFilterConfigs; +import org.hypertrace.gateway.service.common.config.GatewayServiceConfig; import org.hypertrace.gateway.service.common.util.EntityTypeServiceClient; import org.hypertrace.gateway.service.common.util.EntityTypeServiceV2Client; import org.hypertrace.gateway.service.common.util.QueryServiceClient; import org.hypertrace.gateway.service.entity.EntityService; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; -import org.hypertrace.gateway.service.entity.config.LogConfig; import org.hypertrace.gateway.service.executor.QueryExecutorConfig; import org.hypertrace.gateway.service.executor.QueryExecutorServiceFactory; import org.hypertrace.gateway.service.explore.ExploreService; @@ -91,7 +89,6 @@ public GatewayServiceImpl(Config appConfig, GrpcChannelRegistry grpcChannelRegis new AttributeServiceClient( grpcChannelRegistry.forPlaintextAddress(asConfig.getHost(), asConfig.getPort())); AttributeMetadataProvider attributeMetadataProvider = new AttributeMetadataProvider(asClient); - EntityIdColumnsConfigs entityIdColumnsConfigs = EntityIdColumnsConfigs.fromConfig(appConfig); Config untypedQsConfig = appConfig.getConfig(QUERY_SERVICE_CONFIG_KEY); QueryServiceConfig qsConfig = new QueryServiceConfig(untypedQsConfig); @@ -124,30 +121,26 @@ public GatewayServiceImpl(Config appConfig, GrpcChannelRegistry grpcChannelRegis EntityTypesProvider entityTypesProvider = new EntityTypesProvider(entityTypeServiceClient, entityTypeServiceV2Client); - ScopeFilterConfigs scopeFilterConfigs = new ScopeFilterConfigs(appConfig); - LogConfig logConfig = new LogConfig(appConfig); + GatewayServiceConfig gatewayServiceConfig = new GatewayServiceConfig(appConfig); this.traceService = new TracesService( - queryServiceClient, attributeMetadataProvider, scopeFilterConfigs, queryExecutor); + gatewayServiceConfig, queryServiceClient, attributeMetadataProvider, queryExecutor); this.spanService = new SpanService(queryServiceClient, attributeMetadataProvider, queryExecutor); this.entityService = new EntityService( + gatewayServiceConfig, queryServiceClient, eqsClient, eqsStub, attributeMetadataProvider, - entityIdColumnsConfigs, - scopeFilterConfigs, - logConfig, queryExecutor); this.exploreService = new ExploreService( + gatewayServiceConfig, queryServiceClient, eqsClient, attributeMetadataProvider, - scopeFilterConfigs, - entityIdColumnsConfigs, entityTypesProvider); BaselineServiceQueryParser baselineServiceQueryParser = new BaselineServiceQueryParser(attributeMetadataProvider); @@ -155,10 +148,10 @@ public GatewayServiceImpl(Config appConfig, GrpcChannelRegistry grpcChannelRegis new BaselineServiceQueryExecutor(queryServiceClient); this.baselineService = new BaselineServiceImpl( + gatewayServiceConfig, attributeMetadataProvider, baselineServiceQueryParser, - baselineServiceQueryExecutor, - entityIdColumnsConfigs); + baselineServiceQueryExecutor); this.logEventsService = new LogEventsService(queryServiceClient, attributeMetadataProvider); initMetrics(); } diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/baseline/BaselineServiceImpl.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/baseline/BaselineServiceImpl.java index 5a7da8c5..96110d31 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/baseline/BaselineServiceImpl.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/baseline/BaselineServiceImpl.java @@ -16,9 +16,9 @@ import org.hypertrace.gateway.service.baseline.lib.BaselineCalculator; import org.hypertrace.gateway.service.common.AttributeMetadataProvider; import org.hypertrace.gateway.service.common.RequestContext; +import org.hypertrace.gateway.service.common.config.GatewayServiceConfig; import org.hypertrace.gateway.service.common.util.AttributeMetadataUtil; import org.hypertrace.gateway.service.common.util.QueryExpressionUtil; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; import org.hypertrace.gateway.service.v1.baseline.Baseline; import org.hypertrace.gateway.service.v1.baseline.BaselineEntitiesRequest; import org.hypertrace.gateway.service.v1.baseline.BaselineEntitiesResponse; @@ -40,25 +40,25 @@ */ public class BaselineServiceImpl implements BaselineService { - private static final BaselineEntitiesRequestValidator baselineEntitiesRequestValidator = + private static final BaselineEntitiesRequestValidator BASELINE_ENTITIES_REQUEST_VALIDATOR = new BaselineEntitiesRequestValidator(); protected static final long DAY_IN_MILLIS = 86400000L; + private final GatewayServiceConfig gatewayServiceConfig; private final AttributeMetadataProvider attributeMetadataProvider; private final BaselineServiceQueryParser baselineServiceQueryParser; private final BaselineServiceQueryExecutor baselineServiceQueryExecutor; - private final EntityIdColumnsConfigs entityIdColumnsConfigs; public BaselineServiceImpl( + GatewayServiceConfig gatewayServiceConfig, AttributeMetadataProvider attributeMetadataProvider, BaselineServiceQueryParser baselineServiceQueryParser, - BaselineServiceQueryExecutor baselineServiceQueryExecutor, - EntityIdColumnsConfigs entityIdColumnsConfigs) { + BaselineServiceQueryExecutor baselineServiceQueryExecutor) { + this.gatewayServiceConfig = gatewayServiceConfig; this.attributeMetadataProvider = attributeMetadataProvider; this.baselineServiceQueryParser = baselineServiceQueryParser; this.baselineServiceQueryExecutor = baselineServiceQueryExecutor; - this.entityIdColumnsConfigs = entityIdColumnsConfigs; } public BaselineEntitiesResponse getBaselineForEntities( @@ -67,7 +67,7 @@ public BaselineEntitiesResponse getBaselineForEntities( Map attributeMetadataMap = attributeMetadataProvider.getAttributesMetadata( requestContext, originalRequest.getEntityType()); - baselineEntitiesRequestValidator.validate(originalRequest, attributeMetadataMap); + BASELINE_ENTITIES_REQUEST_VALIDATOR.validate(originalRequest, attributeMetadataMap); String timeColumn = AttributeMetadataUtil.getTimestampAttributeId( attributeMetadataProvider, requestContext, originalRequest.getEntityType()); @@ -91,7 +91,7 @@ public BaselineEntitiesResponse getBaselineForEntities( List entityIdAttributes = AttributeMetadataUtil.getIdAttributeIds( attributeMetadataProvider, - entityIdColumnsConfigs, + gatewayServiceConfig.getEntityIdColumnsConfig(), requestContext, originalRequest.getEntityType()); QueryRequest aggQueryRequest = @@ -134,7 +134,7 @@ public BaselineEntitiesResponse getBaselineForEntities( List entityIdAttributes = AttributeMetadataUtil.getIdAttributeIds( attributeMetadataProvider, - entityIdColumnsConfigs, + gatewayServiceConfig.getEntityIdColumnsConfig(), requestContext, originalRequest.getEntityType()); QueryRequest timeSeriesQueryRequest = diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/ExpressionContext.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/ExpressionContext.java index cef03635..f13a9cf8 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/ExpressionContext.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/ExpressionContext.java @@ -18,10 +18,12 @@ import java.util.stream.Stream; import org.hypertrace.core.attribute.service.v1.AttributeMetadata; import org.hypertrace.core.attribute.service.v1.AttributeSource; +import org.hypertrace.gateway.service.common.config.GatewayServiceConfig; import org.hypertrace.gateway.service.common.util.ExpressionReader; import org.hypertrace.gateway.service.common.util.OrderByUtil; import org.hypertrace.gateway.service.v1.common.Expression; import org.hypertrace.gateway.service.v1.common.Filter; +import org.hypertrace.gateway.service.v1.common.Operator; import org.hypertrace.gateway.service.v1.common.OrderByExpression; import org.hypertrace.gateway.service.v1.common.TimeAggregation; import org.slf4j.Logger; @@ -49,12 +51,17 @@ public class ExpressionContext { private ImmutableMap> sourceToMetricOrderByExpressionMap; private ImmutableMap> sourceToMetricOrderByAttributeMap; + private ImmutableMap> sourceToOrderByExpressionMap; + // filters private final Filter filter; private ImmutableMap> sourceToFilterExpressionMap; private ImmutableMap> sourceToFilterAttributeMap; private ImmutableMap> filterAttributeToSourceMap; + // and filter + private boolean isAndFilter; + // group bys private final List groupBys; private ImmutableMap> sourceToGroupByExpressionMap; @@ -64,6 +71,7 @@ public class ExpressionContext { private final Map> allAttributesToSourcesMap = new HashMap<>(); public ExpressionContext( + GatewayServiceConfig gatewayServiceConfig, Map attributeMetadataMap, Filter filter, List selections, @@ -82,6 +90,8 @@ public ExpressionContext( buildSourceToFilterExpressionMaps(); buildSourceToOrderByExpressionMaps(); buildSourceToGroupByExpressionMaps(); + + this.isAndFilter = gatewayServiceConfig.isEntityAndFilterEnabled() && isAndFilter(filter); } public Map> getSourceToSelectionExpressionMap() { @@ -133,6 +143,10 @@ public Map> getSourceToMetricOrderByAttributeMap() { return sourceToMetricOrderByAttributeMap; } + public Map> getSourceToOrderByExpressionMap() { + return sourceToOrderByExpressionMap; + } + public Map> getSourceToFilterExpressionMap() { return sourceToFilterExpressionMap; } @@ -145,6 +159,10 @@ public Map> getFilterAttributeToSourceMap() { return filterAttributeToSourceMap; } + public boolean isAndFilter() { + return isAndFilter; + } + public Map> getAllAttributesToSourcesMap() { return allAttributesToSourcesMap; } @@ -173,6 +191,17 @@ private void buildSourceToFilterExpressionMaps() { .build(); } + private boolean isAndFilter(Filter filter) { + Operator operator = filter.getOperator(); + if (operator == Operator.AND) { + return filter.getChildFilterList().stream().allMatch(this::isAndFilter); + } else if (operator == Operator.OR) { + return false; + } else { + return true; + } + } + private void buildSourceToOrderByExpressionMaps() { // Ensure that the OrderByExpression function alias matches that of a column in the selection or // TimeAggregation, since the OrderByComparator uses the alias to match the column name in the @@ -204,6 +233,8 @@ private void buildSourceToOrderByExpressionMaps() { sourceToMetricOrderByAttributeMap = buildSourceToAttributesMap( convertOrderByExpressionToExpression(sourceToMetricOrderByExpressionMap)); + + sourceToOrderByExpressionMap = getDataSourceToOrderByExpressionMap(orderByExpressions); } private void buildSourceToGroupByExpressionMaps() { diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/config/GatewayServiceConfig.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/config/GatewayServiceConfig.java new file mode 100644 index 00000000..40754adb --- /dev/null +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/config/GatewayServiceConfig.java @@ -0,0 +1,39 @@ +package org.hypertrace.gateway.service.common.config; + +import com.typesafe.config.Config; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; +import org.hypertrace.gateway.service.entity.config.LogConfig; + +public class GatewayServiceConfig { + private static final String ENTITY_AND_FILTER_ENABLED_CONFIG_KEY = "filter.entity.and.enabled"; + private final EntityIdColumnsConfig entityIdColumnsConfig; + private final ScopeFilterConfigs scopeFilterConfigs; + private final LogConfig logConfig; + private final boolean isEntityAndFilterEnabled; + + public GatewayServiceConfig(Config config) { + this.entityIdColumnsConfig = EntityIdColumnsConfig.fromConfig(config); + this.scopeFilterConfigs = new ScopeFilterConfigs(config); + this.logConfig = new LogConfig(config); + this.isEntityAndFilterEnabled = + config.hasPath(ENTITY_AND_FILTER_ENABLED_CONFIG_KEY) + ? config.getBoolean(ENTITY_AND_FILTER_ENABLED_CONFIG_KEY) + : false; + } + + public EntityIdColumnsConfig getEntityIdColumnsConfig() { + return entityIdColumnsConfig; + } + + public ScopeFilterConfigs getScopeFilterConfigs() { + return scopeFilterConfigs; + } + + public LogConfig getLogConfig() { + return logConfig; + } + + public boolean isEntityAndFilterEnabled() { + return isEntityAndFilterEnabled; + } +} diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/datafetcher/EntityDataServiceEntityFetcher.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/datafetcher/EntityDataServiceEntityFetcher.java index 63d5d9d1..81db7aba 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/datafetcher/EntityDataServiceEntityFetcher.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/datafetcher/EntityDataServiceEntityFetcher.java @@ -22,7 +22,7 @@ import org.hypertrace.gateway.service.common.util.ExpressionReader; import org.hypertrace.gateway.service.entity.EntitiesRequestContext; import org.hypertrace.gateway.service.entity.EntityKey; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; import org.hypertrace.gateway.service.v1.common.Value; import org.hypertrace.gateway.service.v1.common.ValueType; import org.hypertrace.gateway.service.v1.entity.EntitiesRequest; @@ -39,15 +39,15 @@ public class EntityDataServiceEntityFetcher implements IEntityFetcher { private final EntityQueryServiceClient entityQueryServiceClient; private final AttributeMetadataProvider attributeMetadataProvider; - private final EntityIdColumnsConfigs entityIdColumnsConfigs; + private final EntityIdColumnsConfig entityIdColumnsConfig; public EntityDataServiceEntityFetcher( EntityQueryServiceClient entityQueryServiceClient, AttributeMetadataProvider attributeMetadataProvider, - EntityIdColumnsConfigs entityIdColumnsConfigs) { + EntityIdColumnsConfig entityIdColumnsConfig) { this.entityQueryServiceClient = entityQueryServiceClient; this.attributeMetadataProvider = attributeMetadataProvider; - this.entityIdColumnsConfigs = entityIdColumnsConfigs; + this.entityIdColumnsConfig = entityIdColumnsConfig; } @Override @@ -56,7 +56,7 @@ public EntityFetcherResponse getEntities( List entityIdAttributeIds = AttributeMetadataUtil.getIdAttributeIds( attributeMetadataProvider, - entityIdColumnsConfigs, + entityIdColumnsConfig, requestContext, entitiesRequest.getEntityType()); Map> requestedAliasesByEntityIdAttributeIds = diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/datafetcher/QueryServiceEntityFetcher.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/datafetcher/QueryServiceEntityFetcher.java index 8eb5da1f..42995f62 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/datafetcher/QueryServiceEntityFetcher.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/datafetcher/QueryServiceEntityFetcher.java @@ -44,7 +44,7 @@ import org.hypertrace.gateway.service.entity.EntitiesRequestContext; import org.hypertrace.gateway.service.entity.EntitiesRequestValidator; import org.hypertrace.gateway.service.entity.EntityKey; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; import org.hypertrace.gateway.service.v1.common.AggregatedMetricValue; import org.hypertrace.gateway.service.v1.common.FunctionExpression; import org.hypertrace.gateway.service.v1.common.FunctionType; @@ -70,15 +70,15 @@ public class QueryServiceEntityFetcher implements IEntityFetcher { private final EntitiesRequestValidator entitiesRequestValidator = new EntitiesRequestValidator(); private final QueryServiceClient queryServiceClient; private final AttributeMetadataProvider attributeMetadataProvider; - private final EntityIdColumnsConfigs entityIdColumnsConfigs; + private final EntityIdColumnsConfig entityIdColumnsConfig; public QueryServiceEntityFetcher( QueryServiceClient queryServiceClient, AttributeMetadataProvider attributeMetadataProvider, - EntityIdColumnsConfigs entityIdColumnsConfigs) { + EntityIdColumnsConfig entityIdColumnsConfig) { this.queryServiceClient = queryServiceClient; this.attributeMetadataProvider = attributeMetadataProvider; - this.entityIdColumnsConfigs = entityIdColumnsConfigs; + this.entityIdColumnsConfig = entityIdColumnsConfig; } @Override @@ -95,7 +95,7 @@ public EntityFetcherResponse getEntities( List entityIdAttributeIds = AttributeMetadataUtil.getIdAttributeIds( attributeMetadataProvider, - entityIdColumnsConfigs, + entityIdColumnsConfig, requestContext, entitiesRequest.getEntityType()); List aggregates = @@ -179,6 +179,7 @@ public EntityFetcherResponse getEntities( } } } + return new EntityFetcherResponse(entityBuilders); } @@ -352,7 +353,7 @@ public EntityFetcherResponse getTimeAggregatedMetrics( List idColumns = AttributeMetadataUtil.getIdAttributeIds( attributeMetadataProvider, - entityIdColumnsConfigs, + entityIdColumnsConfig, requestContext, entitiesRequest.getEntityType()); String timeColumn = @@ -525,7 +526,7 @@ public long getTotal(EntitiesRequestContext requestContext, EntitiesRequest enti List entityIdAttributeIds = AttributeMetadataUtil.getIdAttributeIds( attributeMetadataProvider, - entityIdColumnsConfigs, + entityIdColumnsConfig, requestContext, entitiesRequest.getEntityType()); diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/util/AttributeMetadataUtil.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/util/AttributeMetadataUtil.java index 50e57ad1..e0e0a4ae 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/util/AttributeMetadataUtil.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/util/AttributeMetadataUtil.java @@ -13,7 +13,7 @@ import org.hypertrace.gateway.service.common.AttributeMetadataProvider; import org.hypertrace.gateway.service.common.RequestContext; import org.hypertrace.gateway.service.common.exp.UnknownScopeAndKeyForAttributeException; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; import org.hypertrace.gateway.service.entity.config.TimestampConfigs; import org.hypertrace.gateway.service.v1.common.Expression; @@ -41,17 +41,17 @@ public class AttributeMetadataUtil { * * * @param attributeMetadataProvider - * @param entityIdColumnsConfigs + * @param entityIdColumnsConfig * @param requestContext * @param entityType * @return List of columns(AttributeMetadata ids) used to identify the id of the entity. */ public static List getIdAttributeIds( AttributeMetadataProvider attributeMetadataProvider, - EntityIdColumnsConfigs entityIdColumnsConfigs, + EntityIdColumnsConfig entityIdColumnsConfig, RequestContext requestContext, String entityType) { - return entityIdColumnsConfigs.getIdKey(entityType).stream() + return entityIdColumnsConfig.getIdKey(entityType).stream() .map( idKey -> attributeMetadataProvider.getAttributeMetadata(requestContext, entityType, idKey)) diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/EntityService.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/EntityService.java index 47f490ac..59dc2e55 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/EntityService.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/EntityService.java @@ -31,7 +31,7 @@ import org.hypertrace.gateway.service.common.AttributeMetadataProvider; import org.hypertrace.gateway.service.common.OrderByPercentileSizeSetter; import org.hypertrace.gateway.service.common.RequestContext; -import org.hypertrace.gateway.service.common.config.ScopeFilterConfigs; +import org.hypertrace.gateway.service.common.config.GatewayServiceConfig; import org.hypertrace.gateway.service.common.converters.Converter; import org.hypertrace.gateway.service.common.datafetcher.EntityDataServiceEntityFetcher; import org.hypertrace.gateway.service.common.datafetcher.EntityFetcherResponse; @@ -43,8 +43,6 @@ import org.hypertrace.gateway.service.common.util.AttributeMetadataUtil; import org.hypertrace.gateway.service.common.util.QueryExpressionUtil; import org.hypertrace.gateway.service.common.util.QueryServiceClient; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; -import org.hypertrace.gateway.service.entity.config.LogConfig; import org.hypertrace.gateway.service.entity.converter.EntityConverterModule; import org.hypertrace.gateway.service.entity.query.EntityExecutionContext; import org.hypertrace.gateway.service.entity.query.ExecutionTreeBuilder; @@ -78,42 +76,40 @@ public class EntityService { private static final Logger LOG = LoggerFactory.getLogger(EntityService.class); - private static final UpdateEntityRequestValidator updateEntityRequestValidator = + private static final UpdateEntityRequestValidator UPDATE_ENTITY_REQUEST_VALIDATOR = new UpdateEntityRequestValidator(); private static final BulkUpdateEntitiesRequestValidator BULK_UPDATE_ENTITIES_REQUEST_VALIDATOR = new BulkUpdateEntitiesRequestValidator(); + + private final GatewayServiceConfig gatewayServiceConfig; private final AttributeMetadataProvider metadataProvider; - private final EntityIdColumnsConfigs entityIdColumnsConfigs; private final ExecutorService queryExecutor; private final EntityInteractionsFetcher interactionsFetcher; private final RequestPreProcessor requestPreProcessor; private final ResponsePostProcessor responsePostProcessor; private final EdsEntityUpdater edsEntityUpdater; private final EntityQueryServiceBlockingStub eqsStub; - private final LogConfig logConfig; // Metrics private Timer queryBuildTimer; private Timer queryExecutionTimer; public EntityService( + GatewayServiceConfig gatewayServiceConfig, QueryServiceClient qsClient, EntityQueryServiceClient edsQueryServiceClient, final EntityQueryServiceBlockingStub eqsStub, AttributeMetadataProvider metadataProvider, - EntityIdColumnsConfigs entityIdColumnsConfigs, - ScopeFilterConfigs scopeFilterConfigs, - LogConfig logConfig, ExecutorService queryExecutor) { + this.gatewayServiceConfig = gatewayServiceConfig; this.metadataProvider = metadataProvider; - this.entityIdColumnsConfigs = entityIdColumnsConfigs; this.queryExecutor = queryExecutor; this.interactionsFetcher = new EntityInteractionsFetcher(qsClient, metadataProvider, queryExecutor); - this.requestPreProcessor = new RequestPreProcessor(metadataProvider, scopeFilterConfigs); + this.requestPreProcessor = + new RequestPreProcessor(metadataProvider, gatewayServiceConfig.getScopeFilterConfigs()); this.responsePostProcessor = new ResponsePostProcessor(); this.edsEntityUpdater = new EdsEntityUpdater(edsQueryServiceClient); this.eqsStub = eqsStub; - this.logConfig = logConfig; registerEntityFetchers(qsClient, edsQueryServiceClient); initMetrics(); @@ -125,11 +121,13 @@ private void registerEntityFetchers( registry.registerEntityFetcher( AttributeSource.QS.name(), new QueryServiceEntityFetcher( - queryServiceClient, metadataProvider, entityIdColumnsConfigs)); + queryServiceClient, metadataProvider, gatewayServiceConfig.getEntityIdColumnsConfig())); registry.registerEntityFetcher( AttributeSource.EDS.name(), new EntityDataServiceEntityFetcher( - edsQueryServiceClient, metadataProvider, entityIdColumnsConfigs)); + edsQueryServiceClient, + metadataProvider, + gatewayServiceConfig.getEntityIdColumnsConfig())); } private void initMetrics() { @@ -177,8 +175,8 @@ public EntitiesResponse getEntities( EntityExecutionContext executionContext = new EntityExecutionContext( + gatewayServiceConfig, metadataProvider, - entityIdColumnsConfigs, entitiesRequestContext, preProcessedRequest.get()); ExecutionTreeBuilder executionTreeBuilder = new ExecutionTreeBuilder(executionContext); @@ -216,7 +214,7 @@ public EntitiesResponse getEntities( results.forEach(e -> responseBuilder.addEntity(e.build())); long queryExecutionTime = Duration.between(start, Instant.now()).toMillis(); - if (queryExecutionTime > logConfig.getQueryThresholdInMillis()) { + if (queryExecutionTime > gatewayServiceConfig.getLogConfig().getQueryThresholdInMillis()) { LOG.info( "Total query execution took: {}(ms) for request: {}", queryExecutionTime, @@ -275,7 +273,7 @@ public UpdateEntityResponse updateEntity( Map attributeMetadataMap = metadataProvider.getAttributesMetadata(requestContext, request.getEntityType()); - updateEntityRequestValidator.validate(request, attributeMetadataMap); + UPDATE_ENTITY_REQUEST_VALIDATOR.validate(request, attributeMetadataMap); UpdateExecutionContext updateExecutionContext = new UpdateExecutionContext(requestContext.getHeaders(), attributeMetadataMap); @@ -352,7 +350,10 @@ private Filter createEntityKeysInFilter( List idAttributeIds = AttributeMetadataUtil.getIdAttributeIds( - metadataProvider, entityIdColumnsConfigs, requestContext, entityType); + metadataProvider, + gatewayServiceConfig.getEntityIdColumnsConfig(), + requestContext, + entityType); if (idAttributeIds.size() != 1) { LOG.error("Entity Type {} should have single ID Attribute", entityType); diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/config/EntityIdColumnsConfigs.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/config/EntityIdColumnsConfig.java similarity index 77% rename from gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/config/EntityIdColumnsConfigs.java rename to gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/config/EntityIdColumnsConfig.java index be679f50..c15f07bf 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/config/EntityIdColumnsConfigs.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/config/EntityIdColumnsConfig.java @@ -6,7 +6,7 @@ import java.util.Map; import java.util.Optional; -public class EntityIdColumnsConfigs { +public class EntityIdColumnsConfig { private static final String ENTITY_ID_COLUMN_CONFIG = "entity.idcolumn.config"; // Backwards compatibility. private static final String DOMAIN_OBJECT_CONFIG = "domainobject.config"; @@ -15,17 +15,17 @@ public class EntityIdColumnsConfigs { private final Map scopeToKeyMap; - public static EntityIdColumnsConfigs fromConfig(Config config) { + public static EntityIdColumnsConfig fromConfig(Config config) { if (config.hasPath(ENTITY_ID_COLUMN_CONFIG)) { return fromConfigList(config.getConfigList(ENTITY_ID_COLUMN_CONFIG)); } else if (config.hasPath(DOMAIN_OBJECT_CONFIG)) { return fromConfigList(config.getConfigList(DOMAIN_OBJECT_CONFIG)); } else { - return new EntityIdColumnsConfigs(Map.of()); + return new EntityIdColumnsConfig(Map.of()); } } - private static EntityIdColumnsConfigs fromConfigList(List configs) { + private static EntityIdColumnsConfig fromConfigList(List configs) { ImmutableMap.Builder scopeToKeyMapBuilder = ImmutableMap.builder(); for (Config scopeConfig : configs) { String scope = scopeConfig.getString(SCOPE); @@ -33,10 +33,10 @@ private static EntityIdColumnsConfigs fromConfigList(List conf scopeToKeyMapBuilder.put(scope, key); } - return new EntityIdColumnsConfigs(scopeToKeyMapBuilder.build()); + return new EntityIdColumnsConfig(scopeToKeyMapBuilder.build()); } - public EntityIdColumnsConfigs(Map scopeToKeyMap) { + public EntityIdColumnsConfig(Map scopeToKeyMap) { this.scopeToKeyMap = scopeToKeyMap; } diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/query/DataFetcherNode.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/query/DataFetcherNode.java index d057b199..c0b17ef1 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/query/DataFetcherNode.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/query/DataFetcherNode.java @@ -19,13 +19,26 @@ public class DataFetcherNode implements QueryNode { private Integer limit; private Integer offset; private List orderByExpressionList = Collections.emptyList(); - private final boolean canFetchTotal; + private final QueryNode childNode; + public DataFetcherNode(String source, Filter filter) { this.source = source; this.filter = filter; - this.canFetchTotal = false; // total would be computed in memory + this.childNode = new NoOpNode(); + + // total would be computed in memory + this.canFetchTotal = false; + } + + public DataFetcherNode(String source, Filter filter, QueryNode childNode) { + this.source = source; + this.filter = filter; + this.childNode = childNode; + + // total would be computed in memory + this.canFetchTotal = false; } public DataFetcherNode( @@ -40,6 +53,28 @@ public DataFetcherNode( this.limit = limit; this.offset = offset; this.orderByExpressionList = orderByExpressionList; + this.childNode = new NoOpNode(); + + boolean isPaginated = limit != null && offset != null; + // should only fetch total, if the pagination is pushed down to the data store + // and total has been requested by the client + this.canFetchTotal = isPaginated && canFetchTotal; + } + + public DataFetcherNode( + String source, + Filter filter, + Integer limit, + Integer offset, + List orderByExpressionList, + boolean canFetchTotal, + QueryNode childNode) { + this.source = source; + this.filter = filter; + this.limit = limit; + this.offset = offset; + this.orderByExpressionList = orderByExpressionList; + this.childNode = childNode; boolean isPaginated = limit != null && offset != null; // should only fetch total, if the pagination is pushed down to the data store @@ -71,6 +106,10 @@ public boolean canFetchTotal() { return canFetchTotal; } + public QueryNode getChildNode() { + return childNode; + } + @Override public R acceptVisitor(Visitor v) { return v.visit(this); @@ -90,8 +129,10 @@ public String toString() { + offset + ", orderByExpressionList=" + orderByExpressionList - + ", fetchTotal=" + + ", canFetchTotal=" + canFetchTotal + + ", childNode=" + + childNode + '}'; } } diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/query/EntityExecutionContext.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/query/EntityExecutionContext.java index 3b60f3a6..8652770e 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/query/EntityExecutionContext.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/query/EntityExecutionContext.java @@ -12,11 +12,11 @@ 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.config.GatewayServiceConfig; import org.hypertrace.gateway.service.common.util.AttributeMetadataUtil; import org.hypertrace.gateway.service.common.util.ExpressionReader; import org.hypertrace.gateway.service.common.util.QueryExpressionUtil; import org.hypertrace.gateway.service.entity.EntitiesRequestContext; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; import org.hypertrace.gateway.service.v1.common.Expression; import org.hypertrace.gateway.service.v1.common.Expression.Builder; import org.hypertrace.gateway.service.v1.entity.EntitiesRequest; @@ -27,9 +27,9 @@ */ public class EntityExecutionContext { /** Following fields are immutable and set in the constructor * */ - private final AttributeMetadataProvider attributeMetadataProvider; + private final GatewayServiceConfig gatewayServiceConfig; - private final EntityIdColumnsConfigs entityIdColumnsConfigs; + private final AttributeMetadataProvider attributeMetadataProvider; private final EntitiesRequestContext entitiesRequestContext; private final EntitiesRequest entitiesRequest; @@ -45,12 +45,12 @@ public class EntityExecutionContext { private boolean sortAndPaginationNodeAdded = false; public EntityExecutionContext( + GatewayServiceConfig gatewayServiceConfig, AttributeMetadataProvider attributeMetadataProvider, - EntityIdColumnsConfigs entityIdColumnsConfigs, EntitiesRequestContext entitiesRequestContext, EntitiesRequest entitiesRequest) { + this.gatewayServiceConfig = gatewayServiceConfig; this.attributeMetadataProvider = attributeMetadataProvider; - this.entityIdColumnsConfigs = entityIdColumnsConfigs; this.entitiesRequest = entitiesRequest; this.entitiesRequestContext = entitiesRequestContext; @@ -59,6 +59,7 @@ public EntityExecutionContext( this.entitiesRequestContext, entitiesRequestContext.getEntityType()); this.expressionContext = new ExpressionContext( + gatewayServiceConfig, attributeMetadataMap, entitiesRequest.getFilter(), entitiesRequest.getSelectionList(), @@ -131,7 +132,7 @@ public List getEntityIdExpressions() { List entityIdAttributeNames = AttributeMetadataUtil.getIdAttributeIds( attributeMetadataProvider, - entityIdColumnsConfigs, + gatewayServiceConfig.getEntityIdColumnsConfig(), this.entitiesRequestContext, entitiesRequestContext.getEntityType()); return IntStream.range(0, entityIdAttributeNames.size()) @@ -201,14 +202,14 @@ private void buildOrderByPendingSources() { @Override public String toString() { return "EntityExecutionContext{" - + "attributeMetadataProvider=" + + "gatewayServiceConfig=" + + gatewayServiceConfig + + ", attributeMetadataProvider=" + attributeMetadataProvider - + ", entityIdColumnsConfigs=" - + entityIdColumnsConfigs - + ", entitiesRequest=" - + entitiesRequest + ", entitiesRequestContext=" + entitiesRequestContext + + ", entitiesRequest=" + + entitiesRequest + ", expressionContext=" + expressionContext + ", pendingSelectionSources=" diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/query/ExecutionTreeBuilder.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/query/ExecutionTreeBuilder.java index aa9aea22..fc043828 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/query/ExecutionTreeBuilder.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/query/ExecutionTreeBuilder.java @@ -1,12 +1,19 @@ package org.hypertrace.gateway.service.entity.query; +import static java.util.Collections.emptyList; +import static java.util.Collections.emptyMap; +import static java.util.Collections.unmodifiableList; import static org.hypertrace.core.attribute.service.v1.AttributeSource.EDS; import static org.hypertrace.core.attribute.service.v1.AttributeSource.QS; import com.google.common.annotations.VisibleForTesting; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.EnumMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -19,6 +26,7 @@ import org.hypertrace.gateway.service.entity.query.visitor.ExecutionContextBuilderVisitor; import org.hypertrace.gateway.service.entity.query.visitor.FilterOptimizingVisitor; import org.hypertrace.gateway.service.entity.query.visitor.PrintVisitor; +import org.hypertrace.gateway.service.v1.common.Expression; import org.hypertrace.gateway.service.v1.common.Filter; import org.hypertrace.gateway.service.v1.common.Operator; import org.hypertrace.gateway.service.v1.common.OrderByExpression; @@ -147,13 +155,21 @@ public QueryNode build() { * {@link FilterOptimizingVisitor} is needed to merge filters corresponding to the same source * into one {@link DataFetcherNode}, instead of having multiple {@link DataFetcherNode}s for * each filter + * + *

It is not needed for AND filter, since the filter tree is already optimised with a single + * data fetcher node for each source */ - QueryNode optimizedFilterTree = filterTree.acceptVisitor(new FilterOptimizingVisitor()); - if (LOG.isDebugEnabled()) { - LOG.debug("Optimized Filter Tree:{}", optimizedFilterTree.acceptVisitor(new PrintVisitor())); + + // TODO: Can be extended to OR filter in future + boolean isAndFilter = executionContext.getExpressionContext().isAndFilter(); + if (!isAndFilter) { + filterTree = filterTree.acceptVisitor(new FilterOptimizingVisitor()); + if (LOG.isDebugEnabled()) { + LOG.debug("Optimized Filter Tree:{}", filterTree.acceptVisitor(new PrintVisitor())); + } } - QueryNode executionTree = buildExecutionTree(executionContext, optimizedFilterTree); + QueryNode executionTree = buildExecutionTree(executionContext, filterTree); if (LOG.isDebugEnabled()) { LOG.debug("Execution Tree:{}", executionTree.acceptVisitor(new PrintVisitor())); } @@ -264,7 +280,10 @@ QueryNode buildFilterTree(EntityExecutionContext context, Filter filter) { entitiesRequest.getStartTimeMillis(), entitiesRequest.getEndTimeMillis()); - return buildFilterTree(entitiesRequest, timeRangeFilter); + boolean isAndFilter = executionContext.getExpressionContext().isAndFilter(); + return isAndFilter + ? buildAndFilterTree(entitiesRequest) + : buildFilterTree(entitiesRequest, timeRangeFilter); } @VisibleForTesting @@ -284,13 +303,7 @@ QueryNode buildFilterTree(EntitiesRequest entitiesRequest, Filter filter) { .map(childFilter -> buildFilterTree(entitiesRequest, childFilter)) .collect(Collectors.toList())); } else { - List sources = - attributeMetadataMap - .get( - ExpressionReader.getAttributeIdFromAttributeSelection(filter.getLhs()) - .orElseThrow()) - .getSourcesList(); - + List sources = getAttributeSources(filter.getLhs()); // if the filter by and order by are from QS, pagination can be pushed down to QS // There will always be a DataFetcherNode for QS, because the results are always fetched @@ -305,6 +318,106 @@ QueryNode buildFilterTree(EntitiesRequest entitiesRequest, Filter filter) { } } + // filters and order by on QS, but you can still have selection on EDS + QueryNode buildAndFilterTree(EntitiesRequest entitiesRequest) { + // If the filter by and order by are from QS (and selections are on other sources), pagination + // can be pushed down to QS + // Since the filter and order by are from QS, there won't be any filter on other + // sources + if (sourceSetsIfFilterAndOrderByAreFromSameSourceSets.contains(QS.name())) { + executionContext.setSortAndPaginationNodeAdded(true); + return createQsDataFetcherNodeWithLimitAndOffset(entitiesRequest); + } + + Map sourceToAndFilterMap = + new EnumMap<>(buildSourceToAndFilterMap(entitiesRequest.getFilter())); + + // qs node as the pivot node to fetch time range data + QueryNode qsNode = + new DataFetcherNode( + QS.name(), sourceToAndFilterMap.getOrDefault(QS, Filter.getDefaultInstance())); + // removing QS from the map, since we have a data fetcher node for QS + sourceToAndFilterMap.remove(QS); + + // If there are no filter sources apart from QS + if (sourceToAndFilterMap.isEmpty()) { + return qsNode; + } else if (sourceToAndFilterMap.size() == 1) { + // if there is only one remaining filter source, we can push pagination down to the source + Map.Entry entry = sourceToAndFilterMap.entrySet().iterator().next(); + AttributeSource source = entry.getKey(); + Filter andFilter = entry.getValue(); + + Map> sourceToOrderByExpressions = + executionContext.getExpressionContext().getSourceToOrderByExpressionMap(); + + // We should always fetch total when there is only one remaining filter source + + // If the order by is on QS, or any other source (other than the remaining filter source), we + // can push pagination and total to the remaining source, but we would need a + // SortAndPaginateNode to sort the paginated results. + // SortAndPaginateNode would be added by later steps in the execution tree builder phase + boolean canPaginateOnSource = + !sourceToOrderByExpressions.containsKey(QS.name()) + || (sourceToOrderByExpressions.containsKey(source.name()) + && sourceToOrderByExpressions.size() == 1); + if (canPaginateOnSource) { + executionContext.setSortAndPaginationNodeAdded(true); + } + + return new DataFetcherNode( + source.name(), + andFilter, + entitiesRequest.getLimit(), + entitiesRequest.getOffset(), + sourceToOrderByExpressions.getOrDefault(source, emptyList()), + entitiesRequest.getFetchTotal(), + qsNode); + } else { + // if there are multiple filter sources + List dataFetcherNodes = new ArrayList<>(); + for (Map.Entry entry : sourceToAndFilterMap.entrySet()) { + AttributeSource source = entry.getKey(); + Filter andFilter = entry.getValue(); + + dataFetcherNodes.add(new DataFetcherNode(source.name(), andFilter, qsNode)); + } + + return new AndNode(unmodifiableList(dataFetcherNodes)); + } + } + + private Map buildSourceToAndFilterMap(Filter filter) { + Operator operator = filter.getOperator(); + if (operator == Operator.AND) { + return filter.getChildFilterList().stream() + .map(this::buildSourceToAndFilterMap) + .flatMap(map -> map.entrySet().stream()) + .collect( + Collectors.toUnmodifiableMap( + Entry::getKey, + Entry::getValue, + (value1, value2) -> + Filter.newBuilder() + .setOperator(Operator.AND) + .addChildFilter(value1) + .addChildFilter(value2) + .build())); + + } else if (operator == Operator.OR) { + return Collections.emptyMap(); + } else { + List attributeSources = getAttributeSources(filter.getLhs()); + if (attributeSources.isEmpty()) { + return emptyMap(); + } + + return attributeSources.contains(QS) + ? Map.of(QS, filter) + : Map.of(attributeSources.get(0), filter); + } + } + private QueryNode checkAndAddSortAndPaginationNode( QueryNode childNode, EntityExecutionContext executionContext) { EntitiesRequest entitiesRequest = executionContext.getEntitiesRequest(); @@ -366,4 +479,12 @@ private QueryNode createQsDataFetcherNodeWithLimitAndOffset(EntitiesRequest enti private QueryNode createPaginateOnlyNode(QueryNode queryNode, EntitiesRequest entitiesRequest) { return new PaginateOnlyNode(queryNode, entitiesRequest.getLimit(), entitiesRequest.getOffset()); } + + public List getAttributeSources(Expression expression) { + Set attributeIds = ExpressionReader.extractAttributeIds(expression); + return attributeIds.stream() + .map(attributeId -> attributeMetadataMap.get(attributeId).getSourcesList()) + .flatMap(Collection::stream) + .collect(Collectors.toUnmodifiableList()); + } } diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/query/visitor/ExecutionContextBuilderVisitor.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/query/visitor/ExecutionContextBuilderVisitor.java index e99d7ca6..7f3609d6 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/query/visitor/ExecutionContextBuilderVisitor.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/query/visitor/ExecutionContextBuilderVisitor.java @@ -84,7 +84,7 @@ public Void visit(DataFetcherNode dataFetcherNode) { executionContext::removePendingSelectionSourceForOrderBy); } - return null; + return dataFetcherNode.getChildNode().acceptVisitor(this); } @Override diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/query/visitor/ExecutionVisitor.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/query/visitor/ExecutionVisitor.java index b3c48ed4..f5e372ea 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/query/visitor/ExecutionVisitor.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/entity/query/visitor/ExecutionVisitor.java @@ -30,6 +30,7 @@ import org.hypertrace.gateway.service.entity.query.NoOpNode; import org.hypertrace.gateway.service.entity.query.OrNode; import org.hypertrace.gateway.service.entity.query.PaginateOnlyNode; +import org.hypertrace.gateway.service.entity.query.QueryNode; import org.hypertrace.gateway.service.entity.query.SelectionNode; import org.hypertrace.gateway.service.entity.query.SortAndPaginateNode; import org.hypertrace.gateway.service.v1.common.Expression; @@ -118,6 +119,17 @@ protected static EntityResponse union(List entityResponses) { @Override public EntityResponse visit(DataFetcherNode dataFetcherNode) { + QueryNode childNode = dataFetcherNode.getChildNode(); + + EntityResponse childNodeResponse = dataFetcherNode.getChildNode().acceptVisitor(this); + EntityFetcherResponse childEntityFetcherResponse = null; + Filter childFilter = null; + if (!(childNode instanceof NoOpNode)) { + // Construct the filter from the child nodes result + childEntityFetcherResponse = childNodeResponse.getEntityFetcherResponse(); + childFilter = constructFilterFromChildNodesResult(childEntityFetcherResponse); + } + String source = dataFetcherNode.getSource(); EntitiesRequest entitiesRequest = executionContext.getEntitiesRequest(); EntitiesRequestContext context = @@ -128,6 +140,15 @@ public EntityResponse visit(DataFetcherNode dataFetcherNode) { entitiesRequest.getEntityType(), executionContext.getTimestampAttributeId()); + Filter entitiesRequestFilter = + childFilter != null + ? Filter.newBuilder() + .setOperator(Operator.AND) + .addChildFilter(dataFetcherNode.getFilter()) + .addChildFilter(childFilter) + .build() + : dataFetcherNode.getFilter(); + EntitiesRequest.Builder requestBuilder = EntitiesRequest.newBuilder(entitiesRequest) .clearSelection() @@ -141,7 +162,7 @@ public EntityResponse visit(DataFetcherNode dataFetcherNode) { .getExpressionContext() .getSourceToSelectionExpressionMap() .getOrDefault(source, executionContext.getEntityIdExpressions())) - .setFilter(dataFetcherNode.getFilter()); + .setFilter(entitiesRequestFilter); if (dataFetcherNode.getLimit() != null) { requestBuilder.setLimit(dataFetcherNode.getLimit()); @@ -160,17 +181,28 @@ public EntityResponse visit(DataFetcherNode dataFetcherNode) { // if the data fetcher node is fetching paginated records and the client has requested for // total, the total number of entities has to be fetched separately + + EntityFetcherResponse response; if (dataFetcherNode.canFetchTotal()) { // since, the pagination is pushed down to the data store, total can be requested directly // from the data store. Request it async to parallelize with rest of entity fetch CompletableFuture totalFuture = CompletableFuture.supplyAsync( - () -> entityFetcher.getTotal(context, entitiesRequest), this.executorService); - return new EntityResponse(entityFetcher.getEntities(context, request), totalFuture.join()); + () -> entityFetcher.getTotal(context, request), this.executorService); + EntityFetcherResponse entityFetcherResponse = entityFetcher.getEntities(context, request); + response = + childEntityFetcherResponse != null + ? intersectEntities(List.of(childEntityFetcherResponse, entityFetcherResponse)) + : entityFetcherResponse; + return new EntityResponse(response, totalFuture.join()); } else { // if the data fetcher node is not paginating, the total number of entities is equal to number // of records fetched - EntityFetcherResponse response = entityFetcher.getEntities(context, request); + EntityFetcherResponse entityFetcherResponse = entityFetcher.getEntities(context, request); + response = + childEntityFetcherResponse != null + ? intersectEntities(List.of(childEntityFetcherResponse, entityFetcherResponse)) + : entityFetcherResponse; return new EntityResponse(response, response.getEntityKeyBuilderMap().size()); } } 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 f2bd3c5f..91fba039 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 @@ -18,10 +18,10 @@ import org.hypertrace.gateway.service.common.AttributeMetadataProvider; import org.hypertrace.gateway.service.common.ExpressionContext; import org.hypertrace.gateway.service.common.RequestContext; -import org.hypertrace.gateway.service.common.config.ScopeFilterConfigs; +import org.hypertrace.gateway.service.common.config.GatewayServiceConfig; import org.hypertrace.gateway.service.common.datafetcher.QueryServiceEntityFetcher; import org.hypertrace.gateway.service.common.util.QueryServiceClient; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; import org.hypertrace.gateway.service.explore.entity.EntityRequestHandler; import org.hypertrace.gateway.service.explore.entity.EntityServiceEntityFetcher; import org.hypertrace.gateway.service.v1.explore.ExploreRequest; @@ -29,6 +29,7 @@ public class ExploreService { + private final GatewayServiceConfig gatewayServiceConfig; private final AttributeMetadataProvider attributeMetadataProvider; private final ExploreRequestValidator exploreRequestValidator = new ExploreRequestValidator(); @@ -36,37 +37,39 @@ public class ExploreService { private final TimeAggregationsRequestHandler timeAggregationsRequestHandler; private final TimeAggregationsWithGroupByRequestHandler timeAggregationsWithGroupByRequestHandler; private final EntityRequestHandler entityRequestHandler; - private final ScopeFilterConfigs scopeFilterConfigs; private final EntityTypesProvider entityTypesProvider; private Timer queryExecutionTimer; public ExploreService( + GatewayServiceConfig gatewayServiceConfig, QueryServiceClient queryServiceClient, EntityQueryServiceClient entityQueryServiceClient, AttributeMetadataProvider attributeMetadataProvider, - ScopeFilterConfigs scopeFiltersConfig, - EntityIdColumnsConfigs entityIdColumnsConfigs, EntityTypesProvider entityTypesProvider) { + this.gatewayServiceConfig = gatewayServiceConfig; + EntityIdColumnsConfig entityIdColumnsConfig = gatewayServiceConfig.getEntityIdColumnsConfig(); QueryServiceEntityFetcher queryServiceEntityFetcher = new QueryServiceEntityFetcher( - queryServiceClient, attributeMetadataProvider, entityIdColumnsConfigs); + queryServiceClient, attributeMetadataProvider, entityIdColumnsConfig); EntityServiceEntityFetcher entityServiceEntityFetcher = new EntityServiceEntityFetcher( - attributeMetadataProvider, entityIdColumnsConfigs, entityQueryServiceClient); + attributeMetadataProvider, + gatewayServiceConfig.getEntityIdColumnsConfig(), + entityQueryServiceClient); this.attributeMetadataProvider = attributeMetadataProvider; this.normalRequestHandler = new RequestHandler( queryServiceClient, attributeMetadataProvider, - entityIdColumnsConfigs, + entityIdColumnsConfig, queryServiceEntityFetcher, entityServiceEntityFetcher); this.timeAggregationsRequestHandler = new TimeAggregationsRequestHandler( queryServiceClient, attributeMetadataProvider, - entityIdColumnsConfigs, + entityIdColumnsConfig, queryServiceEntityFetcher, entityServiceEntityFetcher); this.timeAggregationsWithGroupByRequestHandler = @@ -75,11 +78,10 @@ public ExploreService( this.entityRequestHandler = new EntityRequestHandler( attributeMetadataProvider, - entityIdColumnsConfigs, + entityIdColumnsConfig, queryServiceClient, queryServiceEntityFetcher, entityServiceEntityFetcher); - this.scopeFilterConfigs = scopeFiltersConfig; this.entityTypesProvider = entityTypesProvider; initMetrics(); } @@ -101,11 +103,13 @@ public ExploreResponse explore(RequestContext requestContext, ExploreRequest req request = ExploreRequest.newBuilder(request) .setFilter( - scopeFilterConfigs.createScopeFilter( - request.getContext(), - request.getFilter(), - attributeMetadataProvider, - exploreRequestContext)) + gatewayServiceConfig + .getScopeFilterConfigs() + .createScopeFilter( + request.getContext(), + request.getFilter(), + attributeMetadataProvider, + exploreRequestContext)) .build(); ExploreRequestContext newExploreRequestContext = new ExploreRequestContext(requestContext.getGrpcContext(), request); @@ -147,6 +151,7 @@ private IRequestHandler getRequestHandler( && !request.getGroupByList().isEmpty()) { ExpressionContext expressionContext = new ExpressionContext( + gatewayServiceConfig, attributeMetadataMap, request.getFilter(), request.getSelectionList(), 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 3ed30bc2..813b25be 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 @@ -33,7 +33,7 @@ import org.hypertrace.gateway.service.common.util.QueryExpressionUtil; import org.hypertrace.gateway.service.common.util.QueryServiceClient; import org.hypertrace.gateway.service.entity.EntitiesRequestContext; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; import org.hypertrace.gateway.service.explore.entity.EntityServiceEntityFetcher; import org.hypertrace.gateway.service.v1.common.Expression; import org.hypertrace.gateway.service.v1.common.FunctionExpression; @@ -67,20 +67,20 @@ public class RequestHandler implements RequestHandlerWithSorting { private final QueryServiceClient queryServiceClient; private final AttributeMetadataProvider attributeMetadataProvider; private final TheRestGroupRequestHandler theRestGroupRequestHandler; - private final EntityIdColumnsConfigs entityIdColumnsConfigs; + private final EntityIdColumnsConfig entityIdColumnsConfig; private final QueryServiceEntityFetcher queryServiceEntityFetcher; private final EntityServiceEntityFetcher entityServiceEntityFetcher; public RequestHandler( QueryServiceClient queryServiceClient, AttributeMetadataProvider attributeMetadataProvider, - EntityIdColumnsConfigs entityIdColumnsConfigs, + EntityIdColumnsConfig entityIdColumnsConfig, QueryServiceEntityFetcher queryServiceEntityFetcher, EntityServiceEntityFetcher entityServiceEntityFetcher) { this.queryServiceClient = queryServiceClient; this.attributeMetadataProvider = attributeMetadataProvider; this.theRestGroupRequestHandler = new TheRestGroupRequestHandler(this); - this.entityIdColumnsConfigs = entityIdColumnsConfigs; + this.entityIdColumnsConfig = entityIdColumnsConfig; this.queryServiceEntityFetcher = queryServiceEntityFetcher; this.entityServiceEntityFetcher = entityServiceEntityFetcher; } @@ -203,7 +203,7 @@ private ExploreRequest buildExploreRequest( org.hypertrace.gateway.service.v1.common.Filter edsFilter) { List entityIdAttributeIds = AttributeMetadataUtil.getIdAttributeIds( - attributeMetadataProvider, entityIdColumnsConfigs, exploreRequestContext, context); + attributeMetadataProvider, entityIdColumnsConfig, exploreRequestContext, context); List groupBySelections = entityIdAttributeIds.stream() .map(attributeId -> QueryExpressionUtil.buildAttributeExpression(attributeId).build()) @@ -304,7 +304,7 @@ Filter constructQueryServiceFilter( attributeMetadataProvider, exploreRequestContext, request.getContext()), AttributeMetadataUtil.getIdAttributeIds( attributeMetadataProvider, - entityIdColumnsConfigs, + entityIdColumnsConfig, exploreRequestContext, request.getContext()), requestFilter); 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 4dfe6484..97f704b9 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 @@ -20,7 +20,7 @@ import org.hypertrace.gateway.service.common.util.ExpressionReader; import org.hypertrace.gateway.service.common.util.QueryExpressionUtil; import org.hypertrace.gateway.service.common.util.QueryServiceClient; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; import org.hypertrace.gateway.service.explore.entity.EntityServiceEntityFetcher; import org.hypertrace.gateway.service.v1.common.OrderByExpression; import org.hypertrace.gateway.service.v1.common.Period; @@ -39,13 +39,13 @@ public class TimeAggregationsRequestHandler extends RequestHandler { TimeAggregationsRequestHandler( QueryServiceClient queryServiceClient, AttributeMetadataProvider attributeMetadataProvider, - EntityIdColumnsConfigs entityIdColumnsConfigs, + EntityIdColumnsConfig entityIdColumnsConfig, QueryServiceEntityFetcher queryServiceEntityFetcher, EntityServiceEntityFetcher entityServiceEntityFetcher) { super( queryServiceClient, attributeMetadataProvider, - entityIdColumnsConfigs, + entityIdColumnsConfig, queryServiceEntityFetcher, entityServiceEntityFetcher); } 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 5c0f8594..d76df61c 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 @@ -8,7 +8,7 @@ import org.hypertrace.gateway.service.common.datafetcher.QueryServiceEntityFetcher; import org.hypertrace.gateway.service.common.util.DataCollectionUtil; import org.hypertrace.gateway.service.common.util.QueryServiceClient; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; import org.hypertrace.gateway.service.explore.ExploreRequestContext; import org.hypertrace.gateway.service.explore.RequestHandler; import org.hypertrace.gateway.service.explore.RowComparator; @@ -40,14 +40,14 @@ public class EntityRequestHandler extends RequestHandler { public EntityRequestHandler( AttributeMetadataProvider attributeMetadataProvider, - EntityIdColumnsConfigs entityIdColumnsConfigs, + EntityIdColumnsConfig entityIdColumnsConfig, QueryServiceClient queryServiceClient, QueryServiceEntityFetcher queryServiceEntityFetcher, EntityServiceEntityFetcher entityServiceEntityFetcher) { super( queryServiceClient, attributeMetadataProvider, - entityIdColumnsConfigs, + entityIdColumnsConfig, queryServiceEntityFetcher, entityServiceEntityFetcher); this.attributeMetadataProvider = attributeMetadataProvider; diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/entity/EntityServiceEntityFetcher.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/entity/EntityServiceEntityFetcher.java index 1bbeb0c8..0c55ad90 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/entity/EntityServiceEntityFetcher.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/entity/EntityServiceEntityFetcher.java @@ -25,7 +25,7 @@ import org.hypertrace.gateway.service.common.util.AttributeMetadataUtil; import org.hypertrace.gateway.service.common.util.ExpressionReader; import org.hypertrace.gateway.service.common.util.MetricAggregationFunctionUtil; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; import org.hypertrace.gateway.service.explore.ExploreRequestContext; import org.hypertrace.gateway.service.v1.common.FunctionExpression; import org.hypertrace.gateway.service.v1.common.Row; @@ -37,15 +37,15 @@ public class EntityServiceEntityFetcher { private static final Logger LOGGER = LoggerFactory.getLogger(EntityServiceEntityFetcher.class); private static final int DEFAULT_ENTITY_REQUEST_LIMIT = 10_000; private final AttributeMetadataProvider attributeMetadataProvider; - private final EntityIdColumnsConfigs entityIdColumnsConfigs; + private final EntityIdColumnsConfig entityIdColumnsConfig; private final EntityQueryServiceClient entityQueryServiceClient; public EntityServiceEntityFetcher( AttributeMetadataProvider attributeMetadataProvider, - EntityIdColumnsConfigs entityIdColumnsConfigs, + EntityIdColumnsConfig entityIdColumnsConfig, EntityQueryServiceClient entityQueryServiceClient) { this.attributeMetadataProvider = attributeMetadataProvider; - this.entityIdColumnsConfigs = entityIdColumnsConfigs; + this.entityIdColumnsConfig = entityIdColumnsConfig; this.entityQueryServiceClient = entityQueryServiceClient; } @@ -161,7 +161,7 @@ private EntityQueryRequest buildRequest( List entityIdAttributeIds = AttributeMetadataUtil.getIdAttributeIds( - attributeMetadataProvider, entityIdColumnsConfigs, requestContext, entityType); + attributeMetadataProvider, entityIdColumnsConfig, requestContext, entityType); EntityQueryRequest.Builder builder = EntityQueryRequest.newBuilder() .setEntityType(entityType) diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/trace/TracesService.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/trace/TracesService.java index 97fda508..f6742344 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/trace/TracesService.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/trace/TracesService.java @@ -26,7 +26,7 @@ import org.hypertrace.core.serviceframework.metrics.PlatformMetricsRegistry; import org.hypertrace.gateway.service.common.AttributeMetadataProvider; import org.hypertrace.gateway.service.common.RequestContext; -import org.hypertrace.gateway.service.common.config.ScopeFilterConfigs; +import org.hypertrace.gateway.service.common.config.GatewayServiceConfig; import org.hypertrace.gateway.service.common.converters.QueryAndGatewayDtoConverter; import org.hypertrace.gateway.service.common.transformer.RequestPreProcessor; import org.hypertrace.gateway.service.common.util.AttributeMetadataUtil; @@ -63,16 +63,17 @@ public class TracesService { private Timer queryExecutionTimer; public TracesService( + GatewayServiceConfig gatewayServiceConfig, QueryServiceClient queryServiceClient, AttributeMetadataProvider attributeMetadataProvider, - ScopeFilterConfigs scopeFilterConfigs, ExecutorService queryExecutor) { this.queryServiceClient = queryServiceClient; this.attributeMetadataProvider = attributeMetadataProvider; this.queryExecutor = queryExecutor; this.requestValidator = new TracesRequestValidator(); this.requestPreProcessor = - new RequestPreProcessor(attributeMetadataProvider, scopeFilterConfigs); + new RequestPreProcessor( + attributeMetadataProvider, gatewayServiceConfig.getScopeFilterConfigs()); initMetrics(); } diff --git a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/baseline/BaselineServiceImplTest.java b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/baseline/BaselineServiceImplTest.java index 213247a5..ff68e40b 100644 --- a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/baseline/BaselineServiceImplTest.java +++ b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/baseline/BaselineServiceImplTest.java @@ -18,7 +18,8 @@ import org.hypertrace.core.query.service.api.ResultSetChunk; import org.hypertrace.gateway.service.common.AttributeMetadataProvider; import org.hypertrace.gateway.service.common.RequestContext; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; +import org.hypertrace.gateway.service.common.config.GatewayServiceConfig; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; import org.hypertrace.gateway.service.v1.baseline.BaselineEntitiesRequest; import org.hypertrace.gateway.service.v1.baseline.BaselineEntitiesResponse; import org.hypertrace.gateway.service.v1.baseline.BaselineEntity; @@ -32,6 +33,7 @@ import org.hypertrace.gateway.service.v1.common.Value; import org.hypertrace.gateway.service.v1.common.ValueType; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -49,7 +51,13 @@ public class BaselineServiceImplTest { Mockito.mock(BaselineServiceQueryExecutor.class); private final BaselineServiceQueryParser baselineServiceQueryParser = new BaselineServiceQueryParser(attributeMetadataProvider); - private final EntityIdColumnsConfigs entityIdColumnsConfigs = mock(EntityIdColumnsConfigs.class); + private final EntityIdColumnsConfig entityIdColumnsConfig = mock(EntityIdColumnsConfig.class); + private final GatewayServiceConfig gatewayServiceConfig = mock(GatewayServiceConfig.class); + + @BeforeEach + public void setup() { + when(gatewayServiceConfig.getEntityIdColumnsConfig()).thenReturn(entityIdColumnsConfig); + } @Test public void testBaselineForEntitiesForAggregates() { @@ -74,7 +82,7 @@ public void testBaselineForEntitiesForAggregates() { baselineServiceQueryExecutor.executeQuery( any(RequestContext.class), any(QueryRequest.class))) .thenReturn(getResultSetForAvg("duration_ts").iterator()); - when(entityIdColumnsConfigs.getIdKey("SERVICE")).thenReturn(Optional.of("id")); + when(entityIdColumnsConfig.getIdKey("SERVICE")).thenReturn(Optional.of("id")); Map attributeMap = new HashMap<>(); attributeMap.put( @@ -90,10 +98,10 @@ public void testBaselineForEntitiesForAggregates() { BaselineService baselineService = new BaselineServiceImpl( + gatewayServiceConfig, attributeMetadataProvider, baselineServiceQueryParser, - baselineServiceQueryExecutor, - entityIdColumnsConfigs); + baselineServiceQueryExecutor); BaselineEntitiesResponse baselineResponse = baselineService.getBaselineForEntities( new RequestContext(forTenantId(TENANT_ID)), baselineEntitiesRequest); @@ -126,7 +134,7 @@ public void testBaselineEntitiesForAggregatesForAvgRateFunction( baselineServiceQueryExecutor.executeQuery( any(RequestContext.class), any(QueryRequest.class))) .thenReturn(getResultSetForAvgRate("numCalls").iterator()); - when(entityIdColumnsConfigs.getIdKey("SERVICE")).thenReturn(Optional.of("id")); + when(entityIdColumnsConfig.getIdKey("SERVICE")).thenReturn(Optional.of("id")); // Attribute Metadata map contains mapping between Attributes and ID to query data. Map attributeMap = new HashMap<>(); attributeMap.put( @@ -139,10 +147,10 @@ public void testBaselineEntitiesForAggregatesForAvgRateFunction( BaselineService baselineService = new BaselineServiceImpl( + gatewayServiceConfig, attributeMetadataProvider, baselineServiceQueryParser, - baselineServiceQueryExecutor, - entityIdColumnsConfigs); + baselineServiceQueryExecutor); BaselineEntitiesResponse baselineResponse = baselineService.getBaselineForEntities( new RequestContext(forTenantId(TENANT_ID)), baselineEntitiesRequest); @@ -189,14 +197,14 @@ public void testBaselineEntitiesForMetricSeries() { attributeMetadataProvider.getAttributeMetadata( any(RequestContext.class), Mockito.anyString(), Mockito.anyString())) .thenReturn(Optional.of(attribute)); - when(entityIdColumnsConfigs.getIdKey("SERVICE")).thenReturn(Optional.of("id")); + when(entityIdColumnsConfig.getIdKey("SERVICE")).thenReturn(Optional.of("id")); BaselineService baselineService = new BaselineServiceImpl( + gatewayServiceConfig, attributeMetadataProvider, baselineServiceQueryParser, - baselineServiceQueryExecutor, - entityIdColumnsConfigs); + baselineServiceQueryExecutor); BaselineEntitiesResponse baselineResponse = baselineService.getBaselineForEntities( new RequestContext(forTenantId(TENANT_ID)), baselineEntitiesRequest); @@ -304,8 +312,10 @@ public List getResultSetForAvgRate(String alias) { public void testStartTimeCalcGivenTimeRange() { BaselineServiceImpl baselineService = new BaselineServiceImpl( - attributeMetadataProvider, baselineServiceQueryParser, - baselineServiceQueryExecutor, entityIdColumnsConfigs); + gatewayServiceConfig, + attributeMetadataProvider, + baselineServiceQueryParser, + baselineServiceQueryExecutor); long endTimeInMillis = System.currentTimeMillis(); long startTimeInMillis = endTimeInMillis - ONE_HOUR_MILLIS; long actualStartTime = baselineService.getUpdatedStartTime(startTimeInMillis, endTimeInMillis); diff --git a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/common/AbstractServiceTest.java b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/common/AbstractServiceTest.java index 2b510586..34d93eeb 100644 --- a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/common/AbstractServiceTest.java +++ b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/common/AbstractServiceTest.java @@ -35,13 +35,15 @@ import org.hypertrace.core.query.service.api.ResultSetChunk; import org.hypertrace.entity.query.service.client.EntityQueryServiceClient; import org.hypertrace.gateway.service.EntityTypesProvider; +import org.hypertrace.gateway.service.common.config.GatewayServiceConfig; import org.hypertrace.gateway.service.common.config.ScopeFilterConfigs; import org.hypertrace.gateway.service.common.util.QueryServiceClient; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.Mock; import org.mockito.stubbing.Answer; public abstract class AbstractServiceTest< @@ -61,7 +63,8 @@ public abstract class AbstractServiceTest< private static List attributeMetadataList; private static ScopeFilterConfigs scopeFilterConfigs; private static EntityTypesProvider entityTypesProvider; - private static EntityIdColumnsConfigs entityIdColumnsConfigs; + private static EntityIdColumnsConfig entityIdColumnsConfig; + @Mock private static GatewayServiceConfig gatewayServiceConfig; @BeforeAll public static void setUp() throws IOException { @@ -82,7 +85,10 @@ public static void setUp() throws IOException { + "]"; Config config = ConfigFactory.parseString(scopeFiltersConfig); scopeFilterConfigs = new ScopeFilterConfigs(config); - entityIdColumnsConfigs = new EntityIdColumnsConfigs(Collections.emptyMap()); + entityIdColumnsConfig = new EntityIdColumnsConfig(Collections.emptyMap()); + gatewayServiceConfig = mock(GatewayServiceConfig.class); + when(gatewayServiceConfig.getEntityIdColumnsConfig()).thenReturn(entityIdColumnsConfig); + when(gatewayServiceConfig.getScopeFilterConfigs()).thenReturn(scopeFilterConfigs); entityTypesProvider = mock(EntityTypesProvider.class); } @@ -161,12 +167,11 @@ public void runTest(String fileName) throws IOException { TGatewayServiceRequestType testRequest = readGatewayServiceRequest(fileName); TGatewayServiceResponseType actualResponse = executeApi( + gatewayServiceConfig, testRequest, queryServiceClient, entityQueryServiceClient, attributeMetadataProvider, - scopeFilterConfigs, - entityIdColumnsConfigs, entityTypesProvider); TGatewayServiceResponseType expectedResponse = readGatewayServiceResponse(fileName); @@ -284,11 +289,10 @@ private String createResourceFileName(String filesBaseDir, String fileName) { protected abstract GeneratedMessageV3.Builder getGatewayServiceResponseBuilder(); protected abstract TGatewayServiceResponseType executeApi( + GatewayServiceConfig gatewayServiceConfig, TGatewayServiceRequestType request, QueryServiceClient queryServiceClient, EntityQueryServiceClient entityQueryServiceClient, AttributeMetadataProvider attributeMetadataProvider, - ScopeFilterConfigs scopeFilterConfigs, - EntityIdColumnsConfigs entityIdColumnsConfigs, EntityTypesProvider entityTypesProvider); } diff --git a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/common/datafetcher/EntityDataServiceEntityFetcherTest.java b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/common/datafetcher/EntityDataServiceEntityFetcherTest.java index a04fa935..2161e208 100644 --- a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/common/datafetcher/EntityDataServiceEntityFetcherTest.java +++ b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/common/datafetcher/EntityDataServiceEntityFetcherTest.java @@ -40,7 +40,7 @@ import org.hypertrace.gateway.service.common.AttributeMetadataProvider; import org.hypertrace.gateway.service.common.converters.EntityServiceAndGatewayServiceConverter; import org.hypertrace.gateway.service.entity.EntitiesRequestContext; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; import org.hypertrace.gateway.service.entity.config.TimestampConfigs; import org.hypertrace.gateway.service.v1.common.ColumnIdentifier; import org.hypertrace.gateway.service.v1.common.Expression; @@ -62,7 +62,7 @@ public class EntityDataServiceEntityFetcherTest { private EntityQueryServiceClient entityQueryServiceClient; private AttributeMetadataProvider attributeMetadataProvider; private EntityDataServiceEntityFetcher entityDataServiceEntityFetcher; - private EntityIdColumnsConfigs entityIdColumnsConfigs; + private EntityIdColumnsConfig entityIdColumnsConfig; @BeforeEach public void setup() { @@ -70,12 +70,12 @@ public void setup() { attributeMetadataProvider = mock(AttributeMetadataProvider.class); mockAttributeMetadataProvider(AttributeScope.API.name()); - entityIdColumnsConfigs = mock(EntityIdColumnsConfigs.class); - when(entityIdColumnsConfigs.getIdKey("API")).thenReturn(Optional.of("id")); + entityIdColumnsConfig = mock(EntityIdColumnsConfig.class); + when(entityIdColumnsConfig.getIdKey("API")).thenReturn(Optional.of("id")); entityDataServiceEntityFetcher = new EntityDataServiceEntityFetcher( - entityQueryServiceClient, attributeMetadataProvider, entityIdColumnsConfigs); + entityQueryServiceClient, attributeMetadataProvider, entityIdColumnsConfig); } @Test diff --git a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/common/datafetcher/QueryServiceEntityFetcherTests.java b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/common/datafetcher/QueryServiceEntityFetcherTests.java index ac9238b5..dcd758af 100644 --- a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/common/datafetcher/QueryServiceEntityFetcherTests.java +++ b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/common/datafetcher/QueryServiceEntityFetcherTests.java @@ -43,7 +43,7 @@ import org.hypertrace.gateway.service.common.util.QueryServiceClient; import org.hypertrace.gateway.service.entity.EntitiesRequestContext; import org.hypertrace.gateway.service.entity.EntityKey; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; import org.hypertrace.gateway.service.v1.common.Expression; import org.hypertrace.gateway.service.v1.common.Filter; import org.hypertrace.gateway.service.v1.common.FunctionType; @@ -76,7 +76,7 @@ public class QueryServiceEntityFetcherTests { private QueryServiceClient queryServiceClient; private AttributeMetadataProvider attributeMetadataProvider; - private EntityIdColumnsConfigs entityIdColumnsConfigs; + private EntityIdColumnsConfig entityIdColumnsConfig; private QueryServiceEntityFetcher queryServiceEntityFetcher; @BeforeEach @@ -85,12 +85,12 @@ public void setup() { attributeMetadataProvider = mock(AttributeMetadataProvider.class); mockAttributeMetadataProvider(AttributeScope.API.name()); - entityIdColumnsConfigs = mock(EntityIdColumnsConfigs.class); - when(entityIdColumnsConfigs.getIdKey("API")).thenReturn(Optional.of("id")); + entityIdColumnsConfig = mock(EntityIdColumnsConfig.class); + when(entityIdColumnsConfig.getIdKey("API")).thenReturn(Optional.of("id")); queryServiceEntityFetcher = new QueryServiceEntityFetcher( - queryServiceClient, attributeMetadataProvider, entityIdColumnsConfigs); + queryServiceClient, attributeMetadataProvider, entityIdColumnsConfig); } @Test diff --git a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/common/util/AttributeMetadataUtilTest.java b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/common/util/AttributeMetadataUtilTest.java index d7c6d5b2..f9a2d24f 100644 --- a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/common/util/AttributeMetadataUtilTest.java +++ b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/common/util/AttributeMetadataUtilTest.java @@ -11,7 +11,7 @@ import org.hypertrace.core.attribute.service.v1.AttributeScope; import org.hypertrace.gateway.service.common.AttributeMetadataProvider; import org.hypertrace.gateway.service.common.RequestContext; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; import org.hypertrace.gateway.service.v1.common.DomainEntityType; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -19,16 +19,16 @@ import org.mockito.Mock; public class AttributeMetadataUtilTest { - @Mock private EntityIdColumnsConfigs entityIdColumnsConfigs; + @Mock private EntityIdColumnsConfig entityIdColumnsConfig; @BeforeEach public void setup() { - entityIdColumnsConfigs = mock(EntityIdColumnsConfigs.class); + entityIdColumnsConfig = mock(EntityIdColumnsConfig.class); } @Test public void testIdAttributesNotInEntityIdColumnsConfig() { - when(entityIdColumnsConfigs.getIdKey("API")).thenReturn(Optional.of("apiId")); + when(entityIdColumnsConfig.getIdKey("API")).thenReturn(Optional.of("apiId")); AttributeMetadataProvider provider = mock(AttributeMetadataProvider.class); String entityType = DomainEntityType.SERVICE.name(); @@ -36,12 +36,12 @@ public void testIdAttributesNotInEntityIdColumnsConfig() { Assertions.assertEquals( List.of(), AttributeMetadataUtil.getIdAttributeIds( - provider, entityIdColumnsConfigs, mock(RequestContext.class), entityType)); + provider, entityIdColumnsConfig, mock(RequestContext.class), entityType)); } @Test public void testApiIdAttributeInEntityIdColumnsConfig() { - when(entityIdColumnsConfigs.getIdKey("API")).thenReturn(Optional.of("apiId")); + when(entityIdColumnsConfig.getIdKey("API")).thenReturn(Optional.of("apiId")); AttributeMetadataProvider provider = mock(AttributeMetadataProvider.class); String entityType = DomainEntityType.API.name(); when(provider.getAttributeMetadata( @@ -51,14 +51,14 @@ public void testApiIdAttributeInEntityIdColumnsConfig() { Assertions.assertEquals( List.of("API.apiId"), AttributeMetadataUtil.getIdAttributeIds( - provider, entityIdColumnsConfigs, mock(RequestContext.class), entityType)); + provider, entityIdColumnsConfig, mock(RequestContext.class), entityType)); } @Test public void testKnownEntitiesIdAttributesInEntityIdColumnsConfig() { - when(entityIdColumnsConfigs.getIdKey("API")).thenReturn(Optional.of("apiId")); - when(entityIdColumnsConfigs.getIdKey("SERVICE")).thenReturn(Optional.of("id")); - when(entityIdColumnsConfigs.getIdKey("BACKEND")).thenReturn(Optional.of("id")); + when(entityIdColumnsConfig.getIdKey("API")).thenReturn(Optional.of("apiId")); + when(entityIdColumnsConfig.getIdKey("SERVICE")).thenReturn(Optional.of("id")); + when(entityIdColumnsConfig.getIdKey("BACKEND")).thenReturn(Optional.of("id")); AttributeMetadataProvider provider = mock(AttributeMetadataProvider.class); when(provider.getAttributeMetadata( @@ -75,21 +75,21 @@ public void testKnownEntitiesIdAttributesInEntityIdColumnsConfig() { List.of("API.apiId"), AttributeMetadataUtil.getIdAttributeIds( provider, - entityIdColumnsConfigs, + entityIdColumnsConfig, mock(RequestContext.class), DomainEntityType.API.name())); Assertions.assertEquals( List.of("SERVICE.id"), AttributeMetadataUtil.getIdAttributeIds( provider, - entityIdColumnsConfigs, + entityIdColumnsConfig, mock(RequestContext.class), DomainEntityType.SERVICE.name())); Assertions.assertEquals( List.of("BACKEND.id"), AttributeMetadataUtil.getIdAttributeIds( provider, - entityIdColumnsConfigs, + entityIdColumnsConfig, mock(RequestContext.class), DomainEntityType.BACKEND.name())); @@ -98,7 +98,7 @@ public void testKnownEntitiesIdAttributesInEntityIdColumnsConfig() { List.of(), AttributeMetadataUtil.getIdAttributeIds( provider, - entityIdColumnsConfigs, + entityIdColumnsConfig, mock(RequestContext.class), DomainEntityType.NAMESPACE.name())); } diff --git a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/EntityServiceInteractionRequestTest.java b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/EntityServiceInteractionRequestTest.java index aee468b5..bf1e224e 100644 --- a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/EntityServiceInteractionRequestTest.java +++ b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/EntityServiceInteractionRequestTest.java @@ -42,10 +42,11 @@ import org.hypertrace.gateway.service.AbstractGatewayServiceTest; import org.hypertrace.gateway.service.common.AttributeMetadataProvider; import org.hypertrace.gateway.service.common.RequestContext; +import org.hypertrace.gateway.service.common.config.GatewayServiceConfig; import org.hypertrace.gateway.service.common.config.ScopeFilterConfigs; import org.hypertrace.gateway.service.common.converters.QueryRequestUtil; import org.hypertrace.gateway.service.common.util.QueryServiceClient; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; import org.hypertrace.gateway.service.entity.config.LogConfig; import org.hypertrace.gateway.service.executor.QueryExecutorConfig; import org.hypertrace.gateway.service.executor.QueryExecutorServiceFactory; @@ -70,9 +71,11 @@ public class EntityServiceInteractionRequestTest extends AbstractGatewayServiceT private QueryServiceClient queryServiceClient; private EntityQueryServiceClient entityQueryServiceClient; private AttributeMetadataProvider attributeMetadataProvider; - private EntityIdColumnsConfigs entityIdColumnsConfigs; + private EntityIdColumnsConfig entityIdColumnsConfig; private LogConfig logConfig; private ScopeFilterConfigs scopeFilterConfigs; + + private GatewayServiceConfig gatewayServiceConfig; private ExecutorService queryExecutor; @BeforeEach @@ -86,6 +89,10 @@ public void setup() { logConfig = Mockito.mock(LogConfig.class); when(logConfig.getQueryThresholdInMillis()).thenReturn(1500L); scopeFilterConfigs = new ScopeFilterConfigs(ConfigFactory.empty()); + gatewayServiceConfig = Mockito.mock(GatewayServiceConfig.class); + when(gatewayServiceConfig.getEntityIdColumnsConfig()).thenReturn(entityIdColumnsConfig); + when(gatewayServiceConfig.getScopeFilterConfigs()).thenReturn(scopeFilterConfigs); + when(gatewayServiceConfig.getLogConfig()).thenReturn(logConfig); queryExecutor = QueryExecutorServiceFactory.buildExecutorService( QueryExecutorConfig.from(this.getConfig())); @@ -109,7 +116,7 @@ private void mockEntityIdColumnConfigs() { + " }\n" + "]"; Config config = ConfigFactory.parseString(entityIdColumnConfigStr); - entityIdColumnsConfigs = EntityIdColumnsConfigs.fromConfig(config); + entityIdColumnsConfig = EntityIdColumnsConfig.fromConfig(config); } private void mock(AttributeMetadataProvider attributeMetadataProvider) { @@ -821,13 +828,11 @@ public void testGetEntitiesForMultipleTypeInteractionQuery() { EntityService entityService = new EntityService( + gatewayServiceConfig, queryServiceClient, entityQueryServiceClient, null, attributeMetadataProvider, - entityIdColumnsConfigs, - scopeFilterConfigs, - logConfig, queryExecutor); EntitiesResponse response = entityService.getEntities(new RequestContext(forTenantId(TENANT_ID)), request); @@ -900,13 +905,11 @@ public void testGetEntitiesWithInteractionFilters() { EntityService entityService = new EntityService( + gatewayServiceConfig, queryServiceClient, entityQueryServiceClient, null, attributeMetadataProvider, - entityIdColumnsConfigs, - scopeFilterConfigs, - logConfig, queryExecutor); EntitiesResponse response = entityService.getEntities(new RequestContext(forTenantId(TENANT_ID)), request); diff --git a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/EntityServiceTest.java b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/EntityServiceTest.java index b42cb327..37417fc2 100644 --- a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/EntityServiceTest.java +++ b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/EntityServiceTest.java @@ -57,9 +57,10 @@ import org.hypertrace.gateway.service.common.AttributeMetadataProvider; import org.hypertrace.gateway.service.common.QueryServiceRequestAndResponseUtils; import org.hypertrace.gateway.service.common.RequestContext; +import org.hypertrace.gateway.service.common.config.GatewayServiceConfig; import org.hypertrace.gateway.service.common.config.ScopeFilterConfigs; import org.hypertrace.gateway.service.common.util.QueryServiceClient; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; import org.hypertrace.gateway.service.entity.config.LogConfig; import org.hypertrace.gateway.service.executor.QueryExecutorConfig; import org.hypertrace.gateway.service.executor.QueryExecutorServiceFactory; @@ -90,8 +91,10 @@ public class EntityServiceTest extends AbstractGatewayServiceTest { private EntityQueryServiceClient entityQueryServiceClient; private EntityQueryServiceBlockingStub entityQueryStub; private AttributeMetadataProvider attributeMetadataProvider; - private EntityIdColumnsConfigs entityIdColumnsConfigs; + private EntityIdColumnsConfig entityIdColumnsConfig; private LogConfig logConfig; + + private GatewayServiceConfig gatewayServiceConfig; private ExecutorService queryExecutor; @BeforeEach @@ -105,6 +108,10 @@ public void setup() { mock(attributeMetadataProvider); logConfig = Mockito.mock(LogConfig.class); when(logConfig.getQueryThresholdInMillis()).thenReturn(1500L); + gatewayServiceConfig = Mockito.mock(GatewayServiceConfig.class); + when(gatewayServiceConfig.getEntityIdColumnsConfig()).thenReturn(entityIdColumnsConfig); + when(gatewayServiceConfig.getLogConfig()).thenReturn(logConfig); + when(gatewayServiceConfig.isEntityAndFilterEnabled()).thenReturn(false); queryExecutor = QueryExecutorServiceFactory.buildExecutorService( QueryExecutorConfig.from(this.getConfig())); @@ -124,7 +131,7 @@ private void mockEntityIdColumnConfigs() { + " }\n" + "]"; Config config = ConfigFactory.parseString(entityIdColumnConfigStr); - entityIdColumnsConfigs = EntityIdColumnsConfigs.fromConfig(config); + entityIdColumnsConfig = EntityIdColumnsConfig.fromConfig(config); } private void mock(AttributeMetadataProvider attributeMetadataProvider) { @@ -303,15 +310,14 @@ public void testGetEntitiesOnlySelectFromSingleSourceWithTimeRangeShouldUseQuery .iterator()); ScopeFilterConfigs scopeFilterConfigs = new ScopeFilterConfigs(ConfigFactory.empty()); + when(gatewayServiceConfig.getScopeFilterConfigs()).thenReturn(scopeFilterConfigs); EntityService entityService = new EntityService( + gatewayServiceConfig, queryServiceClient, entityQueryServiceClient, null, attributeMetadataProvider, - entityIdColumnsConfigs, - scopeFilterConfigs, - logConfig, queryExecutor); EntitiesResponse response = entityService.getEntities( @@ -342,15 +348,14 @@ public void testGetEntitiesOnlySelectFromMultipleSources() { .build()) .iterator()); ScopeFilterConfigs scopeFilterConfigs = new ScopeFilterConfigs(ConfigFactory.empty()); + when(gatewayServiceConfig.getScopeFilterConfigs()).thenReturn(scopeFilterConfigs); EntityService entityService = new EntityService( + gatewayServiceConfig, queryServiceClient, entityQueryServiceClient, null, attributeMetadataProvider, - entityIdColumnsConfigs, - scopeFilterConfigs, - logConfig, queryExecutor); EntitiesRequest entitiesRequest = EntitiesRequest.newBuilder() @@ -483,15 +488,16 @@ void testBulkUpdateAllMatchingEntities() { final RequestContext requestContext = new RequestContext( org.hypertrace.core.grpcutils.context.RequestContext.forTenantId(TENANT_ID)); + ScopeFilterConfigs scopeFilterConfigs = new ScopeFilterConfigs(ConfigFactory.empty()); + when(gatewayServiceConfig.getScopeFilterConfigs()).thenReturn(scopeFilterConfigs); + final EntityService entityService = new EntityService( + gatewayServiceConfig, queryServiceClient, entityQueryServiceClient, entityQueryStub, attributeMetadataProvider, - entityIdColumnsConfigs, - new ScopeFilterConfigs(ConfigFactory.empty()), - logConfig, queryExecutor); final BulkUpdateAllMatchingEntitiesRequest request = diff --git a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/config/EntityIdColumnsConfigTest.java b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/config/EntityIdColumnsConfigTest.java index 754c72b2..dd46471c 100644 --- a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/config/EntityIdColumnsConfigTest.java +++ b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/config/EntityIdColumnsConfigTest.java @@ -23,11 +23,11 @@ public void testOnlyEntityIdColumnsConfigPresent() { + " }\n" + "]"; Config appConfig = ConfigFactory.parseString(appConfigStr); - EntityIdColumnsConfigs entityIdColumnsConfigs = EntityIdColumnsConfigs.fromConfig(appConfig); + EntityIdColumnsConfig entityIdColumnsConfig = EntityIdColumnsConfig.fromConfig(appConfig); - assertEquals(Optional.of("id"), entityIdColumnsConfigs.getIdKey("FOO")); - assertEquals(Optional.of("id2"), entityIdColumnsConfigs.getIdKey("BAR")); - assertEquals(Optional.empty(), entityIdColumnsConfigs.getIdKey("BAZ")); + assertEquals(Optional.of("id"), entityIdColumnsConfig.getIdKey("FOO")); + assertEquals(Optional.of("id2"), entityIdColumnsConfig.getIdKey("BAR")); + assertEquals(Optional.empty(), entityIdColumnsConfig.getIdKey("BAZ")); } @Test @@ -58,11 +58,11 @@ public void testOnlyDomainConfigPresent() { + " }\n" + "]"; Config appConfig = ConfigFactory.parseString(domainObjectConfig); - EntityIdColumnsConfigs entityIdColumnsConfigs = EntityIdColumnsConfigs.fromConfig(appConfig); + EntityIdColumnsConfig entityIdColumnsConfig = EntityIdColumnsConfig.fromConfig(appConfig); - assertEquals(Optional.of("id"), entityIdColumnsConfigs.getIdKey("FOO")); - assertEquals(Optional.of("id2"), entityIdColumnsConfigs.getIdKey("BAR")); - assertEquals(Optional.empty(), entityIdColumnsConfigs.getIdKey("BAZ")); + assertEquals(Optional.of("id"), entityIdColumnsConfig.getIdKey("FOO")); + assertEquals(Optional.of("id2"), entityIdColumnsConfig.getIdKey("BAR")); + assertEquals(Optional.empty(), entityIdColumnsConfig.getIdKey("BAZ")); } @Test @@ -103,11 +103,11 @@ public void testBothDomainAndEntityIdColumnConfigPresent() { + " }\n" + "]"; Config appConfig = ConfigFactory.parseString(appConfigStr); - EntityIdColumnsConfigs entityIdColumnsConfigs = EntityIdColumnsConfigs.fromConfig(appConfig); + EntityIdColumnsConfig entityIdColumnsConfig = EntityIdColumnsConfig.fromConfig(appConfig); - assertEquals(Optional.of("id"), entityIdColumnsConfigs.getIdKey("FOO")); - assertEquals(Optional.of("id2"), entityIdColumnsConfigs.getIdKey("BAR")); - assertEquals(Optional.empty(), entityIdColumnsConfigs.getIdKey("BAZ")); + assertEquals(Optional.of("id"), entityIdColumnsConfig.getIdKey("FOO")); + assertEquals(Optional.of("id2"), entityIdColumnsConfig.getIdKey("BAR")); + assertEquals(Optional.empty(), entityIdColumnsConfig.getIdKey("BAZ")); } @Test @@ -140,21 +140,21 @@ public void testNonEmptyDomainAndEmptyEntityIdColumnConfig() { + " }\n" + "]"; Config appConfig = ConfigFactory.parseString(appConfigStr); - EntityIdColumnsConfigs entityIdColumnsConfigs = EntityIdColumnsConfigs.fromConfig(appConfig); + EntityIdColumnsConfig entityIdColumnsConfig = EntityIdColumnsConfig.fromConfig(appConfig); - assertEquals(Optional.empty(), entityIdColumnsConfigs.getIdKey("FOO")); - assertEquals(Optional.empty(), entityIdColumnsConfigs.getIdKey("BAR")); - assertEquals(Optional.empty(), entityIdColumnsConfigs.getIdKey("BAZ")); + assertEquals(Optional.empty(), entityIdColumnsConfig.getIdKey("FOO")); + assertEquals(Optional.empty(), entityIdColumnsConfig.getIdKey("BAR")); + assertEquals(Optional.empty(), entityIdColumnsConfig.getIdKey("BAZ")); } @Test public void testNoDomainNorEntityIdColumnConfig() { String appConfigStr = ""; Config appConfig = ConfigFactory.parseString(appConfigStr); - EntityIdColumnsConfigs entityIdColumnsConfigs = EntityIdColumnsConfigs.fromConfig(appConfig); + EntityIdColumnsConfig entityIdColumnsConfig = EntityIdColumnsConfig.fromConfig(appConfig); - assertEquals(Optional.empty(), entityIdColumnsConfigs.getIdKey("FOO")); - assertEquals(Optional.empty(), entityIdColumnsConfigs.getIdKey("BAR")); - assertEquals(Optional.empty(), entityIdColumnsConfigs.getIdKey("BAZ")); + assertEquals(Optional.empty(), entityIdColumnsConfig.getIdKey("FOO")); + assertEquals(Optional.empty(), entityIdColumnsConfig.getIdKey("BAR")); + assertEquals(Optional.empty(), entityIdColumnsConfig.getIdKey("BAZ")); } } diff --git a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/query/ExecutionContextTest.java b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/query/ExecutionContextTest.java index a7aacdf8..d272c1d7 100644 --- a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/query/ExecutionContextTest.java +++ b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/query/ExecutionContextTest.java @@ -22,8 +22,9 @@ import org.hypertrace.gateway.service.common.AttributeMetadataProvider; import org.hypertrace.gateway.service.common.EntitiesRequestAndResponseUtils; import org.hypertrace.gateway.service.common.RequestContext; +import org.hypertrace.gateway.service.common.config.GatewayServiceConfig; import org.hypertrace.gateway.service.entity.EntitiesRequestContext; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; import org.hypertrace.gateway.service.v1.common.Expression; import org.hypertrace.gateway.service.v1.common.Filter; import org.hypertrace.gateway.service.v1.entity.EntitiesRequest; @@ -46,13 +47,16 @@ class ExecutionContextTest { private static final String API_ID_ATTR = "API.id"; @Mock private AttributeMetadataProvider attributeMetadataProvider; - @Mock private EntityIdColumnsConfigs entityIdColumnsConfigs; + @Mock private EntityIdColumnsConfig entityIdColumnsConfig; + @Mock private GatewayServiceConfig gatewayServiceConfig; private EntitiesRequestContext entitiesRequestContext; @BeforeEach public void setup() { attributeMetadataProvider = mock(AttributeMetadataProvider.class); - entityIdColumnsConfigs = mock(EntityIdColumnsConfigs.class); + entityIdColumnsConfig = mock(EntityIdColumnsConfig.class); + gatewayServiceConfig = mock(GatewayServiceConfig.class); + when(gatewayServiceConfig.getEntityIdColumnsConfig()).thenReturn(entityIdColumnsConfig); when(attributeMetadataProvider.getAttributesMetadata( any(RequestContext.class), eq(AttributeScope.API.name()))) .thenReturn(attributeSources); @@ -82,8 +86,8 @@ void testFilterExpressionMaps() { EntitiesRequest.newBuilder().setEntityType("API").setFilter(filter).build(); EntityExecutionContext executionContext = new EntityExecutionContext( + gatewayServiceConfig, attributeMetadataProvider, - entityIdColumnsConfigs, entitiesRequestContext, entitiesRequest); @@ -119,8 +123,8 @@ void removeSelectionAttributes_sourceNotPresent() { EntitiesRequest.newBuilder().setEntityType("API").addAllSelection(selections).build(); EntityExecutionContext executionContext = new EntityExecutionContext( + gatewayServiceConfig, attributeMetadataProvider, - entityIdColumnsConfigs, entitiesRequestContext, entitiesRequest); @@ -166,8 +170,8 @@ void removeSelectionAttributes() { EntitiesRequest.newBuilder().setEntityType("API").addAllSelection(selections).build(); EntityExecutionContext executionContext = new EntityExecutionContext( + gatewayServiceConfig, attributeMetadataProvider, - entityIdColumnsConfigs, entitiesRequestContext, entitiesRequest); @@ -217,8 +221,8 @@ void removeAllSelectionAttributes() { EntitiesRequest.newBuilder().setEntityType("API").addAllSelection(selections).build(); EntityExecutionContext executionContext = new EntityExecutionContext( + gatewayServiceConfig, attributeMetadataProvider, - entityIdColumnsConfigs, entitiesRequestContext, entitiesRequest); diff --git a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/query/ExecutionTreeBuilderTest.java b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/query/ExecutionTreeBuilderTest.java index 67048f7a..a6139e6b 100644 --- a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/query/ExecutionTreeBuilderTest.java +++ b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/query/ExecutionTreeBuilderTest.java @@ -32,8 +32,9 @@ import org.hypertrace.core.attribute.service.v1.AttributeSource; import org.hypertrace.gateway.service.common.AttributeMetadataProvider; import org.hypertrace.gateway.service.common.RequestContext; +import org.hypertrace.gateway.service.common.config.GatewayServiceConfig; import org.hypertrace.gateway.service.entity.EntitiesRequestContext; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; import org.hypertrace.gateway.service.entity.query.visitor.FilterOptimizingVisitor; import org.hypertrace.gateway.service.v1.common.Filter; import org.hypertrace.gateway.service.v1.common.FunctionType; @@ -132,7 +133,8 @@ public class ExecutionTreeBuilderTest { }; @Mock private AttributeMetadataProvider attributeMetadataProvider; - @Mock private EntityIdColumnsConfigs entityIdColumnsConfigs; + @Mock private EntityIdColumnsConfig entityIdColumnsConfig; + @Mock private GatewayServiceConfig gatewayServiceConfig; private static AttributeMetadata buildAttributeMetadataForSources( String attributeId, String scope, String key, List sources) { @@ -147,7 +149,9 @@ private static AttributeMetadata buildAttributeMetadataForSources( @BeforeEach public void setup() { attributeMetadataProvider = mock(AttributeMetadataProvider.class); - entityIdColumnsConfigs = mock(EntityIdColumnsConfigs.class); + entityIdColumnsConfig = mock(EntityIdColumnsConfig.class); + gatewayServiceConfig = mock(GatewayServiceConfig.class); + when(gatewayServiceConfig.getEntityIdColumnsConfig()).thenReturn(entityIdColumnsConfig); when(attributeMetadataProvider.getAttributesMetadata( any(RequestContext.class), eq(AttributeScope.API.name()))) .thenReturn(ATTRIBUTE_SOURCES); @@ -181,7 +185,7 @@ private EntityExecutionContext getExecutionContext(EntitiesRequest entitiesReque "API", "API.startTime"); return new EntityExecutionContext( - attributeMetadataProvider, entityIdColumnsConfigs, entitiesRequestContext, entitiesRequest); + gatewayServiceConfig, attributeMetadataProvider, entitiesRequestContext, entitiesRequest); } @Test @@ -502,8 +506,8 @@ public void testExecutionTreeBuilderWithSelectFilterOrderPagination() { new EntitiesRequestContext(forTenantId(TENANT_ID), 0L, 10L, "API", "API.startTime"); EntityExecutionContext executionContext = new EntityExecutionContext( + gatewayServiceConfig, attributeMetadataProvider, - entityIdColumnsConfigs, entitiesRequestContext, entitiesRequest); ExecutionTreeBuilder executionTreeBuilder = new ExecutionTreeBuilder(executionContext); @@ -541,8 +545,8 @@ public void testExecutionTreeBuilderWithSelectFilterOrderPagination() { forTenantId(TENANT_ID), startTime, endTime, "API", "API.startTime"); EntityExecutionContext executionContext = new EntityExecutionContext( + gatewayServiceConfig, attributeMetadataProvider, - entityIdColumnsConfigs, entitiesRequestContext, entitiesRequest); ExecutionTreeBuilder executionTreeBuilder = new ExecutionTreeBuilder(executionContext); @@ -578,8 +582,8 @@ public void testExecutionTreeBuilderWithSelectPagination() { new EntitiesRequestContext(forTenantId(TENANT_ID), 0L, 10L, "API", "API.startTime"); EntityExecutionContext executionContext = new EntityExecutionContext( + gatewayServiceConfig, attributeMetadataProvider, - entityIdColumnsConfigs, entitiesRequestContext, entitiesRequest); ExecutionTreeBuilder executionTreeBuilder = new ExecutionTreeBuilder(executionContext); @@ -608,8 +612,8 @@ public void testExecutionTreeBuilderWithSelectPagination() { new EntitiesRequestContext(forTenantId(TENANT_ID), 0L, 10L, "API", "API.startTime"); EntityExecutionContext executionContext = new EntityExecutionContext( + gatewayServiceConfig, attributeMetadataProvider, - entityIdColumnsConfigs, entitiesRequestContext, entitiesRequest); ExecutionTreeBuilder executionTreeBuilder = new ExecutionTreeBuilder(executionContext); @@ -660,8 +664,8 @@ public void testExecutionTreeBuilderWithSelectPagination() { new EntitiesRequestContext(forTenantId(TENANT_ID), 0L, 10L, "API", "API.startTime"); EntityExecutionContext executionContext = new EntityExecutionContext( + gatewayServiceConfig, attributeMetadataProvider, - entityIdColumnsConfigs, entitiesRequestContext, entitiesRequest); ExecutionTreeBuilder executionTreeBuilder = new ExecutionTreeBuilder(executionContext); @@ -713,8 +717,8 @@ public void testExecutionTreeBuilderWithSelectPagination() { new EntitiesRequestContext(forTenantId(TENANT_ID), 0L, 10L, "API", "API.startTime"); EntityExecutionContext executionContext = new EntityExecutionContext( + gatewayServiceConfig, attributeMetadataProvider, - entityIdColumnsConfigs, entitiesRequestContext, entitiesRequest); ExecutionTreeBuilder executionTreeBuilder = new ExecutionTreeBuilder(executionContext); @@ -765,8 +769,8 @@ public void testExecutionTreeBuilderWithSelectPagination() { new EntitiesRequestContext(forTenantId(TENANT_ID), 0L, 10L, "API", "API.startTime"); EntityExecutionContext executionContext = new EntityExecutionContext( + gatewayServiceConfig, attributeMetadataProvider, - entityIdColumnsConfigs, entitiesRequestContext, entitiesRequest); ExecutionTreeBuilder executionTreeBuilder = new ExecutionTreeBuilder(executionContext); @@ -817,8 +821,8 @@ public void testExecutionTreeBuilderWithSelectPagination() { "API.startTime"); EntityExecutionContext executionContext = new EntityExecutionContext( + gatewayServiceConfig, attributeMetadataProvider, - entityIdColumnsConfigs, entitiesRequestContext, entitiesRequest); ExecutionTreeBuilder executionTreeBuilder = new ExecutionTreeBuilder(executionContext); @@ -860,8 +864,8 @@ public void test_build_selectAttributeWithFiltersWithDifferentSource_shouldCreat new EntitiesRequestContext(forTenantId(TENANT_ID), 0L, 10L, "API", "API.startTime"); EntityExecutionContext executionContext = new EntityExecutionContext( + gatewayServiceConfig, attributeMetadataProvider, - entityIdColumnsConfigs, entitiesRequestContext, entitiesRequest); ExecutionTreeBuilder executionTreeBuilder = new ExecutionTreeBuilder(executionContext); @@ -901,8 +905,8 @@ public void test_build_includeResultsOutsideTimeRange() { new EntitiesRequestContext(forTenantId(TENANT_ID), 0L, 10L, "API", "API.startTime"); EntityExecutionContext executionContext = new EntityExecutionContext( + gatewayServiceConfig, attributeMetadataProvider, - entityIdColumnsConfigs, entitiesRequestContext, entitiesRequest); ExecutionTreeBuilder executionTreeBuilder = new ExecutionTreeBuilder(executionContext); @@ -947,8 +951,8 @@ public void test_build_filterAndOrderBySameSourceSets_paginationToDataSourceToQs "API.startTime"); EntityExecutionContext executionContext = new EntityExecutionContext( + gatewayServiceConfig, attributeMetadataProvider, - entityIdColumnsConfigs, entitiesRequestContext, entitiesRequest); ExecutionTreeBuilder executionTreeBuilder = new ExecutionTreeBuilder(executionContext); @@ -1007,8 +1011,8 @@ public void test_build_filterAndOrderBySameSourceSets_paginationToDataSourceToQs "API.startTime"); EntityExecutionContext executionContext = new EntityExecutionContext( + gatewayServiceConfig, attributeMetadataProvider, - entityIdColumnsConfigs, entitiesRequestContext, entitiesRequest); ExecutionTreeBuilder executionTreeBuilder = new ExecutionTreeBuilder(executionContext); @@ -1046,8 +1050,8 @@ public void nonLiveEntities_filtersOnOtherDataSourceThanEds() { "API.startTime"); EntityExecutionContext executionContext = new EntityExecutionContext( + gatewayServiceConfig, attributeMetadataProvider, - entityIdColumnsConfigs, entitiesRequestContext, entitiesRequest); ExecutionTreeBuilder executionTreeBuilder = new ExecutionTreeBuilder(executionContext); @@ -1085,8 +1089,8 @@ public void nonLiveEntities_noFilters_shouldFetchFromEds() { "API.startTime"); EntityExecutionContext executionContext = new EntityExecutionContext( + gatewayServiceConfig, attributeMetadataProvider, - entityIdColumnsConfigs, entitiesRequestContext, entitiesRequest); ExecutionTreeBuilder executionTreeBuilder = new ExecutionTreeBuilder(executionContext); @@ -1116,8 +1120,8 @@ public void nonLiveEntities_filterOnEds_shouldFetchFromEds() { "API.startTime"); EntityExecutionContext executionContext = new EntityExecutionContext( + gatewayServiceConfig, attributeMetadataProvider, - entityIdColumnsConfigs, entitiesRequestContext, entitiesRequest); ExecutionTreeBuilder executionTreeBuilder = new ExecutionTreeBuilder(executionContext); diff --git a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/query/visitor/ExecutionVisitorTest.java b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/query/visitor/ExecutionVisitorTest.java index eba9a0f1..c921f8bd 100644 --- a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/query/visitor/ExecutionVisitorTest.java +++ b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/entity/query/visitor/ExecutionVisitorTest.java @@ -725,7 +725,8 @@ public void test_visitPaginateOnlyNode() { when(queryServiceEntityFetcher.getEntities( entitiesRequestContext, entitiesRequestForAttributes)) .thenReturn(attributesResponse); - when(queryServiceEntityFetcher.getTotal(eq(entitiesRequestContext), eq(entitiesRequest))) + when(queryServiceEntityFetcher.getTotal( + eq(entitiesRequestContext), eq(entitiesRequestForAttributes))) .thenReturn(100L); when(queryServiceEntityFetcher.getEntities( entitiesRequestContext, entitiesRequestForMetricAggregation)) diff --git a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/explore/ExploreServiceTest.java b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/explore/ExploreServiceTest.java index 70ff7734..2bde543e 100644 --- a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/explore/ExploreServiceTest.java +++ b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/explore/ExploreServiceTest.java @@ -7,9 +7,8 @@ import org.hypertrace.gateway.service.common.AbstractServiceTest; import org.hypertrace.gateway.service.common.AttributeMetadataProvider; import org.hypertrace.gateway.service.common.RequestContext; -import org.hypertrace.gateway.service.common.config.ScopeFilterConfigs; +import org.hypertrace.gateway.service.common.config.GatewayServiceConfig; import org.hypertrace.gateway.service.common.util.QueryServiceClient; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; import org.hypertrace.gateway.service.v1.explore.ExploreRequest; import org.hypertrace.gateway.service.v1.explore.ExploreResponse; @@ -37,20 +36,18 @@ protected GeneratedMessageV3.Builder getGatewayServiceResponseBuilder() { @Override protected ExploreResponse executeApi( + GatewayServiceConfig gatewayServiceConfig, ExploreRequest request, QueryServiceClient queryServiceClient, EntityQueryServiceClient entityQueryServiceClient, AttributeMetadataProvider attributeMetadataProvider, - ScopeFilterConfigs scopeFilterConfigs, - EntityIdColumnsConfigs entityIdColumnsConfigs, EntityTypesProvider entityTypesProvider) { ExploreService exploreService = new ExploreService( + gatewayServiceConfig, queryServiceClient, entityQueryServiceClient, attributeMetadataProvider, - scopeFilterConfigs, - entityIdColumnsConfigs, entityTypesProvider); return exploreService.explore( new RequestContext( diff --git a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/explore/RequestHandlerTest.java b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/explore/RequestHandlerTest.java index eea6ce7d..457995f4 100644 --- a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/explore/RequestHandlerTest.java +++ b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/explore/RequestHandlerTest.java @@ -24,7 +24,7 @@ import org.hypertrace.gateway.service.common.util.ExpressionReader; import org.hypertrace.gateway.service.common.util.QueryServiceClient; import org.hypertrace.gateway.service.entity.EntityKey; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; import org.hypertrace.gateway.service.explore.entity.EntityServiceEntityFetcher; import org.hypertrace.gateway.service.v1.common.AttributeExpression; import org.hypertrace.gateway.service.v1.common.ColumnIdentifier; @@ -104,7 +104,7 @@ public void orderByExpressionsWithFunction_shouldMatchCorrespondingSelections() new RequestHandler( mock(QueryServiceClient.class), mock(AttributeMetadataProvider.class), - mock(EntityIdColumnsConfigs.class), + mock(EntityIdColumnsConfig.class), mock(QueryServiceEntityFetcher.class), mock(EntityServiceEntityFetcher.class)); List orderByExpressions = @@ -185,7 +185,7 @@ public void noChangeIfOrderByExpressionHasSameAliasAsSelection() { new RequestHandler( mock(QueryServiceClient.class), mock(AttributeMetadataProvider.class), - mock(EntityIdColumnsConfigs.class), + mock(EntityIdColumnsConfig.class), mock(QueryServiceEntityFetcher.class), mock(EntityServiceEntityFetcher.class)); List orderByExpressions = @@ -266,7 +266,7 @@ public void orderByExpressionsWithFunction_shouldMatchCorrespondingTimeAggregati new RequestHandler( mock(QueryServiceClient.class), mock(AttributeMetadataProvider.class), - mock(EntityIdColumnsConfigs.class), + mock(EntityIdColumnsConfig.class), mock(QueryServiceEntityFetcher.class), mock(EntityServiceEntityFetcher.class)); List orderByExpressions = @@ -342,7 +342,7 @@ public void noChangeIfOrderByExpressionIsAColumnAndOrderExpressionOrderIsMaintai new RequestHandler( mock(QueryServiceClient.class), mock(AttributeMetadataProvider.class), - mock(EntityIdColumnsConfigs.class), + mock(EntityIdColumnsConfig.class), mock(QueryServiceEntityFetcher.class), mock(EntityServiceEntityFetcher.class)); List orderByExpressions = @@ -534,19 +534,19 @@ public void testExploreQueryWithEDSFilter() throws InvalidProtocolBufferExceptio AttributeMetadataProvider attributeMetadataProvider = mock(AttributeMetadataProvider.class); QueryServiceEntityFetcher queryServiceEntityFetcher = mock(QueryServiceEntityFetcher.class); EntityServiceEntityFetcher entityServiceEntityFetcher = mock(EntityServiceEntityFetcher.class); - EntityIdColumnsConfigs entityIdColumnsConfigs = mock(EntityIdColumnsConfigs.class); + EntityIdColumnsConfig entityIdColumnsConfig = mock(EntityIdColumnsConfig.class); QueryServiceClient queryServiceClient = mock(QueryServiceClient.class); RequestHandler requestHandler = new RequestHandler( queryServiceClient, attributeMetadataProvider, - entityIdColumnsConfigs, + entityIdColumnsConfig, queryServiceEntityFetcher, entityServiceEntityFetcher); ExploreRequestContext newExploreRequestContext = new ExploreRequestContext(RequestContext.forTenantId("tenantId"), exploreRequest); - when(entityIdColumnsConfigs.getIdKey("API")).thenReturn(Optional.of("entityId")); + when(entityIdColumnsConfig.getIdKey("API")).thenReturn(Optional.of("entityId")); when(attributeMetadataProvider.getAttributesMetadata(any(), any())).thenReturn(attributeMap); when(attributeMetadataProvider.getAttributeMetadata(any(), any(), eq("entityId"))) .thenReturn(Optional.of(AttributeMetadata.newBuilder().setId("API.id").build())); diff --git a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/explore/TimeAggregationsRequestHandlerTest.java b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/explore/TimeAggregationsRequestHandlerTest.java index 78e58b79..3f24ef61 100644 --- a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/explore/TimeAggregationsRequestHandlerTest.java +++ b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/explore/TimeAggregationsRequestHandlerTest.java @@ -7,7 +7,7 @@ import org.hypertrace.gateway.service.common.datafetcher.QueryServiceEntityFetcher; import org.hypertrace.gateway.service.common.util.QueryExpressionUtil; import org.hypertrace.gateway.service.common.util.QueryServiceClient; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; import org.hypertrace.gateway.service.explore.entity.EntityServiceEntityFetcher; import org.hypertrace.gateway.service.v1.common.Expression; import org.hypertrace.gateway.service.v1.common.FunctionExpression; @@ -69,7 +69,7 @@ public void intervalStartTimeOrderByShouldBeAddedToOrderByListAndAliasShouldMatc new TimeAggregationsRequestHandler( mock(QueryServiceClient.class), mock(AttributeMetadataProvider.class), - mock(EntityIdColumnsConfigs.class), + mock(EntityIdColumnsConfig.class), mock(QueryServiceEntityFetcher.class), mock(EntityServiceEntityFetcher.class)); List orderByExpressions = @@ -121,7 +121,7 @@ public void intervalStartTimeOrderingNotAddedIfAlreadyRequested() { new TimeAggregationsRequestHandler( mock(QueryServiceClient.class), mock(AttributeMetadataProvider.class), - mock(EntityIdColumnsConfigs.class), + mock(EntityIdColumnsConfig.class), mock(QueryServiceEntityFetcher.class), mock(EntityServiceEntityFetcher.class)); List orderByExpressions = 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 88b94515..b954f328 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 @@ -20,7 +20,7 @@ import org.hypertrace.gateway.service.common.util.QueryServiceClient; import org.hypertrace.gateway.service.entity.EntitiesRequestContext; import org.hypertrace.gateway.service.entity.EntityKey; -import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfigs; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; import org.hypertrace.gateway.service.explore.ExploreRequestContext; import org.hypertrace.gateway.service.v1.common.ColumnIdentifier; import org.hypertrace.gateway.service.v1.common.Expression; @@ -55,7 +55,7 @@ void setup() { this.entityRequestHandler = new EntityRequestHandler( attributeMetadataProvider, - mock(EntityIdColumnsConfigs.class), + mock(EntityIdColumnsConfig.class), mock(QueryServiceClient.class), queryServiceEntityFetcher, entityServiceEntityFetcher); diff --git a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/explore/entity/EntityServiceEntityFetcherTest.java b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/explore/entity/EntityServiceEntityFetcherTest.java index 734a243a..eaa848a9 100644 --- a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/explore/entity/EntityServiceEntityFetcherTest.java +++ b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/explore/entity/EntityServiceEntityFetcherTest.java @@ -18,7 +18,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.entity.config.EntityIdColumnsConfigs; +import org.hypertrace.gateway.service.entity.config.EntityIdColumnsConfig; import org.hypertrace.gateway.service.explore.ExploreRequestContext; import org.hypertrace.gateway.service.v1.common.ColumnIdentifier; import org.hypertrace.gateway.service.v1.common.Expression; @@ -35,17 +35,17 @@ public class EntityServiceEntityFetcherTest { private AttributeMetadataProvider attributeMetadataProvider; - private EntityIdColumnsConfigs entityIdColumnsConfigs; + private EntityIdColumnsConfig entityIdColumnsConfig; private EntityQueryServiceClient entityQueryServiceClient; @Test void testGetEntities() { AttributeMetadataProvider attributeMetadataProvider = mock(AttributeMetadataProvider.class); - EntityIdColumnsConfigs entityIdColumnsConfigs = mock(EntityIdColumnsConfigs.class); + EntityIdColumnsConfig entityIdColumnsConfig = mock(EntityIdColumnsConfig.class); EntityQueryServiceClient entityQueryServiceClient = mock(EntityQueryServiceClient.class); EntityServiceEntityFetcher entityServiceEntityFetcher = new EntityServiceEntityFetcher( - attributeMetadataProvider, entityIdColumnsConfigs, entityQueryServiceClient); + attributeMetadataProvider, entityIdColumnsConfig, entityQueryServiceClient); when(entityQueryServiceClient.execute(any(), any())).thenReturn(mockResults()); diff --git a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/trace/TracesServiceTest.java b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/trace/TracesServiceTest.java index a031251e..e05e06ff 100644 --- a/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/trace/TracesServiceTest.java +++ b/gateway-service-impl/src/test/java/org/hypertrace/gateway/service/trace/TracesServiceTest.java @@ -26,6 +26,7 @@ import org.hypertrace.gateway.service.AbstractGatewayServiceTest; import org.hypertrace.gateway.service.common.AttributeMetadataProvider; import org.hypertrace.gateway.service.common.RequestContext; +import org.hypertrace.gateway.service.common.config.GatewayServiceConfig; import org.hypertrace.gateway.service.common.config.ScopeFilterConfigs; import org.hypertrace.gateway.service.common.converters.QueryRequestUtil; import org.hypertrace.gateway.service.common.util.QueryExpressionUtil; @@ -49,6 +50,7 @@ public class TracesServiceTest extends AbstractGatewayServiceTest { private QueryServiceClient queryServiceClient; private TracesService tracesService; private ExecutorService queryExecutor; + private GatewayServiceConfig gatewayServiceConfig; @BeforeEach public void setup() { @@ -64,12 +66,14 @@ public void setup() { queryExecutor = QueryExecutorServiceFactory.buildExecutorService( QueryExecutorConfig.from(this.getConfig())); + + gatewayServiceConfig = mock(GatewayServiceConfig.class); + when(gatewayServiceConfig.getLogConfig()).thenReturn(logConfig); + when(gatewayServiceConfig.getScopeFilterConfigs()) + .thenReturn(new ScopeFilterConfigs(ConfigFactory.empty())); tracesService = new TracesService( - queryServiceClient, - attributeMetadataProvider, - new ScopeFilterConfigs(ConfigFactory.empty()), - queryExecutor); + gatewayServiceConfig, queryServiceClient, attributeMetadataProvider, queryExecutor); } @AfterEach diff --git a/gateway-service/src/main/resources/configs/common/application.conf b/gateway-service/src/main/resources/configs/common/application.conf index 4bf968a5..e7a3e412 100644 --- a/gateway-service/src/main/resources/configs/common/application.conf +++ b/gateway-service/src/main/resources/configs/common/application.conf @@ -69,6 +69,10 @@ entity.idcolumn.config = [ }, ] +filter.entity = { + and.enabled = false +} + scopeFiltersConfig = [ { scope = API_TRACE diff --git a/helm/templates/configmap.yaml b/helm/templates/configmap.yaml index 08c47fbe..2a7e960b 100644 --- a/helm/templates/configmap.yaml +++ b/helm/templates/configmap.yaml @@ -1,8 +1,21 @@ apiVersion: v1 kind: ConfigMap metadata: - name: {{ .Values.configMap.name }} + name: {{ .Values.service.config.name }} labels: release: {{ .Release.Name }} data: - {{- toYaml .Values.configMap.data | nindent 2 }} + application.conf: |- + entity.service.config = { + host = entity-service + } + query.service.config = { + host = query-service + } + attributes.service.config = { + host = attribute-service + } + + filter.entity.and.enabled = {{ .Values.service.config.gatewayServiceConfig.entityAndFilterEnabled }} + + diff --git a/helm/values.yaml b/helm/values.yaml index 2b38f8a7..dd6c6e16 100644 --- a/helm/values.yaml +++ b/helm/values.yaml @@ -24,6 +24,10 @@ service: type: ClusterIP port: 50071 adminPort: 50072 + config: + name: gateway-service-config + gatewayServiceConfig: + entityAndFilterEnabled: false nodeLabels: {} @@ -68,19 +72,6 @@ deploymentSelectorMatchLabels: serviceSelectorLabels: app: gateway-service -configMap: - name: gateway-service-config - data: - application.conf: |- - entity.service.config = { - host = entity-service - } - query.service.config = { - host = query-service - } - attributes.service.config = { - host = attribute-service - } logConfig: name: gateway-service-log-config monitorInterval: 30