Skip to content

Commit c502a34

Browse files
committed
Implement wait_for_pending_update method
1 parent 1f8fabd commit c502a34

File tree

2 files changed

+78
-0
lines changed

2 files changed

+78
-0
lines changed

meilisearch/index.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import urllib
2+
from datetime import datetime
3+
from time import sleep
24
from meilisearch._httprequests import HttpRequests
35

46
# pylint: disable=R0904
@@ -181,6 +183,35 @@ def get_update_status(self, update_id):
181183
)
182184
)
183185

186+
187+
def wait_for_pending_update(self, update_id, timeout_in_ms=2000, interval_in_ms=10):
188+
"""Wait until MeiliSearch processes an update, and get its status
189+
190+
Parameters
191+
----------
192+
update_id: int
193+
identifier of the update to retrieve
194+
timeout_in_ms (optional): int
195+
time the function should wait before rising a TimeoutError
196+
interval_in_ms (optional): int
197+
time interval the function should wait (sleep) between requests
198+
Returns
199+
----------
200+
update: `list`
201+
List of all enqueued and processed actions of the index.
202+
"""
203+
start_time = datetime.now()
204+
elapsed_time = 0
205+
while elapsed_time < timeout_in_ms:
206+
get_update = self.get_update_status(update_id)
207+
if get_update['status'] != 'enqueued':
208+
return get_update
209+
sleep(interval_in_ms/1000)
210+
time_delta = datetime.now() - start_time
211+
elapsed_time = time_delta.seconds * 1000 + time_delta.microseconds / 1000
212+
raise TimeoutError
213+
214+
184215
def get_stats(self):
185216
"""Get stats of an index
186217
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from datetime import datetime
2+
import json
3+
import pytest
4+
import meilisearch
5+
from meilisearch.tests import BASE_URL, MASTER_KEY
6+
7+
class TestUpdate:
8+
client = meilisearch.Client(BASE_URL, MASTER_KEY)
9+
index = None
10+
11+
def setup_class(self):
12+
self.index = self.client.create_index(uid='indexUID')
13+
14+
def teardown_class(self):
15+
self.index.delete()
16+
17+
def test_wait_for_pending_update_default(self):
18+
"""Tests call to wait for an update with default parameters"""
19+
response = self.index.add_documents([{'id': 1, 'title': 'Le Petit Prince'}])
20+
assert 'updateId' in response
21+
wait_update = self.index.wait_for_pending_update(response['updateId'])
22+
assert isinstance(wait_update, object)
23+
assert 'status' in wait_update
24+
assert wait_update['status'] != 'enqueued'
25+
26+
def test_wait_for_pending_update_timeout(self):
27+
"""Tests timeout risen by waiting for an update"""
28+
with pytest.raises(TimeoutError):
29+
self.index.wait_for_pending_update(2, timeout_in_ms=0)
30+
31+
def test_wait_for_pending_update_interval(self):
32+
"""Tests call to wait for an update with custom interval"""
33+
dataset_file = open("datasets/small_movies.json", "r")
34+
dataset_json = json.loads(dataset_file.read())
35+
response = self.index.add_documents(dataset_json)
36+
assert 'updateId' in response
37+
start_time = datetime.now()
38+
wait_update = self.index.wait_for_pending_update(
39+
response['updateId'],
40+
interval_in_ms=1000,
41+
timeout_in_ms=6000
42+
)
43+
time_delta = datetime.now() - start_time
44+
assert isinstance(wait_update, object)
45+
assert 'status' in wait_update
46+
assert wait_update['status'] != 'enqueued'
47+
assert time_delta.seconds >= 1

0 commit comments

Comments
 (0)