cqlengine: fix index names to be compatible with C* >=2.0
This commit is contained in:
@@ -107,6 +107,18 @@ def drop_keyspace(name):
|
||||
execute("DROP KEYSPACE {0}".format(metadata.protect_name(name)))
|
||||
|
||||
|
||||
def _get_index_name_by_column(table, column_name):
|
||||
"""
|
||||
Find the index name for a given table and column.
|
||||
"""
|
||||
for _, index_metadata in six.iteritems(table.indexes):
|
||||
options = dict(index_metadata.index_options)
|
||||
if 'target' in options and options['target'] == column_name:
|
||||
return index_metadata.name
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def sync_table(model):
|
||||
"""
|
||||
Inspects the model and creates / updates the corresponding table and columns.
|
||||
@@ -190,11 +202,11 @@ def sync_table(model):
|
||||
|
||||
# TODO: support multiple indexes in C* 3.0+
|
||||
for column in indexes:
|
||||
index_name = 'index_{0}_{1}'.format(raw_cf_name, column.db_field_name)
|
||||
if table.indexes.get(index_name):
|
||||
index_name = _get_index_name_by_column(table, column.db_field_name)
|
||||
if index_name:
|
||||
continue
|
||||
|
||||
qs = ['CREATE INDEX {0}'.format(metadata.protect_name(index_name))]
|
||||
qs = ['CREATE INDEX']
|
||||
qs += ['ON {0}'.format(cf_name)]
|
||||
qs += ['("{0}")'.format(column.db_field_name)]
|
||||
qs = ' '.join(qs)
|
||||
|
||||
@@ -267,14 +267,13 @@ class IndexTests(BaseCassEngTestCase):
|
||||
"""
|
||||
sync_table(IndexModel)
|
||||
table_meta = management._get_table_metadata(IndexModel)
|
||||
self.assertIn("index_index_model_second_key", table_meta.indexes)
|
||||
self.assertIsNotNone(management._get_index_name_by_column(table_meta, 'second_key'))
|
||||
|
||||
# index already exists
|
||||
sync_table(IndexModel)
|
||||
table_meta = management._get_table_metadata(IndexModel)
|
||||
self.assertIn("index_index_model_second_key", table_meta.indexes)
|
||||
self.assertIsNotNone(management._get_index_name_by_column(table_meta, 'second_key'))
|
||||
|
||||
@greaterthancass20
|
||||
def test_sync_index_case_sensitive(self):
|
||||
"""
|
||||
Tests the default table creation, and ensures the table_name is created correctly and surfaced correctly
|
||||
@@ -288,12 +287,12 @@ class IndexTests(BaseCassEngTestCase):
|
||||
"""
|
||||
sync_table(IndexCaseSensitiveModel)
|
||||
table_meta = management._get_table_metadata(IndexCaseSensitiveModel)
|
||||
self.assertIn("index_IndexModel_second_key", table_meta.indexes)
|
||||
self.assertIsNotNone(management._get_index_name_by_column(table_meta, 'second_key'))
|
||||
|
||||
# index already exists
|
||||
sync_table(IndexCaseSensitiveModel)
|
||||
table_meta = management._get_table_metadata(IndexCaseSensitiveModel)
|
||||
self.assertIn("index_IndexModel_second_key", table_meta.indexes)
|
||||
self.assertIsNotNone(management._get_index_name_by_column(table_meta, 'second_key'))
|
||||
|
||||
|
||||
class NonModelFailureTest(BaseCassEngTestCase):
|
||||
|
||||
Reference in New Issue
Block a user