Skip to content

Commit dc27836

Browse files
committed
Merge branch 'main' into trino_func_types
2 parents f2b6f9a + 51f63c8 commit dc27836

File tree

8 files changed

+182
-9
lines changed

8 files changed

+182
-9
lines changed

helm/templates/deployment.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,13 @@ spec:
9090
name: {{ .Values.queryServiceConfig.data.postgresPasswordSecretName }}
9191
key: {{ .Values.queryServiceConfig.data.postgresqlPasswordSecretKey }}
9292
{{- end }}
93+
{{- if eq .Values.queryServiceConfig.interactiveClientType "trino" }}
94+
- name: {{ .Values.queryServiceConfig.data.trinoPasswordEnvVariable }}
95+
valueFrom:
96+
secretKeyRef:
97+
name: {{ .Values.queryServiceConfig.data.trinoPasswordSecretName }}
98+
key: {{ .Values.queryServiceConfig.data.trinoPasswordSecretKey }}
99+
{{- end }}
93100
volumeMounts:
94101
- name: service-config
95102
mountPath: /app/resources/configs/{{ .Chart.Name }}/application.conf

helm/templates/query-service-config.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ data:
6767
{{- end }}
6868
{{- if eq .Values.queryServiceConfig.interactiveClientType "trino" }}
6969
{{- range .Values.trinoHandlers }}
70-
{
70+
{
7171
{{ tpl . $ | indent 10 }}
72-
}
72+
}
7373
{{- end }}
7474
{{- end }}
7575
]

owasp-suppressions.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
<notes><![CDATA[
4040
file name: netty-handler-4.1.94.Final.jar
4141
]]></notes>
42-
<packageUrl regex="true">^pkg:maven/io\.netty/netty\-handler@.*$</packageUrl>
42+
<packageUrl regex="true">^pkg:maven/io\.netty/netty.*@.*$</packageUrl>
4343
<vulnerabilityName>CVE-2023-4586</vulnerabilityName>
4444
</suppress>
4545
</suppressions>

