in src/main.py [0:0]
def ensure_indexes(self, model: 'BaseModel'):
table_name = model.Meta.table_name
_LOG.info(f'Going to check indexes for {table_name}')
collection = model.mongodb_handler().mongodb.collection(table_name)
existing = collection.index_information()
for name in self._exceptional_indexes():
existing.pop(name, None)
needed = {}
for name, h, r in self._iter_all_indexes(model):
needed[name] = [(h, self.hash_key_order)]
if r:
needed[name].append((r, self.range_key_order))
to_create = []
to_delete = set()
for name, data in existing.items():
if name not in needed:
to_delete.add(name)
continue
# name in needed so maybe the index is valid, and we must keep it
# or the index has changed, and we need to re-create it
if data.get('key', []) != needed[name]: # not valid
to_delete.add(name)
to_create.append(IndexModel(keys=needed[name], name=name))
needed.pop(name)
for name, keys in needed.items(): # all that left must be created
to_create.append(IndexModel(keys=keys, name=name))
for name in to_delete:
_LOG.info(f'Going to remove index: {name}')
collection.drop_index(name)
if to_create:
_message = ','.join(
json.dumps(i.document, separators=(',', ':'))
for i in to_create
)
_LOG.info(f'Going to create indexes: {_message}')
collection.create_indexes(to_create)