Моя первоначальная мысль заключалась в том, что ограничение связано с влиянием на память и сеть для получения коллекций, поскольку несколько коллекций могут быть возвращены одновременно с ограничением in. Однако я обнаружил, что запрос работает, если он менее ограничен, указав только ключ раздела.
Мои тестовые данные (на Cassandra 3.7):
cqlsh:test> create table mytable(X text, Y text, Z text, mylist list<int>, primary key (X,Y));
cqlsh:test> insert into mytable (X,Y,Z,mylist) values('x','y1','z1',[1,2,3]);
cqlsh:test> insert into mytable (X,Y,Z,mylist) values('x','y2','z2',[4,5,6]);
cqlsh:test> select x,y,z from mytable where x = 'x' and y in ('y1');
x | y | z
---+----+----
x | y1 | z1
(1 rows)
cqlsh:test> select * from mytable where x = 'x' and y in ('y1');
InvalidRequest: Error from server: code=2200 [Invalid query] message="Cannot restrict clustering columns by IN relations when a collection is selected by the query"
cqlsh:test> select * from mytable where x = 'x';
x | y | mylist | z
---+----+-----------+----
x | y1 | [1, 2, 3] | z1
x | y2 | [4, 5, 6] | z2
(2 rows)
Базовый дамп sstable:
$ sstabledump mb-1-big-Data.db
[
{
"partition" : {
"key" : [ "x" ],
"position" : 0
},
"rows" : [
{
"type" : "row",
"position" : 15,
"clustering" : [ "y1" ],
"liveness_info" : { "tstamp" : "2016-09-13T08:14:33.172799Z" },
"cells" : [
{ "name" : "z", "value" : "z1" },
{ "name" : "mylist", "deletion_info" : { "marked_deleted" : "2016-09-13T08:14:33.172798Z", "local_delete_time" : "2016-09-13T08:14:33Z" } },
{ "name" : "mylist", "path" : [ "1a1a0760-798a-11e6-851a-e3954ecad15b" ], "value" : "1" },
{ "name" : "mylist", "path" : [ "1a1a0761-798a-11e6-851a-e3954ecad15b" ], "value" : "2" },
{ "name" : "mylist", "path" : [ "1a1a0762-798a-11e6-851a-e3954ecad15b" ], "value" : "3" }
]
},
{
"type" : "row",
"position" : 99,
"clustering" : [ "y2" ],
"liveness_info" : { "tstamp" : "2016-09-13T08:14:49.772718Z" },
"cells" : [
{ "name" : "z", "value" : "z2" },
{ "name" : "mylist", "deletion_info" : { "marked_deleted" : "2016-09-13T08:14:49.772717Z", "local_delete_time" : "2016-09-13T08:14:49Z" } },
{ "name" : "mylist", "path" : [ "23fefce0-798a-11e6-851a-e3954ecad15b" ], "value" : "4" },
{ "name" : "mylist", "path" : [ "23fefce1-798a-11e6-851a-e3954ecad15b" ], "value" : "5" },
{ "name" : "mylist", "path" : [ "23fefce2-798a-11e6-851a-e3954ecad15b" ], "value" : "6" }
]
}
]
}
]
Как видите, коллекция на самом деле не отличается от столбца, не являющегося первичным ключом, за исключением агрегации, которая необходима перед ее возвратом клиенту. Интересно, было ли это ограничением для старой реализации бережливости и было ли оно перенесено, хотя нет очевидной причины, по которой это невозможно сделать.
person
Ko-Chih Wu
schedule
13.09.2016