Repository: cassandra Updated Branches: refs/heads/cassandra-3.0 45c04b727 -> 2fcfc7c58
Fix for Row deletion bug in Materialized Views patch by carl; reviewed by tjake for CASSANDRA-10014 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/2fcfc7c5 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/2fcfc7c5 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/2fcfc7c5 Branch: refs/heads/cassandra-3.0 Commit: 2fcfc7c58aafb59b51580a7fdef5f849f38dc637 Parents: 45c04b7 Author: Carl Yeksigian <c...@apache.org> Authored: Fri Aug 7 14:32:20 2015 -0400 Committer: T Jake Luciani <j...@apache.org> Committed: Mon Aug 10 11:23:16 2015 -0400 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../cassandra/db/view/MaterializedView.java | 7 +++- .../cassandra/cql3/MaterializedViewTest.java | 43 ++++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/2fcfc7c5/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 639dd59..c7d466a 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0.0-beta1 + * Fix row deletion bug for Materialized Views (CASSANDRA-10014) * Support mixed-version clusters with Cassandra 2.1 and 2.2 (CASSANDRA-9704) * Fix multiple slices on RowSearchers (CASSANDRA-10002) * Fix bug in merging of collections (CASSANDRA-10001) http://git-wip-us.apache.org/repos/asf/cassandra/blob/2fcfc7c5/src/java/org/apache/cassandra/db/view/MaterializedView.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/view/MaterializedView.java b/src/java/org/apache/cassandra/db/view/MaterializedView.java index 06c4dc2..c953d5f 100644 --- a/src/java/org/apache/cassandra/db/view/MaterializedView.java +++ b/src/java/org/apache/cassandra/db/view/MaterializedView.java @@ -216,9 +216,14 @@ public class MaterializedView if (!partition.deletionInfo().isLive()) return true; - // Check whether the update touches any of the columns included in the view + // Check each row for deletion or update for (Row row : partition) { + if (row.hasComplexDeletion()) + return true; + if (!row.deletion().isLive()) + return true; + for (ColumnData data : row) { if (getViewCfs().metadata.getColumnDefinition(data.column().name) != null) http://git-wip-us.apache.org/repos/asf/cassandra/blob/2fcfc7c5/test/unit/org/apache/cassandra/cql3/MaterializedViewTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/MaterializedViewTest.java b/test/unit/org/apache/cassandra/cql3/MaterializedViewTest.java index 78c40e2..faff229 100644 --- a/test/unit/org/apache/cassandra/cql3/MaterializedViewTest.java +++ b/test/unit/org/apache/cassandra/cql3/MaterializedViewTest.java @@ -90,6 +90,49 @@ public class MaterializedViewTest extends CQLTester } } + @Test + public void testPartitionTombstone() throws Throwable + { + createTable("CREATE TABLE %s (k1 int, c1 int , val int, PRIMARY KEY (k1))"); + + execute("USE " + keyspace()); + executeNet(protocolVersion, "USE " + keyspace()); + + createView("view1", "CREATE MATERIALIZED VIEW view1 AS SELECT k1 FROM %%s WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL PRIMARY KEY (val, k1, c1)"); + + updateMV("INSERT INTO %s (k1, c1, val) VALUES (1, 2, 200)"); + updateMV("INSERT INTO %s (k1, c1, val) VALUES (1, 3, 300)"); + + Assert.assertEquals(1, execute("select * from %s").size()); + Assert.assertEquals(1, execute("select * from view1").size()); + + updateMV("DELETE FROM %s WHERE k1 = 1"); + + Assert.assertEquals(0, execute("select * from %s").size()); + Assert.assertEquals(0, execute("select * from view1").size()); + } + + @Test + public void testClusteringKeyTombstone() throws Throwable + { + createTable("CREATE TABLE %s (k1 int, c1 int , val int, PRIMARY KEY (k1, c1))"); + + execute("USE " + keyspace()); + executeNet(protocolVersion, "USE " + keyspace()); + + createView("view1", "CREATE MATERIALIZED VIEW view1 AS SELECT k1 FROM %%s WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL PRIMARY KEY (val, k1, c1)"); + + updateMV("INSERT INTO %s (k1, c1, val) VALUES (1, 2, 200)"); + updateMV("INSERT INTO %s (k1, c1, val) VALUES (1, 3, 300)"); + + Assert.assertEquals(2, execute("select * from %s").size()); + Assert.assertEquals(2, execute("select * from view1").size()); + + updateMV("DELETE FROM %s WHERE k1 = 1 and c1 = 3"); + + Assert.assertEquals(1, execute("select * from %s").size()); + Assert.assertEquals(1, execute("select * from view1").size()); + } @Test public void testAccessAndSchema() throws Throwable