From bd1dbbb6809e19c43ea9681548a943ef7cd70c73 Mon Sep 17 00:00:00 2001 From: Ronak Date: Tue, 13 Jun 2023 17:44:47 +0530 Subject: [PATCH 1/6] feat: add support for handling text indexes in pinot --- .../query/service/pinot/PinotColumnSpec.java | 10 ++ .../QueryRequestToPinotSQLConverter.java | 35 ++++++- .../query/service/pinot/ViewDefinition.java | 17 ++++ .../QueryRequestToPinotSQLConverterTest.java | 91 +++++++++++++++++++ .../src/test/resources/request_handler.conf | 1 + 5 files changed, 152 insertions(+), 2 deletions(-) diff --git a/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/PinotColumnSpec.java b/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/PinotColumnSpec.java index c3f06277..e2a0b104 100644 --- a/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/PinotColumnSpec.java +++ b/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/PinotColumnSpec.java @@ -8,9 +8,11 @@ public class PinotColumnSpec { private final List columnNames; private ValueType type; + private boolean textIndex; public PinotColumnSpec() { columnNames = new ArrayList<>(); + textIndex = false; } public List getColumnNames() { @@ -28,4 +30,12 @@ public ValueType getType() { public void setType(ValueType type) { this.type = type; } + + public boolean hasTextIndex() { + return textIndex; + } + + public void setTextIndex() { + this.textIndex = true; + } } diff --git a/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverter.java b/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverter.java index 2f3f5a92..46d83d7b 100644 --- a/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverter.java +++ b/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverter.java @@ -3,7 +3,6 @@ import static org.hypertrace.core.query.service.QueryRequestUtil.getLogicalColumnName; import static org.hypertrace.core.query.service.QueryRequestUtil.isAttributeExpressionWithSubpath; import static org.hypertrace.core.query.service.QueryRequestUtil.isSimpleAttributeExpression; -import static org.hypertrace.core.query.service.api.Expression.ValueCase.COLUMNIDENTIFIER; import static org.hypertrace.core.query.service.api.Expression.ValueCase.LITERAL; import com.google.common.base.Joiner; @@ -13,6 +12,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map.Entry; +import java.util.Optional; import org.hypertrace.core.query.service.ExecutionContext; import org.hypertrace.core.query.service.api.Expression; import org.hypertrace.core.query.service.api.Filter; @@ -36,6 +36,7 @@ class QueryRequestToPinotSQLConverter { private static final String QUESTION_MARK = "?"; private static final String REGEX_OPERATOR = "REGEXP_LIKE"; + private static final String TEXT_MATCH_OPERATOR = "TEXT_MATCH"; private static final String MAP_VALUE = "mapValue"; private static final int MAP_KEY_INDEX = 0; private static final int MAP_VALUE_INDEX = 1; @@ -144,9 +145,17 @@ private String convertFilterToString( } else { switch (filter.getOperator()) { case LIKE: - // The like operation in PQL looks like `regexp_like(lhs, rhs)` + /** + * If the text index is not enabled on lhs expression, + * - the pql looks like `regexp_like(lhs, rhs)` + * else + * - the pql looks like `text_match(lhs, rhs)` + */ + operator = handleLikeOperator(filter.getLhs()); Expression rhs = handleValueConversionForLiteralExpression(filter.getLhs(), filter.getRhs()); + rhs = prefixValueForLikeOperator(operator, rhs); + builder.append(operator); builder.append("("); builder.append( @@ -276,6 +285,28 @@ private String convertOperatorToString(Operator operator) { } } + private String handleLikeOperator(Expression expression) { + Optional logicalColumnName = getLogicalColumnName(expression); + if(logicalColumnName.isPresent() + && isSimpleAttributeExpression(expression) + && viewDefinition.hasTextIndex(logicalColumnName.get())) { + return TEXT_MATCH_OPERATOR; + } + return REGEX_OPERATOR; + } + + private Expression prefixValueForLikeOperator(String likeOperatorStr, Expression rhsExpression) { + if(likeOperatorStr.equals(TEXT_MATCH_OPERATOR)) { + String strValue = "/" + rhsExpression.getLiteral().getValue().getString() + "/"; + Value value = Value.newBuilder().setValueType(ValueType.STRING).setString(strValue).build(); + + return Expression.newBuilder() + .setLiteral(LiteralConstant.newBuilder().setValue(value)) + .build(); + } + return rhsExpression; + } + private String convertExpressionToString( Expression expression, Builder paramsBuilder, ExecutionContext executionContext) { switch (expression.getValueCase()) { diff --git a/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/ViewDefinition.java b/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/ViewDefinition.java index 011bc412..dab6377c 100644 --- a/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/ViewDefinition.java +++ b/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/ViewDefinition.java @@ -29,6 +29,7 @@ public class ViewDefinition { private static final String MAP_FIELDS_CONFIG_KEY = "mapFields"; private static final String FILTERS_CONFIG_KEY = "filters"; private static final String COLUMN_CONFIG_KEY = "column"; + private static final String TEXT_INDEXES_FIELDS_CONFIG_KEY = "textIndexes"; private static final long DEFAULT_RETENTION_TIME = TimeUnit.DAYS.toMillis(8); private static final long DEFAULT_TIME_GRANULARITY = TimeUnit.MINUTES.toMillis(1); @@ -102,6 +103,13 @@ public static ViewDefinition parse(Config config, String tenantColumnName) { ? config.getStringList(BYTES_FIELDS_CONFIG_KEY) : List.of()); + // get all the String fields that have enabled text Indexes + final Set textIndexFields = new HashSet<>( + config.hasPath(TEXT_INDEXES_FIELDS_CONFIG_KEY) + ? config.getStringList(TEXT_INDEXES_FIELDS_CONFIG_KEY) + : List.of() + ); + Map columnSpecMap = new HashMap<>(); for (Map.Entry entry : fieldMap.entrySet()) { String logicalName = entry.getKey(); @@ -120,6 +128,11 @@ public static ViewDefinition parse(Config config, String tenantColumnName) { spec.addColumnName(physName); spec.setType(ValueType.STRING); } + + if (textIndexFields.contains(physName)) { + spec.setTextIndex(); + } + columnSpecMap.put(logicalName, spec); } @@ -175,6 +188,10 @@ public ValueType getColumnType(String logicalName) { return columnSpecMap.get(logicalName).getType(); } + public boolean hasTextIndex(String logicalName) { + return columnSpecMap.get(logicalName).hasTextIndex(); + } + public String getKeyColumnNameForMap(String logicalName) { List keys = findPhysicalNameWithSuffix(logicalName, MAP_KEYS_SUFFIX); Preconditions.checkArgument(keys.size() <= 1); diff --git a/query-service-impl/src/test/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverterTest.java b/query-service-impl/src/test/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverterTest.java index c5ac8b46..af33f6c0 100644 --- a/query-service-impl/src/test/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverterTest.java +++ b/query-service-impl/src/test/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverterTest.java @@ -3,6 +3,7 @@ import static java.util.Objects.requireNonNull; import static org.hypertrace.core.query.service.QueryRequestBuilderUtils.createAliasedFunctionExpression; import static org.hypertrace.core.query.service.QueryRequestBuilderUtils.createColumnExpression; +import static org.hypertrace.core.query.service.QueryRequestBuilderUtils.createCompositeFilter; import static org.hypertrace.core.query.service.QueryRequestBuilderUtils.createCountByColumnSelection; import static org.hypertrace.core.query.service.QueryRequestBuilderUtils.createEqualsFilter; import static org.hypertrace.core.query.service.QueryRequestBuilderUtils.createFunctionExpression; @@ -951,6 +952,96 @@ public void testQueryWithAverageRateInOrderBy() { executionContext); } + @Test + public void testQueryWithLikeOperatorForServiceNameNotHavingTextIndex() { + Builder builder = QueryRequest.newBuilder(); + + Filter startTimeFilter = + createTimeFilter("Span.start_time_millis", Operator.GT, 1570658506605L); + Filter endTimeFilter = createTimeFilter("Span.end_time_millis", Operator.LT, 1570744906673L); + + Filter likeFilter = + Filter.newBuilder() + .setOperator(Operator.LIKE) + .setLhs(createColumnExpression("Span.serviceName")) + .setRhs(createStringLiteralValueExpression("abc")) + .build(); + builder.setFilter(likeFilter); + + builder + .addSelection(createColumnExpression("Span.id")) + .addSelection(createColumnExpression("Span.serviceName")) + .setFilter(createCompositeFilter(Operator.AND, startTimeFilter, endTimeFilter, likeFilter)) + .setLimit(15); + + ViewDefinition viewDefinition = getDefaultViewDefinition(); + defaultMockingForExecutionContext(); + + /* + * select span_id, service_name from spaneventview where tenant_id = '__default' and ( start_time_millis > 1570658506605 and end_time_millis < 1570744906673 and regexp_like(service_name,'abc') ) limit 15 + * */ + assertPQLQuery( + builder.build(), + "select span_id, service_name from spanEventView " + + "where " + + viewDefinition.getTenantIdColumn() + + " = '" + + TENANT_ID + + "'" + + " and " + + "( start_time_millis > 1570658506605 and end_time_millis < 1570744906673" + + " and " + + "regexp_like(service_name,'abc') ) " + + "limit 15", + viewDefinition, + executionContext); + } + + @Test + public void testQueryWithLikeOperatorForResponseBodyHavingTextIndex() { + Builder builder = QueryRequest.newBuilder(); + + Filter startTimeFilter = + createTimeFilter("Span.start_time_millis", Operator.GT, 1570658506605L); + Filter endTimeFilter = createTimeFilter("Span.end_time_millis", Operator.LT, 1570744906673L); + + Filter likeFilter = + Filter.newBuilder() + .setOperator(Operator.LIKE) + .setLhs(createColumnExpression("Span.attributes.response_body")) + .setRhs(createStringLiteralValueExpression("abc")) + .build(); + builder.setFilter(likeFilter); + + builder + .addSelection(createColumnExpression("Span.id")) + .addSelection(createColumnExpression("Span.attributes.response_body")) + .setFilter(createCompositeFilter(Operator.AND, startTimeFilter, endTimeFilter, likeFilter)) + .setLimit(15); + + ViewDefinition viewDefinition = getDefaultViewDefinition(); + defaultMockingForExecutionContext(); + + /* + * select span_id, service_name from spaneventview where tenant_id = '__default' and ( start_time_millis > 1570658506605 and end_time_millis < 1570744906673 and regexp_like(service_name,'abc') ) limit 15 + * */ + assertPQLQuery( + builder.build(), + "select span_id, response_body from spanEventView " + + "where " + + viewDefinition.getTenantIdColumn() + + " = '" + + TENANT_ID + + "'" + + " and " + + "( start_time_millis > 1570658506605 and end_time_millis < 1570744906673" + + " and " + + "text_match(response_body,'/abc/') ) " + + "limit 15", + viewDefinition, + executionContext); + } + private QueryRequest buildSimpleQueryWithFilter(Filter filter) { Builder builder = QueryRequest.newBuilder(); builder.addSelection(createColumnExpression("Span.id").build()); diff --git a/query-service-impl/src/test/resources/request_handler.conf b/query-service-impl/src/test/resources/request_handler.conf index 59163097..c37f4f2d 100644 --- a/query-service-impl/src/test/resources/request_handler.conf +++ b/query-service-impl/src/test/resources/request_handler.conf @@ -8,6 +8,7 @@ viewName = SpanEventView mapFields = ["tags", "request_headers"] bytesFields = ["parent_span_id", "span_id"] + textIndexes = ["response_body"] fieldMap = { "Span.tags": "tags", "Span.id": "span_id", From fe5f4f1e78c1daa0a59dc2405062b32f5962c47c Mon Sep 17 00:00:00 2001 From: Ronak Date: Tue, 13 Jun 2023 17:52:51 +0530 Subject: [PATCH 2/6] fixed spotless issues --- .../service/pinot/QueryRequestToPinotSQLConverter.java | 10 ++++------ .../core/query/service/pinot/ViewDefinition.java | 10 +++++----- .../pinot/QueryRequestToPinotSQLConverterTest.java | 4 ++-- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverter.java b/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverter.java index 46d83d7b..6d3ab3ca 100644 --- a/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverter.java +++ b/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverter.java @@ -146,10 +146,8 @@ private String convertFilterToString( switch (filter.getOperator()) { case LIKE: /** - * If the text index is not enabled on lhs expression, - * - the pql looks like `regexp_like(lhs, rhs)` - * else - * - the pql looks like `text_match(lhs, rhs)` + * If the text index is not enabled on lhs expression, - the pql looks like + * `regexp_like(lhs, rhs)` else - the pql looks like `text_match(lhs, rhs)` */ operator = handleLikeOperator(filter.getLhs()); Expression rhs = @@ -287,7 +285,7 @@ private String convertOperatorToString(Operator operator) { private String handleLikeOperator(Expression expression) { Optional logicalColumnName = getLogicalColumnName(expression); - if(logicalColumnName.isPresent() + if (logicalColumnName.isPresent() && isSimpleAttributeExpression(expression) && viewDefinition.hasTextIndex(logicalColumnName.get())) { return TEXT_MATCH_OPERATOR; @@ -296,7 +294,7 @@ && isSimpleAttributeExpression(expression) } private Expression prefixValueForLikeOperator(String likeOperatorStr, Expression rhsExpression) { - if(likeOperatorStr.equals(TEXT_MATCH_OPERATOR)) { + if (likeOperatorStr.equals(TEXT_MATCH_OPERATOR)) { String strValue = "/" + rhsExpression.getLiteral().getValue().getString() + "/"; Value value = Value.newBuilder().setValueType(ValueType.STRING).setString(strValue).build(); diff --git a/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/ViewDefinition.java b/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/ViewDefinition.java index dab6377c..8f166bbb 100644 --- a/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/ViewDefinition.java +++ b/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/ViewDefinition.java @@ -104,11 +104,11 @@ public static ViewDefinition parse(Config config, String tenantColumnName) { : List.of()); // get all the String fields that have enabled text Indexes - final Set textIndexFields = new HashSet<>( - config.hasPath(TEXT_INDEXES_FIELDS_CONFIG_KEY) - ? config.getStringList(TEXT_INDEXES_FIELDS_CONFIG_KEY) - : List.of() - ); + final Set textIndexFields = + new HashSet<>( + config.hasPath(TEXT_INDEXES_FIELDS_CONFIG_KEY) + ? config.getStringList(TEXT_INDEXES_FIELDS_CONFIG_KEY) + : List.of()); Map columnSpecMap = new HashMap<>(); for (Map.Entry entry : fieldMap.entrySet()) { diff --git a/query-service-impl/src/test/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverterTest.java b/query-service-impl/src/test/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverterTest.java index af33f6c0..273cbd08 100644 --- a/query-service-impl/src/test/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverterTest.java +++ b/query-service-impl/src/test/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverterTest.java @@ -978,8 +978,8 @@ public void testQueryWithLikeOperatorForServiceNameNotHavingTextIndex() { defaultMockingForExecutionContext(); /* - * select span_id, service_name from spaneventview where tenant_id = '__default' and ( start_time_millis > 1570658506605 and end_time_millis < 1570744906673 and regexp_like(service_name,'abc') ) limit 15 - * */ + * select span_id, service_name from spaneventview where tenant_id = '__default' and ( start_time_millis > 1570658506605 and end_time_millis < 1570744906673 and regexp_like(service_name,'abc') ) limit 15 + * */ assertPQLQuery( builder.build(), "select span_id, service_name from spanEventView " From 8f50fae04a6f860d3bf3da2564f8e1af56774126 Mon Sep 17 00:00:00 2001 From: Ronak Date: Tue, 13 Jun 2023 20:05:55 +0530 Subject: [PATCH 3/6] rename the functions to match with its task --- .../service/pinot/QueryRequestToPinotSQLConverter.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverter.java b/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverter.java index 6d3ab3ca..dff7a7b7 100644 --- a/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverter.java +++ b/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverter.java @@ -149,10 +149,10 @@ private String convertFilterToString( * If the text index is not enabled on lhs expression, - the pql looks like * `regexp_like(lhs, rhs)` else - the pql looks like `text_match(lhs, rhs)` */ - operator = handleLikeOperator(filter.getLhs()); + operator = handleLikeOperatorConversion(filter.getLhs()); Expression rhs = handleValueConversionForLiteralExpression(filter.getLhs(), filter.getRhs()); - rhs = prefixValueForLikeOperator(operator, rhs); + rhs = postProcessValueConversionForLikeOperator(operator, rhs); builder.append(operator); builder.append("("); @@ -283,7 +283,7 @@ private String convertOperatorToString(Operator operator) { } } - private String handleLikeOperator(Expression expression) { + private String handleLikeOperatorConversion(Expression expression) { Optional logicalColumnName = getLogicalColumnName(expression); if (logicalColumnName.isPresent() && isSimpleAttributeExpression(expression) @@ -293,7 +293,8 @@ && isSimpleAttributeExpression(expression) return REGEX_OPERATOR; } - private Expression prefixValueForLikeOperator(String likeOperatorStr, Expression rhsExpression) { + private Expression postProcessValueConversionForLikeOperator( + String likeOperatorStr, Expression rhsExpression) { if (likeOperatorStr.equals(TEXT_MATCH_OPERATOR)) { String strValue = "/" + rhsExpression.getLiteral().getValue().getString() + "/"; Value value = Value.newBuilder().setValueType(ValueType.STRING).setString(strValue).build(); From 4ad57bfd12f8c0e78a13d96f60fac2da5acdf410 Mon Sep 17 00:00:00 2001 From: Ronak Date: Tue, 13 Jun 2023 20:17:53 +0530 Subject: [PATCH 4/6] removed temporary comments for test files --- .../service/pinot/QueryRequestToPinotSQLConverterTest.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/query-service-impl/src/test/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverterTest.java b/query-service-impl/src/test/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverterTest.java index 273cbd08..f2347a4b 100644 --- a/query-service-impl/src/test/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverterTest.java +++ b/query-service-impl/src/test/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverterTest.java @@ -977,9 +977,6 @@ public void testQueryWithLikeOperatorForServiceNameNotHavingTextIndex() { ViewDefinition viewDefinition = getDefaultViewDefinition(); defaultMockingForExecutionContext(); - /* - * select span_id, service_name from spaneventview where tenant_id = '__default' and ( start_time_millis > 1570658506605 and end_time_millis < 1570744906673 and regexp_like(service_name,'abc') ) limit 15 - * */ assertPQLQuery( builder.build(), "select span_id, service_name from spanEventView " @@ -1022,9 +1019,6 @@ public void testQueryWithLikeOperatorForResponseBodyHavingTextIndex() { ViewDefinition viewDefinition = getDefaultViewDefinition(); defaultMockingForExecutionContext(); - /* - * select span_id, service_name from spaneventview where tenant_id = '__default' and ( start_time_millis > 1570658506605 and end_time_millis < 1570744906673 and regexp_like(service_name,'abc') ) limit 15 - * */ assertPQLQuery( builder.build(), "select span_id, response_body from spanEventView " From d099e807bbf5f344f308e65da1277f6c9415cfce Mon Sep 17 00:00:00 2001 From: Ronak Date: Tue, 13 Jun 2023 20:41:27 +0530 Subject: [PATCH 5/6] changed the test example to use dispalySpanName --- .../pinot/QueryRequestToPinotSQLConverterTest.java | 8 ++++---- .../src/test/resources/request_handler.conf | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/query-service-impl/src/test/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverterTest.java b/query-service-impl/src/test/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverterTest.java index f2347a4b..5364a32e 100644 --- a/query-service-impl/src/test/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverterTest.java +++ b/query-service-impl/src/test/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverterTest.java @@ -1005,14 +1005,14 @@ public void testQueryWithLikeOperatorForResponseBodyHavingTextIndex() { Filter likeFilter = Filter.newBuilder() .setOperator(Operator.LIKE) - .setLhs(createColumnExpression("Span.attributes.response_body")) + .setLhs(createColumnExpression("Span.displaySpanName")) .setRhs(createStringLiteralValueExpression("abc")) .build(); builder.setFilter(likeFilter); builder .addSelection(createColumnExpression("Span.id")) - .addSelection(createColumnExpression("Span.attributes.response_body")) + .addSelection(createColumnExpression("Span.displaySpanName")) .setFilter(createCompositeFilter(Operator.AND, startTimeFilter, endTimeFilter, likeFilter)) .setLimit(15); @@ -1021,7 +1021,7 @@ public void testQueryWithLikeOperatorForResponseBodyHavingTextIndex() { assertPQLQuery( builder.build(), - "select span_id, response_body from spanEventView " + "select span_id, span_name from spanEventView " + "where " + viewDefinition.getTenantIdColumn() + " = '" @@ -1030,7 +1030,7 @@ public void testQueryWithLikeOperatorForResponseBodyHavingTextIndex() { + " and " + "( start_time_millis > 1570658506605 and end_time_millis < 1570744906673" + " and " - + "text_match(response_body,'/abc/') ) " + + "text_match(span_name,'/abc/') ) " + "limit 15", viewDefinition, executionContext); diff --git a/query-service-impl/src/test/resources/request_handler.conf b/query-service-impl/src/test/resources/request_handler.conf index c37f4f2d..6e5eecc0 100644 --- a/query-service-impl/src/test/resources/request_handler.conf +++ b/query-service-impl/src/test/resources/request_handler.conf @@ -8,7 +8,7 @@ viewName = SpanEventView mapFields = ["tags", "request_headers"] bytesFields = ["parent_span_id", "span_id"] - textIndexes = ["response_body"] + textIndexes = ["span_name"] fieldMap = { "Span.tags": "tags", "Span.id": "span_id", From fe030ccac20f69af06cdf282afe80a60894603e6 Mon Sep 17 00:00:00 2001 From: Ronak Date: Tue, 13 Jun 2023 21:56:49 +0530 Subject: [PATCH 6/6] addressed comments --- .../pinot/QueryRequestToPinotSQLConverter.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverter.java b/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverter.java index dff7a7b7..7795386e 100644 --- a/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverter.java +++ b/query-service-impl/src/main/java/org/hypertrace/core/query/service/pinot/QueryRequestToPinotSQLConverter.java @@ -151,8 +151,7 @@ private String convertFilterToString( */ operator = handleLikeOperatorConversion(filter.getLhs()); Expression rhs = - handleValueConversionForLiteralExpression(filter.getLhs(), filter.getRhs()); - rhs = postProcessValueConversionForLikeOperator(operator, rhs); + handleValueConversionForLikeArgument(operator, filter.getLhs(), filter.getRhs()); builder.append(operator); builder.append("("); @@ -293,17 +292,20 @@ && isSimpleAttributeExpression(expression) return REGEX_OPERATOR; } + private Expression handleValueConversionForLikeArgument( + String likeOperatorStr, Expression lhsExpression, Expression rhsExpression) { + return postProcessValueConversionForLikeOperator( + likeOperatorStr, handleValueConversionForLiteralExpression(lhsExpression, rhsExpression)); + } + private Expression postProcessValueConversionForLikeOperator( String likeOperatorStr, Expression rhsExpression) { + Expression.Builder builder = rhsExpression.toBuilder(); if (likeOperatorStr.equals(TEXT_MATCH_OPERATOR)) { String strValue = "/" + rhsExpression.getLiteral().getValue().getString() + "/"; - Value value = Value.newBuilder().setValueType(ValueType.STRING).setString(strValue).build(); - - return Expression.newBuilder() - .setLiteral(LiteralConstant.newBuilder().setValue(value)) - .build(); + builder.getLiteralBuilder().getValueBuilder().setString(strValue); } - return rhsExpression; + return builder.build(); } private String convertExpressionToString(