query-service-impl/src/main/java/org/hypertrace/core/query/service/trino/QueryRequestToTrinoSQLConverter.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.util.stream.Stream;
1414
import org.hypertrace.core.query.service.ExecutionContext;
1515
import org.hypertrace.core.query.service.api.Expression;
16+
import org.hypertrace.core.query.service.api.Filter;
1617
import org.hypertrace.core.query.service.api.OrderByExpression;
1718
import org.hypertrace.core.query.service.api.QueryRequest;
1819
import org.hypertrace.core.query.service.api.SortOrder;
@@ -31,11 +32,13 @@ class QueryRequestToTrinoSQLConverter {
3132

3233
private final org.hypertrace.core.query.service.trino.TableDefinition tableDefinition;
3334
private final TrinoFunctionConverter functionConverter;
35+
private final TrinoFilterHandler trinoFilterHandler;
3436

3537
QueryRequestToTrinoSQLConverter(
3638
TableDefinition tableDefinition, TrinoFunctionConverter functionConverter) {
3739
this.tableDefinition = tableDefinition;
3840
this.functionConverter = functionConverter;
41+
this.trinoFilterHandler = new TrinoFilterHandler();
3942
}
4043

4144
Entry<String, Params> toSQL(
@@ -61,10 +64,13 @@ Entry<String, Params> toSQL(
6164

6265
paramsBuilder.addStringParam(trinoExecutionContext.getExecutionContext().getTenantId());
6366
if (request.hasFilter()) {
64-
String filterClause =
65-
columnRequestConverter.convertFilterClause(
66-
request.getFilter(), paramsBuilder, trinoExecutionContext);
67-
trinoExecutionContext.addResolvedFilterColumnQuery(filterClause);
67+
Filter filter = trinoFilterHandler.skipTrinoAttributeFilter(request.getFilter());
68+
if (!filter.equals(Filter.getDefaultInstance())) {
69+
String filterClause =
70+
columnRequestConverter.convertFilterClause(
71+
filter, paramsBuilder, trinoExecutionContext);
72+
trinoExecutionContext.addResolvedFilterColumnQuery(filterClause);
73+
}
6874
}
6975
trinoExecutionContext.addAllFilterTableColumnNames(
7076
trinoExecutionContext.getActualTableColumnNames());

query-service-impl/src/main/java/org/hypertrace/core/query/service/trino/TrinoBasedRequestHandler.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public class TrinoBasedRequestHandler implements RequestHandler {
4343
private static final String START_TIME_ATTRIBUTE_NAME_CONFIG_KEY = "startTimeAttributeName";
4444
private static final String SLOW_QUERY_THRESHOLD_MS_CONFIG = "slowQueryThresholdMs";
4545
private static final String MIN_REQUEST_DURATION_KEY = "minRequestDuration";
46+
private static final String IS_TRINO_ATTRIBUTE = "EVENT.isTrino";
4647

4748
private static final int DEFAULT_SLOW_QUERY_THRESHOLD_MS = 3000;
4849
private static final Set<Operator> GTE_OPERATORS = Set.of(Operator.GE, Operator.GT, Operator.EQ);
@@ -67,6 +68,7 @@ public class TrinoBasedRequestHandler implements RequestHandler {
6768
private Optional<String> startTimeAttributeName;
6869
private QueryRequestToTrinoSQLConverter request2TrinoSqlConverter;
6970
private final TrinoClientFactory trinoClientFactory;
71+
private final TrinoFilterHandler trinoFilterHandler;
7072

7173
private final JsonFormat.Printer protoJsonPrinter =
7274
JsonFormat.printer().omittingInsignificantWhitespace();
@@ -79,6 +81,7 @@ public class TrinoBasedRequestHandler implements RequestHandler {
7981
this.name = name;
8082
this.trinoClientFactory = trinoClientFactory;
8183
this.processConfig(config);
84+
this.trinoFilterHandler = new TrinoFilterHandler();
8285
}
8386

8487
@Override
@@ -96,7 +99,16 @@ public QueryCost canHandle(QueryRequest request, ExecutionContext executionConte
9699
Set<String> referencedColumns = executionContext.getReferencedColumns();
97100

98101
Preconditions.checkArgument(!referencedColumns.isEmpty());
102+
103+
// query must contain isTrino attribute filter
104+
if (!trinoFilterHandler.containsAttributeFilter(request)) {
105+
return QueryCost.UNSUPPORTED;
106+
}
107+
99108
for (String referencedColumn : referencedColumns) {
109+
if (referencedColumn.equalsIgnoreCase(IS_TRINO_ATTRIBUTE)) {
110+
continue;
111+
}
100112
if (!tableDefinition.containsColumn(referencedColumn)) {
101113
return QueryCost.UNSUPPORTED;
102114
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package org.hypertrace.core.query.service.trino;
2+
3+
import static org.hypertrace.core.query.service.QueryRequestUtil.getLogicalColumnName;
4+
5+
import java.util.List;
6+
import java.util.Optional;
7+
import org.hypertrace.core.query.service.api.Filter;
8+
import org.hypertrace.core.query.service.api.QueryRequest;
9+
10+
public class TrinoFilterHandler {
11+
private static final String IS_TRINO_ATTRIBUTE = "EVENT.isTrino";
12+
13+
public boolean containsAttributeFilter(QueryRequest request) {
14+
return request.hasFilter() && containsAttributeFilter(request.getFilter());
15+
}
16+
17+
public Filter skipTrinoAttributeFilter(Filter filter) {
18+
return skipAttributeFilterIfPresent(filter);
19+
}
20+
21+
private boolean containsAttributeFilter(Filter filter) {
22+
if (filter.getChildFilterCount() > 0) {
23+
for (Filter childFilter : filter.getChildFilterList()) {
24+
if (containsAttributeFilter(childFilter)) {
25+
return true;
26+
}
27+
}
28+
}
29+
return isTrinoAttributeFilter(filter);
30+
}
31+
32+
private Filter skipAttributeFilterIfPresent(Filter filter) {
33+
if (filter.getChildFilterCount() > 0) {
34+
Filter.Builder builder = filter.toBuilder();
35+
List<Filter> childFilters = filter.getChildFilterList();
36+
builder.clearChildFilter();
37+
for (Filter childFilter : childFilters) {
38+
Filter skippedFilter = skipAttributeFilterIfPresent(childFilter);
39+
if (!skippedFilter.equals(Filter.getDefaultInstance())) {
40+
builder.addChildFilter(skippedFilter);
41+
}
42+
}
43+
if (builder.getChildFilterList().isEmpty()) {
44+
return Filter.getDefaultInstance();
45+
}
46+
return builder.build();
47+
} else if (isTrinoAttributeFilter(filter)) {
48+
return Filter.getDefaultInstance();
49+
}
50+
return filter;
51+
}
52+
53+
private boolean isTrinoAttributeFilter(Filter filter) {
54+
// filter must contain Event.isTrino attribute
55+
Optional<String> mayBeColumn = getLogicalColumnName(filter.getLhs());
56+
return mayBeColumn.isPresent() && mayBeColumn.get().equalsIgnoreCase(IS_TRINO_ATTRIBUTE);
57+
}
58+
}

query-service-impl/src/test/java/org/hypertrace/core/query/service/trino/QueryRequestToTrinoSQLConverterTest.java

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,96 @@ void testQueryWithBooleanFilter() {
218218
}
219219

220220
@Test
221+
void testQueryWithIsTrinoFilterOnly() {
222+
QueryRequest queryRequest =
223+
buildSimpleQueryWithFilter(createEqualsFilter("Event.isTrino", true));
224+
TableDefinition tableDefinition = getDefaultTableDefinition();
225+
defaultMockingForExecutionContext();
226+
227+
assertSQLQuery(
228+
queryRequest,
229+
"Select lower(to_hex(span_id)) FROM span-event-view WHERE "
230+
+ tableDefinition.getTenantIdColumn()
231+
+ " = '"
232+
+ TENANT_ID
233+
+ "'",
234+
tableDefinition,
235+
executionContext);
236+
}
237+
238+
@Test
239+
void testQueryWithIsTrinoFilterInBeginning() {
240+
Filter isTrinoFilter = createEqualsFilter("EVENT.isTrino", true);
241+
Filter isEntryFilter = createEqualsFilter("Span.is_entry", true);
242+
Filter isBareFilter = createEqualsFilter("Span.isBare", false);
243+
QueryRequest queryRequest =
244+
buildSimpleQueryWithFilter(
245+
createCompositeFilter(Operator.AND, isTrinoFilter, isEntryFilter, isBareFilter)
246+
.build());
247+
TableDefinition tableDefinition = getDefaultTableDefinition();
248+
defaultMockingForExecutionContext();
249+
250+
assertSQLQuery(
251+
queryRequest,
252+
"Select lower(to_hex(span_id)) FROM span-event-view WHERE "
253+
+ tableDefinition.getTenantIdColumn()
254+
+ " = '"
255+
+ TENANT_ID
256+
+ "' "
257+
+ "AND ( is_entry = true AND is_bare = false )",
258+
tableDefinition,
259+
executionContext);
260+
}
261+
262+
@Test
263+
void testQueryWithIsTrinoFilterInMiddle() {
264+
Filter isEntryFilter = createEqualsFilter("Span.is_entry", true);
265+
Filter isTrinoFilter = createEqualsFilter("EVENT.isTrino", true);
266+
Filter isBareFilter = createEqualsFilter("Span.isBare", false);
267+
QueryRequest queryRequest =
268+
buildSimpleQueryWithFilter(
269+
createCompositeFilter(Operator.AND, isEntryFilter, isTrinoFilter, isBareFilter)
270+
.build());
271+
TableDefinition tableDefinition = getDefaultTableDefinition();
272+
defaultMockingForExecutionContext();
273+
274+
assertSQLQuery(
275+
queryRequest,
276+
"Select lower(to_hex(span_id)) FROM span-event-view WHERE "
277+
+ tableDefinition.getTenantIdColumn()
278+
+ " = '"
279+
+ TENANT_ID
280+
+ "' "
281+
+ "AND ( is_entry = true AND is_bare = false )",
282+
tableDefinition,
283+
executionContext);
284+
}
285+
286+
@Test
287+
void testQueryWithIsTrinoFilterInEnd() {
288+
Filter isEntryFilter = createEqualsFilter("Span.is_entry", true);
289+
Filter isBareFilter = createEqualsFilter("Span.isBare", false);
290+
Filter isTrinoFilter = createEqualsFilter("EVENT.isTrino", true);
291+
QueryRequest queryRequest =
292+
buildSimpleQueryWithFilter(
293+
createCompositeFilter(Operator.AND, isEntryFilter, isBareFilter, isTrinoFilter)
294+
.build());
295+
TableDefinition tableDefinition = getDefaultTableDefinition();
296+
defaultMockingForExecutionContext();
297+
298+
assertSQLQuery(
299+
queryRequest,
300+
"Select lower(to_hex(span_id)) FROM span-event-view WHERE "
301+
+ tableDefinition.getTenantIdColumn()
302+
+ " = '"
303+
+ TENANT_ID
304+
+ "' "
305+
+ "AND ( is_entry = true AND is_bare = false )",
306+
tableDefinition,
307+
executionContext);
308+
}
309+
310+
// @Test
221311
void testQueryWithDoubleFilter() {
222312
QueryRequest queryRequest =
223313
buildSimpleQueryWithFilter(createEqualsFilter("Span.metrics.duration_millis", 1.2));

query-service/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ plugins {
1111
dependencies {
1212
implementation(project(":query-service-factory"))
1313
implementation("org.hypertrace.core.grpcutils:grpc-server-utils:0.12.1")
14-
implementation("org.hypertrace.core.serviceframework:platform-grpc-service-framework:0.1.60")
14+
implementation("org.hypertrace.core.serviceframework:platform-grpc-service-framework:0.1.61")
1515
implementation("org.slf4j:slf4j-api:1.7.32")
1616
implementation("com.typesafe:config:1.4.1")
1717

@@ -22,7 +22,7 @@ dependencies {
2222
integrationTestImplementation("org.testcontainers:testcontainers:1.16.2")
2323
integrationTestImplementation("org.testcontainers:junit-jupiter:1.16.2")
2424
integrationTestImplementation("org.testcontainers:kafka:1.16.2")
25-
integrationTestImplementation("org.hypertrace.core.serviceframework:integrationtest-service-framework:0.1.60")
25+
integrationTestImplementation("org.hypertrace.core.serviceframework:integrationtest-service-framework:0.1.61")
2626
integrationTestImplementation("com.github.stefanbirkner:system-lambda:1.2.0")
2727

2828
integrationTestImplementation("org.apache.kafka:kafka-clients:7.2.1-ccs")

0 commit comments

Comments
 (0)