Repository: cassandra
Updated Branches:
  refs/heads/trunk d4d71cd33 -> 55a45b58d


Fix queries on columns with reversed type on SASI indexes

Patch by Alex Petrov; reviewed by xedin for CASSANDRA-12223


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

Branch: refs/heads/trunk
Commit: 55a45b58d678eb919fa6b5a4c224fb43791e0234
Parents: d4d71cd
Author: Alex Petrov <oleksandr.pet...@gmail.com>
Authored: Fri Aug 5 16:01:50 2016 +0200
Committer: Pavel Yaskevich <xe...@apache.org>
Committed: Wed Aug 17 14:40:17 2016 -0700

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../cassandra/index/sasi/plan/Expression.java   | 21 ++++++--
 .../cassandra/index/sasi/SASIIndexTest.java     | 54 ++++++++++++++++++++
 3 files changed, 72 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/55a45b58/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 51b87db..d5e220c 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 3.10
+ * Fix queries on columns with reversed type on SASI indexes (CASSANDRA-12223)
  * Added slow query log (CASSANDRA-12403)
  * Count full coordinated request against timeout (CASSANDRA-12256)
  * Allow TTL with null value on insert and update (CASSANDRA-12216)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/55a45b58/src/java/org/apache/cassandra/index/sasi/plan/Expression.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/index/sasi/plan/Expression.java 
b/src/java/org/apache/cassandra/index/sasi/plan/Expression.java
index cc156ee..93f1938 100644
--- a/src/java/org/apache/cassandra/index/sasi/plan/Expression.java
+++ b/src/java/org/apache/cassandra/index/sasi/plan/Expression.java
@@ -166,17 +166,30 @@ public class Expression
                 break;
 
             case LTE:
-                upperInclusive = true;
+                if (index.getDefinition().isReversedType())
+                    lowerInclusive = true;
+                else
+                    upperInclusive = true;
             case LT:
                 operation = Op.RANGE;
-                upper = new Bound(value, upperInclusive);
+                if (index.getDefinition().isReversedType())
+                    lower = new Bound(value, lowerInclusive);
+                else
+                    upper = new Bound(value, upperInclusive);
                 break;
 
             case GTE:
-                lowerInclusive = true;
+                if (index.getDefinition().isReversedType())
+                    upperInclusive = true;
+                else
+                    lowerInclusive = true;
             case GT:
                 operation = Op.RANGE;
-                lower = new Bound(value, lowerInclusive);
+                if (index.getDefinition().isReversedType())
+                    upper = new Bound(value, upperInclusive);
+                else
+                    lower = new Bound(value, lowerInclusive);
+
                 break;
         }
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/55a45b58/test/unit/org/apache/cassandra/index/sasi/SASIIndexTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/index/sasi/SASIIndexTest.java 
b/test/unit/org/apache/cassandra/index/sasi/SASIIndexTest.java
index 47e3895..da1d0e3 100644
--- a/test/unit/org/apache/cassandra/index/sasi/SASIIndexTest.java
+++ b/test/unit/org/apache/cassandra/index/sasi/SASIIndexTest.java
@@ -2119,6 +2119,60 @@ public class SASIIndexTest
     }
 
     @Test
