Skip to content

Commit d51263a

Browse files
Sarthak SinghalSarthak Singhal
authored andcommitted
added contains key filter for selection
1 parent 929e3c9 commit d51263a

File tree

2 files changed

+52
-8
lines changed

2 files changed

+52
-8
lines changed

query-service-impl/src/main/java/org/hypertrace/core/query/service/projection/ProjectionTransformation.java

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import java.util.List;
1818
import java.util.Optional;
1919
import java.util.stream.Collectors;
20+
import java.util.stream.Stream;
2021
import javax.inject.Inject;
2122
import org.hypertrace.core.attribute.service.cachingclient.CachingAttributeClient;
2223
import org.hypertrace.core.attribute.service.projection.AttributeProjection;
@@ -344,7 +345,8 @@ private QueryRequest rebuildRequest(
344345
List<OrderByExpression> orderBys) {
345346

346347
QueryRequest.Builder builder = original.toBuilder();
347-
Filter updatedFilter = rebuildFilterForComplexAttributeExpression(originalFilter, orderBys);
348+
Filter updatedFilter =
349+
rebuildFilterForComplexAttributeExpression(originalFilter, orderBys, selections);
348350

349351
if (Filter.getDefaultInstance().equals(updatedFilter)) {
350352
builder.clearFilter();
@@ -365,16 +367,20 @@ private QueryRequest rebuildRequest(
365367
}
366368

367369
/*
368-
* We need the CONTAINS_KEY filter in all filters and order bys dealing with complex
370+
* We need the CONTAINS_KEY filter in all filters, selections and order bys dealing with complex
369371
* attribute expressions as Pinot gives error if particular key is absent. Rest all work fine.
370-
* To handle order bys, we add the corresponding filter at the top and 'AND' it with the main filter.
372+
* To handle order bys and selections, we add the corresponding filter at the top and 'AND' it with the main filter.
371373
* To handle filter, we modify each filter (say filter1) as : "CONTAINS_KEY AND filter1".
372374
*/
373375
private Filter rebuildFilterForComplexAttributeExpression(
374-
Filter originalFilter, List<OrderByExpression> orderBys) {
376+
Filter originalFilter, List<OrderByExpression> orderBys, List<Expression> selections) {
375377

376378
Filter updatedFilter = updateFilterForComplexAttributeExpressionFromFilter(originalFilter);
377-
List<Filter> filterList = createFilterForComplexAttributeExpressionFromOrderBy(orderBys);
379+
List<Filter> filterList =
380+
Stream.concat(
381+
createFilterForComplexAttributeExpressionFromOrderBy(orderBys),
382+
createFilterForComplexAttributeExpressionFromSelection(selections))
383+
.collect(Collectors.toList());
378384

379385
if (filterList.isEmpty()) {
380386
return updatedFilter;
@@ -423,14 +429,31 @@ private Filter updateFilterForComplexAttributeExpressionFromFilter(Filter origin
423429
}
424430
}
425431

426-
private List<Filter> createFilterForComplexAttributeExpressionFromOrderBy(
432+
private Stream<Filter> createFilterForComplexAttributeExpressionFromOrderBy(
427433
List<OrderByExpression> orderByExpressionList) {
428434
return orderByExpressionList.stream()
429435
.map(OrderByExpression::getExpression)
430436
.filter(QueryRequestUtil::isAttributeExpressionWithSubpath)
431437
.map(Expression::getAttributeExpression)
432-
.map(QueryRequestUtil::createContainsKeyFilter)
433-
.collect(Collectors.toList());
438+
.map(QueryRequestUtil::createContainsKeyFilter);
439+
}
440+
441+
private Stream<Filter> createFilterForComplexAttributeExpressionFromSelection(
442+
List<Expression> selections) {
443+
return selections.stream()
444+
.flatMap(this::getAnyAttributeExpression)
445+
.map(QueryRequestUtil::createContainsKeyFilter);
446+
}
447+
448+
private Stream<AttributeExpression> getAnyAttributeExpression(Expression selection) {
449+
if (selection.hasFunction()) {
450+
return selection.getFunction().getArgumentsList().stream()
451+
.flatMap(this::getAnyAttributeExpression);
452+
} else {
453+
return Stream.of(selection)
454+
.filter(QueryRequestUtil::isAttributeExpressionWithSubpath)
455+
.map(Expression::getAttributeExpression);
456+
}
434457
}
435458

436459
private String getOriginalKey(AttributeExpression attributeExpression) {

query-service-impl/src/test/java/org/hypertrace/core/query/service/projection/ProjectionTransformationTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,27 @@ void transQueryWithComplexAttributeExpression_OrderByAndFilter() {
240240
.blockingGet());
241241
}
242242

243+
@Test
244+
void transQueryWithComplexAttributeExpression_SingleSelection() {
245+
this.mockAttribute("Span.tags", AttributeMetadata.getDefaultInstance());
246+
247+
Expression.Builder spanTag = createComplexAttributeExpression("Span.tags", "span.kind");
248+
249+
QueryRequest originalRequest = QueryRequest.newBuilder().addSelection(spanTag).build();
250+
251+
QueryRequest expectedTransform =
252+
QueryRequest.newBuilder()
253+
.addSelection(spanTag)
254+
.setFilter(createContainsKeyFilter("Span.tags", "span.kind"))
255+
.build();
256+
257+
assertEquals(
258+
expectedTransform,
259+
this.projectionTransformation
260+
.transform(originalRequest, mockTransformationContext)
261+
.blockingGet());
262+
}
263+
243264
@Test
244265
void transQueryWithComplexAttributeExpression_SingleOrderBy() {
245266
this.mockAttribute("Span.tags", AttributeMetadata.getDefaultInstance());

0 commit comments

Comments
 (0)