Repository: cassandra
Updated Branches:
  refs/heads/cassandra-3.X 6f97804ce -> 5d48b0d38


Allow IN restrictions on column families with collections

patch by Alex Petrov; reviewed by Benjamin Lerer for CASSANDRA-12654


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

Branch: refs/heads/cassandra-3.X
Commit: 5d48b0d38d996cde1954c3c0df0f0f0a5eecfb81
Parents: 6f97804
Author: Alex Petrov <[email protected]>
Authored: Mon Dec 19 15:53:29 2016 +0100
Committer: Benjamin Lerer <[email protected]>
Committed: Mon Dec 19 15:58:48 2016 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../restrictions/StatementRestrictions.java     |  7 ---
 .../cassandra/cql3/selection/Selection.java     | 14 ------
 .../cql3/statements/ModificationStatement.java  |  2 +-
 .../cql3/statements/SelectStatement.java        |  1 -
 .../cql3/statements/UpdateStatement.java        |  2 -
 .../validation/entities/CollectionsTest.java    | 51 +++++++++++++++++---
 7 files changed, 46 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/5d48b0d3/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 1563d6b..d4da5c4 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 3.12
+ * Allow IN restrictions on column families with collections (CASSANDRA-12654)
  * Move to FastThreadLocalThread and FastThreadLocal (CASSANDRA-13034)
  * nodetool stopdaemon errors out (CASSANDRA-13030)
  * Log message size in trace message in OutboundTcpConnection (CASSANDRA-13028)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/5d48b0d3/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java 
b/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java
index 6b89579..0d5d403 100644
--- a/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java
+++ b/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java
@@ -36,7 +36,6 @@ import 
org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.index.Index;
 import org.apache.cassandra.index.SecondaryIndexManager;
 import org.apache.cassandra.net.MessagingService;
-import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.btree.BTreeSet;
 
 import static 
org.apache.cassandra.cql3.statements.RequestValidations.checkFalse;
@@ -122,7 +121,6 @@ public final class StatementRestrictions
                                  WhereClause whereClause,
                                  VariableSpecifications boundNames,
                                  boolean selectsOnlyStaticColumns,
