Skip to content

Commit 96d0e67

Browse files
committed
Implement get_or_create_index method and add tests
Simple readme update
1 parent 95156d0 commit 96d0e67

File tree

3 files changed

+58
-0
lines changed

3 files changed

+58
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ You can check out [the API documentation](https://docs.meilisearch.com/reference
121121
client.create_index('books')
122122
# Create an index and give the primary-key
123123
client.create_index('books', {'primaryKey': 'book_id'})
124+
# Get an index or create it if it doesn't exist
125+
client.get_or_create_index('books', {'primaryKey': 'book_id'})
124126
```
125127

126128
#### List all indexes <!-- omit in toc -->

meilisearch/client.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from meilisearch.index import Index
22
from meilisearch.config import Config
33
from meilisearch._httprequests import HttpRequests
4+
from meilisearch.errors import MeiliSearchApiError
45

56
class Client():
67
"""
@@ -80,6 +81,34 @@ def get_index(self, uid):
8081
"""
8182
return Index.get_index(self.config, uid=uid)
8283

84+
def get_or_create_index(self, uid, options=None):
85+
"""Get an index, or create it if it doesn't exist.
86+
87+
Parameters
88+
----------
89+
uid: str
90+
UID of the index
91+
options: dict, optional
92+
Options passed during index creation (ex: primaryKey)
93+
94+
Returns
95+
-------
96+
index : Index
97+
an instance of Index containing the information of the retrieved or newly created index
98+
Raises
99+
------
100+
HTTPError
101+
In case of any other error found here https://docs.meilisearch.com/references/#errors-status-code
102+
"""
103+
try:
104+
index = Index(self.config, uid)
105+
index.create(self.config, uid, options)
106+
except MeiliSearchApiError as err:
107+
if err.message != 'index already exists':
108+
raise err
109+
index = self.get_index(uid)
110+
return index
111+
83112
def get_all_stats(self):
84113
"""Get all stats of MeiliSearch
85114

meilisearch/tests/index/test_index.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class TestIndex:
1010
index_uid = 'indexUID'
1111
index_uid2 = 'indexUID2'
1212
index_uid3 = 'indexUID3'
13+
index_uid4 = 'indexUID4'
1314

1415
def setup_class(self):
1516
clear_all_indexes(self.client)
@@ -56,6 +57,32 @@ def test_get_index_with_none_uid(self):
5657
with pytest.raises(Exception):
5758
self.client.get_index(uid=None)
5859

60+
def test_get_or_create_index(self):
61+
"""Test get_or_create_index method"""
62+
# self.client.create_index(self.index_uid3)
63+
index_1 = self.client.get_or_create_index(self.index_uid4)
64+
index_2 = self.client.get_or_create_index(self.index_uid4)
65+
index_3 = self.client.get_or_create_index(self.index_uid4)
66+
assert index_1.uid == index_2.uid == index_3.uid == self.index_uid4
67+
update = index_1.add_documents([{
68+
'book_id': 1,
69+
'name': "Some book"
70+
}])
71+
index_1.wait_for_pending_update(update['updateId'])
72+
documents = index_2.get_documents()
73+
assert len(documents) == 1
74+
index_2.delete()
75+
with pytest.raises(Exception):
76+
self.client.get_index(index_3).info()
77+
78+
def test_get_or_create_index_with_primary_key(self):
79+
"""Test get_or_create_index method with primary key"""
80+
index_1 = self.client.get_or_create_index('books', {'primaryKey': self.index_uid4})
81+
index_2 = self.client.get_or_create_index('books', {'primaryKey': 'some_wrong_key'})
82+
assert index_1.get_primary_key() == self.index_uid4
83+
assert index_2.get_primary_key() == self.index_uid4
84+
index_1.delete()
85+
5986
def test_index_info(self):
6087
"""Tests getting an index's info"""
6188
index = self.client.get_index(uid=self.index_uid)

0 commit comments

Comments
 (0)