/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.cassandra.cql3; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.db.ConsistencyLevel; import org.apache.cassandra.gms.Gossiper; import org.apache.cassandra.service.ClientState; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Iterator; import static org.apache.cassandra.cql3.QueryProcessor.process; import static org.apache.cassandra.cql3.QueryProcessor.processInternal; import static org.junit.Assert.assertEquals; public class SelectionOrderingTest { private static final Logger logger = LoggerFactory.getLogger(SelectWithTokenFunctionTest.class); static ClientState clientState; static String keyspace = "select_with_ordering_test"; @BeforeClass public static void setUpClass() throws Throwable { SchemaLoader.loadSchema(); executeSchemaChange("CREATE KEYSPACE IF NOT EXISTS %s WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}"); executeSchemaChange("CREATE TABLE IF NOT EXISTS %s.single_clustering (a int, b int, c int, PRIMARY KEY (a, b))"); executeSchemaChange("CREATE TABLE IF NOT EXISTS %s.single_clustering_desc (a int, b int, c int, PRIMARY KEY (a, b)) WITH CLUSTERING ORDER BY (b DESC)"); executeSchemaChange("CREATE TABLE IF NOT EXISTS %s.multiple_clustering (a int, b int, c int, d int, PRIMARY KEY (a, b, c))"); clientState = ClientState.forInternalCalls(); } @AfterClass public static void stopGossiper() { Gossiper.instance.stop(); } private static void executeSchemaChange(String query) throws Throwable { try { process(String.format(query, keyspace), ConsistencyLevel.ONE); } catch (RuntimeException exc) { throw exc.getCause(); } } private static UntypedResultSet execute(String query) throws Throwable { try { return processInternal(String.format(query, keyspace)); } catch (RuntimeException exc) { if (exc.getCause() != null) throw exc.getCause(); throw exc; } } @Test public void testNormalSelectionOrderSingleClustering() throws Throwable { for (String descOption : new String[]{"", "_desc"}) { execute("INSERT INTO %s.single_clustering" + descOption + " (a, b, c) VALUES (0, 0, 0)"); execute("INSERT INTO %s.single_clustering" + descOption + " (a, b, c) VALUES (0, 1, 1)"); execute("INSERT INTO %s.single_clustering" + descOption + " (a, b, c) VALUES (0, 2, 2)"); try { UntypedResultSet results = execute("SELECT * FROM %s.single_clustering" + descOption + " WHERE a=0 ORDER BY b ASC"); assertEquals(3, results.size()); Iterator<UntypedResultSet.Row> rows = results.iterator(); for (int i = 0; i < 3; i++) assertEquals(i, rows.next().getInt("b")); results = execute("SELECT * FROM %s.single_clustering" + descOption + " WHERE a=0 ORDER BY b DESC"); assertEquals(3, results.size()); rows = results.iterator(); for (int i = 2; i >= 0; i--) assertEquals(i, rows.next().getInt("b")); // order by the only column in the selection results = execute("SELECT b FROM %s.single_clustering" + descOption + " WHERE a=0 ORDER BY b ASC"); assertEquals(3, results.size()); rows = results.iterator(); for (int i = 0; i < 3; i++) assertEquals(i, rows.next().getInt("b")); results = execute("SELECT b FROM %s.single_clustering" + descOption + " WHERE a=0 ORDER BY b DESC"); assertEquals(3, results.size()); rows = results.iterator(); for (int i = 2; i >= 0; i--) assertEquals(i, rows.next().getInt("b")); // order by a column not in the selection results = execute("SELECT c FROM %s.single_clustering" + descOption + " WHERE a=0 ORDER BY b ASC"); assertEquals(3, results.size()); rows = results.iterator(); for (int i = 0; i < 3; i++) assertEquals(i, rows.next().getInt("c")); results = execute("SELECT c FROM %s.single_clustering" + descOption + " WHERE a=0 ORDER BY b DESC"); assertEquals(3, results.size()); rows = results.iterator(); for (int i = 2; i >= 0; i--) assertEquals(i, rows.next().getInt("c")); } finally { execute("DELETE FROM %s.single_clustering" + descOption + " WHERE a = 0"); } } } @Test public void testFunctionSelectionOrderSingleClustering() throws Throwable { for (String descOption : new String[]{"", "_desc"}) { execute("INSERT INTO %s.single_clustering" + descOption + " (a, b, c) VALUES (0, 0, 0)"); execute("INSERT INTO %s.single_clustering" + descOption + " (a, b, c) VALUES (0, 1, 1)"); execute("INSERT INTO %s.single_clustering" + descOption + " (a, b, c) VALUES (0, 2, 2)"); try { // order by a column in the selection (wrapped in a function) UntypedResultSet results = execute("SELECT blobAsInt(intAsBlob(b)) as col FROM %s.single_clustering" + descOption + " WHERE a=0 ORDER BY b ASC"); assertEquals(3, results.size()); Iterator<UntypedResultSet.Row> rows = results.iterator(); for (int i = 0; i < 3; i++) assertEquals(i, rows.next().getInt("col")); results = execute("SELECT blobAsInt(intAsBlob(b)) as col FROM %s.single_clustering" + descOption + " WHERE a=0 ORDER BY b DESC"); assertEquals(3, results.size()); rows = results.iterator(); for (int i = 2; i >= 0; i--) assertEquals(i, rows.next().getInt("col")); // order by a column in the selection, plus the column wrapped in a function results = execute("SELECT b, blobAsInt(intAsBlob(b)) as col FROM %s.single_clustering" + descOption + " WHERE a=0 ORDER BY b ASC"); assertEquals(3, results.size()); rows = results.iterator(); for (int i = 0; i < 3; i++) { UntypedResultSet.Row row = rows.next(); assertEquals(i, row.getInt("b")); assertEquals(i, row.getInt("col")); } results = execute("SELECT b, blobAsInt(intAsBlob(b)) as col FROM %s.single_clustering" + descOption + " WHERE a=0 ORDER BY b DESC"); assertEquals(3, results.size()); rows = results.iterator(); for (int i = 2; i >= 0; i--) { UntypedResultSet.Row row = rows.next(); assertEquals(i, row.getInt("b")); assertEquals(i, row.getInt("col")); } // order by a column not in the selection (wrapped in a function) results = execute("SELECT blobAsInt(intAsBlob(c)) as col FROM %s.single_clustering" + descOption + " WHERE a=0 ORDER BY b ASC"); assertEquals(3, results.size()); rows = results.iterator(); for (int i = 0; i < 3; i++) assertEquals(i, rows.next().getInt("col")); results = execute("SELECT blobAsInt(intAsBlob(c)) as col FROM %s.single_clustering" + descOption + " WHERE a=0 ORDER BY b DESC"); assertEquals(3, results.size()); rows = results.iterator(); for (int i = 2; i >= 0; i--) assertEquals(i, rows.next().getInt("col")); } finally { execute("DELETE FROM %s.single_clustering" + descOption + " WHERE a = 0"); } } } @Test public void testNormalSelectionOrderMultipleClustering() throws Throwable { execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 0, 0)"); execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 1, 1)"); execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 2, 2)"); execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 1, 0, 3)"); execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 1, 1, 4)"); execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 1, 2, 5)"); try { UntypedResultSet results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 ORDER BY b ASC"); assertEquals(6, results.size()); Iterator<UntypedResultSet.Row> rows = results.iterator(); assertEquals(0, rows.next().getInt("d")); assertEquals(1, rows.next().getInt("d")); assertEquals(2, rows.next().getInt("d")); assertEquals(3, rows.next().getInt("d")); assertEquals(4, rows.next().getInt("d")); assertEquals(5, rows.next().getInt("d")); results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 ORDER BY b DESC"); assertEquals(6, results.size()); rows = results.iterator(); assertEquals(5, rows.next().getInt("d")); assertEquals(4, rows.next().getInt("d")); assertEquals(3, rows.next().getInt("d")); assertEquals(2, rows.next().getInt("d")); assertEquals(1, rows.next().getInt("d")); assertEquals(0, rows.next().getInt("d")); results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 ORDER BY b DESC, c DESC"); assertEquals(6, results.size()); rows = results.iterator(); assertEquals(5, rows.next().getInt("d")); assertEquals(4, rows.next().getInt("d")); assertEquals(3, rows.next().getInt("d")); assertEquals(2, rows.next().getInt("d")); assertEquals(1, rows.next().getInt("d")); assertEquals(0, rows.next().getInt("d")); // select and order by b results = execute("SELECT b FROM %s.multiple_clustering WHERE a=0 ORDER BY b ASC"); assertEquals(6, results.size()); rows = results.iterator(); assertEquals(0, rows.next().getInt("b")); assertEquals(0, rows.next().getInt("b")); assertEquals(0, rows.next().getInt("b")); assertEquals(1, rows.next().getInt("b")); assertEquals(1, rows.next().getInt("b")); assertEquals(1, rows.next().getInt("b")); results = execute("SELECT b FROM %s.multiple_clustering WHERE a=0 ORDER BY b DESC"); assertEquals(6, results.size()); rows = results.iterator(); assertEquals(1, rows.next().getInt("b")); assertEquals(1, rows.next().getInt("b")); assertEquals(1, rows.next().getInt("b")); assertEquals(0, rows.next().getInt("b")); assertEquals(0, rows.next().getInt("b")); assertEquals(0, rows.next().getInt("b")); // select c, order by b results = execute("SELECT c FROM %s.multiple_clustering WHERE a=0 ORDER BY b ASC"); rows = results.iterator(); assertEquals(0, rows.next().getInt("c")); assertEquals(1, rows.next().getInt("c")); assertEquals(2, rows.next().getInt("c")); assertEquals(0, rows.next().getInt("c")); assertEquals(1, rows.next().getInt("c")); assertEquals(2, rows.next().getInt("c")); results = execute("SELECT c FROM %s.multiple_clustering WHERE a=0 ORDER BY b DESC"); assertEquals(6, results.size()); rows = results.iterator(); assertEquals(2, rows.next().getInt("c")); assertEquals(1, rows.next().getInt("c")); assertEquals(0, rows.next().getInt("c")); assertEquals(2, rows.next().getInt("c")); assertEquals(1, rows.next().getInt("c")); assertEquals(0, rows.next().getInt("c")); // select c, order by b, c results = execute("SELECT c FROM %s.multiple_clustering WHERE a=0 ORDER BY b ASC, c ASC"); rows = results.iterator(); assertEquals(0, rows.next().getInt("c")); assertEquals(1, rows.next().getInt("c")); assertEquals(2, rows.next().getInt("c")); assertEquals(0, rows.next().getInt("c")); assertEquals(1, rows.next().getInt("c")); assertEquals(2, rows.next().getInt("c")); results = execute("SELECT c FROM %s.multiple_clustering WHERE a=0 ORDER BY b DESC, c DESC"); assertEquals(6, results.size()); rows = results.iterator(); assertEquals(2, rows.next().getInt("c")); assertEquals(1, rows.next().getInt("c")); assertEquals(0, rows.next().getInt("c")); assertEquals(2, rows.next().getInt("c")); assertEquals(1, rows.next().getInt("c")); assertEquals(0, rows.next().getInt("c")); // select d, order by b, c results = execute("SELECT d FROM %s.multiple_clustering WHERE a=0 ORDER BY b ASC, c ASC"); rows = results.iterator(); assertEquals(0, rows.next().getInt("d")); assertEquals(1, rows.next().getInt("d")); assertEquals(2, rows.next().getInt("d")); assertEquals(3, rows.next().getInt("d")); assertEquals(4, rows.next().getInt("d")); assertEquals(5, rows.next().getInt("d")); results = execute("SELECT d FROM %s.multiple_clustering WHERE a=0 ORDER BY b DESC, c DESC"); assertEquals(6, results.size()); rows = results.iterator(); assertEquals(5, rows.next().getInt("d")); assertEquals(4, rows.next().getInt("d")); assertEquals(3, rows.next().getInt("d")); assertEquals(2, rows.next().getInt("d")); assertEquals(1, rows.next().getInt("d")); assertEquals(0, rows.next().getInt("d")); } finally { execute("DELETE FROM %s.multiple_clustering WHERE a = 0"); } } @Test public void testFunctionSelectionOrderMultipleClustering() throws Throwable { execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 0, 0)"); execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 1, 1)"); execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 2, 2)"); execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 1, 0, 3)"); execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 1, 1, 4)"); execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 1, 2, 5)"); try { // select function of b, order by b UntypedResultSet results = execute("SELECT blobAsInt(intAsBlob(b)) as col FROM %s.multiple_clustering WHERE a=0 ORDER BY b ASC"); assertEquals(6, results.size()); Iterator<UntypedResultSet.Row> rows = results.iterator(); assertEquals(0, rows.next().getInt("col")); assertEquals(0, rows.next().getInt("col")); assertEquals(0, rows.next().getInt("col")); assertEquals(1, rows.next().getInt("col")); assertEquals(1, rows.next().getInt("col")); assertEquals(1, rows.next().getInt("col")); results = execute("SELECT blobAsInt(intAsBlob(b)) as col FROM %s.multiple_clustering WHERE a=0 ORDER BY b DESC"); assertEquals(6, results.size()); rows = results.iterator(); assertEquals(1, rows.next().getInt("col")); assertEquals(1, rows.next().getInt("col")); assertEquals(1, rows.next().getInt("col")); assertEquals(0, rows.next().getInt("col")); assertEquals(0, rows.next().getInt("col")); assertEquals(0, rows.next().getInt("col")); // select b and function of b, order by b results = execute("SELECT b, blobAsInt(intAsBlob(b)) as col FROM %s.multiple_clustering WHERE a=0 ORDER BY b ASC"); assertEquals(6, results.size()); rows = results.iterator(); assertEquals(0, rows.next().getInt("col")); assertEquals(0, rows.next().getInt("col")); assertEquals(0, rows.next().getInt("col")); assertEquals(1, rows.next().getInt("col")); assertEquals(1, rows.next().getInt("col")); assertEquals(1, rows.next().getInt("col")); results = execute("SELECT b, blobAsInt(intAsBlob(b)) as col FROM %s.multiple_clustering WHERE a=0 ORDER BY b DESC"); assertEquals(6, results.size()); rows = results.iterator(); assertEquals(1, rows.next().getInt("col")); assertEquals(1, rows.next().getInt("col")); assertEquals(1, rows.next().getInt("col")); assertEquals(0, rows.next().getInt("col")); assertEquals(0, rows.next().getInt("col")); assertEquals(0, rows.next().getInt("col")); // select c, order by b results = execute("SELECT blobAsInt(intAsBlob(c)) as col FROM %s.multiple_clustering WHERE a=0 ORDER BY b ASC"); rows = results.iterator(); assertEquals(0, rows.next().getInt("col")); assertEquals(1, rows.next().getInt("col")); assertEquals(2, rows.next().getInt("col")); assertEquals(0, rows.next().getInt("col")); assertEquals(1, rows.next().getInt("col")); assertEquals(2, rows.next().getInt("col")); results = execute("SELECT blobAsInt(intAsBlob(c)) as col FROM %s.multiple_clustering WHERE a=0 ORDER BY b DESC"); assertEquals(6, results.size()); rows = results.iterator(); assertEquals(2, rows.next().getInt("col")); assertEquals(1, rows.next().getInt("col")); assertEquals(0, rows.next().getInt("col")); assertEquals(2, rows.next().getInt("col")); assertEquals(1, rows.next().getInt("col")); assertEquals(0, rows.next().getInt("col")); // select c, order by b, c results = execute("SELECT blobAsInt(intAsBlob(c)) as col FROM %s.multiple_clustering WHERE a=0 ORDER BY b ASC, c ASC"); rows = results.iterator(); assertEquals(0, rows.next().getInt("col")); assertEquals(1, rows.next().getInt("col")); assertEquals(2, rows.next().getInt("col")); assertEquals(0, rows.next().getInt("col")); assertEquals(1, rows.next().getInt("col")); assertEquals(2, rows.next().getInt("col")); results = execute("SELECT blobAsInt(intAsBlob(c)) as col FROM %s.multiple_clustering WHERE a=0 ORDER BY b DESC, c DESC"); assertEquals(6, results.size()); rows = results.iterator(); assertEquals(2, rows.next().getInt("col")); assertEquals(1, rows.next().getInt("col")); assertEquals(0, rows.next().getInt("col")); assertEquals(2, rows.next().getInt("col")); assertEquals(1, rows.next().getInt("col")); assertEquals(0, rows.next().getInt("col")); // select d, order by b, c results = execute("SELECT blobAsInt(intAsBlob(d)) as col FROM %s.multiple_clustering WHERE a=0 ORDER BY b ASC, c ASC"); rows = results.iterator(); assertEquals(0, rows.next().getInt("col")); assertEquals(1, rows.next().getInt("col")); assertEquals(2, rows.next().getInt("col")); assertEquals(3, rows.next().getInt("col")); assertEquals(4, rows.next().getInt("col")); assertEquals(5, rows.next().getInt("col")); results = execute("SELECT blobAsInt(intAsBlob(d)) as col FROM %s.multiple_clustering WHERE a=0 ORDER BY b DESC, c DESC"); assertEquals(6, results.size()); rows = results.iterator(); assertEquals(5, rows.next().getInt("col")); assertEquals(4, rows.next().getInt("col")); assertEquals(3, rows.next().getInt("col")); assertEquals(2, rows.next().getInt("col")); assertEquals(1, rows.next().getInt("col")); assertEquals(0, rows.next().getInt("col")); } finally { execute("DELETE FROM %s.multiple_clustering WHERE a = 0"); } } }