You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by bl...@apache.org on 2017/03/28 11:22:39 UTC

[2/3] cassandra git commit: Fix static column indexes

Fix static column indexes

patch by Andr�s de la Pe�a; reviewed by Benjamin Lerer for CASSANDRA-13277


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/41befde2
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/41befde2
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/41befde2

Branch: refs/heads/trunk
Commit: 41befde2273724e2070a28cd6c47a407e3e4426a
Parents: 52fc62f
Author: Andr�s de la Pe�a <a....@gmail.com>
Authored: Tue Mar 28 13:15:17 2017 +0200
Committer: Benjamin Lerer <b....@gmail.com>
Committed: Tue Mar 28 13:17:46 2017 +0200

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../internal/composites/CompositesSearcher.java |  6 +++++
 .../index/internal/CassandraIndexTest.java      | 26 ++++++++++++++++++++
 3 files changed, 33 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/41befde2/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 038befb..2122227 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 3.11.0
+ * Fix static column indexes (CASSANDRA-13277) 
  * DataOutputBuffer.asNewBuffer broken (CASSANDRA-13298)
  * unittest CipherFactoryTest failed on MacOS (CASSANDRA-13370)
  * Forbid SELECT restrictions and CREATE INDEX over non-frozen UDT columns (CASSANDRA-13247)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/41befde2/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java b/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java
index 324d939..e777620 100644
--- a/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java
+++ b/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java
@@ -114,6 +114,12 @@ public class CompositesSearcher extends CassandraIndexSearcher
                     List<IndexEntry> entries = new ArrayList<>();
                     if (isStaticColumn())
                     {
+                        // The index hit may not match the commad key constraint
+                        if (!isMatchingEntry(partitionKey, nextEntry, command)) {
+                            nextEntry = indexHits.hasNext() ? index.decodeEntry(indexKey, indexHits.next()) : null;
+                            continue;
+                        }
+
                         // If the index is on a static column, we just need to do a full read on the partition.
                         // Note that we want to re-use the command.columnFilter() in case of future change.
                         dataCmd = SinglePartitionReadCommand.create(index.baseCfs.metadata,

http://git-wip-us.apache.org/repos/asf/cassandra/blob/41befde2/test/unit/org/apache/cassandra/index/internal/CassandraIndexTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/index/internal/CassandraIndexTest.java b/test/unit/org/apache/cassandra/index/internal/CassandraIndexTest.java
index 5c7d840..59d6860 100644
--- a/test/unit/org/apache/cassandra/index/internal/CassandraIndexTest.java
+++ b/test/unit/org/apache/cassandra/index/internal/CassandraIndexTest.java
@@ -358,6 +358,32 @@ public class CassandraIndexTest extends CQLTester
     }
 
     @Test
+    public void indexOnStaticColumn() throws Throwable
+    {
+        Object[] row1 = row("k0", "c0", "s0");
+        Object[] row2 = row("k0", "c1", "s0");
+        Object[] row3 = row("k1", "c0", "s1");
+        Object[] row4 = row("k1", "c1", "s1");
+
+        createTable("CREATE TABLE %s (k text, c text, s text static, PRIMARY KEY (k, c));");
+        createIndex("CREATE INDEX sc_index on %s(s)");
+
+        execute("INSERT INTO %s (k, c, s) VALUES (?, ?, ?)", row1);
+        execute("INSERT INTO %s (k, c, s) VALUES (?, ?, ?)", row2);
+        execute("INSERT INTO %s (k, c, s) VALUES (?, ?, ?)", row3);
+        execute("INSERT INTO %s (k, c, s) VALUES (?, ?, ?)", row4);
+
+        assertRows(execute("SELECT * FROM %s WHERE s = ?", "s0"), row1, row2);
+        assertRows(execute("SELECT * FROM %s WHERE s = ?", "s1"), row3, row4);
+
+        assertRows(execute("SELECT * FROM %s WHERE s = ? AND token(k) >= token(?)", "s0", "k0"), row1, row2);
+        assertRows(execute("SELECT * FROM %s WHERE s = ? AND token(k) >= token(?)", "s1", "k1"), row3, row4);
+
+        assertEmpty(execute("SELECT * FROM %s WHERE s = ? AND token(k) < token(?)", "s0", "k0"));
+        assertEmpty(execute("SELECT * FROM %s WHERE s = ? AND token(k) < token(?)", "s1", "k1"));
+    }
+
+    @Test
     public void createIndexesOnMultipleMapDimensions() throws Throwable
     {
         Object[] row1 = row(0, 0, ImmutableMap.of("a", 10, "b", 20, "c", 30));