rohangarg commented on code in PR #13206:
URL: https://github.com/apache/druid/pull/13206#discussion_r993277472


##########
sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidQuery.java:
##########
@@ -774,6 +784,53 @@ private static Filtration toFiltration(DimFilter filter, 
VirtualColumnRegistry v
     return 
Filtration.create(filter).optimize(virtualColumnRegistry.getFullRowSignature());
   }
 
+  /**
+   * Whether the provided combination of dataSource, filtration, and 
queryGranularity is safe to use in queries.
+   *
+   * Necessary because some combinations are unsafe, mainly because they would 
lead to the creation of too many
+   * time-granular buckets during query processing.
+   */
+  private static boolean canUseQueryGranularity(
+      final DataSource dataSource,
+      final Filtration filtration,
+      final Granularity queryGranularity
+  )
+  {
+    if (Granularities.ALL.equals(queryGranularity)) {
+      // Always OK: no storage adapter has problem with ALL.
+      return true;
+    }
+
+    if (DataSourceAnalysis.forDataSource(dataSource).isConcreteTableBased()) {
+      // Always OK: queries on concrete tables (regular Druid datasources) use 
segment-based storage adapters
+      // (IncrementalIndex or QueryableIndex). These clip query interval to 
data interval, making wide query
+      // intervals safer. They do not have special checks for granularity and 
interval safety.
+      return true;
+    }
+
+    // Query is against something other than a regular Druid table. Apply 
additional checks, because we can't
+    // count on interval-clipping to save us.
+
+    for (final Interval filtrationInterval : filtration.getIntervals()) {
+      // Query may be using RowBasedStorageAdapter. We don't know for sure, so 
check
+      // RowBasedStorageAdapter#isQueryGranularityAllowed to be safe.
+      if 
(!RowBasedStorageAdapter.isQueryGranularityAllowed(filtrationInterval, 
queryGranularity)) {
+        return false;
+      }
+
+      // Validate the interval against MAX_TIME_GRAINS_NON_DRUID_TABLE.
+      // Estimate based on the size of the first bucket, to avoid computing 
them all. (That's what we're
+      // trying to avoid!)
+      final Interval firstBucket = 
queryGranularity.bucket(filtrationInterval.getStart());

Review Comment:
   Oh, that's a good point. I missed those cases



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


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

Reply via email to