This is an automated email from the ASF dual-hosted git repository.
adelapena pushed a commit to branch cassandra-5.0
in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/cassandra-5.0 by this push:
new c26f2a3d69 Fix SAI unindexed contexts not considering CONTAINS KEY
c26f2a3d69 is described below
commit c26f2a3d6936d6ff2f14c6ab19b3727c2f86c941
Author: Andrés de la Peña <[email protected]>
AuthorDate: Mon Nov 20 13:42:10 2023 +0000
Fix SAI unindexed contexts not considering CONTAINS KEY
patch by Andrés de la Peña; reviewed by Maxwell Guo and Michael Semb Wever
for CASSANDRA-19040
---
CHANGES.txt | 1 +
.../cassandra/index/sai/plan/QueryController.java | 4 ++-
.../index/sai/cql/CollectionIndexingTest.java | 40 ++++++++++++++++++----
3 files changed, 38 insertions(+), 7 deletions(-)
diff --git a/CHANGES.txt b/CHANGES.txt
index d744f50fa1..19c16fde48 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
5.0-beta1
+ * Fix SAI unindexed contexts not considering CONTAINS KEY (CASSANDRA-19040)
* Ensure that empty SAI column indexes do not fail on validation after
full-SSTable streaming (CASSANDRA-19017)
* SAI in-memory index should check max term size (CASSANDRA-18926)
* Set default disk_access_mode to mmap_index_only (CASSANDRA-19021)
diff --git a/src/java/org/apache/cassandra/index/sai/plan/QueryController.java
b/src/java/org/apache/cassandra/index/sai/plan/QueryController.java
index eee85f016e..b236c61db4 100644
--- a/src/java/org/apache/cassandra/index/sai/plan/QueryController.java
+++ b/src/java/org/apache/cassandra/index/sai/plan/QueryController.java
@@ -146,7 +146,9 @@ public class QueryController
cfs.getPartitioner(),
cfs.getComparator(),
expression.column(),
- IndexTarget.Type.VALUES,
+
expression.operator().isContainsKey()
+ ?
IndexTarget.Type.KEYS
+ :
IndexTarget.Type.VALUES,
null)
: indexes.iterator().next().getIndexContext();
}
diff --git
a/test/unit/org/apache/cassandra/index/sai/cql/CollectionIndexingTest.java
b/test/unit/org/apache/cassandra/index/sai/cql/CollectionIndexingTest.java
index a82f539842..b490dfa946 100644
--- a/test/unit/org/apache/cassandra/index/sai/cql/CollectionIndexingTest.java
+++ b/test/unit/org/apache/cassandra/index/sai/cql/CollectionIndexingTest.java
@@ -42,28 +42,28 @@ public class CollectionIndexingTest extends SAITester
}
@Test
- public void indexMap() throws Throwable
+ public void indexMap()
{
createPopulatedMap(createIndexDDL("value"));
assertEquals(2, execute("SELECT * FROM %s WHERE value CONTAINS
'v1'").size());
}
@Test
- public void indexMapKeys() throws Throwable
+ public void indexMapKeys()
{
createPopulatedMap(createIndexDDL("KEYS(value)"));
assertEquals(2, execute("SELECT * FROM %s WHERE value CONTAINS KEY
1").size());
}
@Test
- public void indexMapValues() throws Throwable
+ public void indexMapValues()
{
createPopulatedMap(createIndexDDL("VALUES(value)"));
assertEquals(2, execute("SELECT * FROM %s WHERE value CONTAINS
'v1'").size());
}
@Test
- public void indexMapEntries() throws Throwable
+ public void indexMapEntries()
{
createPopulatedMap(createIndexDDL("ENTRIES(value)"));
assertEquals(2, execute("SELECT * FROM %s WHERE value[1] =
'v1'").size());
@@ -71,7 +71,7 @@ public class CollectionIndexingTest extends SAITester
}
@Test
- public void indexFrozenList() throws Throwable
+ public void indexFrozenList()
{
createPopulatedFrozenList(createIndexDDL("FULL(value)"));
assertEquals(2, execute("SELECT * FROM %s WHERE value = ?",
Arrays.asList(1, 2, 3)).size());
@@ -176,6 +176,34 @@ public class CollectionIndexingTest extends SAITester
assertUnsupportedIndexOperator(2, "SELECT * FROM %s WHERE value[1] =
'v1'");
}
+ @Test
+ public void unindexedContainsExpressions()
+ {
+ createTable("CREATE TABLE %s (k int PRIMARY KEY, v int, m map<int,
int>)");
+ createIndex("CREATE INDEX ON %s(v) USING 'SAI'"); // just to make sure
that SAI is involved
+
+ Object[] row = row(0, 1, map(2, 3));
+ execute("INSERT INTO %s (k, v, m) VALUES (?, ?, ?)", row);
+ execute("INSERT INTO %s (k, v, m) VALUES (?, ?, ?)", 1, 1, map(12,
13));
+
+ // try without any indexes on the map
+ assertRows(execute("SELECT k, v, m FROM %s WHERE v = 1 AND m CONTAINS
3 ALLOW FILTERING"), row);
+ assertRows(execute("SELECT k, v, m FROM %s WHERE v = 1 AND m CONTAINS
KEY 2 ALLOW FILTERING"), row);
+ assertRows(execute("SELECT k, v, m FROM %s WHERE v = 1 AND m CONTAINS
KEY 2 AND m CONTAINS 3 ALLOW FILTERING"), row);
+
+ // try with index on map values
+ createIndex("CREATE INDEX ON %s(m) USING 'SAI'");
+ assertRows(execute("SELECT k, v, m FROM %s WHERE v = 1 AND m CONTAINS
3"), row);
+ assertRows(execute("SELECT k, v, m FROM %s WHERE v = 1 AND m CONTAINS
KEY 2 ALLOW FILTERING"), row);
+ assertRows(execute("SELECT k, v, m FROM %s WHERE v = 1 AND m CONTAINS
KEY 2 AND m CONTAINS 3 ALLOW FILTERING"), row);
+
+ // try with index on map keys
+ createIndex("CREATE INDEX ON %s(KEYS(m)) USING 'SAI'");
+ assertRows(execute("SELECT k, v, m FROM %s WHERE v = 1 AND m CONTAINS
3"), row);
+ assertRows(execute("SELECT k, v, m FROM %s WHERE v = 1 AND m CONTAINS
KEY 2"), row);
+ assertRows(execute("SELECT k, v, m FROM %s WHERE v = 1 AND m CONTAINS
KEY 2 AND m CONTAINS 3"), row);
+ }
+
private void createPopulatedMap(String createIndex)
{
createTable("CREATE TABLE %s (pk int primary key, value map<int,
text>)");
@@ -191,7 +219,7 @@ public class CollectionIndexingTest extends SAITester
}
@SuppressWarnings("SameParameterValue")
- private void createPopulatedFrozenMap(String createIndex) throws Throwable
+ private void createPopulatedFrozenMap(String createIndex)
{
createTable("CREATE TABLE %s (pk int primary key, value
frozen<map<int, text>>)");
createIndex(createIndex);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]