From 7f98720bf182a34d05cbdc781bf184e4b5345270 Mon Sep 17 00:00:00 2001 From: Suneet Saldanha Date: Wed, 29 Jan 2020 10:47:02 -0800 Subject: [PATCH 1/3] Add getRightColumns to JoinConditionAnalysis This change other implementations of JoinableFactory to ask the analysis for the right key columns instead of having to calculate it themselves. --- .../druid/segment/join/JoinConditionAnalysis.java | 11 +++++++++++ .../segment/join/JoinConditionAnalysisTest.java | 14 +++++++++++++- .../druid/segment/join/InlineJoinableFactory.java | 4 +--- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/processing/src/main/java/org/apache/druid/segment/join/JoinConditionAnalysis.java b/processing/src/main/java/org/apache/druid/segment/join/JoinConditionAnalysis.java index a9e9f21bfae0..6ba71a479b34 100644 --- a/processing/src/main/java/org/apache/druid/segment/join/JoinConditionAnalysis.java +++ b/processing/src/main/java/org/apache/druid/segment/join/JoinConditionAnalysis.java @@ -32,6 +32,7 @@ import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.stream.Collectors; /** * Represents analysis of a join condition. @@ -55,6 +56,7 @@ public class JoinConditionAnalysis private final boolean isAlwaysFalse; private final boolean isAlwaysTrue; private final boolean canHashJoin; + private final List rightKeyColumns; private JoinConditionAnalysis( final String originalExpression, @@ -76,6 +78,7 @@ private JoinConditionAnalysis( .allMatch(expr -> expr.isLiteral() && expr.eval( ExprUtils.nilBindings()).asBoolean()); canHashJoin = nonEquiConditions.stream().allMatch(Expr::isLiteral); + rightKeyColumns = getEquiConditions().stream().map(Equality::getRightColumn).distinct().collect(Collectors.toList()); } /** @@ -176,6 +179,14 @@ public boolean canHashJoin() return canHashJoin; } + /** + * Returns the distinct column keys from the RHS required to evaluate the equi conditions. + */ + public List getRightKeyColumns() + { + return rightKeyColumns; + } + @Override public boolean equals(Object o) { diff --git a/processing/src/test/java/org/apache/druid/segment/join/JoinConditionAnalysisTest.java b/processing/src/test/java/org/apache/druid/segment/join/JoinConditionAnalysisTest.java index 87ad4516adfd..a66c948d1ae8 100644 --- a/processing/src/test/java/org/apache/druid/segment/join/JoinConditionAnalysisTest.java +++ b/processing/src/test/java/org/apache/druid/segment/join/JoinConditionAnalysisTest.java @@ -25,6 +25,7 @@ import org.apache.druid.java.util.common.Pair; import org.apache.druid.math.expr.Expr; import org.apache.druid.math.expr.ExprMacroTable; +import org.hamcrest.CoreMatchers; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; @@ -60,6 +61,7 @@ public void test_forExpression_simple() ImmutableList.of(), exprsToStrings(analysis.getNonEquiConditions()) ); + Assert.assertThat(analysis.getRightKeyColumns(), CoreMatchers.is(ImmutableList.of("y"))); } @Test @@ -80,6 +82,7 @@ public void test_forExpression_simpleFlipped() ImmutableList.of(), exprsToStrings(analysis.getNonEquiConditions()) ); + Assert.assertThat(analysis.getRightKeyColumns(), CoreMatchers.is(ImmutableList.of("y"))); } @Test @@ -100,6 +103,7 @@ public void test_forExpression_leftFunction() ImmutableList.of(), exprsToStrings(analysis.getNonEquiConditions()) ); + Assert.assertThat(analysis.getRightKeyColumns(), CoreMatchers.is(ImmutableList.of("z"))); } @Test @@ -120,6 +124,7 @@ public void test_forExpression_rightFunction() ImmutableList.of("(== (+ j.x j.y) z)"), exprsToStrings(analysis.getNonEquiConditions()) ); + Assert.assertTrue(analysis.getRightKeyColumns().isEmpty()); } @Test @@ -140,6 +145,7 @@ public void test_forExpression_mixedFunction() ImmutableList.of("(== (+ x j.y) j.z)"), exprsToStrings(analysis.getNonEquiConditions()) ); + Assert.assertTrue(analysis.getRightKeyColumns().isEmpty()); } @Test @@ -160,6 +166,7 @@ public void test_forExpression_trueConstant() ImmutableList.of("2"), exprsToStrings(analysis.getNonEquiConditions()) ); + Assert.assertTrue(analysis.getRightKeyColumns().isEmpty()); } @Test @@ -180,6 +187,7 @@ public void test_forExpression_falseConstant() ImmutableList.of("0"), exprsToStrings(analysis.getNonEquiConditions()) ); + Assert.assertTrue(analysis.getRightKeyColumns().isEmpty()); } @Test @@ -200,6 +208,7 @@ public void test_forExpression_onlyLeft() ImmutableList.of("(== x 1)"), exprsToStrings(analysis.getNonEquiConditions()) ); + Assert.assertTrue(analysis.getRightKeyColumns().isEmpty()); } @Test @@ -220,6 +229,7 @@ public void test_forExpression_onlyRight() ImmutableList.of(), exprsToStrings(analysis.getNonEquiConditions()) ); + Assert.assertThat(analysis.getRightKeyColumns(), CoreMatchers.is(ImmutableList.of("x"))); } @Test @@ -240,6 +250,7 @@ public void test_forExpression_andOfThreeConditions() ImmutableList.of(), exprsToStrings(analysis.getNonEquiConditions()) ); + Assert.assertThat(analysis.getRightKeyColumns(), CoreMatchers.is(ImmutableList.of("y", "z", "zz"))); } @Test @@ -260,6 +271,7 @@ public void test_forExpression_mixedAndWithOr() ImmutableList.of("(|| (== (+ x y) j.z) (== z j.zz))"), exprsToStrings(analysis.getNonEquiConditions()) ); + Assert.assertThat(analysis.getRightKeyColumns(), CoreMatchers.is(ImmutableList.of("y"))); } @Test @@ -271,7 +283,7 @@ public void test_equals() // These fields are tightly coupled with originalExpression "equiConditions", "nonEquiConditions", // These fields are calculated from nonEquiConditions - "isAlwaysTrue", "isAlwaysFalse", "canHashJoin") + "isAlwaysTrue", "isAlwaysFalse", "canHashJoin", "rightKeyColumns") .verify(); } diff --git a/server/src/main/java/org/apache/druid/segment/join/InlineJoinableFactory.java b/server/src/main/java/org/apache/druid/segment/join/InlineJoinableFactory.java index d4b9937165bb..900dae7f21c1 100644 --- a/server/src/main/java/org/apache/druid/segment/join/InlineJoinableFactory.java +++ b/server/src/main/java/org/apache/druid/segment/join/InlineJoinableFactory.java @@ -27,7 +27,6 @@ import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; /** * A {@link JoinableFactory} for {@link InlineDataSource}. It works by building an {@link IndexedTable}. @@ -39,8 +38,7 @@ public Optional build(final DataSource dataSource, final JoinCondition { if (condition.canHashJoin() && dataSource instanceof InlineDataSource) { final InlineDataSource inlineDataSource = (InlineDataSource) dataSource; - final List rightKeyColumns = - condition.getEquiConditions().stream().map(Equality::getRightColumn).distinct().collect(Collectors.toList()); + final List rightKeyColumns = condition.getRightKeyColumns(); return Optional.of( new IndexedTableJoinable( From 5b54942b4ca2a61755f6872bd4f3111da755925d Mon Sep 17 00:00:00 2001 From: Suneet Saldanha Date: Wed, 29 Jan 2020 14:01:59 -0800 Subject: [PATCH 2/3] Address some review comments --- .../segment/join/JoinConditionAnalysis.java | 6 +++-- .../segment/join/table/IndexedTable.java | 3 ++- .../join/table/RowBasedIndexedTable.java | 7 ++--- .../join/JoinConditionAnalysisTest.java | 26 +++++++++---------- .../druid/segment/join/JoinTestHelper.java | 5 ++-- .../join/table/IndexedTableJoinableTest.java | 3 ++- .../join/table/RowBasedIndexedTableTest.java | 3 ++- .../segment/join/InlineJoinableFactory.java | 4 +-- 8 files changed, 32 insertions(+), 25 deletions(-) diff --git a/processing/src/main/java/org/apache/druid/segment/join/JoinConditionAnalysis.java b/processing/src/main/java/org/apache/druid/segment/join/JoinConditionAnalysis.java index 6ba71a479b34..fd69b4b0f28d 100644 --- a/processing/src/main/java/org/apache/druid/segment/join/JoinConditionAnalysis.java +++ b/processing/src/main/java/org/apache/druid/segment/join/JoinConditionAnalysis.java @@ -20,6 +20,7 @@ package org.apache.druid.segment.join; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableSet; import org.apache.druid.java.util.common.Pair; import org.apache.druid.math.expr.Expr; import org.apache.druid.math.expr.ExprMacroTable; @@ -32,6 +33,7 @@ import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; /** @@ -182,9 +184,9 @@ public boolean canHashJoin() /** * Returns the distinct column keys from the RHS required to evaluate the equi conditions. */ - public List getRightKeyColumns() + public Set getRightEquiConditionKeys() { - return rightKeyColumns; + return ImmutableSet.copyOf(rightKeyColumns); } @Override diff --git a/processing/src/main/java/org/apache/druid/segment/join/table/IndexedTable.java b/processing/src/main/java/org/apache/druid/segment/join/table/IndexedTable.java index a7b6b748b948..dfd64b1e4eaf 100644 --- a/processing/src/main/java/org/apache/druid/segment/join/table/IndexedTable.java +++ b/processing/src/main/java/org/apache/druid/segment/join/table/IndexedTable.java @@ -25,6 +25,7 @@ import javax.annotation.Nullable; import java.util.List; import java.util.Map; +import java.util.Set; /** * An interface to a table where some columns (the 'key columns') have indexes that enable fast lookups. @@ -36,7 +37,7 @@ public interface IndexedTable /** * Returns the columns of this table that have indexes. */ - List keyColumns(); + Set keyColumns(); /** * Returns all columns of this table, including the key and non-key columns. diff --git a/processing/src/main/java/org/apache/druid/segment/join/table/RowBasedIndexedTable.java b/processing/src/main/java/org/apache/druid/segment/join/table/RowBasedIndexedTable.java index 698382387004..37e9cb59e8a5 100644 --- a/processing/src/main/java/org/apache/druid/segment/join/table/RowBasedIndexedTable.java +++ b/processing/src/main/java/org/apache/druid/segment/join/table/RowBasedIndexedTable.java @@ -33,6 +33,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; @@ -48,13 +49,13 @@ public class RowBasedIndexedTable implements IndexedTable private final List columns; private final List columnTypes; private final List> columnFunctions; - private final List keyColumns; + private final Set keyColumns; public RowBasedIndexedTable( final List table, final RowAdapter rowAdapter, final Map rowSignature, - final List keyColumns + final Set keyColumns ) { this.table = table; @@ -107,7 +108,7 @@ public RowBasedIndexedTable( } @Override - public List keyColumns() + public Set keyColumns() { return keyColumns; } diff --git a/processing/src/test/java/org/apache/druid/segment/join/JoinConditionAnalysisTest.java b/processing/src/test/java/org/apache/druid/segment/join/JoinConditionAnalysisTest.java index a66c948d1ae8..875f686af577 100644 --- a/processing/src/test/java/org/apache/druid/segment/join/JoinConditionAnalysisTest.java +++ b/processing/src/test/java/org/apache/druid/segment/join/JoinConditionAnalysisTest.java @@ -20,12 +20,12 @@ package org.apache.druid.segment.join; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import nl.jqno.equalsverifier.EqualsVerifier; import org.apache.druid.common.config.NullHandling; import org.apache.druid.java.util.common.Pair; import org.apache.druid.math.expr.Expr; import org.apache.druid.math.expr.ExprMacroTable; -import org.hamcrest.CoreMatchers; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; @@ -61,7 +61,7 @@ public void test_forExpression_simple() ImmutableList.of(), exprsToStrings(analysis.getNonEquiConditions()) ); - Assert.assertThat(analysis.getRightKeyColumns(), CoreMatchers.is(ImmutableList.of("y"))); + Assert.assertEquals(analysis.getRightEquiConditionKeys(), ImmutableSet.of("y")); } @Test @@ -82,7 +82,7 @@ public void test_forExpression_simpleFlipped() ImmutableList.of(), exprsToStrings(analysis.getNonEquiConditions()) ); - Assert.assertThat(analysis.getRightKeyColumns(), CoreMatchers.is(ImmutableList.of("y"))); + Assert.assertEquals(analysis.getRightEquiConditionKeys(), ImmutableSet.of("y")); } @Test @@ -103,7 +103,7 @@ public void test_forExpression_leftFunction() ImmutableList.of(), exprsToStrings(analysis.getNonEquiConditions()) ); - Assert.assertThat(analysis.getRightKeyColumns(), CoreMatchers.is(ImmutableList.of("z"))); + Assert.assertEquals(analysis.getRightEquiConditionKeys(), ImmutableSet.of("z")); } @Test @@ -124,7 +124,7 @@ public void test_forExpression_rightFunction() ImmutableList.of("(== (+ j.x j.y) z)"), exprsToStrings(analysis.getNonEquiConditions()) ); - Assert.assertTrue(analysis.getRightKeyColumns().isEmpty()); + Assert.assertTrue(analysis.getRightEquiConditionKeys().isEmpty()); } @Test @@ -145,7 +145,7 @@ public void test_forExpression_mixedFunction() ImmutableList.of("(== (+ x j.y) j.z)"), exprsToStrings(analysis.getNonEquiConditions()) ); - Assert.assertTrue(analysis.getRightKeyColumns().isEmpty()); + Assert.assertTrue(analysis.getRightEquiConditionKeys().isEmpty()); } @Test @@ -166,7 +166,7 @@ public void test_forExpression_trueConstant() ImmutableList.of("2"), exprsToStrings(analysis.getNonEquiConditions()) ); - Assert.assertTrue(analysis.getRightKeyColumns().isEmpty()); + Assert.assertTrue(analysis.getRightEquiConditionKeys().isEmpty()); } @Test @@ -187,7 +187,7 @@ public void test_forExpression_falseConstant() ImmutableList.of("0"), exprsToStrings(analysis.getNonEquiConditions()) ); - Assert.assertTrue(analysis.getRightKeyColumns().isEmpty()); + Assert.assertTrue(analysis.getRightEquiConditionKeys().isEmpty()); } @Test @@ -208,7 +208,7 @@ public void test_forExpression_onlyLeft() ImmutableList.of("(== x 1)"), exprsToStrings(analysis.getNonEquiConditions()) ); - Assert.assertTrue(analysis.getRightKeyColumns().isEmpty()); + Assert.assertTrue(analysis.getRightEquiConditionKeys().isEmpty()); } @Test @@ -229,7 +229,7 @@ public void test_forExpression_onlyRight() ImmutableList.of(), exprsToStrings(analysis.getNonEquiConditions()) ); - Assert.assertThat(analysis.getRightKeyColumns(), CoreMatchers.is(ImmutableList.of("x"))); + Assert.assertEquals(analysis.getRightEquiConditionKeys(), ImmutableSet.of("x")); } @Test @@ -250,7 +250,7 @@ public void test_forExpression_andOfThreeConditions() ImmutableList.of(), exprsToStrings(analysis.getNonEquiConditions()) ); - Assert.assertThat(analysis.getRightKeyColumns(), CoreMatchers.is(ImmutableList.of("y", "z", "zz"))); + Assert.assertEquals(analysis.getRightEquiConditionKeys(), ImmutableSet.of("y", "z", "zz")); } @Test @@ -271,7 +271,7 @@ public void test_forExpression_mixedAndWithOr() ImmutableList.of("(|| (== (+ x y) j.z) (== z j.zz))"), exprsToStrings(analysis.getNonEquiConditions()) ); - Assert.assertThat(analysis.getRightKeyColumns(), CoreMatchers.is(ImmutableList.of("y"))); + Assert.assertEquals(analysis.getRightEquiConditionKeys(), ImmutableSet.of("y")); } @Test @@ -282,7 +282,7 @@ public void test_equals() .withIgnoredFields( // These fields are tightly coupled with originalExpression "equiConditions", "nonEquiConditions", - // These fields are calculated from nonEquiConditions + // These fields are calculated from other other fields in the class "isAlwaysTrue", "isAlwaysFalse", "canHashJoin", "rightKeyColumns") .verify(); } diff --git a/processing/src/test/java/org/apache/druid/segment/join/JoinTestHelper.java b/processing/src/test/java/org/apache/druid/segment/join/JoinTestHelper.java index 88d36e61e2c4..ac0022dc1ff1 100644 --- a/processing/src/test/java/org/apache/druid/segment/join/JoinTestHelper.java +++ b/processing/src/test/java/org/apache/druid/segment/join/JoinTestHelper.java @@ -23,6 +23,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import org.apache.druid.common.config.NullHandling; import org.apache.druid.data.input.InputRow; @@ -252,7 +253,7 @@ public static RowBasedIndexedTable> createCountriesIndexedTa rows, createMapRowAdapter(COUNTRIES_SIGNATURE), COUNTRIES_SIGNATURE, - ImmutableList.of("countryNumber", "countryIsoCode") + ImmutableSet.of("countryNumber", "countryIsoCode") ) ); } @@ -265,7 +266,7 @@ public static RowBasedIndexedTable> createRegionsIndexedTabl rows, createMapRowAdapter(REGIONS_SIGNATURE), REGIONS_SIGNATURE, - ImmutableList.of("regionIsoCode", "countryIsoCode") + ImmutableSet.of("regionIsoCode", "countryIsoCode") ) ); } diff --git a/processing/src/test/java/org/apache/druid/segment/join/table/IndexedTableJoinableTest.java b/processing/src/test/java/org/apache/druid/segment/join/table/IndexedTableJoinableTest.java index ad785c1f08ee..30beafcfc98b 100644 --- a/processing/src/test/java/org/apache/druid/segment/join/table/IndexedTableJoinableTest.java +++ b/processing/src/test/java/org/apache/druid/segment/join/table/IndexedTableJoinableTest.java @@ -20,6 +20,7 @@ package org.apache.druid.segment.join.table; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import org.apache.druid.math.expr.ExprMacroTable; import org.apache.druid.query.InlineDataSource; import org.apache.druid.query.dimension.DefaultDimensionSpec; @@ -72,7 +73,7 @@ public ColumnCapabilities getColumnCapabilities(String columnName) inlineDataSource.getRowsAsList(), inlineDataSource.rowAdapter(), inlineDataSource.getRowSignature(), - ImmutableList.of("str") + ImmutableSet.of("str") ); @Test diff --git a/processing/src/test/java/org/apache/druid/segment/join/table/RowBasedIndexedTableTest.java b/processing/src/test/java/org/apache/druid/segment/join/table/RowBasedIndexedTableTest.java index d57f23a0fa4e..fed0a7019853 100644 --- a/processing/src/test/java/org/apache/druid/segment/join/table/RowBasedIndexedTableTest.java +++ b/processing/src/test/java/org/apache/druid/segment/join/table/RowBasedIndexedTableTest.java @@ -21,6 +21,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import org.apache.druid.common.config.NullHandling; import org.apache.druid.segment.column.ValueType; import org.apache.druid.segment.join.JoinTestHelper; @@ -64,7 +65,7 @@ public void setUp() throws IOException @Test public void test_keyColumns_countries() { - Assert.assertEquals(ImmutableList.of("countryNumber", "countryIsoCode"), countriesTable.keyColumns()); + Assert.assertEquals(ImmutableSet.of("countryNumber", "countryIsoCode"), countriesTable.keyColumns()); } @Test diff --git a/server/src/main/java/org/apache/druid/segment/join/InlineJoinableFactory.java b/server/src/main/java/org/apache/druid/segment/join/InlineJoinableFactory.java index 900dae7f21c1..69ee6cc16c74 100644 --- a/server/src/main/java/org/apache/druid/segment/join/InlineJoinableFactory.java +++ b/server/src/main/java/org/apache/druid/segment/join/InlineJoinableFactory.java @@ -25,8 +25,8 @@ import org.apache.druid.segment.join.table.IndexedTableJoinable; import org.apache.druid.segment.join.table.RowBasedIndexedTable; -import java.util.List; import java.util.Optional; +import java.util.Set; /** * A {@link JoinableFactory} for {@link InlineDataSource}. It works by building an {@link IndexedTable}. @@ -38,7 +38,7 @@ public Optional build(final DataSource dataSource, final JoinCondition { if (condition.canHashJoin() && dataSource instanceof InlineDataSource) { final InlineDataSource inlineDataSource = (InlineDataSource) dataSource; - final List rightKeyColumns = condition.getRightKeyColumns(); + final Set rightKeyColumns = condition.getRightEquiConditionKeys(); return Optional.of( new IndexedTableJoinable( From e70dca1b9796189273a21c4a8f357b1fb0ff751a Mon Sep 17 00:00:00 2001 From: Suneet Saldanha Date: Wed, 29 Jan 2020 16:14:57 -0800 Subject: [PATCH 3/3] more code review stuff --- .../apache/druid/segment/join/JoinConditionAnalysis.java | 7 +++---- .../druid/segment/join/lookup/LookupJoinMatcher.java | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/processing/src/main/java/org/apache/druid/segment/join/JoinConditionAnalysis.java b/processing/src/main/java/org/apache/druid/segment/join/JoinConditionAnalysis.java index fd69b4b0f28d..6f2225d8bcfc 100644 --- a/processing/src/main/java/org/apache/druid/segment/join/JoinConditionAnalysis.java +++ b/processing/src/main/java/org/apache/druid/segment/join/JoinConditionAnalysis.java @@ -20,7 +20,6 @@ package org.apache.druid.segment.join; import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableSet; import org.apache.druid.java.util.common.Pair; import org.apache.druid.math.expr.Expr; import org.apache.druid.math.expr.ExprMacroTable; @@ -58,7 +57,7 @@ public class JoinConditionAnalysis private final boolean isAlwaysFalse; private final boolean isAlwaysTrue; private final boolean canHashJoin; - private final List rightKeyColumns; + private final Set rightKeyColumns; private JoinConditionAnalysis( final String originalExpression, @@ -80,7 +79,7 @@ private JoinConditionAnalysis( .allMatch(expr -> expr.isLiteral() && expr.eval( ExprUtils.nilBindings()).asBoolean()); canHashJoin = nonEquiConditions.stream().allMatch(Expr::isLiteral); - rightKeyColumns = getEquiConditions().stream().map(Equality::getRightColumn).distinct().collect(Collectors.toList()); + rightKeyColumns = getEquiConditions().stream().map(Equality::getRightColumn).distinct().collect(Collectors.toSet()); } /** @@ -186,7 +185,7 @@ public boolean canHashJoin() */ public Set getRightEquiConditionKeys() { - return ImmutableSet.copyOf(rightKeyColumns); + return rightKeyColumns; } @Override diff --git a/processing/src/main/java/org/apache/druid/segment/join/lookup/LookupJoinMatcher.java b/processing/src/main/java/org/apache/druid/segment/join/lookup/LookupJoinMatcher.java index 9af6df93fdc6..cbf99f1475a4 100644 --- a/processing/src/main/java/org/apache/druid/segment/join/lookup/LookupJoinMatcher.java +++ b/processing/src/main/java/org/apache/druid/segment/join/lookup/LookupJoinMatcher.java @@ -191,9 +191,9 @@ public static LookupJoinMatcher create( keyExprs = null; } else if (!condition.getNonEquiConditions().isEmpty()) { throw new IAE("Cannot join lookup with non-equi condition: %s", condition); - } else if (!condition.getEquiConditions() + } else if (!condition.getRightEquiConditionKeys() .stream() - .allMatch(eq -> eq.getRightColumn().equals(LookupColumnSelectorFactory.KEY_COLUMN))) { + .allMatch(LookupColumnSelectorFactory.KEY_COLUMN::equals)) { throw new IAE("Cannot join lookup with condition referring to non-key column: %s", condition); } else { keyExprs = condition.getEquiConditions().stream().map(Equality::getLeftExpr).collect(Collectors.toList());