Skip to content

Commit b4f1dfb

Browse files
adelapenadjatnieks
authored andcommitted
CNDB-15239: Add ALLOW FILTERING to AbstractReadQuery#toCQLString (#1974)
This makes the output of toCQLString a bit more distracting because AF is not always needed, but it aligns with ASF and it guarantees that the output of that method is always runnable.
1 parent 0ced680 commit b4f1dfb

File tree

5 files changed

+83
-102
lines changed

5 files changed

+83
-102
lines changed

src/java/org/apache/cassandra/db/AbstractReadQuery.java

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,19 @@
1717
*/
1818
package org.apache.cassandra.db;
1919

20+
import java.util.Set;
21+
2022
import org.apache.cassandra.cql3.ColumnIdentifier;
2123
import org.apache.cassandra.cql3.CqlBuilder;
2224
import org.apache.cassandra.cql3.statements.SelectOptions;
23-
import org.apache.cassandra.db.filter.ANNOptions;
2425
import org.apache.cassandra.db.filter.ColumnFilter;
2526
import org.apache.cassandra.db.filter.DataLimits;
27+
import org.apache.cassandra.db.filter.IndexHints;
2628
import org.apache.cassandra.db.filter.RowFilter;
2729
import org.apache.cassandra.db.monitoring.MonitorableImpl;
2830
import org.apache.cassandra.db.partitions.PartitionIterator;
2931
import org.apache.cassandra.db.partitions.UnfilteredPartitionIterators;
32+
import org.apache.cassandra.schema.IndexMetadata;
3033
import org.apache.cassandra.schema.TableMetadata;
3134

3235
/**
@@ -103,20 +106,28 @@ public ColumnFilter columnFilter()
103106
*/
104107
public String toCQLString()
105108
{
106-
CqlBuilder builder = new CqlBuilder().append("SELECT ")
107-
.append(columnFilter().toCQLString())
108-
.append(" FROM ")
109-
.append(ColumnIdentifier.maybeQuote(metadata().keyspace))
110-
.append('.')
111-
.append(ColumnIdentifier.maybeQuote(metadata().name));
109+
CqlBuilder builder = new CqlBuilder();
110+
builder.append("SELECT ").append(columnFilter().toCQLString());
111+
builder.append(" FROM ").append(ColumnIdentifier.maybeQuote(metadata().keyspace))
112+
.append('.')
113+
.append(ColumnIdentifier.maybeQuote(metadata().name));
114+
112115
appendCQLWhereClause(builder);
113116

114117
if (limits() != DataLimits.NONE)
115118
builder.append(' ').append(limits());
116119

117-
ANNOptions annOptions = rowFilter().annOptions();
118-
if (annOptions != ANNOptions.NONE)
119-
builder.append(" WITH ").append(SelectOptions.ANN_OPTIONS).append(" = ").append(annOptions.toCQLString());
120+
// ALLOW FILTERING might not be strictly necessary
121+
builder.append(" ALLOW FILTERING");
122+
123+
builder.appendOptions(b -> {
124+
IndexHints indexHints = rowFilter().indexHints;
125+
Set<String> included = IndexMetadata.toNames(indexHints.included);
126+
Set<String> excluded = IndexMetadata.toNames(indexHints.excluded);
127+
b.append(SelectOptions.INCLUDED_INDEXES, included)
128+
.append(SelectOptions.EXCLUDED_INDEXES, excluded)
129+
.append(SelectOptions.ANN_OPTIONS, rowFilter().annOptions().toCQLString());
130+
});
120131

121132
return builder.toString();
122133
}

src/java/org/apache/cassandra/db/ReadCommand.java

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import java.io.IOException;
2121
import java.util.ArrayList;
2222
import java.util.Collections;
23-
import java.util.HashSet;
2423
import java.util.List;
2524
import java.util.Objects;
2625
import java.util.Set;
@@ -42,9 +41,7 @@
4241

