cqlengine: fix index names to be compatible with C* >=2.0

This commit is contained in:
Alan Boudreault
2016-03-07 14:38:43 -05:00
parent 464bb18e32
commit d724c33b5a
2 changed files with 19 additions and 8 deletions

View File

@@ -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)

View File

@@ -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):