+    public void testConditionalsWithReversedType()
+    {
+        final String TABLE_NAME = "reversed_clustering";
+
+        QueryProcessor.executeOnceInternal(String.format("CREATE TABLE IF NOT 
EXISTS %s.%s (pk text, ck int, v int, PRIMARY KEY (pk, ck)) " +
+                                                         "WITH CLUSTERING 
ORDER BY (ck DESC);", KS_NAME, TABLE_NAME));
+        QueryProcessor.executeOnceInternal(String.format("CREATE CUSTOM INDEX 
ON %s.%s (ck) USING 'org.apache.cassandra.index.sasi.SASIIndex'", KS_NAME, 
TABLE_NAME));
+        QueryProcessor.executeOnceInternal(String.format("CREATE CUSTOM INDEX 
ON %s.%s (v) USING 'org.apache.cassandra.index.sasi.SASIIndex'", KS_NAME, 
TABLE_NAME));
+
+        QueryProcessor.executeOnceInternal(String.format("INSERT INTO %s.%s 
(pk, ck, v) VALUES ('Alex', 1, 1);", KS_NAME, TABLE_NAME));
+        QueryProcessor.executeOnceInternal(String.format("INSERT INTO %s.%s 
(pk, ck, v) VALUES ('Alex', 2, 2);", KS_NAME, TABLE_NAME));
+        QueryProcessor.executeOnceInternal(String.format("INSERT INTO %s.%s 
(pk, ck, v) VALUES ('Alex', 3, 3);", KS_NAME, TABLE_NAME));
+        QueryProcessor.executeOnceInternal(String.format("INSERT INTO %s.%s 
(pk, ck, v) VALUES ('Tom', 1, 1);", KS_NAME, TABLE_NAME));
+        QueryProcessor.executeOnceInternal(String.format("INSERT INTO %s.%s 
(pk, ck, v) VALUES ('Tom', 2, 2);", KS_NAME, TABLE_NAME));
+        QueryProcessor.executeOnceInternal(String.format("INSERT INTO %s.%s 
(pk, ck, v) VALUES ('Tom', 3, 3);", KS_NAME, TABLE_NAME));
+
+        UntypedResultSet resultSet = 
QueryProcessor.executeOnceInternal(String.format("SELECT * FROM %s.%s WHERE ck 
<= 2;", KS_NAME, TABLE_NAME));
+
+        CQLTester.assertRowsIgnoringOrder(resultSet,
+                                          CQLTester.row("Alex", 1, 1),
+                                          CQLTester.row("Alex", 2, 2),
+                                          CQLTester.row("Tom", 1, 1),
+                                          CQLTester.row("Tom", 2, 2));
+
+        resultSet = QueryProcessor.executeOnceInternal(String.format("SELECT * 
FROM %s.%s WHERE ck <= 2 AND v > 1 ALLOW FILTERING;", KS_NAME, TABLE_NAME));
+
+        CQLTester.assertRowsIgnoringOrder(resultSet,
+                                          CQLTester.row("Alex", 2, 2),
+                                          CQLTester.row("Tom", 2, 2));
+
+        resultSet = QueryProcessor.executeOnceInternal(String.format("SELECT * 
FROM %s.%s WHERE ck < 2;", KS_NAME, TABLE_NAME));
+        CQLTester.assertRowsIgnoringOrder(resultSet,
+                                          CQLTester.row("Alex", 1, 1),
+                                          CQLTester.row("Tom", 1, 1));
+
+        resultSet = QueryProcessor.executeOnceInternal(String.format("SELECT * 
FROM %s.%s WHERE ck >= 2;", KS_NAME, TABLE_NAME));
+        CQLTester.assertRowsIgnoringOrder(resultSet,
+                                          CQLTester.row("Alex", 2, 2),
+                                          CQLTester.row("Alex", 3, 3),
+                                          CQLTester.row("Tom", 2, 2),
+                                          CQLTester.row("Tom", 3, 3));
+
+        resultSet = QueryProcessor.executeOnceInternal(String.format("SELECT * 
FROM %s.%s WHERE ck >= 2 AND v < 3 ALLOW FILTERING;", KS_NAME, TABLE_NAME));
+        CQLTester.assertRowsIgnoringOrder(resultSet,
+                                          CQLTester.row("Alex", 2, 2),
+                                          CQLTester.row("Tom", 2, 2));
+
+        resultSet = QueryProcessor.executeOnceInternal(String.format("SELECT * 
FROM %s.%s WHERE ck > 2;", KS_NAME, TABLE_NAME));
+        CQLTester.assertRowsIgnoringOrder(resultSet,
+                                          CQLTester.row("Alex", 3, 3),
+                                          CQLTester.row("Tom", 3, 3));
+    }
+
+    @Test
     public void testIndexMemtableSwitching()
     {
         // write some data but don't flush

Reply via email to