4342
import io.netty.util.concurrent.FastThreadLocal;
4443
import org.apache.cassandra.config.*;
45-
import org.apache.cassandra.cql3.ColumnIdentifier;
4644
import org.apache.cassandra.cql3.CqlBuilder;
47-
import org.apache.cassandra.cql3.statements.SelectOptions;
4845
import org.apache.cassandra.db.filter.*;
4946
import org.apache.cassandra.db.transform.BasePartitions;
5047
import org.apache.cassandra.db.transform.BaseRows;
@@ -60,7 +57,6 @@
6057
import org.apache.cassandra.db.filter.ClusteringIndexFilter;
6158
import org.apache.cassandra.db.filter.ColumnFilter;
6259
import org.apache.cassandra.db.filter.DataLimits;
63-
import org.apache.cassandra.db.filter.IndexHints;
6460
import org.apache.cassandra.db.filter.RowFilter;
6561
import org.apache.cassandra.db.filter.TombstoneOverwhelmingException;
6662
import org.apache.cassandra.db.partitions.PartitionIterator;
@@ -1011,42 +1007,6 @@ protected LongPredicate getPurgeEvaluator()
10111007
*/
10121008
public abstract String loggableTokens();
10131009

1014-
@Override
1015-
public String toCQLString()
1016-
{
1017-
CqlBuilder builder = new CqlBuilder();
1018-
builder.append("SELECT ").append(columnFilter().toCQLString());
1019-
builder.append(" FROM ").append(ColumnIdentifier.maybeQuote(metadata().keyspace)).append('.').append(ColumnIdentifier.maybeQuote(metadata().name));
1020-
appendCQLWhereClause(builder);
1021-
1022-
if (limits() != DataLimits.NONE)
1023-
builder.append(' ').append(limits());
1024-
1025-
builder.appendOptions(b -> {
1026-
1027-
IndexHints indexHints = rowFilter().indexHints;
1028-
Set<String> included = new HashSet<>();
1029-
for (IndexMetadata i : indexHints.included)
1030-
included.add(i.name);
1031-
Set<String> excluded = new HashSet<>();
1032-
for (IndexMetadata i : indexHints.excluded)
1033-
excluded.add(i.name);
1034-
1035-
b.append(SelectOptions.INCLUDED_INDEXES, included)
1036-
.append(SelectOptions.EXCLUDED_INDEXES, excluded)
1037-
.append(SelectOptions.ANN_OPTIONS, rowFilter().annOptions().toCQLString());
1038-
});
1039-
1040-
builder.append(" ALLOW FILTERING");
1041-
return builder.toString();
1042-
}
1043-
1044-
// Monitorable interface
1045-
public String name()
1046-
{
1047-
return toCQLString();
1048-
}
1049-
10501010
InputCollector<UnfilteredRowIterator> iteratorsForPartition(ColumnFamilyStore.ViewFragment view, ReadExecutionController controller)
10511011
{
10521012
final BiFunction<List<UnfilteredRowIterator>, RepairedDataInfo, UnfilteredRowIterator> merge =

src/java/org/apache/cassandra/schema/IndexMetadata.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@
2121
import java.io.IOException;
2222
import java.lang.reflect.InvocationTargetException;
2323
import java.util.HashMap;
24+
import java.util.HashSet;
2425
import java.util.List;
2526
import java.util.Map;
27+
import java.util.Set;
2628
import java.util.TreeSet;
2729
import java.util.UUID;
2830
import java.util.concurrent.ConcurrentHashMap;
@@ -295,6 +297,14 @@ public static String joinNames(Iterable<IndexMetadata> metadata)
295297
return String.join(",", sortedNames);
296298
}
297299

