Skip to content

Commit a3c5222

Browse files
committed
RDBC-889 Add Enable Corax on static index, Add Vector search tests, Fix toggle databases status
1 parent 88cfd61 commit a3c5222

File tree

4 files changed

+84
-10
lines changed

4 files changed

+84
-10
lines changed

ravendb/documents/indexes/abstract_index_creation_tasks.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
SpatialOptions,
1717
IndexFieldOptions,
1818
IndexType,
19+
SearchEngineType,
1920
)
2021
from ravendb.documents.indexes.spatial.configuration import SpatialOptionsFactory
2122
from ravendb.documents.indexes.vector.options import VectorOptions
@@ -41,13 +42,15 @@ def __init__(
4142
lock_mode: IndexLockMode = None,
4243
deployment_mode: IndexDeploymentMode = None,
4344
state: IndexState = None,
45+
search_engine_type: SearchEngineType = None,
4446
):
4547
super().__init__()
4648
self.conventions = conventions
4749
self.priority = priority
4850
self.lock_mode = lock_mode
4951
self.deployment_mode = deployment_mode
5052
self.state = state
53+
self.search_engine_type = search_engine_type
5154

5255
def execute(self, store: "DocumentStore", conventions: DocumentConventions = None, database: str = None):
5356
old_conventions = self.conventions
@@ -69,6 +72,11 @@ def execute(self, store: "DocumentStore", conventions: DocumentConventions = Non
6972
if self.deployment_mode is not None:
7073
index_definition.deployment_mode = self.deployment_mode
7174

75+
if self.search_engine_type is not None:
76+
if not index_definition.configuration:
77+
index_definition.configuration = {}
78+
index_definition.configuration["Indexing.Static.SearchEngineType"] = self.search_engine_type.__str__()
79+
7280
store.maintenance.for_database(database).send(PutIndexesOperation(index_definition))
7381

7482
finally:

ravendb/documents/indexes/definitions.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ def __str__(self):
6161
return self.value
6262

6363

64+
class SearchEngineType(Enum):
65+
LUCENE = "Lucene"
66+
CORAX = "Corax"
67+
68+
def __str__(self):
69+
return self.value
70+
71+
6472
class FieldStorage(Enum):
6573
YES = "Yes"
6674
NO = "No"
@@ -196,6 +204,7 @@ def __init__(
196204
pattern_for_output_reduce_to_collection_references: Optional[str] = None,
197205
pattern_references_collection_name: Optional[str] = None,
198206
deployment_mode: Optional[IndexDeploymentMode] = None,
207+
search_engine_type: Optional[SearchEngineType] = None,
199208
):
200209
super(IndexDefinition, self).__init__(name, priority, state)
201210
self.lock_mode = lock_mode
@@ -212,6 +221,7 @@ def __init__(
212221
self.pattern_for_output_reduce_to_collection_references = pattern_for_output_reduce_to_collection_references
213222
self.pattern_references_collection_name = pattern_references_collection_name
214223
self.deployment_mode = deployment_mode
224+
self.search_engine_type = search_engine_type
215225

216226
@classmethod
217227
def from_json(cls, json_dict: dict) -> IndexDefinition:
@@ -234,6 +244,8 @@ def from_json(cls, json_dict: dict) -> IndexDefinition:
234244
index_type = json_dict.get("IndexType", None)
235245
if index_type is not None:
236246
result.__index_type = IndexType(index_type)
247+
if json_dict["Configuration"] and json_dict["Configuration"]["Indexing.Static.SearchEngineType"]:
248+
result.search_engine_type = SearchEngineType(json_dict["Configuration"]["Indexing.Static.SearchEngineType"])
237249
result.output_reduce_to_collection = json_dict["OutputReduceToCollection"]
238250
result.reduce_output_index = json_dict["ReduceOutputIndex"]
239251
result.pattern_for_output_reduce_to_collection_references = json_dict[

ravendb/documents/operations/server_misc.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def __init__(self, databases_names: List[str] = None):
2828
self.databases_names = databases_names
2929

3030
def to_json(self) -> Dict[str, Any]:
31-
return {"DatabasesNames": self.databases_names}
31+
return {"DatabaseNames": self.databases_names}
3232

3333
def __init__(self, database_name: str, disable: bool):
3434
if database_name is None:
@@ -50,7 +50,7 @@ def from_parameters(cls, parameters: ToggleDatabasesStateOperation.Parameters, d
5050
raise ValueError("Parameters cannot be None")
5151

5252
if not parameters.databases_names:
53-
raise ValueError("Parameters.DatabasesNames cannot be None or empty")
53+
raise ValueError("Parameters.DatabaseNames cannot be None or empty")
5454

5555
this = cls("", disable)
5656
this._parameters = parameters

ravendb/tests/dotnet_migrated_tests/test_ravenDB_22076.py

Lines changed: 62 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
1+
from datetime import timedelta
12
from typing import List
23

34
from ravendb import AbstractIndexCreationTask
5+
from ravendb.documents.indexes.definitions import SearchEngineType
46
from ravendb.documents.indexes.vector.embedding import VectorEmbeddingType
57
from ravendb.documents.indexes.vector.options import VectorOptions
8+
from ravendb.documents.operations.server_misc import ToggleDatabasesStateOperation
69
from ravendb.tests.test_base import TestBase
710

811

912
class Dto:
1013
def __init__(
1114
self,
12-
embedding_base_64: str,
13-
embedding_singles: List[float],
14-
embedding_sbytes: List[int],
15-
embedding_binary: List[int],
15+
embedding_base_64: str = None,
16+
embedding_singles: List[float] = None,
17+
embedding_sbytes: List[int] = None,
18+
embedding_binary: List[int] = None,
1619
):
1720
self.embedding_base_64 = embedding_base_64
1821
self.embedding_singles = embedding_singles
@@ -24,7 +27,7 @@ class DummyIndex(AbstractIndexCreationTask):
2427
def __init__(self):
2528
super().__init__()
2629
self.map = """
27-
from dto in docs.Dtos
30+
from dto in docs.Dtoes
2831
select new
2932
{
3033
Singles = CreateVector(dto.embedding_singles),
@@ -34,13 +37,14 @@ def __init__(self):
3437
"""
3538
self._vector("Integers", VectorOptions(VectorEmbeddingType.INT8))
3639
self._vector("Binary", VectorOptions(VectorEmbeddingType.BINARY))
40+
self.search_engine_type = SearchEngineType.CORAX
3741

3842

3943
class IndexWithSetDimensions(AbstractIndexCreationTask):
4044
def __init__(self):
4145
super().__init__()
4246
self.map = """
43-
from dto in docs.Dtos
47+
from dto in docs.Dtoes
4448
select new
4549
{
4650
Singles = CreateVector(dto.embedding_singles)
@@ -53,7 +57,7 @@ class IndexWithSetDimensionsInt8(AbstractIndexCreationTask):
5357
def __init__(self):
5458
super().__init__()
5559
self.map = """
56-
from dto in docs.Dtos
60+
from dto in docs.Dtoes
5761
select new
5862
{
5963
Sbytes = CreateVector(dto.embedding_singles)
@@ -91,7 +95,7 @@ def test_rql_generation(self):
9195
q7 = session.query(object_type=Dto).vector_search_text_i8("TextField", "aaaa")
9296
self.assertEqual("from 'Dtoes' where vector.search(embedding.text_i8(TextField), $p0)", q7._to_string())
9397

94-
def test_rql_generation_async(self):
98+
def test_rql_generation_2(self):
9599
with self.store.open_session() as session:
96100

97101
# -- Not applicable for Python - here we just don't have such methods in the API, making this impossible --
@@ -137,3 +141,53 @@ def test_rql_generation_async(self):
137141
"EmbeddingBase64", "abcd==", is_exact=True, number_of_candidates=25
138142
)
139143
self.assertEqual("from 'Dtoes' where exact(vector.search(EmbeddingBase64, $p0, null, 25))", q8._to_string())
144+
145+
def test_embedding_dimensions_check(self):
146+
with self.store.open_session() as session:
147+
dto1 = Dto(embedding_singles=[0.5, -1.0])
148+
dto2 = Dto(embedding_singles=[0.2, 0.3])
149+
150+
session.store(dto1)
151+
session.store(dto2)
152+
153+
session.save_changes()
154+
155+
index = DummyIndex()
156+
157+
index.execute(self.store)
158+
159+
self.wait_for_indexing(self.store)
160+
161+
database_disable_result = self.store.maintenance.server.send(
162+
ToggleDatabasesStateOperation(self.store.database, True)
163+
)
164+
165+
self.assertTrue(database_disable_result.success)
166+
self.assertTrue(database_disable_result.disabled)
167+
self.assertEqual(database_disable_result.name, self.store.database)
168+
169+
database_enable_result = self.store.maintenance.server.send(
170+
ToggleDatabasesStateOperation(self.store.database, False)
171+
)
172+
173+
self.assertTrue(database_enable_result.success)
174+
self.assertFalse(database_enable_result.disabled)
175+
self.assertEqual(database_enable_result.name, self.store.database)
176+
177+
dto3 = Dto(embedding_singles=[0.1, 0.2])
178+
session.store(dto3)
179+
session.save_changes()
180+
181+
self.wait_for_indexing(self.store)
182+
183+
dto4 = Dto(embedding_singles=[0.5, 0.7, 0.9])
184+
session.store(dto4)
185+
session.save_changes()
186+
187+
index_errors = self.wait_for_indexing_errors(self.store, timeout=timedelta(seconds=5))
188+
189+
self.assertEqual(1, len(index_errors))
190+
self.assertIn(
191+
"Attempted to index embedding with 3 dimensions, but field Singles already contains indexed embedding with 2 dimensions, or was explicitly configured for embeddings with 2 dimensions.",
192+
index_errors[0].errors[0].error,
193+
)

0 commit comments

Comments
 (0)