-                                 boolean selectsComplexColumn,
                                  boolean allowFiltering,
                                  boolean forView)
     {
@@ -218,7 +216,6 @@ public final class StatementRestrictions
 
         processClusteringColumnsRestrictions(hasQueriableIndex,
                                              selectsOnlyStaticColumns,
-                                             selectsComplexColumn,
                                              forView,
                                              allowFiltering);
 
@@ -487,11 +484,9 @@ public final class StatementRestrictions
      * @param hasQueriableIndex <code>true</code> if some of the queried data 
are indexed, <code>false</code> otherwise
      * @param selectsOnlyStaticColumns <code>true</code> if the selected or 
modified columns are all statics,
      * <code>false</code> otherwise.
-     * @param selectsComplexColumn <code>true</code> if the query should 
return a collection column
      */
     private void processClusteringColumnsRestrictions(boolean 
hasQueriableIndex,
                                                       boolean 
selectsOnlyStaticColumns,
-                                                      boolean 
selectsComplexColumn,
                                                       boolean forView,
                                                       boolean allowFiltering)
     {
@@ -507,8 +502,6 @@ public final class StatementRestrictions
         }
         else
         {
-            checkFalse(clusteringColumnsRestrictions.hasIN() && 
selectsComplexColumn,
-                       "Cannot restrict clustering columns by IN relations 
when a collection is selected by the query");
             checkFalse(clusteringColumnsRestrictions.hasContains() && 
!hasQueriableIndex && !allowFiltering,
 
                        "Clustering columns can only be restricted with 
CONTAINS with a secondary index or filtering");

http://git-wip-us.apache.org/repos/asf/cassandra/blob/5d48b0d3/src/java/org/apache/cassandra/cql3/selection/Selection.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/selection/Selection.java 
b/src/java/org/apache/cassandra/cql3/selection/Selection.java
index 0d76b4e..401442f 100644
--- a/src/java/org/apache/cassandra/cql3/selection/Selection.java
+++ b/src/java/org/apache/cassandra/cql3/selection/Selection.java
@@ -116,20 +116,6 @@ public abstract class Selection
         return true;
     }
 
-    /**
-     * Checks if this selection contains a complex column.
-     *
-     * @return <code>true</code> if this selection contains a multicell 
collection or UDT, <code>false</code> otherwise.
-     */
-    public boolean containsAComplexColumn()
-    {
-        for (ColumnDefinition def : getColumns())
-            if (def.isComplex())
-                return true;
-
-        return false;
-    }
-
     public ResultSet.ResultMetadata getResultMetadata(boolean isJson)
     {
         if (!isJson)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/5d48b0d3/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
index 5f3a2b3..99395ed 100644
--- a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
@@ -887,7 +887,7 @@ public abstract class ModificationStatement implements 
CQLStatement
                 throw new 
InvalidRequestException(CUSTOM_EXPRESSIONS_NOT_ALLOWED);
 
             boolean applyOnlyToStaticColumns = 
appliesOnlyToStaticColumns(operations, conditions);
-            return new StatementRestrictions(type, cfm, where, boundNames, 
applyOnlyToStaticColumns, false, false, false);
+            return new StatementRestrictions(type, cfm, where, boundNames, 
applyOnlyToStaticColumns, false, false);
         }
 
         /**

http://git-wip-us.apache.org/repos/asf/cassandra/blob/5d48b0d3/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
index 1744e70..8e28ceb 100644
--- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
@@ -995,7 +995,6 @@ public class SelectStatement implements CQLStatement
                                              whereClause,
                                              boundNames,
                                              
selection.containsOnlyStaticColumns(),
-                                             
selection.containsAComplexColumn(),
                                              parameters.allowFiltering,
                                              forView);
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/5d48b0d3/src/java/org/apache/cassandra/cql3/statements/UpdateStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/UpdateStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/UpdateStatement.java
index 6bcfd9c..b097ded 100644
--- a/src/java/org/apache/cassandra/cql3/statements/UpdateStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/UpdateStatement.java
@@ -184,7 +184,6 @@ public class UpdateStatement extends ModificationStatement
                                                                            
boundNames,
                                                                            
applyOnlyToStaticColumns,
                                                                            
false,
-                                                                           
false,
                                                                            
false);
 
             return new UpdateStatement(type,
@@ -253,7 +252,6 @@ public class UpdateStatement extends ModificationStatement
                                                                            
boundNames,
                                                                            
applyOnlyToStaticColumns,
                                                                            
false,
-                                                                           
false,
                                                                            
false);
 
             return new UpdateStatement(type,

http://git-wip-us.apache.org/repos/asf/cassandra/blob/5d48b0d3/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java 
b/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java
index 0c59d6f..20cbe29 100644
--- 
a/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java
+++ 
b/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java
@@ -564,17 +564,54 @@ public class CollectionsTest extends CQLTester
         assertInvalid("SELECT writetime(l) FROM %s WHERE k = 0");
     }
 
-    /**
-     * Migrated from cql_tests.py:TestCQL.bug_5376()
-     */
     @Test
-    public void testInClauseWithCollections() throws Throwable
+    public void testInRestrictionWithCollection() throws Throwable
     {
-        createTable("CREATE TABLE %s (key text, c bigint, v text, x set < text 
>, PRIMARY KEY(key, c) )");
-
-        assertInvalid("select * from %s where key = 'foo' and c in (1,3,4)");
+        for (boolean frozen : new boolean[]{true, false})
+        {
+            createTable(frozen ? "CREATE TABLE %s (a int, b int, c int, d 
frozen<list<int>>, e frozen<map<int, int>>, f frozen<set<int>>, PRIMARY KEY (a, 
b, c))"
+                    : "CREATE TABLE %s (a int, b int, c int, d list<int>, e 
map<int, int>, f set<int>, PRIMARY KEY (a, b, c))");
+
+            execute("INSERT INTO %s (a, b, c, d, e, f) VALUES (1, 1, 1, [1, 
2], {1: 2}, {1, 2})");
+            execute("INSERT INTO %s (a, b, c, d, e, f) VALUES (1, 1, 2, [1, 
3], {1: 3}, {1, 3})");
+            execute("INSERT INTO %s (a, b, c, d, e, f) VALUES (1, 1, 3, [1, 
4], {1: 4}, {1, 4})");
+            execute("INSERT INTO %s (a, b, c, d, e, f) VALUES (1, 2, 3, [1, 
3], {1: 3}, {1, 3})");
+            execute("INSERT INTO %s (a, b, c, d, e, f) VALUES (1, 2, 4, [1, 
3], {1: 3}, {1, 3})");
+            execute("INSERT INTO %s (a, b, c, d, e, f) VALUES (2, 1, 1, [1, 
2], {2: 2}, {1, 2})");
+
+            beforeAndAfterFlush(() -> {
+                assertRows(execute("SELECT * FROM %s WHERE a in (1,2)"),
+                           row(1, 1, 1, list(1, 2), map(1, 2), set(1, 2)),
+                           row(1, 1, 2, list(1, 3), map(1, 3), set(1, 3)),
+                           row(1, 1, 3, list(1, 4), map(1, 4), set(1, 4)),
+                           row(1, 2, 3, list(1, 3), map(1, 3), set(1, 3)),
+                           row(1, 2, 4, list(1, 3), map(1, 3), set(1, 3)),
+                           row(2, 1, 1, list(1, 2), map(2, 2), set(1, 2)));
+
+                assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b IN 
(1,2)"),
+                           row(1, 1, 1, list(1, 2), map(1, 2), set(1, 2)),
+                           row(1, 1, 2, list(1, 3), map(1, 3), set(1, 3)),
+                           row(1, 1, 3, list(1, 4), map(1, 4), set(1, 4)),
+                           row(1, 2, 3, list(1, 3), map(1, 3), set(1, 3)),
+                           row(1, 2, 4, list(1, 3), map(1, 3), set(1, 3)));
+
+                assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 1 AND 
c in (1,2)"),
+                           row(1, 1, 1, list(1, 2), map(1, 2), set(1, 2)),
+                           row(1, 1, 2, list(1, 3), map(1, 3), set(1, 3)));
+
+                assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b IN (1, 
2) AND c in (1,2,3)"),
+                           row(1, 1, 1, list(1, 2), map(1, 2), set(1, 2)),
+                           row(1, 1, 2, list(1, 3), map(1, 3), set(1, 3)),
+                           row(1, 1, 3, list(1, 4), map(1, 4), set(1, 4)),
+                           row(1, 2, 3, list(1, 3), map(1, 3), set(1, 3)));
+
+                assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b IN (1, 
2) AND c in (1,2,3) AND d CONTAINS 4 ALLOW FILTERING"),
+                           row(1, 1, 3, list(1, 4), map(1, 4), set(1, 4)));
+            });
+        }
     }
 
+
     /**
      * Test for bug #5795,
      * migrated from cql_tests.py:TestCQL.nonpure_function_collection_test()

Reply via email to