You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@druid.apache.org by cw...@apache.org on 2023/05/17 11:31:31 UTC
[druid] branch 26.0.0 updated: Fixing an issue with filtering on a single dimension by converting In… (#14277) (#14302)
This is an automated email from the ASF dual-hosted git repository.
cwylie pushed a commit to branch 26.0.0
in repository https://gitbox.apache.org/repos/asf/druid.git
The following commit(s) were added to refs/heads/26.0.0 by this push:
new 0cf86d17fe Fixing an issue with filtering on a single dimension by converting In… (#14277) (#14302)
0cf86d17fe is described below
commit 0cf86d17fec4bb24d06e3e4d7e2c4a999fc22f37
Author: Clint Wylie <cw...@apache.org>
AuthorDate: Wed May 17 04:31:25 2023 -0700
Fixing an issue with filtering on a single dimension by converting In… (#14277) (#14302)
* Fixing an issue with filtering on a single dimension by converting In filter to a selector filter as needed with Filters.toFilter
* Adding a test so that any future refactoring does not break this behavior
* Made comment a bit more meaningful
Co-authored-by: Soumyava <93...@users.noreply.github.com>
---
.../druid/segment/join/JoinableFactoryWrapper.java | 6 ++-
.../segment/join/JoinableFactoryWrapperTest.java | 43 ++++++++++++++++++++++
2 files changed, 48 insertions(+), 1 deletion(-)
diff --git a/processing/src/main/java/org/apache/druid/segment/join/JoinableFactoryWrapper.java b/processing/src/main/java/org/apache/druid/segment/join/JoinableFactoryWrapper.java
index 94c98f8ae2..df4d14cf62 100644
--- a/processing/src/main/java/org/apache/druid/segment/join/JoinableFactoryWrapper.java
+++ b/processing/src/main/java/org/apache/druid/segment/join/JoinableFactoryWrapper.java
@@ -30,6 +30,7 @@ import org.apache.druid.java.util.common.Pair;
import org.apache.druid.query.filter.Filter;
import org.apache.druid.query.filter.InDimFilter;
import org.apache.druid.segment.filter.FalseFilter;
+import org.apache.druid.segment.filter.Filters;
import org.apache.druid.utils.CollectionUtils;
import javax.annotation.Nullable;
@@ -177,7 +178,10 @@ public class JoinableFactoryWrapper
}
return new JoinClauseToFilterConversion(null, false);
}
- final Filter onlyFilter = new InDimFilter(leftColumn, columnValuesWithUniqueFlag.getColumnValues());
+ final Filter onlyFilter = Filters.toFilter(new InDimFilter(
+ leftColumn,
+ columnValuesWithUniqueFlag.getColumnValues()
+ ));
if (!columnValuesWithUniqueFlag.isAllUnique()) {
joinClauseFullyConverted = false;
}
diff --git a/processing/src/test/java/org/apache/druid/segment/join/JoinableFactoryWrapperTest.java b/processing/src/test/java/org/apache/druid/segment/join/JoinableFactoryWrapperTest.java
index 8ff6d8461f..f4ee1676b5 100644
--- a/processing/src/test/java/org/apache/druid/segment/join/JoinableFactoryWrapperTest.java
+++ b/processing/src/test/java/org/apache/druid/segment/join/JoinableFactoryWrapperTest.java
@@ -36,6 +36,7 @@ import org.apache.druid.query.filter.InDimFilter;
import org.apache.druid.segment.column.ColumnType;
import org.apache.druid.segment.column.RowSignature;
import org.apache.druid.segment.filter.FalseFilter;
+import org.apache.druid.segment.filter.SelectorFilter;
import org.apache.druid.segment.join.lookup.LookupJoinable;
import org.apache.druid.segment.join.table.IndexedTable;
import org.apache.druid.segment.join.table.IndexedTableJoinable;
@@ -100,6 +101,13 @@ public class JoinableFactoryWrapperTest extends NullHandlingTest
.build()
);
+ private static final InlineDataSource INDEXED_TABLE_DS_ONE_ROW = InlineDataSource.fromIterable(
+ ImmutableList.of(
+ new Object[]{"Mexico"}
+ ),
+ RowSignature.builder().add("country", ColumnType.STRING).build()
+ );
+
private static final InlineDataSource NULL_INDEXED_TABLE_DS = InlineDataSource.fromIterable(
ImmutableList.of(
new Object[]{null}
@@ -123,6 +131,14 @@ public class JoinableFactoryWrapperTest extends NullHandlingTest
DateTimes.nowUtc().toString()
);
+ private static final IndexedTable TEST_INDEXED_TABLE_ONE_ROW = new RowBasedIndexedTable<>(
+ INDEXED_TABLE_DS_ONE_ROW.getRowsAsList(),
+ INDEXED_TABLE_DS_ONE_ROW.rowAdapter(),
+ INDEXED_TABLE_DS_ONE_ROW.getRowSignature(),
+ ImmutableSet.of("country"),
+ DateTimes.nowUtc().toString()
+ );
+
private static final IndexedTable TEST_NULL_INDEXED_TABLE = new RowBasedIndexedTable<>(
NULL_INDEXED_TABLE_DS.getRowsAsList(),
NULL_INDEXED_TABLE_DS.rowAdapter(),
@@ -240,6 +256,33 @@ public class JoinableFactoryWrapperTest extends NullHandlingTest
);
}
+ @Test
+ public void test_convertJoinsToPartialFiltersWithSelectorFiltersInsteadOfInsForSingleValue()
+ {
+ JoinableClause joinableClause = new JoinableClause(
+ "j.",
+ new IndexedTableJoinable(TEST_INDEXED_TABLE_ONE_ROW),
+ JoinType.INNER,
+ JoinConditionAnalysis.forExpression("x == \"j.country\"", "j.", ExprMacroTable.nil())
+ );
+ final Pair<List<Filter>, List<JoinableClause>> conversion = JoinableFactoryWrapper.convertJoinsToFilters(
+ ImmutableList.of(joinableClause),
+ ImmutableSet.of("x"),
+ Integer.MAX_VALUE
+ );
+
+ // Although the filter created was an In Filter in equijoin (here inFilter = IN (Mexico))
+ // We should receive a SelectorFilter for Filters.toFilter(inFilter) call
+ // and should receive a SelectorFilter with x = Mexico
+ Assert.assertEquals(
+ Pair.of(
+ ImmutableList.of(new SelectorFilter("x", "Mexico", null)),
+ ImmutableList.of()
+ ),
+ conversion
+ );
+ }
+
@Test
public void test_convertJoinsToFilters_convertTwoInnerJoins()
{
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@druid.apache.org
For additional commands, e-mail: commits-help@druid.apache.org