Skip to content

Commit 36ea493

Browse files
committed
feat: adding save records endpoint
1 parent 7f23fc2 commit 36ea493

File tree

3 files changed

+64
-2
lines changed

3 files changed

+64
-2
lines changed

algoliasearch_django/__init__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@
2727
get_adapter_from_instance = algolia_engine.get_adapter_from_instance
2828

2929
save_record = algolia_engine.save_record
30+
save_records = algolia_engine.save_records
3031
delete_record = algolia_engine.delete_record
3132
update_records = algolia_engine.update_records
3233
raw_search = algolia_engine.raw_search
33-
clear_index = algolia_engine.clear_index # TODO: deprecate
34+
clear_index = algolia_engine.clear_index # TODO: deprecate
3435
clear_objects = algolia_engine.clear_objects
3536
reindex_all = algolia_engine.reindex_all
3637

@@ -44,7 +45,7 @@ def emit(self, record):
4445

4546

4647
def autodiscover():
47-
autodiscover_modules('index')
48+
autodiscover_modules("index")
4849

4950

5051
logging.getLogger(__name__.split('.')[0]).addHandler(NullHandler())

algoliasearch_django/models.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,58 @@ def save_record(self, instance, update_fields=None, **kwargs):
316316
logger.warning('%s FROM %s NOT SAVED: %s', obj['objectID'],
317317
self.model, e)
318318

319+
def save_records(self, qs, batch_size=1000, **kwargs):
320+
"""Saves multiple records to the index in batches.
321+
322+
Parameters:
323+
- qs (QuerySet): A set of records to be saved.
324+
- batch_size (int): The size of each batch for saving records. Defaults to 1000.
325+
- **kwargs: Additional keyword arguments.
326+
"""
327+
self.__tmp_index.clear_objects()
328+
logger.debug('CLEAR INDEX %s_tmp', self.index_name)
329+
330+
to_update_batch = []
331+
to_delete_batch = []
332+
for instance in qs:
333+
if not self._should_index(instance):
334+
# Should not index, but since we don't know the state of the
335+
# instance, we need to send a DELETE request.
336+
to_delete_batch.append(instance)
337+
continue
338+
339+
to_update_batch.append(self.get_raw_record(instance))
340+
if len(to_update_batch) >= batch_size:
341+
self.__tmp_index.save_objects(to_update_batch)
342+
logger.info(
343+
'SAVE %d OBJECTS TO %s_tmp', len(to_update_batch), self.index_name
344+
)
345+
to_update_batch = []
346+
347+
if len(to_update_batch) > 0:
348+
self.__tmp_index.save_objects(to_update_batch)
349+
logger.info(
350+
'SAVE %d OBJECTS TO %s_tmp', len(to_update_batch), self.index_name
351+
)
352+
353+
self.__client.move_index(self.tmp_index_name, self.index_name)
354+
logger.info('MOVE INDEX %s_tmp TO %s', self.index_name, self.index_name)
355+
356+
if len(to_delete_batch) > 0:
357+
self.delete_records(to_delete_batch)
358+
359+
def delete_records(self, objects):
360+
"""Delete multiple records."""
361+
objectIDs = [self.objectID(instance) for instance in objects]
362+
try:
363+
self.__index.delete_objects(object_ids=objectIDs)
364+
logger.info('DELETE %s FROM %s', objectIDs, self.model)
365+
except AlgoliaException as e:
366+
if DEBUG:
367+
raise e
368+
else:
369+
logger.warning('%s FROM %s NOT DELETED: %s', objectIDs, self.model, e)
370+
319371
def delete_record(self, instance):
320372
"""Deletes the record."""
321373
objectID = self.objectID(instance)

algoliasearch_django/registration.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,15 @@ def delete_record(self, instance):
129129
adapter = self.get_adapter_from_instance(instance)
130130
adapter.delete_record(instance)
131131

132+
def bulk_save_records(self, model, qs, **kwargs):
133+
"""
134+
>>> from algoliasearch_django import update_records
135+
>>> qs = MyModel.objects.filter()
136+
>>> bulk_save_records(MyModel, qs)
137+
"""
138+
adapter = self.get_adapter(model)
139+
adapter.save_records(qs, **kwargs)
140+
132141
def update_records(self, model, qs, batch_size=1000, **kwargs):
133142
"""
134143
Updates multiple records.

0 commit comments

Comments
 (0)