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

cwylie 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 d6c07270a58 fix issues with join filter pushdown and virtual column 
resolution (#16702)
d6c07270a58 is described below

commit d6c07270a58ac93c7578eb0754d9efdfdd76c8d3
Author: Clint Wylie <[email protected]>
AuthorDate: Thu Jul 11 04:26:07 2024 -0700

    fix issues with join filter pushdown and virtual column resolution (#16702)
---
 .../org/apache/druid/segment/VirtualColumns.java   | 57 ++++++++-------
 .../join/HashJoinSegmentStorageAdapter.java        | 85 +++++-----------------
 .../segment/join/filter/JoinFilterAnalyzer.java    | 25 +++----
 .../segment/join/filter/JoinFilterPreAnalysis.java | 10 +--
 .../join/filter/JoinFilterPreAnalysisKey.java      |  1 +
 .../druid/segment/join/filter/JoinableClauses.java | 15 ++--
 .../join/HashJoinSegmentStorageAdapterTest.java    | 38 ----------
 .../druid/segment/join/JoinFilterAnalyzerTest.java | 77 +++++++++++---------
 8 files changed, 119 insertions(+), 189 deletions(-)

diff --git 
a/processing/src/main/java/org/apache/druid/segment/VirtualColumns.java 
b/processing/src/main/java/org/apache/druid/segment/VirtualColumns.java
index 583f0425c2a..79354a4fa2a 100644
--- a/processing/src/main/java/org/apache/druid/segment/VirtualColumns.java
+++ b/processing/src/main/java/org/apache/druid/segment/VirtualColumns.java
@@ -48,13 +48,12 @@ import 
org.apache.druid.segment.virtual.VirtualizedColumnInspector;
 import org.apache.druid.segment.virtual.VirtualizedColumnSelectorFactory;
 
 import javax.annotation.Nullable;
-
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 /**
  * Class allowing lookup and usage of virtual columns.
@@ -86,11 +85,21 @@ public class VirtualColumns implements Cacheable
   }
 
   @JsonCreator
-  public static VirtualColumns create(List<VirtualColumn> virtualColumns)
+  public static VirtualColumns create(@Nullable List<VirtualColumn> 
virtualColumns)
   {
     if (virtualColumns == null || virtualColumns.isEmpty()) {
       return EMPTY;
     }
+    return fromIterable(virtualColumns);
+  }
+
+  public static VirtualColumns create(VirtualColumn... virtualColumns)
+  {
+    return create(Arrays.asList(virtualColumns));
+  }
+
+  public static VirtualColumns fromIterable(Iterable<VirtualColumn> 
virtualColumns)
+  {
     Map<String, VirtualColumn> withDotSupport = new HashMap<>();
     Map<String, VirtualColumn> withoutDotSupport = new HashMap<>();
     for (VirtualColumn vc : virtualColumns) {
@@ -115,11 +124,6 @@ public class VirtualColumns implements Cacheable
     return new VirtualColumns(ImmutableList.copyOf(virtualColumns), 
withDotSupport, withoutDotSupport);
   }
 
-  public static VirtualColumns create(VirtualColumn... virtualColumns)
-  {
-    return create(Arrays.asList(virtualColumns));
-  }
-
   public static VirtualColumns nullToEmpty(@Nullable VirtualColumns 
virtualColumns)
   {
     return virtualColumns == null ? EMPTY : virtualColumns;
@@ -134,6 +138,14 @@ public class VirtualColumns implements Cacheable
     }
   }
 
+  // For equals, hashCode, toString, and serialization:
+  private final List<VirtualColumn> virtualColumns;
+  private final List<String> virtualColumnNames;
+
+  // For getVirtualColumn:
+  private final Map<String, VirtualColumn> withDotSupport;
+  private final Map<String, VirtualColumn> withoutDotSupport;
+
   private VirtualColumns(
       List<VirtualColumn> virtualColumns,
       Map<String, VirtualColumn> withDotSupport,
@@ -143,19 +155,14 @@ public class VirtualColumns implements Cacheable
     this.virtualColumns = virtualColumns;
     this.withDotSupport = withDotSupport;
     this.withoutDotSupport = withoutDotSupport;
+    this.virtualColumnNames = new ArrayList<>(virtualColumns.size());
 
     for (VirtualColumn virtualColumn : virtualColumns) {
       detectCycles(virtualColumn, null);
+      virtualColumnNames.add(virtualColumn.getOutputName());
     }
   }
 
-  // For equals, hashCode, toString, and serialization:
-  private final List<VirtualColumn> virtualColumns;
-
-  // For getVirtualColumn:
-  private final Map<String, VirtualColumn> withDotSupport;
-  private final Map<String, VirtualColumn> withoutDotSupport;
-
   /**
    * Returns true if a virtual column exists with a particular columnName.
    *
@@ -468,6 +475,16 @@ public class VirtualColumns implements Cacheable
     return new CacheKeyBuilder((byte) 
0).appendCacheablesIgnoringOrder(virtualColumns).build();
   }
 
+  public boolean isEmpty()
+  {
+    return virtualColumns.isEmpty();
+  }
+
+  public List<String> getColumnNames()
+  {
+    return virtualColumnNames;
+  }
+
   private VirtualColumn getVirtualColumnForSelector(String columnName)
   {
     VirtualColumn virtualColumn = getVirtualColumn(columnName);
@@ -538,14 +555,4 @@ public class VirtualColumns implements Cacheable
              ((VirtualColumns) obj).virtualColumns.isEmpty();
     }
   }
-
-  public boolean isEmpty()
-  {
-    return virtualColumns.isEmpty();
-  }
-
-  public List<String> getColumnNames()
-  {
-    return virtualColumns.stream().map(v -> 
v.getOutputName()).collect(Collectors.toList());
-  }
 }
diff --git 
a/processing/src/main/java/org/apache/druid/segment/join/HashJoinSegmentStorageAdapter.java
 
b/processing/src/main/java/org/apache/druid/segment/join/HashJoinSegmentStorageAdapter.java
index c7126448112..fd9c07a253f 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/join/HashJoinSegmentStorageAdapter.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/join/HashJoinSegmentStorageAdapter.java
@@ -19,7 +19,10 @@
 
 package org.apache.druid.segment.join;
 
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import org.apache.druid.java.util.common.ISE;
 import org.apache.druid.java.util.common.granularity.Granularity;
 import org.apache.druid.java.util.common.guava.Sequence;
@@ -30,7 +33,6 @@ import org.apache.druid.query.filter.Filter;
 import org.apache.druid.segment.Cursor;
 import org.apache.druid.segment.Metadata;
 import org.apache.druid.segment.StorageAdapter;
-import org.apache.druid.segment.VirtualColumn;
 import org.apache.druid.segment.VirtualColumns;
 import org.apache.druid.segment.column.ColumnCapabilities;
 import org.apache.druid.segment.data.Indexed;
@@ -46,13 +48,10 @@ import org.joda.time.Interval;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Optional;
-import java.util.Set;
 
 public class HashJoinSegmentStorageAdapter implements StorageAdapter
 {
@@ -292,43 +291,40 @@ public class HashJoinSegmentStorageAdapter implements 
StorageAdapter
         );
 
     final JoinFilterPreAnalysisKey keyCached = joinFilterPreAnalysis.getKey();
-    final JoinFilterSplit joinFilterSplit;
-
+    final JoinFilterPreAnalysis preAnalysis;
     if (keyIn.equals(keyCached)) {
       // Common case: key used during filter pre-analysis (keyCached) matches 
key implied by makeCursors call (keyIn).
-      joinFilterSplit = JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis, 
baseFilter);
+      preAnalysis = joinFilterPreAnalysis;
     } else {
       // Less common case: key differs. Re-analyze the filter. This case can 
happen when an unnest datasource is
       // layered on top of a join datasource.
-      joinFilterSplit = JoinFilterAnalyzer.splitFilter(
-          JoinFilterAnalyzer.computeJoinFilterPreAnalysis(keyIn),
-          baseFilter
-      );
+      preAnalysis = JoinFilterAnalyzer.computeJoinFilterPreAnalysis(keyIn);
     }
 
-    final List<VirtualColumn> preJoinVirtualColumns = new ArrayList<>();
-    final List<VirtualColumn> postJoinVirtualColumns = new ArrayList<>();
 
-    determineBaseColumnsWithPreAndPostJoinVirtualColumns(
-        virtualColumns,
-        preJoinVirtualColumns,
-        postJoinVirtualColumns
+    final JoinFilterSplit joinFilterSplit = JoinFilterAnalyzer.splitFilter(
+        preAnalysis,
+        baseFilter
     );
 
-    // We merge the filter on base table specified by the user and filter on 
the base table that is pushed from
-    // the join
-    preJoinVirtualColumns.addAll(joinFilterSplit.getPushDownVirtualColumns());
-
     final Sequence<Cursor> baseCursorSequence = baseAdapter.makeCursors(
         joinFilterSplit.getBaseTableFilter().isPresent() ? 
joinFilterSplit.getBaseTableFilter().get() : null,
         interval,
-        VirtualColumns.create(preJoinVirtualColumns),
+        VirtualColumns.fromIterable(
+            Iterables.concat(
+                Sets.difference(
+                    ImmutableSet.copyOf(virtualColumns.getVirtualColumns()),
+                    joinFilterPreAnalysis.getPostJoinVirtualColumns()
+                ),
+                joinFilterSplit.getPushDownVirtualColumns()
+            )
+        ),
         gran,
         descending,
         queryMetrics
     );
 
-    Closer joinablesCloser = Closer.create();
+    final Closer joinablesCloser = Closer.create();
     return Sequences.<Cursor, Cursor>map(
         baseCursorSequence,
         cursor -> {
@@ -341,7 +337,7 @@ public class HashJoinSegmentStorageAdapter implements 
StorageAdapter
 
           return PostJoinCursor.wrap(
               retVal,
-              VirtualColumns.create(postJoinVirtualColumns),
+              
VirtualColumns.fromIterable(preAnalysis.getPostJoinVirtualColumns()),
               joinFilterSplit.getJoinTableFilter().orElse(null)
           );
         }
@@ -357,47 +353,6 @@ public class HashJoinSegmentStorageAdapter implements 
StorageAdapter
     return !getClauseForColumn(column).isPresent();
   }
 
-  /**
-   * Return a String set containing the name of columns that belong to the 
base table (including any pre-join virtual
-   * columns as well).
-   *
-   * Additionally, if the preJoinVirtualColumns and/or postJoinVirtualColumns 
arguments are provided, this method
-   * will add each VirtualColumn in the provided virtualColumns to either 
preJoinVirtualColumns or
-   * postJoinVirtualColumns based on whether the virtual column is pre-join or 
post-join.
-   *
-   * @param virtualColumns         List of virtual columns from the query
-   * @param preJoinVirtualColumns  If provided, virtual columns determined to 
be pre-join will be added to this list
-   * @param postJoinVirtualColumns If provided, virtual columns determined to 
be post-join will be added to this list
-   *
-   * @return The set of base column names, including any pre-join virtual 
columns.
-   */
-  public Set<String> determineBaseColumnsWithPreAndPostJoinVirtualColumns(
-      VirtualColumns virtualColumns,
-      @Nullable List<VirtualColumn> preJoinVirtualColumns,
-      @Nullable List<VirtualColumn> postJoinVirtualColumns
-  )
-  {
-    final Set<String> baseColumns = new 
HashSet<>(baseAdapter.getRowSignature().getColumnNames());
-
-    for (VirtualColumn virtualColumn : virtualColumns.getVirtualColumns()) {
-      // Virtual columns cannot depend on each other, so we don't need to 
check transitive dependencies.
-      if (baseColumns.containsAll(virtualColumn.requiredColumns())) {
-        // Since pre-join virtual columns can be computed using only base 
columns, we include them in the
-        // base column set.
-        baseColumns.add(virtualColumn.getOutputName());
-        if (preJoinVirtualColumns != null) {
-          preJoinVirtualColumns.add(virtualColumn);
-        }
-      } else {
-        if (postJoinVirtualColumns != null) {
-          postJoinVirtualColumns.add(virtualColumn);
-        }
-      }
-    }
-
-    return baseColumns;
-  }
-
   /**
    * Returns the JoinableClause corresponding to a particular column, based on 
the clauses' prefixes.
    *
diff --git 
a/processing/src/main/java/org/apache/druid/segment/join/filter/JoinFilterAnalyzer.java
 
b/processing/src/main/java/org/apache/druid/segment/join/filter/JoinFilterAnalyzer.java
index a4c06e79826..d1641770fa8 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/join/filter/JoinFilterAnalyzer.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/join/filter/JoinFilterAnalyzer.java
@@ -69,8 +69,8 @@ import java.util.Set;
  *
  * The result of this pre-analysis method should be passed into the next step 
of join filter analysis, described below.
  *
- * The {@link #splitFilter(JoinFilterPreAnalysis)} method takes the 
pre-analysis result and optionally applies the
- * filter rewrite and push down operations on a per-segment level.
+ * The {@link #splitFilter(JoinFilterPreAnalysis, Filter)} method takes the 
pre-analysis result and optionally applies
+ * the filter rewrite and push down operations on a per-segment level.
  */
 public class JoinFilterAnalyzer
 {
@@ -90,11 +90,10 @@ public class JoinFilterAnalyzer
    */
   public static JoinFilterPreAnalysis computeJoinFilterPreAnalysis(final 
JoinFilterPreAnalysisKey key)
   {
-    final List<VirtualColumn> preJoinVirtualColumns = new ArrayList<>();
-    final List<VirtualColumn> postJoinVirtualColumns = new ArrayList<>();
-
     final JoinableClauses joinableClauses = 
JoinableClauses.fromList(key.getJoinableClauses());
-    joinableClauses.splitVirtualColumns(key.getVirtualColumns(), 
preJoinVirtualColumns, postJoinVirtualColumns);
+    final Set<VirtualColumn> postJoinVirtualColumns = 
joinableClauses.getPostJoinVirtualColumns(
+        key.getVirtualColumns()
+    );
 
     final JoinFilterPreAnalysis.Builder preAnalysisBuilder =
         new JoinFilterPreAnalysis.Builder(key, postJoinVirtualColumns);
@@ -159,13 +158,6 @@ public class JoinFilterAnalyzer
     return preAnalysisBuilder.withCorrelations(correlations).build();
   }
 
-  public static JoinFilterSplit splitFilter(
-      JoinFilterPreAnalysis joinFilterPreAnalysis
-  )
-  {
-    return splitFilter(joinFilterPreAnalysis, null);
-  }
-
   /**
    * @param joinFilterPreAnalysis The pre-analysis computed by {@link 
#computeJoinFilterPreAnalysis)}
    * @param baseFilter - Filter on base table that was specified in the query 
itself
@@ -210,7 +202,8 @@ public class JoinFilterAnalyzer
       );
       if (joinFilterAnalysis.isCanPushDown()) {
         //noinspection OptionalGetWithoutIsPresent isCanPushDown checks 
isPresent
-        leftFilters.add(joinFilterAnalysis.getPushDownFilter().get());
+        final Filter pushDown = joinFilterAnalysis.getPushDownFilter().get();
+        leftFilters.add(pushDown);
       }
       if (joinFilterAnalysis.isRetainAfterJoin()) {
         rightFilters.add(joinFilterAnalysis.getOriginalFilter());
@@ -519,7 +512,7 @@ public class JoinFilterAnalyzer
   }
 
   private static boolean isColumnFromPostJoinVirtualColumns(
-      List<VirtualColumn> postJoinVirtualColumns,
+      Set<VirtualColumn> postJoinVirtualColumns,
       String column
   )
   {
@@ -532,7 +525,7 @@ public class JoinFilterAnalyzer
   }
 
   private static boolean areSomeColumnsFromPostJoinVirtualColumns(
-      List<VirtualColumn> postJoinVirtualColumns,
+      Set<VirtualColumn> postJoinVirtualColumns,
       Collection<String> columns
   )
   {
diff --git 
a/processing/src/main/java/org/apache/druid/segment/join/filter/JoinFilterPreAnalysis.java
 
b/processing/src/main/java/org/apache/druid/segment/join/filter/JoinFilterPreAnalysis.java
index b8b2e7c7830..b63b72c9f96 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/join/filter/JoinFilterPreAnalysis.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/join/filter/JoinFilterPreAnalysis.java
@@ -50,12 +50,12 @@ public class JoinFilterPreAnalysis
   private final List<Filter> normalizedBaseTableClauses;
   private final List<Filter> normalizedJoinTableClauses;
   private final JoinFilterCorrelations correlations;
-  private final List<VirtualColumn> postJoinVirtualColumns;
+  private final Set<VirtualColumn> postJoinVirtualColumns;
   private final Equiconditions equiconditions;
 
   private JoinFilterPreAnalysis(
       final JoinFilterPreAnalysisKey key,
-      final List<VirtualColumn> postJoinVirtualColumns,
+      final Set<VirtualColumn> postJoinVirtualColumns,
       final List<Filter> normalizedBaseTableClauses,
       final List<Filter> normalizedJoinTableClauses,
       final JoinFilterCorrelations correlations,
@@ -86,7 +86,7 @@ public class JoinFilterPreAnalysis
     return key.getFilter();
   }
 
-  public List<VirtualColumn> getPostJoinVirtualColumns()
+  public Set<VirtualColumn> getPostJoinVirtualColumns()
   {
     return postJoinVirtualColumns;
   }
@@ -140,13 +140,13 @@ public class JoinFilterPreAnalysis
     @Nullable
     private JoinFilterCorrelations correlations;
     @Nonnull
-    private final List<VirtualColumn> postJoinVirtualColumns;
+    private final Set<VirtualColumn> postJoinVirtualColumns;
     @Nonnull
     private Equiconditions equiconditions = new 
Equiconditions(Collections.emptyMap());
 
     public Builder(
         @Nonnull JoinFilterPreAnalysisKey key,
-        @Nonnull List<VirtualColumn> postJoinVirtualColumns
+        @Nonnull Set<VirtualColumn> postJoinVirtualColumns
     )
     {
       this.key = key;
diff --git 
a/processing/src/main/java/org/apache/druid/segment/join/filter/JoinFilterPreAnalysisKey.java
 
b/processing/src/main/java/org/apache/druid/segment/join/filter/JoinFilterPreAnalysisKey.java
index fe863b0fd5b..48c00421b54 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/join/filter/JoinFilterPreAnalysisKey.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/join/filter/JoinFilterPreAnalysisKey.java
@@ -68,6 +68,7 @@ public class JoinFilterPreAnalysisKey
     return virtualColumns;
   }
 
+  @Nullable
   public Filter getFilter()
   {
     return filter;
diff --git 
a/processing/src/main/java/org/apache/druid/segment/join/filter/JoinableClauses.java
 
b/processing/src/main/java/org/apache/druid/segment/join/filter/JoinableClauses.java
index 254d4edc50a..fbf457c55a0 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/join/filter/JoinableClauses.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/join/filter/JoinableClauses.java
@@ -32,8 +32,10 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 public class JoinableClauses
@@ -88,19 +90,20 @@ public class JoinableClauses
     return joinableClauses;
   }
 
-  public void splitVirtualColumns(
-      final VirtualColumns virtualColumns,
-      final List<VirtualColumn> preJoinVirtualColumns,
-      final List<VirtualColumn> postJoinVirtualColumns
+  /**
+   * Retrieve subset of virtual columns which require inputs which are only 
present on the join table
+   */
+  public Set<VirtualColumn> getPostJoinVirtualColumns(
+      final VirtualColumns virtualColumns
   )
   {
+    final Set<VirtualColumn> postJoinVirtualColumns = new HashSet<>();
     for (VirtualColumn virtualColumn : virtualColumns.getVirtualColumns()) {
       if (areSomeColumnsFromJoin(virtualColumn.requiredColumns())) {
         postJoinVirtualColumns.add(virtualColumn);
-      } else {
-        preJoinVirtualColumns.add(virtualColumn);
       }
     }
+    return postJoinVirtualColumns;
   }
 
   public boolean areSomeColumnsFromJoin(
diff --git 
a/processing/src/test/java/org/apache/druid/segment/join/HashJoinSegmentStorageAdapterTest.java
 
b/processing/src/test/java/org/apache/druid/segment/join/HashJoinSegmentStorageAdapterTest.java
index 20d032aba38..5931bff8359 100644
--- 
a/processing/src/test/java/org/apache/druid/segment/join/HashJoinSegmentStorageAdapterTest.java
+++ 
b/processing/src/test/java/org/apache/druid/segment/join/HashJoinSegmentStorageAdapterTest.java
@@ -33,7 +33,6 @@ import org.apache.druid.query.filter.Filter;
 import org.apache.druid.query.filter.InDimFilter;
 import org.apache.druid.query.filter.OrDimFilter;
 import org.apache.druid.query.filter.SelectorDimFilter;
-import org.apache.druid.segment.VirtualColumn;
 import org.apache.druid.segment.VirtualColumns;
 import org.apache.druid.segment.column.ColumnCapabilities;
 import org.apache.druid.segment.column.ValueType;
@@ -45,7 +44,6 @@ import 
org.apache.druid.segment.join.table.IndexedTableJoinable;
 import org.junit.Assert;
 import org.junit.Test;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -2294,42 +2292,6 @@ public class HashJoinSegmentStorageAdapterTest extends 
BaseHashJoinSegmentStorag
     );
   }
 
-  @Test
-  public void test_determineBaseColumnsWithPreAndPostJoinVirtualColumns()
-  {
-    List<JoinableClause> joinableClauses = 
ImmutableList.of(factToCountryOnIsoCode(JoinType.LEFT));
-    JoinFilterPreAnalysis analysis = makeDefaultConfigPreAnalysis(null, 
joinableClauses, VirtualColumns.EMPTY);
-    HashJoinSegmentStorageAdapter adapter = new HashJoinSegmentStorageAdapter(
-        factSegment.asStorageAdapter(),
-        joinableClauses,
-        analysis
-    );
-    List<VirtualColumn> expectedPreJoin = ImmutableList.of(
-        makeExpressionVirtualColumn("concat(countryIsoCode,'L')", "v0"),
-        makeExpressionVirtualColumn("concat(countryIsoCode, countryNumber)", 
"v1"),
-        makeExpressionVirtualColumn("channel_uniques - 1", "v2"),
-        makeExpressionVirtualColumn("channel_uniques - __time", "v3")
-    );
-
-    List<VirtualColumn> expectedPostJoin = ImmutableList.of(
-        makeExpressionVirtualColumn("concat(countryIsoCode, dummyColumn)", 
"v4"),
-        makeExpressionVirtualColumn("dummyMetric - __time", "v5")
-    );
-    List<VirtualColumn> actualPreJoin = new ArrayList<>();
-    List<VirtualColumn> actualPostJoin = new ArrayList<>();
-    List<VirtualColumn> allVirtualColumns = new ArrayList<>();
-    allVirtualColumns.addAll(expectedPreJoin);
-    allVirtualColumns.addAll(expectedPostJoin);
-    adapter.determineBaseColumnsWithPreAndPostJoinVirtualColumns(
-        VirtualColumns.create(allVirtualColumns),
-        actualPreJoin,
-        actualPostJoin
-    );
-
-    Assert.assertEquals(expectedPreJoin, actualPreJoin);
-    Assert.assertEquals(expectedPostJoin, actualPostJoin);
-  }
-
   @Test
   public void 
test_hasBuiltInFiltersForSingleJoinableClauseWithVariousJoinTypes()
   {
diff --git 
a/processing/src/test/java/org/apache/druid/segment/join/JoinFilterAnalyzerTest.java
 
b/processing/src/test/java/org/apache/druid/segment/join/JoinFilterAnalyzerTest.java
index 1b7f250f847..68a77f38884 100644
--- 
a/processing/src/test/java/org/apache/druid/segment/join/JoinFilterAnalyzerTest.java
+++ 
b/processing/src/test/java/org/apache/druid/segment/join/JoinFilterAnalyzerTest.java
@@ -119,7 +119,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         null,
         ImmutableSet.of()
     );
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -183,7 +183,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         new SelectorFilter("rtc.countryName", "United States"),
         ImmutableSet.of()
     );
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -249,7 +249,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -320,7 +320,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -382,7 +382,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -461,7 +461,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -521,7 +521,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -685,7 +685,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -758,7 +758,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
 
     ExpressionVirtualColumn expectedVirtualColumn = new 
ExpressionVirtualColumn(
         "JOIN-FILTER-PUSHDOWN-VIRTUAL-COLUMN-0",
@@ -933,7 +933,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -1013,7 +1013,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         )
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(
         expectedFilterSplit.getBaseTableFilter(),
         actualFilterSplit.getBaseTableFilter()
@@ -1103,7 +1103,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         )
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(
         expectedFilterSplit.getBaseTableFilter(),
         actualFilterSplit.getBaseTableFilter()
@@ -1171,7 +1171,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -1228,7 +1228,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -1284,7 +1284,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -1341,7 +1341,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -1396,7 +1396,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -1460,7 +1460,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -1523,7 +1523,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -1578,7 +1578,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -1632,7 +1632,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -1690,7 +1690,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -1747,7 +1747,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -1803,7 +1803,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -1858,7 +1858,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -1924,7 +1924,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -1995,7 +1995,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -2074,7 +2074,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -2133,7 +2133,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -2241,7 +2241,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -2494,7 +2494,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         expectedVirtualColumns
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -2556,7 +2556,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -2630,7 +2630,7 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         ImmutableSet.of()
     );
 
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis);
+    JoinFilterSplit actualFilterSplit = split(joinFilterPreAnalysis);
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
 
@@ -2674,7 +2674,16 @@ public class JoinFilterAnalyzerTest extends 
BaseHashJoinSegmentStorageAdapterTes
         null,
         ImmutableSet.of()
     );
-    JoinFilterSplit actualFilterSplit = 
JoinFilterAnalyzer.splitFilter(joinFilterPreAnalysis, baseTableFilter);
+    JoinFilterSplit actualFilterSplit = JoinFilterAnalyzer.splitFilter(
+        joinFilterPreAnalysis,
+        baseTableFilter
+    );
     Assert.assertEquals(expectedFilterSplit, actualFilterSplit);
   }
+
+
+  private JoinFilterSplit split(JoinFilterPreAnalysis preAnalysis)
+  {
+    return JoinFilterAnalyzer.splitFilter(preAnalysis, null);
+  }
 }


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


Reply via email to