300+
public static Set<String> toNames(Set<IndexMetadata> indexes)
301+
{
302+
Set<String> included = new HashSet<>(indexes.size());
303+
for (IndexMetadata i : indexes)
304+
included.add(i.name);
305+
return included;
306+
}
307+
298308
@Override
299309
public String toString()
300310
{

test/unit/org/apache/cassandra/db/PartitionRangeReadCommandCQLTest.java

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -29,64 +29,64 @@ public void testToCQLString()
2929
{
3030
createTable("CREATE TABLE %s (k int, c int, v int, PRIMARY KEY (k, c))");
3131

32-
assertToCQLString("SELECT * FROM %s", "SELECT * FROM %s");
32+
assertToCQLString("SELECT * FROM %s", "SELECT * FROM %s ALLOW FILTERING");
3333

34-
assertToCQLString("SELECT * FROM %s WHERE c = 0 ALLOW FILTERING", "SELECT * FROM %s WHERE c = 0");
35-
assertToCQLString("SELECT * FROM %s WHERE (c) = (0) ALLOW FILTERING", "SELECT * FROM %s WHERE c = 0");
36-
assertToCQLString("SELECT * FROM %s WHERE c > 0 ALLOW FILTERING", "SELECT * FROM %s WHERE c > 0");
37-
assertToCQLString("SELECT * FROM %s WHERE c < 0 ALLOW FILTERING", "SELECT * FROM %s WHERE c < 0");
38-
assertToCQLString("SELECT * FROM %s WHERE c >= 0 ALLOW FILTERING", "SELECT * FROM %s WHERE c >= 0");
39-
assertToCQLString("SELECT * FROM %s WHERE c <= 0 ALLOW FILTERING", "SELECT * FROM %s WHERE c <= 0");
34+
assertToCQLString("SELECT * FROM %s WHERE c = 0 ALLOW FILTERING", "SELECT * FROM %s WHERE c = 0 ALLOW FILTERING");
35+
assertToCQLString("SELECT * FROM %s WHERE (c) = (0) ALLOW FILTERING", "SELECT * FROM %s WHERE c = 0 ALLOW FILTERING");
36+
assertToCQLString("SELECT * FROM %s WHERE c > 0 ALLOW FILTERING", "SELECT * FROM %s WHERE c > 0 ALLOW FILTERING");
37+
assertToCQLString("SELECT * FROM %s WHERE c < 0 ALLOW FILTERING", "SELECT * FROM %s WHERE c < 0 ALLOW FILTERING");
38+
assertToCQLString("SELECT * FROM %s WHERE c >= 0 ALLOW FILTERING", "SELECT * FROM %s WHERE c >= 0 ALLOW FILTERING");
39+
assertToCQLString("SELECT * FROM %s WHERE c <= 0 ALLOW FILTERING", "SELECT * FROM %s WHERE c <= 0 ALLOW FILTERING");
4040

41-
assertToCQLString("SELECT * FROM %s WHERE v = 1 ALLOW FILTERING", "SELECT * FROM %s WHERE v = 1");
42-
assertToCQLString("SELECT * FROM %s WHERE c = 0 AND v = 1 ALLOW FILTERING", "SELECT * FROM %s WHERE v = 1 AND c = 0");
43-
assertToCQLString("SELECT * FROM %s WHERE c > 0 AND v = 1 ALLOW FILTERING", "SELECT * FROM %s WHERE v = 1 AND c > 0");
44-
assertToCQLString("SELECT * FROM %s WHERE c < 0 AND v = 1 ALLOW FILTERING", "SELECT * FROM %s WHERE v = 1 AND c < 0");
45-
assertToCQLString("SELECT * FROM %s WHERE c >= 0 AND v = 1 ALLOW FILTERING", "SELECT * FROM %s WHERE v = 1 AND c >= 0");
46-
assertToCQLString("SELECT * FROM %s WHERE c <= 0 AND v = 1 ALLOW FILTERING", "SELECT * FROM %s WHERE v = 1 AND c <= 0");
41+
assertToCQLString("SELECT * FROM %s WHERE v = 1 ALLOW FILTERING", "SELECT * FROM %s WHERE v = 1 ALLOW FILTERING");
42+
assertToCQLString("SELECT * FROM %s WHERE c = 0 AND v = 1 ALLOW FILTERING", "SELECT * FROM %s WHERE c = 0 AND v = 1 ALLOW FILTERING");
43+
assertToCQLString("SELECT * FROM %s WHERE c > 0 AND v = 1 ALLOW FILTERING", "SELECT * FROM %s WHERE c > 0 AND v = 1 ALLOW FILTERING");
44+
assertToCQLString("SELECT * FROM %s WHERE c < 0 AND v = 1 ALLOW FILTERING", "SELECT * FROM %s WHERE c < 0 AND v = 1 ALLOW FILTERING");
45+
assertToCQLString("SELECT * FROM %s WHERE c >= 0 AND v = 1 ALLOW FILTERING", "SELECT * FROM %s WHERE c >= 0 AND v = 1 ALLOW FILTERING");
46+
assertToCQLString("SELECT * FROM %s WHERE c <= 0 AND v = 1 ALLOW FILTERING", "SELECT * FROM %s WHERE c <= 0 AND v = 1 ALLOW FILTERING");
4747

4848
// test with token restrictions
4949
IPartitioner partitioner = DatabaseDescriptor.getPartitioner();
5050
String token = partitioner.getToken(Int32Type.instance.decompose(0)).toString();
5151
assertToCQLString("SELECT * FROM %s WHERE token(k) > token(0)",
52-
"SELECT * FROM %s WHERE token(k) > " + token);
52+
"SELECT * FROM %s WHERE token(k) > " + token + " ALLOW FILTERING");
5353
assertToCQLString("SELECT * FROM %s WHERE token(k) >= token(0)",
54-
"SELECT * FROM %s WHERE token(k) >= " + token);
54+
"SELECT * FROM %s WHERE token(k) >= " + token + " ALLOW FILTERING");
5555
assertToCQLString("SELECT * FROM %s WHERE token(k) >= token(0) AND token(k) <= token(0)",
56-
"SELECT * FROM %s WHERE token(k) >= " + token + " AND token(k) <= " + token);
56+
"SELECT * FROM %s WHERE token(k) >= " + token + " AND token(k) <= " + token + " ALLOW FILTERING");
5757

