Skip to content

Commit 6f3e0d8

Browse files
authored
Merge pull request #603 from meilisearch/add_swap_indexes_feature_for_v0.30.0
Add swap indexes feature for v0.30.0
2 parents ec64322 + 55ee4ae commit 6f3e0d8

File tree

3 files changed

+81
-0
lines changed

3 files changed

+81
-0
lines changed

meilisearch/client.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,27 @@ def create_dump(self) -> dict[str, str]:
400400
"""
401401
return self.http.post(self.config.paths.dumps)
402402

403+
def swap_indexes(self, parameters: list[dict[str, list[str]]]) -> TaskInfo:
404+
"""Swap two indexes.
405+
406+
Parameters
407+
----------
408+
indexes:
409+
List of indexes to swap (ex: [{"indexes": ["indexA", "indexB"]}).
410+
411+
Returns
412+
-------
413+
task_info:
414+
TaskInfo instance containing information about a task to track the progress of an asynchronous process.
415+
https://docs.meilisearch.com/reference/api/tasks.html#get-one-task
416+
417+
Raises
418+
------
419+
MeiliSearchApiError
420+
An error containing details about why Meilisearch can't process your request. Meilisearch error codes are described here: https://docs.meilisearch.com/errors/#meilisearch-errors
421+
"""
422+
return TaskInfo(**self.http.post(self.config.paths.swap, parameters))
423+
403424
def get_tasks(
404425
self, parameters: dict[str, Any] | None = None
405426
) -> dict[str, list[dict[str, Any]]]:

meilisearch/config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class Paths:
2929
dumps = "dumps"
3030
pagination = "pagination"
3131
faceting = "faceting"
32+
swap = "swap-indexes"
3233

3334
def __init__(self, url: str, api_key: str | None = None, timeout: int | None = None) -> None:
3435
"""
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# pylint: disable=invalid-name
2+
3+
import pytest
4+
5+
from meilisearch.errors import MeiliSearchApiError
6+
7+
8+
def test_swap_indexes(client, empty_index):
9+
"""Tests swap two indexes."""
10+
indexA = empty_index("index_A")
11+
indexB = empty_index("index_B")
12+
taskA = indexA.add_documents([{"id": 1, "title": "index_A"}])
13+
taskB = indexB.add_documents([{"id": 1, "title": "index_B"}])
14+
client.wait_for_task(taskA.task_uid)
15+
client.wait_for_task(taskB.task_uid)
16+
swapTask = client.swap_indexes(
17+
[
18+
{
19+
"indexes": [indexA.uid, indexB.uid],
20+
},
21+
]
22+
)
23+
task = client.wait_for_task(swapTask.task_uid)
24+
docA = client.index(indexA.uid).get_document(1)
25+
docB = client.index(indexB.uid).get_document(1)
26+
27+
assert docA.title == indexB.uid
28+
assert docB.title == indexA.uid
29+
assert task["type"] == "indexSwap"
30+
assert "swaps" in task["details"]
31+
32+
33+
def test_swap_indexes_with_one_that_does_not_exist(client, empty_index):
34+
"""Tests swap indexes with one that does not exist."""
35+
index = empty_index("index_A")
36+
swapTask = client.swap_indexes(
37+
[
38+
{
39+
"indexes": [index.uid, "does_not_exist"],
40+
},
41+
]
42+
)
43+
task = client.wait_for_task(swapTask.task_uid)
44+
45+
assert swapTask.type == "indexSwap"
46+
assert task["error"]["code"] == "index_not_found"
47+
48+
49+
def test_swap_indexes_with_itself(client, empty_index):
50+
"""Tests swap indexes with itself."""
51+
index = empty_index()
52+
with pytest.raises(MeiliSearchApiError):
53+
client.swap_indexes(
54+
[
55+
{
56+
"indexes": [index.uid, index.uid],
57+
},
58+
]
59+
)

0 commit comments

Comments
 (0)