Author: jbellis
Date: Tue Aug 17 21:21:51 2010
New Revision: 986488

URL: http://svn.apache.org/viewvc?rev=986488&view=rev
Log:
allow compound index clauses to include non-EQ operators.  patch by jbellis; 
reviewed by eevans for CASSANDRA-1401

Modified:
    cassandra/trunk/CHANGES.txt
    cassandra/trunk/interface/cassandra.thrift
    
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Constants.java
    
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/IndexOperator.java
    cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
    cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java
    cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java

Modified: cassandra/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=986488&r1=986487&r2=986488&view=diff
==============================================================================
--- cassandra/trunk/CHANGES.txt (original)
+++ cassandra/trunk/CHANGES.txt Tue Aug 17 21:21:51 2010
@@ -12,6 +12,8 @@ dev
  * fix setting read_repair_chance from CLI addColumnFamily (CASSANDRA-1399)
  * fix updates to indexed columns (CASSANDRA-1373)
  * fix race condition leaving to FileNotFoundException (CASSANDRA-1382)
+ * fix sharded lock hash on index write path (CASSANDRA-1402)
+ * add support for GT/E, LT/E in subordinate index clauses (CASSANDRA-1401)
 
 
 0.7-beta1

Modified: cassandra/trunk/interface/cassandra.thrift
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/interface/cassandra.thrift?rev=986488&r1=986487&r2=986488&view=diff
==============================================================================
--- cassandra/trunk/interface/cassandra.thrift (original)
+++ cassandra/trunk/interface/cassandra.thrift Tue Aug 17 21:21:51 2010
@@ -46,7 +46,7 @@ namespace rb CassandraThrift
 #           for every edit that doesn't result in a change to major/minor.
 #
 # See the Semantic Versioning Specification (SemVer) http://semver.org.
-const string VERSION = "11.0.0"
+const string VERSION = "11.1.0"
 
 
 #
