Repository: cassandra Updated Branches: refs/heads/trunk 5fc02d4f5 -> 492507de6
Make aggregates work with reversed types patch by Carl Yeksigian; reviewed by Benjamin Lerer for CASSANDRA-10296 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/c12abfb6 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/c12abfb6 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/c12abfb6 Branch: refs/heads/trunk Commit: c12abfb697dabd249c37b578bde675c0f52d4e34 Parents: a64bcfd Author: Carl Yeksigian <c...@apache.org> Authored: Fri Sep 11 11:18:23 2015 +0200 Committer: blerer <benjamin.le...@datastax.com> Committed: Fri Sep 11 11:18:23 2015 +0200 ---------------------------------------------------------------------- .../apache/cassandra/cql3/selection/Selector.java | 4 ++++ .../apache/cassandra/db/marshal/AbstractType.java | 5 +++++ .../apache/cassandra/db/marshal/ReversedType.java | 6 ++++++ .../cassandra/cql3/validation/entities/UFTest.java | 15 +++++++++++++++ .../cql3/validation/operations/AggregationTest.java | 12 ++++++++++++ 5 files changed, 42 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/c12abfb6/src/java/org/apache/cassandra/cql3/selection/Selector.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/selection/Selector.java b/src/java/org/apache/cassandra/cql3/selection/Selector.java index d53fba1..1bddcc8 100644 --- a/src/java/org/apache/cassandra/cql3/selection/Selector.java +++ b/src/java/org/apache/cassandra/cql3/selection/Selector.java @@ -27,6 +27,7 @@ import org.apache.cassandra.cql3.ColumnSpecification; import org.apache.cassandra.cql3.functions.Function; import org.apache.cassandra.cql3.selection.Selection.ResultSetBuilder; import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.db.marshal.ReversedType; import org.apache.cassandra.exceptions.InvalidRequestException; /** @@ -180,6 +181,9 @@ public abstract class Selector implements AssignmentTestable if (getType().isFrozenCollection()) receiverType = receiverType.freeze(); + if (getType().isReversed()) + receiverType = ReversedType.getInstance(receiverType); + if (receiverType.equals(getType())) return AssignmentTestable.TestResult.EXACT_MATCH; http://git-wip-us.apache.org/repos/asf/cassandra/blob/c12abfb6/src/java/org/apache/cassandra/db/marshal/AbstractType.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/marshal/AbstractType.java b/src/java/org/apache/cassandra/db/marshal/AbstractType.java index aa25a81..ab05642 100644 --- a/src/java/org/apache/cassandra/db/marshal/AbstractType.java +++ b/src/java/org/apache/cassandra/db/marshal/AbstractType.java @@ -155,6 +155,11 @@ public abstract class AbstractType<T> implements Comparator<ByteBuffer> return isCollection() && !isMultiCell(); } + public boolean isReversed() + { + return false; + } + public static AbstractType<?> parseDefaultParameters(AbstractType<?> baseType, TypeParser parser) throws SyntaxException { Map<String, String> parameters = parser.getKeyValueParameters(); http://git-wip-us.apache.org/repos/asf/cassandra/blob/c12abfb6/src/java/org/apache/cassandra/db/marshal/ReversedType.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/marshal/ReversedType.java b/src/java/org/apache/cassandra/db/marshal/ReversedType.java index 2181f74..2aea3cd 100644 --- a/src/java/org/apache/cassandra/db/marshal/ReversedType.java +++ b/src/java/org/apache/cassandra/db/marshal/ReversedType.java @@ -129,6 +129,12 @@ public class ReversedType<T> extends AbstractType<T> } @Override + public boolean isReversed() + { + return true; + } + + @Override public String toString() { return getClass().getName() + "(" + baseType + ")"; http://git-wip-us.apache.org/repos/asf/cassandra/blob/c12abfb6/test/unit/org/apache/cassandra/cql3/validation/entities/UFTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/UFTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/UFTest.java index 2e7c2f1..673ccc3 100644 --- a/test/unit/org/apache/cassandra/cql3/validation/entities/UFTest.java +++ b/test/unit/org/apache/cassandra/cql3/validation/entities/UFTest.java @@ -429,6 +429,21 @@ public class UFTest extends CQLTester } @Test + public void testFunctionExecutionWithReversedTypeAsOutput() throws Throwable + { + createTable("CREATE TABLE %s (k int, v text, PRIMARY KEY(k, v)) WITH CLUSTERING ORDER BY (v DESC)"); + + String fRepeat = createFunction(KEYSPACE_PER_TEST, "text", + "CREATE FUNCTION %s(v text) " + + "RETURNS NULL ON NULL INPUT " + + "RETURNS text " + + "LANGUAGE java " + + "AS 'return v + v;'"); + + execute("INSERT INTO %s(k, v) VALUES (?, " + fRepeat + "(?))", 1, "a"); + } + + @Test public void testFunctionOverloading() throws Throwable { createTable("CREATE TABLE %s (k text PRIMARY KEY, v int)"); http://git-wip-us.apache.org/repos/asf/cassandra/blob/c12abfb6/test/unit/org/apache/cassandra/cql3/validation/operations/AggregationTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/AggregationTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/AggregationTest.java index b44fc71..b2ecd04 100644 --- a/test/unit/org/apache/cassandra/cql3/validation/operations/AggregationTest.java +++ b/test/unit/org/apache/cassandra/cql3/validation/operations/AggregationTest.java @@ -276,6 +276,18 @@ public class AggregationTest extends CQLTester } @Test + public void testReversedType() throws Throwable + { + createTable("CREATE TABLE %s (a int, b int, c int, primary key (a, b)) WITH CLUSTERING ORDER BY (b DESC)"); + execute("INSERT INTO %s (a, b, c) VALUES (1, 1, 10)"); + execute("INSERT INTO %s (a, b, c) VALUES (1, 2, 9)"); + execute("INSERT INTO %s (a, b, c) VALUES (1, 3, 8)"); + execute("INSERT INTO %s (a, b, c) VALUES (1, 4, 7)"); + + assertRows(execute("SELECT max(c), min(c), avg(c) FROM %s WHERE a = 1 AND b > 1"), row(9, 7, 8)); + } + + @Test public void testNestedFunctions() throws Throwable { createTable("CREATE TABLE %s (a int primary key, b timeuuid, c double, d double)");