This is an automated email from the ASF dual-hosted git repository.

cecemei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 6687229e0e4 minor:  add debug logs for diagnosing projection match 
failures (#19613)
6687229e0e4 is described below

commit 6687229e0e4a90f20cf7827c2c0c2edcff0b2562
Author: Cece Mei <[email protected]>
AuthorDate: Wed Jun 24 11:43:53 2026 -0700

    minor:  add debug logs for diagnosing projection match failures (#19613)
    
    * proj
    
    * comment
    
    * debug
    
    * debug
---
 .../druid/segment/projections/Projections.java     | 46 ++++++++++++++++++++--
 1 file changed, 43 insertions(+), 3 deletions(-)

diff --git 
a/processing/src/main/java/org/apache/druid/segment/projections/Projections.java
 
b/processing/src/main/java/org/apache/druid/segment/projections/Projections.java
index 40980d000bb..54c214f4b37 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/projections/Projections.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/projections/Projections.java
@@ -26,6 +26,8 @@ import org.apache.druid.error.InvalidInput;
 import org.apache.druid.java.util.common.granularity.Granularities;
 import org.apache.druid.java.util.common.granularity.Granularity;
 import org.apache.druid.java.util.common.granularity.PeriodGranularity;
+import org.apache.druid.java.util.common.logger.Logger;
+import org.apache.druid.query.QueryContext;
 import org.apache.druid.query.QueryContexts;
 import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.FilteredAggregatorFactory;
@@ -67,6 +69,17 @@ import java.util.function.Function;
 
 public class Projections
 {
+  private static final Logger log = new Logger(Projections.class);
+
+  private static void logTrace(QueryContext context, String format, Object... 
args)
+  {
+    if (context.isDebug()) {
+      log.info(format, args);
+    } else {
+      log.debug(format, args);
+    }
+  }
+
   public static final String BASE_TABLE_PROJECTION_NAME = "__base";
 
   private static final String CLUSTER_GROUP_PREFIX = 
BASE_TABLE_PROJECTION_NAME + "$";
@@ -161,13 +174,22 @@ public class Projections
   )
   {
     if 
(!queryCursorBuildSpec.isCompatibleOrdering(projection.getOrderingWithTimeColumnSubstitution()))
 {
+      logTrace(
+          queryCursorBuildSpec.getQueryContext(),
+          "matchAggregateProjection: projection [%s] rejected — incompatible 
ordering, query wants %s but projection provides %s",
+          projection.getName(),
+          queryCursorBuildSpec.getPreferredOrdering(),
+          projection.getOrderingWithTimeColumnSubstitution()
+      );
       return null;
     }
     if 
(CollectionUtils.isNullOrEmpty(queryCursorBuildSpec.getPhysicalColumns())) {
+      logTrace(queryCursorBuildSpec.getQueryContext(), 
"matchAggregateProjection: projection [%s] rejected — no physical columns in 
query", projection.getName());
       return null;
     }
 
     if (isUnalignedInterval(projection, queryCursorBuildSpec, dataInterval)) {
+      logTrace(queryCursorBuildSpec.getQueryContext(), 
"matchAggregateProjection: projection [%s] rejected — unaligned interval", 
projection.getName());
       return null;
     }
     ProjectionMatchBuilder matchBuilder = new ProjectionMatchBuilder();
@@ -175,21 +197,25 @@ public class Projections
     // match virtual columns first, which will populate the 'remapColumns' of 
the match builder
     matchBuilder = matchQueryVirtualColumns(projection, queryCursorBuildSpec, 
physicalColumnChecker, matchBuilder);
     if (matchBuilder == null) {
+      logTrace(queryCursorBuildSpec.getQueryContext(), 
"matchAggregateProjection: projection [%s] rejected — virtual column mismatch", 
projection.getName());
       return null;
     }
 
     matchBuilder = matchFilter(projection, queryCursorBuildSpec, 
physicalColumnChecker, matchBuilder);
     if (matchBuilder == null) {
+      logTrace(queryCursorBuildSpec.getQueryContext(), 
"matchAggregateProjection: projection [%s] rejected — filter mismatch", 
projection.getName());
       return null;
     }
 
     matchBuilder = matchGrouping(projection, queryCursorBuildSpec, 
physicalColumnChecker, matchBuilder);
     if (matchBuilder == null) {
+      logTrace(queryCursorBuildSpec.getQueryContext(), 
"matchAggregateProjection: projection [%s] rejected — grouping mismatch", 
projection.getName());
       return null;
     }
 
     matchBuilder = matchAggregators(projection, queryCursorBuildSpec, 
physicalColumnChecker, matchBuilder);
     if (matchBuilder == null) {
+      logTrace(queryCursorBuildSpec.getQueryContext(), 
"matchAggregateProjection: projection [%s] rejected — aggregator mismatch", 
projection.getName());
       return null;
     }
 
@@ -213,6 +239,7 @@ public class Projections
           matchBuilder
       );
       if (matchBuilder == null) {
+        logTrace(queryCursorBuildSpec.getQueryContext(), 
"matchQueryVirtualColumns: projection [%s] rejected — virtual column [%s] could 
not be matched", projection.getName(), vc.getOutputName());
         return null;
       }
     }
@@ -231,7 +258,6 @@ public class Projections
     if (projection.getFilter() != null) {
       final Filter queryFilter = queryCursorBuildSpec.getFilter();
       if (queryFilter != null) {
-        final Set<String> originalRequired = queryFilter.getRequiredColumns();
         // try to rewrite the query filter into a projection filter, if the 
rewrite is valid, we can proceed
         final Filter projectionFilter = 
projection.getFilter().toOptimizedFilter(false);
         final Filter remappedQueryFilter = 
remapFilterToProjection(matchBuilder, queryFilter);
@@ -239,6 +265,7 @@ public class Projections
         final Filter rewritten = 
ProjectionFilterMatch.rewriteFilter(projectionFilter, remappedQueryFilter);
         // if the filter does not contain the projection filter, we cannot 
match this projection
         if (rewritten == null) {
+          logTrace(queryCursorBuildSpec.getQueryContext(), "matchFilter: 
projection [%s] rejected — query filter does not contain the projection 
filter", projection.getName());
           return null;
         }
         //noinspection ObjectEquality
@@ -251,6 +278,7 @@ public class Projections
         }
       } else {
         // projection has a filter, but the query doesn't, no good
+        logTrace(queryCursorBuildSpec.getQueryContext(), "matchFilter: 
projection [%s] rejected — projection has a filter but query does not", 
projection.getName());
         return null;
       }
     } else {
@@ -269,6 +297,7 @@ public class Projections
             matchBuilder
         );
         if (matchBuilder == null) {
+          logTrace(queryCursorBuildSpec.getQueryContext(), "matchFilter: 
projection [%s] rejected — required filter column [%s] not available on 
projection", projection.getName(), queryColumn);
           return null;
         }
       }
@@ -296,14 +325,17 @@ public class Projections
             matchBuilder
         );
         if (matchBuilder == null) {
+          logTrace(queryCursorBuildSpec.getQueryContext(), "matchGrouping: 
projection [%s] rejected — grouping column [%s] not available on projection", 
projection.getName(), queryColumn);
           return null;
         }
         // a query grouping column must also be defined as a projection 
grouping column
         if (projection.isInvalidGrouping(queryColumn)) {
+          logTrace(queryCursorBuildSpec.getQueryContext(), "matchGrouping: 
projection [%s] rejected — column [%s] is not a grouping column on the 
projection", projection.getName(), queryColumn);
           return null;
         }
         // even if remapped
         if 
(projection.isInvalidGrouping(matchBuilder.getRemapValue(queryColumn))) {
+          logTrace(queryCursorBuildSpec.getQueryContext(), "matchGrouping: 
projection [%s] rejected — remapped column [%s] is not a grouping column on the 
projection", projection.getName(), matchBuilder.getRemapValue(queryColumn));
           return null;
         }
       }
@@ -354,6 +386,7 @@ public class Projections
                   matchBuilder
               );
               if (matchBuilder == null) {
+                logTrace(queryCursorBuildSpec.getQueryContext(), 
"matchAggregators: projection [%s] rejected — filtered aggregator [%s] requires 
column [%s] not available on projection", projection.getName(), 
queryAgg.getName(), column);
                 return null;
               }
             }
@@ -375,6 +408,7 @@ public class Projections
     if (allMatch) {
       return matchBuilder;
     }
+    logTrace(queryCursorBuildSpec.getQueryContext(), "matchAggregators: 
projection [%s] rejected — one or more query aggregators could not be matched 
to a projection aggregator", projection.getName());
     return null;
   }
 
@@ -422,7 +456,7 @@ public class Projections
       );
     }
 