@@ -244,6 +244,10 @@ struct SlicePredicate {
 
 enum IndexOperator {
     EQ,
+    GTE,
+    GT,
+    LTE,
+    LT
 }
 
 struct IndexExpression {

Modified: 
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Constants.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Constants.java?rev=986488&r1=986487&r2=986488&view=diff
==============================================================================
--- 
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Constants.java
 (original)
+++ 
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Constants.java
 Tue Aug 17 21:21:51 2010
@@ -42,6 +42,6 @@ import org.slf4j.LoggerFactory;
 
 public class Constants {
 
-  public static final String VERSION = "11.0.0";
+  public static final String VERSION = "11.1.0";
 
 }

Modified: 
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/IndexOperator.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/IndexOperator.java?rev=986488&r1=986487&r2=986488&view=diff
==============================================================================
--- 
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/IndexOperator.java
 (original)
+++ 
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/IndexOperator.java
 Tue Aug 17 21:21:51 2010
@@ -32,7 +32,11 @@ import java.util.HashMap;
 import org.apache.thrift.TEnum;
 
 public enum IndexOperator implements TEnum {
-  EQ(0);
+  EQ(0),
+  GTE(1),
+  GT(2),
+  LTE(3),
+  LT(4);
 
   private final int value;
 
@@ -55,6 +59,14 @@ public enum IndexOperator implements TEn
     switch (value) {
       case 0:
         return EQ;
+      case 1:
+        return GTE;
+      case 2:
+        return GT;
+      case 3:
+        return LTE;
+      case 4:
+        return LT;
       default:
         return null;
     }

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java?rev=986488&r1=986487&r2=986488&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java Tue 
Aug 17 21:21:51 2010
@@ -60,6 +60,7 @@ import org.apache.cassandra.io.util.File
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.thrift.IndexClause;
 import org.apache.cassandra.thrift.IndexExpression;
+import org.apache.cassandra.thrift.IndexOperator;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.LatencyTracker;
 import org.apache.cassandra.utils.WrappedRunnable;
@@ -1163,7 +1164,7 @@ public class ColumnFamilyStore implement
         for (IndexExpression expression : clause.expressions)
         {
             ColumnFamilyStore cfs = 
getIndexedColumnFamilyStore(expression.column_name);
-            if (cfs == null)
+            if (cfs == null || !expression.op.equals(IndexOperator.EQ))
                 continue;
             int columns = cfs.getMeanColumns();
             if (columns < bestMeanCount)
@@ -1184,12 +1185,34 @@ public class ColumnFamilyStore implement
                 continue;
             // check column data vs expression
             IColumn column = data.getColumn(expression.column_name);
-            if (column != null && !Arrays.equals(column.value(), 
expression.value))
-                 return false;
+            if (column == null)
+                continue;
+            int v = data.getComparator().compare(column.value(), 
expression.value);
+            if (!satisfies(v, expression.op))
+                return false;
         }
         return true;
     }
 
+    private static boolean satisfies(int comparison, IndexOperator op)
+    {
+        switch (op)
+        {
+            case EQ:
+                return comparison == 0;
+            case GTE:
+                return comparison >= 0;
+            case GT:
+                return comparison > 0;
+            case LTE:
+                return comparison <= 0;
+            case LT:
+                return comparison < 0;
+            default:
+                throw new IllegalStateException();
+        }
+    }
+
     public AbstractType getComparator()
     {
         return metadata.comparator;

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java?rev=986488&r1=986487&r2=986488&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java 
Tue Aug 17 21:21:51 2010
@@ -379,9 +379,9 @@ public class ThriftValidation
         Set<byte[]> indexedColumns = 
Table.open(keyspace).getColumnFamilyStore(columnFamily).getIndexedColumns();
         for (IndexExpression expression : index_clause.expressions)
         {
-            if (indexedColumns.contains(expression.column_name))
+            if (expression.op.equals(IndexOperator.EQ) && 
indexedColumns.contains(expression.column_name))
                 return;
         }
-        throw new InvalidRequestException("No indexed columns present in index 
clause");
+        throw new InvalidRequestException("No indexed columns present in index 
clause with operator EQ");
     }
 }

Modified: 
cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java?rev=986488&r1=986487&r2=986488&view=diff
==============================================================================
--- 
cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java 
(original)
+++ 
cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java 
Tue Aug 17 21:21:51 2010
@@ -170,7 +170,7 @@ public class ColumnFamilyStoreTest exten
         rm.apply();
 
         rm = new RowMutation("Keyspace1", "k3".getBytes());
-        rm.add(new QueryPath("Indexed1", null, 
"notbirthdate".getBytes("UTF8")), FBUtilities.toByteArray(1L), new 
TimestampClock(0));
+        rm.add(new QueryPath("Indexed1", null, 
"notbirthdate".getBytes("UTF8")), FBUtilities.toByteArray(2L), new 
TimestampClock(0));
         rm.add(new QueryPath("Indexed1", null, "birthdate".getBytes("UTF8")), 
FBUtilities.toByteArray(1L), new TimestampClock(0));
         rm.apply();
         
@@ -192,6 +192,13 @@ public class ColumnFamilyStoreTest exten
         assert Arrays.equals("k3".getBytes(), rows.get(1).key.key);
         assert Arrays.equals(FBUtilities.toByteArray(1L), 
rows.get(0).cf.getColumn("birthdate".getBytes("UTF8")).value());
         assert Arrays.equals(FBUtilities.toByteArray(1L), 
rows.get(1).cf.getColumn("birthdate".getBytes("UTF8")).value());
+
+        IndexExpression expr2 = new 
IndexExpression("notbirthdate".getBytes("UTF8"), IndexOperator.GTE, 
FBUtilities.toByteArray(2L));
+        clause = new IndexClause(Arrays.asList(expr, expr2), 
ArrayUtils.EMPTY_BYTE_ARRAY, 100);
+        rows = 
Table.open("Keyspace1").getColumnFamilyStore("Indexed1").scan(clause, range, 
filter);
+
+        assert rows.size() == 1 : StringUtils.join(rows, ",");
+        assert Arrays.equals("k3".getBytes(), rows.get(0).key.key);
     }
 
     @Test


Reply via email to