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