-    return matchQueryPhysicalColumn(column, projection, physicalColumnChecker, 
matchBuilder);
+    return matchQueryPhysicalColumn(column, projection, physicalColumnChecker, 
matchBuilder, queryCursorBuildSpec.getQueryContext());
   }
 
   @Nullable
@@ -482,12 +516,14 @@ public class Projections
         // 1. virtual gran is NONE, and projection gran is not
         // 2. projection gran is ALL, and virtual gran is not
         // 3. both are period granularities, but projection gran can't be 
mapped to virtual gran, e.x. PT2H can't be mapped to PT1H
+        logTrace(queryCursorBuildSpec.getQueryContext(), 
"matchQueryVirtualColumn: projection [%s] rejected — virtual column [%s] 
granularity [%s] is incompatible with projection granularity [%s]", 
projection.getName(), queryVirtualColumn.getOutputName(), virtualGranularity, 
projection.getEffectiveGranularity());
         return null;
       } else {
         // we can't decide query granularity for the virtual column with 
__time, requires none granularity to be safe
         if (Granularities.NONE.equals(projection.getEffectiveGranularity())) {
           return 
matchBuilder.addReferencedPhysicalColumn(ColumnHolder.TIME_COLUMN_NAME);
         }
+        logTrace(queryCursorBuildSpec.getQueryContext(), 
"matchQueryVirtualColumn: projection [%s] rejected — virtual column [%s] uses 
__time but projection granularity [%s] is not NONE", projection.getName(), 
queryVirtualColumn.getOutputName(), projection.getEffectiveGranularity());
         return null;
       }
     } else {
@@ -500,6 +536,7 @@ public class Projections
             matchBuilder
         );
         if (matchBuilder == null) {
+          logTrace(queryCursorBuildSpec.getQueryContext(), 
"matchQueryVirtualColumn: projection [%s] rejected — virtual column [%s] 
requires input [%s] not available on projection", projection.getName(), 
queryVirtualColumn.getOutputName(), required);
           return null;
         }
       }
@@ -512,7 +549,8 @@ public class Projections
       String column,
       AggregateProjectionSchema projection,
       PhysicalColumnChecker physicalColumnChecker,
-      ProjectionMatchBuilder matchBuilder
+      ProjectionMatchBuilder matchBuilder,
+      QueryContext context
   )
   {
     // if we need __time as a physical column, the projection must be grouping 
on __time directly
@@ -520,11 +558,13 @@ public class Projections
       if 
(ColumnHolder.TIME_COLUMN_NAME.equals(projection.getTimeColumnName())) {
         return 
matchBuilder.addReferencedPhysicalColumn(ColumnHolder.TIME_COLUMN_NAME);
       }
+      logTrace(context, "matchQueryPhysicalColumn: projection [%s] rejected — 
query requires __time as a physical column but projection does not group on 
__time", projection.getName());
       return null;
     }
     if (physicalColumnChecker.check(projection.getName(), column)) {
       return matchBuilder.addReferencedPhysicalColumn(column);
     }
+    logTrace(context, "matchQueryPhysicalColumn: projection [%s] rejected — 
column [%s] is not available on projection", projection.getName(), column);
     return null;
   }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to