1717import java .util .List ;
1818import java .util .Optional ;
1919import java .util .stream .Collectors ;
20+ import java .util .stream .Stream ;
2021import javax .inject .Inject ;
2122import org .hypertrace .core .attribute .service .cachingclient .CachingAttributeClient ;
2223import 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 ) {
0 commit comments