5858
// test with a secondary index (indexed queries are always mapped to range commands)
5959
createIndex("CREATE INDEX ON %s(v)");
60-
assertToCQLString("SELECT * FROM %s WHERE v = 0", "SELECT * FROM %s WHERE v = 0");
61-
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0", "SELECT * FROM %s WHERE v = 0 AND k = 0");
62-
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c = 0", "SELECT * FROM %s WHERE v = 0 AND k = 0 AND c = 0");
63-
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c > 0", "SELECT * FROM %s WHERE v = 0 AND k = 0 AND c > 0");
64-
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c < 0", "SELECT * FROM %s WHERE v = 0 AND k = 0 AND c < 0");
65-
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c >= 0", "SELECT * FROM %s WHERE v = 0 AND k = 0 AND c >= 0");
66-
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c <= 0", "SELECT * FROM %s WHERE v = 0 AND k = 0 AND c <= 0");
67-
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c IN (0)", "SELECT * FROM %s WHERE v = 0 AND k = 0 AND c = 0");
68-
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c IN (0, 1)", "SELECT * FROM %s WHERE v = 0 AND k = 0 AND c IN (0, 1)");
60+
assertToCQLString("SELECT * FROM %s WHERE v = 0", "SELECT * FROM %s WHERE v = 0 ALLOW FILTERING");
61+
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0", "SELECT * FROM %s WHERE k = 0 AND v = 0 ALLOW FILTERING");
62+
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c = 0", "SELECT * FROM %s WHERE k = 0 AND c = 0 AND v = 0 ALLOW FILTERING");
63+
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c > 0", "SELECT * FROM %s WHERE k = 0 AND c > 0 AND v = 0 ALLOW FILTERING");
64+
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c < 0", "SELECT * FROM %s WHERE k = 0 AND c < 0 AND v = 0 ALLOW FILTERING");
65+
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c >= 0", "SELECT * FROM %s WHERE k = 0 AND c >= 0 AND v = 0 ALLOW FILTERING");
66+
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c <= 0", "SELECT * FROM %s WHERE k = 0 AND c <= 0 AND v = 0 ALLOW FILTERING");
67+
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c IN (0)", "SELECT * FROM %s WHERE k = 0 AND c = 0 AND v = 0 ALLOW FILTERING");
68+
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c IN (0, 1)", "SELECT * FROM %s WHERE k = 0 AND (c) IN ((0), (1)) AND v = 0 ALLOW FILTERING");
6969
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND token(k) > token(0)",
70-
"SELECT * FROM %s WHERE v = 0 AND token(k) > " + token);
70+
"SELECT * FROM %s WHERE token(k) > " + token + " AND v = 0 ALLOW FILTERING");
7171
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND token(k) >= token(0)",
72-
"SELECT * FROM %s WHERE v = 0 AND token(k) >= " + token);
72+
"SELECT * FROM %s WHERE token(k) >= " + token + " AND v = 0 ALLOW FILTERING");
7373
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND token(k) >= token(0) AND token(k) <= token(0)",
74-
"SELECT * FROM %s WHERE v = 0 AND token(k) >= " + token + " AND token(k) <= " + token);
74+
"SELECT * FROM %s WHERE token(k) >= " + token + " AND token(k) <= " + token + " AND v = 0 ALLOW FILTERING");
7575

