Skip to content

Commit bca8778

Browse files
authored
Merge pull request #306 from bouthilx/hotfix/ephemeral_remove_and_update_index
Fix EphemeralDB index update after document deletion
2 parents 3604466 + a857148 commit bca8778

File tree

3 files changed

+48
-2
lines changed

3 files changed

+48
-2
lines changed

src/orion/core/io/database/ephemeraldb.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -301,11 +301,15 @@ def delete_many(self, query=None):
301301
retained_documents = []
302302
for document in self._documents:
303303
if not document.match(query):
304-
retained_documents.append(document)
304+
retained_documents.append(document.to_dict())
305305
else:
306306
deleted += 1
307307

308-
self._documents = retained_documents
308+
for name, (keys, _) in self._indexes.items():
309+
self._indexes[name] = (keys, set())
310+
311+
self._documents = []
312+
self.insert_many(retained_documents)
309313

310314
return deleted
311315

tests/unittests/core/test_ephemeraldb.py

+20
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,26 @@ def test_remove_with_id(self, exp_config, database, orion_db):
310310
backward.populate_space(loaded_config)
311311
assert loaded_configs == exp_config[0][1:]
312312

313+
def test_remove_update_indexes(self, exp_config, database, orion_db):
314+
"""Verify that indexes are properly update after deletion."""
315+
with pytest.raises(DuplicateKeyError):
316+
orion_db.write('experiments', {'_id': exp_config[0][0]['_id']})
317+
with pytest.raises(DuplicateKeyError):
318+
orion_db.write('experiments', {'_id': exp_config[0][1]['_id']})
319+
320+
filt = {'_id': exp_config[0][0]['_id']}
321+
322+
count_before = database['experiments'].count()
323+
# call interface
324+
assert orion_db.remove('experiments', filt) == 1
325+
assert database['experiments'].count() == count_before - 1
326+
# Should not fail now, otherwise it means the indexes were not updated properly during
327+
# remove()
328+
orion_db.write('experiments', filt)
329+
# And this should still fail
330+
with pytest.raises(DuplicateKeyError):
331+
orion_db.write('experiments', {'_id': exp_config[0][1]['_id']})
332+
313333

314334
@pytest.mark.usefixtures("clean_db")
315335
class TestCount(object):

tests/unittests/core/test_pickleddb.py

+22
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,28 @@ def test_remove_with_id(self, exp_config, orion_db):
301301
backward.populate_space(loaded_config)
302302
assert loaded_configs == exp_config[0][1:]
303303

304+
def test_remove_update_indexes(self, exp_config, orion_db):
305+
"""Verify that indexes are properly update after deletion."""
306+
with pytest.raises(DuplicateKeyError):
307+
orion_db.write('experiments', {'_id': exp_config[0][0]['_id']})
308+
with pytest.raises(DuplicateKeyError):
309+
orion_db.write('experiments', {'_id': exp_config[0][1]['_id']})
310+
311+
filt = {'_id': exp_config[0][0]['_id']}
312+
313+
database = orion_db._get_database()._db
314+
count_before = database['experiments'].count()
315+
# call interface
316+
assert orion_db.remove('experiments', filt) == 1
317+
database = orion_db._get_database()._db
318+
assert database['experiments'].count() == count_before - 1
319+
# Should not fail now, otherwise it means the indexes were not updated properly during
320+
# remove()
321+
orion_db.write('experiments', filt)
322+
# And this should still fail
323+
with pytest.raises(DuplicateKeyError):
324+
orion_db.write('experiments', {'_id': exp_config[0][1]['_id']})
325+
304326

305327
@pytest.mark.usefixtures("clean_db")
306328
class TestCount(object):

0 commit comments

Comments
 (0)