diff --git a/gateway-service-impl/build.gradle.kts b/gateway-service-impl/build.gradle.kts index 2caa403d..6b07a7d0 100644 --- a/gateway-service-impl/build.gradle.kts +++ b/gateway-service-impl/build.gradle.kts @@ -33,8 +33,8 @@ dependencies { implementation("com.google.guava:guava:32.1.2-jre") implementation("com.google.inject:guice:5.0.1") - implementation("com.fasterxml.jackson.core:jackson-annotations:2.15.2") - implementation("com.fasterxml.jackson.core:jackson-databind:2.15.2") + implementation("com.fasterxml.jackson.core:jackson-annotations:2.16.0") + implementation("com.fasterxml.jackson.core:jackson-databind:2.16.0") testImplementation("org.junit.jupiter:junit-jupiter:5.8.2") testImplementation("org.mockito:mockito-junit-jupiter:5.4.0") diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/converters/QueryRequestUtil.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/converters/QueryRequestUtil.java index 42541fa4..b0235e86 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/converters/QueryRequestUtil.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/common/converters/QueryRequestUtil.java @@ -20,6 +20,7 @@ public class QueryRequestUtil { private static final String COUNT_FUNCTION_NAME = "COUNT"; private static final String DISTINCTCOUNT_FUNCTION_NAME = "DISTINCTCOUNT"; + private static final List LIST_WITH_NULL_STRING = List.of("null"); public static Filter createBetweenTimesFilter(String columnName, long lower, long higher) { return Filter.newBuilder() @@ -127,4 +128,19 @@ public static Expression createTimeColumnGroupByExpression( .addArguments(createStringLiteralExpression(periodSecs + ":SECONDS"))) .build(); } + + public static List convertStringArrayValue( + org.hypertrace.gateway.service.v1.common.Value value) { + // The downstream QS service returns the default value "null" for a string array when it is + // empty. GW returns an empty list as output. This transformation occurs in the value converter. + // To handle this scenario when querying downstream with an empty list, set its default value to + // "null." + // Refer to {@linkplain StringToAttributeKindConverter#convertToArray} to check how QS response + // for string array column is converted + if (value.getStringArrayList().isEmpty()) { + return LIST_WITH_NULL_STRING; + } else { + return value.getStringArrayList(); + } + } } diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/TheRestGroupRequestHandler.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/TheRestGroupRequestHandler.java index e410e2d8..52acc6a7 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/TheRestGroupRequestHandler.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/TheRestGroupRequestHandler.java @@ -1,11 +1,14 @@ package org.hypertrace.gateway.service.explore; +import static org.hypertrace.gateway.service.common.converters.QueryRequestUtil.convertStringArrayValue; + import com.google.common.collect.ImmutableSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.hypertrace.gateway.service.common.util.ExpressionReader; import org.hypertrace.gateway.service.v1.common.Expression; import org.hypertrace.gateway.service.v1.common.Filter; @@ -224,10 +227,21 @@ private Set getExcludedValues( String resultName, ExploreResponse.Builder originalResponse) { return originalResponse.getRowBuilderList().stream() .map(rowBuilder -> rowBuilder.getColumnsMap().get(resultName)) - .map(Value::getString) + .flatMap(this::getStringValues) .collect(ImmutableSet.toImmutableSet()); } + private Stream getStringValues(Value value) { + switch (value.getValueType()) { + case STRING: + return Stream.of(value.getString()); + case STRING_ARRAY: + return convertStringArrayValue(value).stream(); + default: + return Stream.of(); + } + } + private Filter.Builder createExcludedChildFilter( Expression groupBySelectionExpression, Set excludedValues) { return Filter.newBuilder() diff --git a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/TimeAggregationsWithGroupByRequestHandler.java b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/TimeAggregationsWithGroupByRequestHandler.java index 5690e195..2c988008 100644 --- a/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/TimeAggregationsWithGroupByRequestHandler.java +++ b/gateway-service-impl/src/main/java/org/hypertrace/gateway/service/explore/TimeAggregationsWithGroupByRequestHandler.java @@ -1,5 +1,7 @@ package org.hypertrace.gateway.service.explore; +import static org.hypertrace.gateway.service.common.converters.QueryRequestUtil.convertStringArrayValue; + import com.google.common.collect.Streams; import java.util.List; import java.util.Map; @@ -228,7 +230,7 @@ private void buildInClauseFilterValue(Value value, Value.Builder valueBuilder) { valueBuilder.addStringArray(value.getString()); break; case STRING_ARRAY: - valueBuilder.addAllStringArray(value.getStringArrayList()); + valueBuilder.addAllStringArray(convertStringArrayValue(value)); break; case LONG: valueBuilder.addLongArray(value.getLong()); diff --git a/gateway-service-impl/src/test/resources/attributes/attributes.json b/gateway-service-impl/src/test/resources/attributes/attributes.json index 30d873c1..48c3665c 100644 --- a/gateway-service-impl/src/test/resources/attributes/attributes.json +++ b/gateway-service-impl/src/test/resources/attributes/attributes.json @@ -945,6 +945,17 @@ "QS" ] }, + { + "fqn": "Service.labels", + "valueKind": "TYPE_STRING_ARRAY", + "key": "labels", + "displayName": "Service Labels", + "scopeString": "SERVICE", + "type": "ATTRIBUTE", + "sources": [ + "QS" + ] + }, { "fqn": "Service.start_time_millis", "valueKind": "TYPE_INT64", diff --git a/gateway-service-impl/src/test/resources/expected-test-responses/explore/grouped-time-aggregation-with-group-limit-and-the-rest-with-null-value-group.json b/gateway-service-impl/src/test/resources/expected-test-responses/explore/grouped-time-aggregation-with-group-limit-and-the-rest-with-null-value-group.json new file mode 100644 index 00000000..c4106795 --- /dev/null +++ b/gateway-service-impl/src/test/resources/expected-test-responses/explore/grouped-time-aggregation-with-group-limit-and-the-rest-with-null-value-group.json @@ -0,0 +1,98 @@ +{ + "row": [ + { + "columns": { + "INTERVAL_START_TIME": { + "valueType": "LONG", + "long": "1615593600000" + }, + "SERVICE.labels": { + "valueType": "STRING_ARRAY" + }, + "SUM_SERVICE.numCalls_[]": { + "valueType": "LONG", + "long": "1616" + } + } + }, + { + "columns": { + "INTERVAL_START_TIME": { + "valueType": "LONG", + "long": "1615593600000" + }, + "SERVICE.labels": { + "valueType": "STRING_ARRAY", + "string_array": ["label1"] + }, + "SUM_SERVICE.numCalls_[]": { + "valueType": "LONG", + "long": "1989" + } + } + }, + { + "columns": { + "INTERVAL_START_TIME": { + "valueType": "LONG", + "long": "1615597200000" + }, + "SERVICE.labels": { + "valueType": "STRING_ARRAY" + }, + "SUM_SERVICE.numCalls_[]": { + "valueType": "LONG", + "long": "2525" + } + } + }, + { + "columns": { + "INTERVAL_START_TIME": { + "valueType": "LONG", + "long": "1615597200000" + }, + "SERVICE.labels": { + "valueType": "STRING_ARRAY", + "string_array": ["label1"] + }, + "SUM_SERVICE.numCalls_[]": { + "valueType": "LONG", + "long": "1977" + } + } + }, + { + "columns": { + "INTERVAL_START_TIME": { + "valueType": "LONG", + "long": "1615593600000" + }, + "SUM_SERVICE.numCalls_[]": { + "valueType": "LONG", + "long": "27485" + }, + "SERVICE.labels": { + "valueType": "STRING", + "string": "__Other" + } + } + }, + { + "columns": { + "INTERVAL_START_TIME": { + "valueType": "LONG", + "long": "1615597200000" + }, + "SUM_SERVICE.numCalls_[]": { + "valueType": "LONG", + "long": "27192" + }, + "SERVICE.labels": { + "valueType": "STRING", + "string": "__Other" + } + } + } + ] +} \ No newline at end of file diff --git a/gateway-service-impl/src/test/resources/expected-test-responses/explore/grouped-time-aggregation-with-group-limit-with-null-and-nonnull-value-group.json b/gateway-service-impl/src/test/resources/expected-test-responses/explore/grouped-time-aggregation-with-group-limit-with-null-and-nonnull-value-group.json new file mode 100644 index 00000000..682b8dc6 --- /dev/null +++ b/gateway-service-impl/src/test/resources/expected-test-responses/explore/grouped-time-aggregation-with-group-limit-with-null-and-nonnull-value-group.json @@ -0,0 +1,90 @@ +{ + "row": [{ + "columns": { + "INTERVAL_START_TIME": { + "valueType": "LONG", + "long": "1615593600000" + }, + "SERVICE.labels": { + "valueType": "STRING_ARRAY" + }, + "SUM_SERVICE.numCalls_[]": { + "valueType": "LONG", + "long": "1616" + } + } + }, { + "columns": { + "INTERVAL_START_TIME": { + "valueType": "LONG", + "long": "1615593600000" + }, + "SERVICE.labels": { + "valueType": "STRING_ARRAY", + "string_array": ["label1"] + }, + "SUM_SERVICE.numCalls_[]": { + "valueType": "LONG", + "long": "1989" + } + } + }, { + "columns": { + "INTERVAL_START_TIME": { + "valueType": "LONG", + "long": "1615597200000" + }, + "SERVICE.labels": { + "valueType": "STRING_ARRAY" + }, + "SUM_SERVICE.numCalls_[]": { + "valueType": "LONG", + "long": "2525" + } + } + }, { + "columns": { + "INTERVAL_START_TIME": { + "valueType": "LONG", + "long": "1615597200000" + }, + "SERVICE.labels": { + "valueType": "STRING_ARRAY", + "string_array": ["label1"] + }, + "SUM_SERVICE.numCalls_[]": { + "valueType": "LONG", + "long": "1977" + } + } + }, { + "columns": { + "INTERVAL_START_TIME": { + "valueType": "LONG", + "long": "1615600800000" + }, + "SERVICE.labels": { + "valueType": "STRING_ARRAY", + "string_array": ["label1"] + }, + "SUM_SERVICE.numCalls_[]": { + "valueType": "LONG", + "long": "1965" + } + } + }, { + "columns": { + "INTERVAL_START_TIME": { + "valueType": "LONG", + "long": "1615600800000" + }, + "SERVICE.labels": { + "valueType": "STRING_ARRAY" + }, + "SUM_SERVICE.numCalls_[]": { + "valueType": "LONG", + "long": "2323" + } + } + }] +} \ No newline at end of file diff --git a/gateway-service-impl/src/test/resources/expected-test-responses/explore/grouped-time-aggregation-with-group-limit-with-null-value-group.json b/gateway-service-impl/src/test/resources/expected-test-responses/explore/grouped-time-aggregation-with-group-limit-with-null-value-group.json new file mode 100644 index 00000000..d8548568 --- /dev/null +++ b/gateway-service-impl/src/test/resources/expected-test-responses/explore/grouped-time-aggregation-with-group-limit-with-null-value-group.json @@ -0,0 +1,45 @@ +{ + "row": [{ + "columns": { + "INTERVAL_START_TIME": { + "valueType": "LONG", + "long": "1615593600000" + }, + "SERVICE.labels": { + "valueType": "STRING_ARRAY" + }, + "SUM_SERVICE.numCalls_[]": { + "valueType": "LONG", + "long": "1616" + } + } + }, { + "columns": { + "INTERVAL_START_TIME": { + "valueType": "LONG", + "long": "1615597200000" + }, + "SERVICE.labels": { + "valueType": "STRING_ARRAY" + }, + "SUM_SERVICE.numCalls_[]": { + "valueType": "LONG", + "long": "2525" + } + } + }, { + "columns": { + "INTERVAL_START_TIME": { + "valueType": "LONG", + "long": "1615600800000" + }, + "SERVICE.labels": { + "valueType": "STRING_ARRAY" + }, + "SUM_SERVICE.numCalls_[]": { + "valueType": "LONG", + "long": "2323" + } + } + }] +} \ No newline at end of file diff --git a/gateway-service-impl/src/test/resources/query-service-requests-and-responses/explore/grouped-time-aggregation-with-group-limit-and-the-rest-with-null-value-group.json b/gateway-service-impl/src/test/resources/query-service-requests-and-responses/explore/grouped-time-aggregation-with-group-limit-and-the-rest-with-null-value-group.json new file mode 100644 index 00000000..ce56343e --- /dev/null +++ b/gateway-service-impl/src/test/resources/query-service-requests-and-responses/explore/grouped-time-aggregation-with-group-limit-and-the-rest-with-null-value-group.json @@ -0,0 +1,529 @@ +[ + { + "request": { + "filter": { + "childFilter": [ + { + "lhs": { + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, + "operator": "GE", + "rhs": { + "literal": { + "value": { + "valueType": "LONG", + "long": "1615593600000" + } + } + } + }, + { + "lhs": { + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, + "operator": "LT", + "rhs": { + "literal": { + "value": { + "valueType": "LONG", + "long": "1615844349000" + } + } + } + } + ] + }, + "selection": [ + { + "function": { + "functionName": "SUM", + "arguments": [ + { + "attributeExpression": { + "attributeId": "SERVICE.numCalls" + } + } + ], + "alias": "SUM_SERVICE.numCalls_[]" + } + }, + { + "attributeExpression": { + "attributeId": "SERVICE.labels", + "alias": "SERVICE.labels" + } + } + ], + "groupBy": [ + { + "attributeExpression": { + "attributeId": "SERVICE.labels", + "alias": "SERVICE.labels" + } + } + ], + "limit": 2 + }, + "response": { + "isLastChunk": true, + "resultSetMetadata": { + "columnMetadata": [ + { + "columnName": "SERVICE.labels" + }, + { + "columnName": "SUM_SERVICE.numCalls_[]" + } + ] + }, + "row": [ + { + "column": [ + { + "string": "null" + }, + { + "string": "136098.0" + } + ] + }, + { + "column": [ + { + "string": "label1" + }, + { + "string": "136269.0" + } + ] + } + ] + } + }, + { + "request": { + "filter": { + "childFilter": [ + { + "childFilter": [ + { + "lhs": { + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, + "operator": "GE", + "rhs": { + "literal": { + "value": { + "valueType": "LONG", + "long": "1615593600000" + } + } + } + }, + { + "lhs": { + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, + "operator": "LT", + "rhs": { + "literal": { + "value": { + "valueType": "LONG", + "long": "1615842000000" + } + } + } + } + ] + }, + { + "childFilter": [ + { + "lhs": { + "attributeExpression": { + "attributeId": "SERVICE.labels", + "alias": "SERVICE.labels" + } + }, + "operator": "IN", + "rhs": { + "literal": { + "value": { + "valueType": "STRING_ARRAY", + "stringArray": [ + "null", + "label1" + ] + } + } + } + } + ] + } + ] + }, + "selection": [ + { + "function": { + "functionName": "SUM", + "arguments": [ + { + "attributeExpression": { + "attributeId": "SERVICE.numCalls" + } + } + ], + "alias": "SUM_SERVICE.numCalls_[]" + } + }, + { + "attributeExpression": { + "attributeId": "SERVICE.labels", + "alias": "SERVICE.labels" + } + } + ], + "groupBy": [ + { + "function": { + "functionName": "dateTimeConvert", + "arguments": [ + { + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, + { + "literal": { + "value": { + "string": "1:MILLISECONDS:EPOCH" + } + } + }, + { + "literal": { + "value": { + "string": "1:MILLISECONDS:EPOCH" + } + } + }, + { + "literal": { + "value": { + "string": "3600:SECONDS" + } + } + } + ] + } + }, + { + "attributeExpression": { + "attributeId": "SERVICE.labels", + "alias": "SERVICE.labels" + } + } + ], + "orderBy": [ + { + "expression": { + "function": { + "functionName": "dateTimeConvert", + "arguments": [ + { + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, + { + "literal": { + "value": { + "string": "1:MILLISECONDS:EPOCH" + } + } + }, + { + "literal": { + "value": { + "string": "1:MILLISECONDS:EPOCH" + } + } + }, + { + "literal": { + "value": { + "string": "3600:SECONDS" + } + } + } + ] + } + } + } + ], + "limit": 6 + }, + "response": { + "isLastChunk": true, + "resultSetMetadata": { + "columnMetadata": [ + { + "columnName": "dateTimeConvert" + }, + { + "columnName": "SERVICE.labels" + }, + { + "columnName": "SUM_SERVICE.numCalls_[]" + } + ] + }, + "row": [ + { + "column": [ + { + "string": "1615593600000" + }, + { + "string": "null" + }, + { + "string": "1616.0" + } + ] + }, + { + "column": [ + { + "string": "1615593600000" + }, + { + "string": "label1" + }, + { + "string": "1989.0" + } + ] + }, + { + "column": [ + { + "string": "1615597200000" + }, + { + "string": "null" + }, + { + "string": "2525.0" + } + ] + }, + { + "column": [ + { + "string": "1615597200000" + }, + { + "string": "label1" + }, + { + "string": "1977.0" + } + ] + } + ] + } + }, + { + "request": { + "filter": { + "childFilter": [ + { + "childFilter": [ + { + "lhs": { + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, + "operator": "GE", + "rhs": { + "literal": { + "value": { + "valueType": "LONG", + "long": "1615593600000" + } + } + } + }, + { + "lhs": { + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, + "operator": "LT", + "rhs": { + "literal": { + "value": { + "valueType": "LONG", + "long": "1615842000000" + } + } + } + } + ] + }, + { + "childFilter": [ + { + "lhs": { + "attributeExpression": { + "attributeId": "SERVICE.labels", + "alias": "SERVICE.labels" + } + }, + "operator": "NOT_IN", + "rhs": { + "literal": { + "value": { + "valueType": "STRING_ARRAY", + "stringArray": [ + "null", + "label1" + ] + } + } + } + } + ] + } + ] + }, + "selection": [ + { + "function": { + "functionName": "SUM", + "arguments": [ + { + "attributeExpression": { + "attributeId": "SERVICE.numCalls" + } + } + ], + "alias": "SUM_SERVICE.numCalls_[]" + } + } + ], + "groupBy": [ + { + "function": { + "functionName": "dateTimeConvert", + "arguments": [ + { + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, + { + "literal": { + "value": { + "string": "1:MILLISECONDS:EPOCH" + } + } + }, + { + "literal": { + "value": { + "string": "1:MILLISECONDS:EPOCH" + } + } + }, + { + "literal": { + "value": { + "string": "3600:SECONDS" + } + } + } + ] + } + } + ], + "orderBy": [{ + "expression": { + "function": { + "functionName": "dateTimeConvert", + "arguments": [{ + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, { + "literal": { + "value": { + "string": "1:MILLISECONDS:EPOCH" + } + } + }, { + "literal": { + "value": { + "string": "1:MILLISECONDS:EPOCH" + } + } + }, { + "literal": { + "value": { + "string": "3600:SECONDS" + } + } + }] + } + } + }], + "limit": 2 + }, + "response": { + "isLastChunk": true, + "resultSetMetadata": { + "columnMetadata": [ + { + "columnName": "dateTimeConvert" + }, + { + "columnName": "SUM_SERVICE.numCalls_[]" + } + ] + }, + "row": [ + { + "column": [ + { + "string": "1615593600000" + }, + { + "string": "27485.0" + } + ] + }, + { + "column": [ + { + "string": "1615597200000" + }, + { + "string": "27192.0" + } + ] + } + ] + } + } +] \ No newline at end of file diff --git a/gateway-service-impl/src/test/resources/query-service-requests-and-responses/explore/grouped-time-aggregation-with-group-limit-with-null-and-nonnull-value-group.json b/gateway-service-impl/src/test/resources/query-service-requests-and-responses/explore/grouped-time-aggregation-with-group-limit-with-null-and-nonnull-value-group.json new file mode 100644 index 00000000..e1ae767f --- /dev/null +++ b/gateway-service-impl/src/test/resources/query-service-requests-and-responses/explore/grouped-time-aggregation-with-group-limit-with-null-and-nonnull-value-group.json @@ -0,0 +1,372 @@ +[ + { + "request": { + "filter": { + "childFilter": [ + { + "lhs": { + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, + "operator": "GE", + "rhs": { + "literal": { + "value": { + "valueType": "LONG", + "long": "1615593600000" + } + } + } + }, + { + "lhs": { + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, + "operator": "LT", + "rhs": { + "literal": { + "value": { + "valueType": "LONG", + "long": "1615844349000" + } + } + } + } + ] + }, + "selection": [ + { + "function": { + "functionName": "SUM", + "arguments": [ + { + "attributeExpression": { + "attributeId": "SERVICE.numCalls" + } + } + ], + "alias": "SUM_SERVICE.numCalls_[]" + } + }, + { + "attributeExpression": { + "attributeId": "SERVICE.labels", + "alias": "SERVICE.labels" + } + } + ], + "groupBy": [ + { + "attributeExpression": { + "attributeId": "SERVICE.labels", + "alias": "SERVICE.labels" + } + } + ], + "limit": 2 + }, + "response": { + "isLastChunk": true, + "resultSetMetadata": { + "columnMetadata": [ + { + "columnName": "SERVICE.labels" + }, + { + "columnName": "SUM_SERVICE.numCalls_[]" + } + ] + }, + "row": [ + { + "column": [ + { + "string": "null" + }, + { + "string": "136098.0" + } + ] + }, + { + "column": [ + { + "string": "label1" + }, + { + "string": "136269.0" + } + ] + } + ] + } + }, + { + "request": { + "filter": { + "childFilter": [ + { + "childFilter": [ + { + "lhs": { + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, + "operator": "GE", + "rhs": { + "literal": { + "value": { + "valueType": "LONG", + "long": "1615593600000" + } + } + } + }, + { + "lhs": { + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, + "operator": "LT", + "rhs": { + "literal": { + "value": { + "valueType": "LONG", + "long": "1615842000000" + } + } + } + } + ] + }, + { + "childFilter": [ + { + "lhs": { + "attributeExpression": { + "attributeId": "SERVICE.labels", + "alias": "SERVICE.labels" + } + }, + "operator": "IN", + "rhs": { + "literal": { + "value": { + "valueType": "STRING_ARRAY", + "stringArray": [ + "null", + "label1" + ] + } + } + } + } + ] + } + ] + }, + "selection": [ + { + "function": { + "functionName": "SUM", + "arguments": [ + { + "attributeExpression": { + "attributeId": "SERVICE.numCalls" + } + } + ], + "alias": "SUM_SERVICE.numCalls_[]" + } + }, + { + "attributeExpression": { + "attributeId": "SERVICE.labels", + "alias": "SERVICE.labels" + } + } + ], + "groupBy": [ + { + "function": { + "functionName": "dateTimeConvert", + "arguments": [ + { + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, + { + "literal": { + "value": { + "string": "1:MILLISECONDS:EPOCH" + } + } + }, + { + "literal": { + "value": { + "string": "1:MILLISECONDS:EPOCH" + } + } + }, + { + "literal": { + "value": { + "string": "3600:SECONDS" + } + } + } + ] + } + }, + { + "attributeExpression": { + "attributeId": "SERVICE.labels", + "alias": "SERVICE.labels" + } + } + ], + "orderBy": [ + { + "expression": { + "function": { + "functionName": "dateTimeConvert", + "arguments": [ + { + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, + { + "literal": { + "value": { + "string": "1:MILLISECONDS:EPOCH" + } + } + }, + { + "literal": { + "value": { + "string": "1:MILLISECONDS:EPOCH" + } + } + }, + { + "literal": { + "value": { + "string": "3600:SECONDS" + } + } + } + ] + } + }, + "order": "DESC" + } + ], + "limit": 6 + }, + "response": { + "isLastChunk": true, + "resultSetMetadata": { + "columnMetadata": [ + { + "columnName": "dateTimeConvert" + }, + { + "columnName": "SERVICE.labels" + }, + { + "columnName": "SUM_SERVICE.numCalls_[]" + } + ] + }, + "row": [ + { + "column": [ + { + "string": "1615593600000" + }, + { + "string": "null" + }, + { + "string": "1616.0" + } + ] + }, + { + "column": [ + { + "string": "1615593600000" + }, + { + "string": "label1" + }, + { + "string": "1989.0" + } + ] + }, + { + "column": [ + { + "string": "1615597200000" + }, + { + "string": "null" + }, + { + "string": "2525.0" + } + ] + }, + { + "column": [ + { + "string": "1615597200000" + }, + { + "string": "label1" + }, + { + "string": "1977.0" + } + ] + }, + { + "column": [ + { + "string": "1615600800000" + }, + { + "string": "label1" + }, + { + "string": "1965.0" + } + ] + }, + { + "column": [ + { + "string": "1615600800000" + }, + { + "string": "null" + }, + { + "string": "2323.0" + } + ] + } + ] + } + } +] \ No newline at end of file diff --git a/gateway-service-impl/src/test/resources/query-service-requests-and-responses/explore/grouped-time-aggregation-with-group-limit-with-null-value-group.json b/gateway-service-impl/src/test/resources/query-service-requests-and-responses/explore/grouped-time-aggregation-with-group-limit-with-null-value-group.json new file mode 100644 index 00000000..01b3cc25 --- /dev/null +++ b/gateway-service-impl/src/test/resources/query-service-requests-and-responses/explore/grouped-time-aggregation-with-group-limit-with-null-value-group.json @@ -0,0 +1,322 @@ +[ + { + "request": { + "filter": { + "childFilter": [ + { + "lhs": { + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, + "operator": "GE", + "rhs": { + "literal": { + "value": { + "valueType": "LONG", + "long": "1615593600000" + } + } + } + }, + { + "lhs": { + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, + "operator": "LT", + "rhs": { + "literal": { + "value": { + "valueType": "LONG", + "long": "1615844349000" + } + } + } + } + ] + }, + "selection": [ + { + "function": { + "functionName": "SUM", + "arguments": [ + { + "attributeExpression": { + "attributeId": "SERVICE.numCalls" + } + } + ], + "alias": "SUM_SERVICE.numCalls_[]" + } + }, + { + "attributeExpression": { + "attributeId": "SERVICE.labels", + "alias": "SERVICE.labels" + } + } + ], + "groupBy": [ + { + "attributeExpression": { + "attributeId": "SERVICE.labels", + "alias": "SERVICE.labels" + } + } + ], + "limit": 2 + }, + "response": { + "isLastChunk": true, + "resultSetMetadata": { + "columnMetadata": [ + { + "columnName": "SERVICE.labels" + }, + { + "columnName": "SUM_SERVICE.numCalls_[]" + } + ] + }, + "row": [ + { + "column": [ + { + "string": "null" + }, + { + "string": "136098.0" + } + ] + } + ] + } + }, + { + "request": { + "filter": { + "childFilter": [ + { + "childFilter": [ + { + "lhs": { + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, + "operator": "GE", + "rhs": { + "literal": { + "value": { + "valueType": "LONG", + "long": "1615593600000" + } + } + } + }, + { + "lhs": { + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, + "operator": "LT", + "rhs": { + "literal": { + "value": { + "valueType": "LONG", + "long": "1615842000000" + } + } + } + } + ] + }, + { + "childFilter": [ + { + "lhs": { + "attributeExpression": { + "attributeId": "SERVICE.labels", + "alias": "SERVICE.labels" + } + }, + "operator": "IN", + "rhs": { + "literal": { + "value": { + "valueType": "STRING_ARRAY", + "stringArray": [ + "null" + ] + } + } + } + } + ] + } + ] + }, + "selection": [ + { + "function": { + "functionName": "SUM", + "arguments": [ + { + "attributeExpression": { + "attributeId": "SERVICE.numCalls" + } + } + ], + "alias": "SUM_SERVICE.numCalls_[]" + } + }, + { + "attributeExpression": { + "attributeId": "SERVICE.labels", + "alias": "SERVICE.labels" + } + } + ], + "groupBy": [ + { + "function": { + "functionName": "dateTimeConvert", + "arguments": [ + { + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, + { + "literal": { + "value": { + "string": "1:MILLISECONDS:EPOCH" + } + } + }, + { + "literal": { + "value": { + "string": "1:MILLISECONDS:EPOCH" + } + } + }, + { + "literal": { + "value": { + "string": "3600:SECONDS" + } + } + } + ] + } + }, + { + "attributeExpression": { + "attributeId": "SERVICE.labels", + "alias": "SERVICE.labels" + } + } + ], + "orderBy": [ + { + "expression": { + "function": { + "functionName": "dateTimeConvert", + "arguments": [ + { + "attributeExpression": { + "attributeId": "SERVICE.startTime" + } + }, + { + "literal": { + "value": { + "string": "1:MILLISECONDS:EPOCH" + } + } + }, + { + "literal": { + "value": { + "string": "1:MILLISECONDS:EPOCH" + } + } + }, + { + "literal": { + "value": { + "string": "3600:SECONDS" + } + } + } + ] + } + }, + "order": "DESC" + } + ], + "limit": 6 + }, + "response": { + "isLastChunk": true, + "resultSetMetadata": { + "columnMetadata": [ + { + "columnName": "dateTimeConvert" + }, + { + "columnName": "SERVICE.labels" + }, + { + "columnName": "SUM_SERVICE.numCalls_[]" + } + ] + }, + "row": [ + { + "column": [ + { + "string": "1615593600000" + }, + { + "string": "null" + }, + { + "string": "1616.0" + } + ] + }, + { + "column": [ + { + "string": "1615597200000" + }, + { + "string": "null" + }, + { + "string": "2525.0" + } + ] + }, + { + "column": [ + { + "string": "1615600800000" + }, + { + "string": "null" + }, + { + "string": "2323.0" + } + ] + } + ] + } + } +] \ No newline at end of file diff --git a/gateway-service-impl/src/test/resources/test-requests/explore/grouped-time-aggregation-with-group-limit-and-the-rest-with-null-value-group.json b/gateway-service-impl/src/test/resources/test-requests/explore/grouped-time-aggregation-with-group-limit-and-the-rest-with-null-value-group.json new file mode 100644 index 00000000..8cc3052e --- /dev/null +++ b/gateway-service-impl/src/test/resources/test-requests/explore/grouped-time-aggregation-with-group-limit-and-the-rest-with-null-value-group.json @@ -0,0 +1,39 @@ +{ + "context": "SERVICE", + "startTimeMillis": "1615593600000", + "endTimeMillis": "1615844349000", + "filter": { + }, + "timeAggregation": [ + { + "period": { + "value": 3600, + "unit": "SECONDS" + }, + "aggregation": { + "function": { + "function": "SUM", + "arguments": [ + { + "columnIdentifier": { + "columnName": "SERVICE.numCalls" + } + } + ], + "alias": "SUM_SERVICE.numCalls_[]" + } + } + } + ], + "groupBy": [ + { + "columnIdentifier": { + "columnName": "SERVICE.labels", + "alias": "SERVICE.labels" + } + } + ], + "includeRestGroup": true, + "groupLimit": 2, + "limit": 6 +} \ No newline at end of file diff --git a/gateway-service-impl/src/test/resources/test-requests/explore/grouped-time-aggregation-with-group-limit-with-null-and-nonnull-value-group.json b/gateway-service-impl/src/test/resources/test-requests/explore/grouped-time-aggregation-with-group-limit-with-null-and-nonnull-value-group.json new file mode 100644 index 00000000..f0f3df51 --- /dev/null +++ b/gateway-service-impl/src/test/resources/test-requests/explore/grouped-time-aggregation-with-group-limit-with-null-and-nonnull-value-group.json @@ -0,0 +1,40 @@ +{ + "context": "SERVICE", + "startTimeMillis": "1615593600000", + "endTimeMillis": "1615844349000", + "filter": { + }, + "timeAggregation": [{ + "period": { + "value": 3600, + "unit": "SECONDS" + }, + "aggregation": { + "function": { + "function": "SUM", + "arguments": [{ + "columnIdentifier": { + "columnName": "SERVICE.numCalls" + } + }], + "alias": "SUM_SERVICE.numCalls_[]" + } + } + }], + "orderBy": [{ + "expression": { + "columnIdentifier": { + "columnName": "INTERVAL_START_TIME" + } + }, + "order": "DESC" + }], + "groupBy": [{ + "columnIdentifier": { + "columnName": "SERVICE.labels", + "alias": "SERVICE.labels" + } + }], + "groupLimit": 2, + "limit": 6 +} \ No newline at end of file diff --git a/gateway-service-impl/src/test/resources/test-requests/explore/grouped-time-aggregation-with-group-limit-with-null-value-group.json b/gateway-service-impl/src/test/resources/test-requests/explore/grouped-time-aggregation-with-group-limit-with-null-value-group.json new file mode 100644 index 00000000..f0f3df51 --- /dev/null +++ b/gateway-service-impl/src/test/resources/test-requests/explore/grouped-time-aggregation-with-group-limit-with-null-value-group.json @@ -0,0 +1,40 @@ +{ + "context": "SERVICE", + "startTimeMillis": "1615593600000", + "endTimeMillis": "1615844349000", + "filter": { + }, + "timeAggregation": [{ + "period": { + "value": 3600, + "unit": "SECONDS" + }, + "aggregation": { + "function": { + "function": "SUM", + "arguments": [{ + "columnIdentifier": { + "columnName": "SERVICE.numCalls" + } + }], + "alias": "SUM_SERVICE.numCalls_[]" + } + } + }], + "orderBy": [{ + "expression": { + "columnIdentifier": { + "columnName": "INTERVAL_START_TIME" + } + }, + "order": "DESC" + }], + "groupBy": [{ + "columnIdentifier": { + "columnName": "SERVICE.labels", + "alias": "SERVICE.labels" + } + }], + "groupLimit": 2, + "limit": 6 +} \ No newline at end of file diff --git a/owasp-suppressions.xml b/owasp-suppressions.xml index d3486420..74e475e7 100644 --- a/owasp-suppressions.xml +++ b/owasp-suppressions.xml @@ -9,15 +9,7 @@ cpe:/a:utils_project:utils cpe:/a:service_project:service - - - ^pkg:maven/com\.fasterxml\.jackson\.core/jackson\-databind@.*$ - CVE-2023-35116 - - + ^pkg:maven/io\.netty/netty.*@.*$ CVE-2023-4586 + + + ^pkg:maven/io\.grpc/grpc\-.*@.*$ + CVE-2023-44487 +