7676
// test with index and multi-column clustering
7777
createTable("CREATE TABLE %s (k int, c1 int, c2 int,v int, PRIMARY KEY (k, c1, c2))");
7878
createIndex("CREATE INDEX ON %s(v)");
79-
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0", "SELECT * FROM %s WHERE v = 0 AND k = 0");
80-
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 = 1", "SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 = 1");
81-
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 > 1", "SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 > 1");
82-
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 < 1", "SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 < 1");
83-
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 >= 1", "SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 >= 1");
84-
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 <= 1", "SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 <= 1");
85-
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 = 1 AND c2 = 2", "SELECT * FROM %s WHERE v = 0 AND k = 0 AND (c1, c2) = (1, 2)");
86-
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 = 1 AND c2 > 2", "SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 = 1 AND c2 > 2");
87-
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 = 1 AND c2 < 2", "SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 = 1 AND c2 < 2");
88-
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 = 1 AND c2 >= 2", "SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 = 1 AND c2 >= 2");
89-
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 = 1 AND c2 <= 2", "SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 = 1 AND c2 <= 2");
79+
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0", "SELECT * FROM %s WHERE k = 0 AND v = 0 ALLOW FILTERING");
80+
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 = 1", "SELECT * FROM %s WHERE k = 0 AND c1 = 1 AND v = 0 ALLOW FILTERING");
81+
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 > 1", "SELECT * FROM %s WHERE k = 0 AND c1 > 1 AND v = 0 ALLOW FILTERING");
82+
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 < 1", "SELECT * FROM %s WHERE k = 0 AND c1 < 1 AND v = 0 ALLOW FILTERING");
83+
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 >= 1", "SELECT * FROM %s WHERE k = 0 AND c1 >= 1 AND v = 0 ALLOW FILTERING");
84+
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 <= 1", "SELECT * FROM %s WHERE k = 0 AND c1 <= 1 AND v = 0 ALLOW FILTERING");
85+
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 = 1 AND c2 = 2", "SELECT * FROM %s WHERE k = 0 AND (c1, c2) = (1, 2) AND v = 0 ALLOW FILTERING");
86+
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 = 1 AND c2 > 2", "SELECT * FROM %s WHERE k = 0 AND c1 = 1 AND c2 > 2 AND v = 0 ALLOW FILTERING");
87+
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 = 1 AND c2 < 2", "SELECT * FROM %s WHERE k = 0 AND c1 = 1 AND c2 < 2 AND v = 0 ALLOW FILTERING");
88+
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 = 1 AND c2 >= 2", "SELECT * FROM %s WHERE k = 0 AND c1 = 1 AND c2 >= 2 AND v = 0 ALLOW FILTERING");
89+
assertToCQLString("SELECT * FROM %s WHERE v = 0 AND k = 0 AND c1 = 1 AND c2 <= 2", "SELECT * FROM %s WHERE k = 0 AND c1 = 1 AND c2 <= 2 AND v = 0 ALLOW FILTERING");
9090
}
9191

9292
@Override

0 commit comments

Comments
 (0)