Skip to content

Commit 077b876

Browse files
committed
Fix index target for collection indexes
1 parent df2009d commit 077b876

3 files changed

Lines changed: 62 additions & 1 deletion

File tree

cassandra/cqltypes.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -958,6 +958,21 @@ def serialize_safe(cls, val, protocol_version):
958958
return subtype.to_binary(val, protocol_version)
959959

960960

961+
class FrozenType(_ParameterizedType):
962+
typename = "frozen"
963+
num_subtypes = 1
964+
965+
@classmethod
966+
def deserialize_safe(cls, byts, protocol_version):
967+
subtype, = cls.subtypes
968+
return subtype.from_binary(byts)
969+
970+
@classmethod
971+
def serialize_safe(cls, val, protocol_version):
972+
subtype, = cls.subtypes
973+
return subtype.to_binary(val, protocol_version)
974+
975+
961976
def is_counter_type(t):
962977
if isinstance(t, six.string_types):
963978
t = lookup_casstype(t)

cassandra/metadata.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1210,11 +1210,30 @@ def as_cql_query(self):
12101210
"""
12111211
table = self.column.table
12121212
if self.index_type != "CUSTOM":
1213+
index_target = protect_name(self.column.name)
1214+
if self.index_options is not None:
1215+
option_keys = self.index_options.keys()
1216+
if "index_keys" in option_keys:
1217+
index_target = 'keys(%s)' % (index_target,)
1218+
elif "index_values" in option_keys:
1219+
# don't use any "function" for collection values
1220+
pass
1221+
else:
1222+
# it might be a "full" index on a frozen collection, but
1223+
# we need to check the data type to verify that, because
1224+
# there is no special index option for full-collection
1225+
# indexes.
1226+
data_type = self.column.data_type
1227+
collection_types = ('map', 'set', 'list')
1228+
if data_type.typename == "frozen" and data_type.subtypes[0].typename in collection_types:
1229+
# no index option for full-collection index
1230+
index_target = 'full(%s)' % (index_target,)
1231+
12131232
return "CREATE INDEX %s ON %s.%s (%s)" % (
12141233
self.name, # Cassandra doesn't like quoted index names for some reason
12151234
protect_name(table.keyspace.name),
12161235
protect_name(table.name),
1217-
protect_name(self.column.name))
1236+
index_target)
12181237
else:
12191238
return "CREATE CUSTOM INDEX %s ON %s.%s (%s) USING '%s'" % (
12201239
self.name, # Cassandra doesn't like quoted index names for some reason

tests/integration/standard/test_metadata.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,33 @@ def test_indexes(self):
308308
self.assertIn('CREATE INDEX d_index', statement)
309309
self.assertIn('CREATE INDEX e_index', statement)
310310

311+
def test_collection_indexes(self):
312+
self.session.execute("CREATE TABLE %s.%s (a int PRIMARY KEY, b map<text, text>)"
313+
% (self.ksname, self.cfname))
314+
self.session.execute("CREATE INDEX index1 ON %s.%s (keys(b))"
315+
% (self.ksname, self.cfname))
316+
317+
tablemeta = self.get_table_metadata()
318+
self.assertIn('(keys(b))', tablemeta.export_as_string())
319+
320+
self.session.execute("DROP INDEX %s.index1" % (self.ksname,))
321+
self.session.execute("CREATE INDEX index2 ON %s.%s (b)"
322+
% (self.ksname, self.cfname))
323+
324+
tablemeta = self.get_table_metadata()
325+
self.assertIn(' (b)', tablemeta.export_as_string())
326+
327+
# test full indexes on frozen collections, if available
328+
if get_server_versions()[0] >= (2, 1, 3):
329+
self.session.execute("DROP TABLE %s.%s" % (self.ksname, self.cfname))
330+
self.session.execute("CREATE TABLE %s.%s (a int PRIMARY KEY, b frozen<map<text, text>>)"
331+
% (self.ksname, self.cfname))
332+
self.session.execute("CREATE INDEX index3 ON %s.%s (full(b))"
333+
% (self.ksname, self.cfname))
334+
335+
tablemeta = self.get_table_metadata()
336+
self.assertIn('(full(b))', tablemeta.export_as_string())
337+
311338
def test_compression_disabled(self):
312339
create_statement = self.make_create_statement(["a"], ["b"], ["c"])
313340
create_statement += " WITH compression = {}"

0 commit comments

Comments
 (0)