Skip to content

Commit 341fc74

Browse files
authored
Merge pull request #79 from meilisearch/wait_for_pending_update_method
Implement wait_for_pending_update method
2 parents 1f8fabd + b8e720f commit 341fc74

File tree

2 files changed

+91
-1
lines changed

2 files changed

+91
-1
lines changed

meilisearch/index.py

Lines changed: 30 additions & 1 deletion
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
@@ -170,7 +172,7 @@ def get_update_status(self, update_id):
170172
Returns
171173
----------
172174
update: `list`
173-
List of all enqueued and processed actions of the index.
175+
List containing the details of the update status.
174176
"""
175177
return self.http.get(
176178
'{}/{}/{}/{}'.format(
@@ -181,6 +183,33 @@ def get_update_status(self, update_id):
181183
)
182184
)
183185

186+
def wait_for_pending_update(self, update_id, timeout_in_ms=5000, interval_in_ms=50):
187+
"""Wait until MeiliSearch processes an update, and get its status
188+
189+
Parameters
190+
----------
191+
update_id: int
192+
identifier of the update to retrieve
193+
timeout_in_ms (optional): int
194+
time the method should wait before rising a TimeoutError
195+
interval_in_ms (optional): int
196+
time interval the method should wait (sleep) between requests
197+
Returns
198+
----------
199+
update: `list`
200+
List containing the details of the processed update status.
201+
"""
202+
start_time = datetime.now()
203+
elapsed_time = 0
204+
while elapsed_time < timeout_in_ms:
205+
get_update = self.get_update_status(update_id)
206+
if get_update['status'] != 'enqueued':
207+
return get_update
208+
sleep(interval_in_ms / 1000)
209+
time_delta = datetime.now() - start_time
210+
elapsed_time = time_delta.seconds * 1000 + time_delta.microseconds / 1000
211+
raise TimeoutError
212+
184213
def get_stats(self):
185214
"""Get stats of an index
186215
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
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+
dataset_file = open("datasets/small_movies.json", "r")
11+
dataset_json = None
12+
13+
def setup_class(self):
14+
self.index = self.client.create_index(uid='indexUID')
15+
self.dataset_json = json.loads(self.dataset_file.read())
16+
17+
def teardown_class(self):
18+
self.index.delete()
19+
20+
def test_wait_for_pending_update_default(self):
21+
"""Tests call to wait for an update with default parameters"""
22+
response = self.index.add_documents([{'id': 1, 'title': 'Le Petit Prince'}])
23+
assert 'updateId' in response
24+
wait_update = self.index.wait_for_pending_update(response['updateId'])
25+
assert isinstance(wait_update, object)
26+
assert 'status' in wait_update
27+
assert wait_update['status'] != 'enqueued'
28+
29+
def test_wait_for_pending_update_timeout(self):
30+
"""Tests timeout risen by waiting for an update"""
31+
with pytest.raises(TimeoutError):
32+
self.index.wait_for_pending_update(2, timeout_in_ms=0)
33+
34+
def test_wait_for_pending_update_interval_custom(self):
35+
"""Tests call to wait for an update with custom interval"""
36+
response = self.index.add_documents(self.dataset_json)
37+
assert 'updateId' in response
38+
start_time = datetime.now()
39+
wait_update = self.index.wait_for_pending_update(
40+
response['updateId'],
41+
interval_in_ms=1000,
42+
timeout_in_ms=6000
43+
)
44+
time_delta = datetime.now() - start_time
45+
assert isinstance(wait_update, object)
46+
assert 'status' in wait_update
47+
assert wait_update['status'] != 'enqueued'
48+
assert time_delta.seconds >= 1
49+
50+
def test_wait_for_pending_update_interval_zero(self):
51+
"""Tests call to wait for an update with custom interval"""
52+
response = self.index.add_documents(self.dataset_json)
53+
assert 'updateId' in response
54+
wait_update = self.index.wait_for_pending_update(
55+
response['updateId'],
56+
interval_in_ms=0,
57+
timeout_in_ms=6000
58+
)
59+
assert isinstance(wait_update, object)
60+
assert 'status' in wait_update
61+
assert wait_update['status'] != 'enqueued'

0 commit comments

Comments
 (0)