|
1 | 1 | import unittest |
| 2 | +from datetime import timedelta |
| 3 | +from typing import Type |
2 | 4 |
|
3 | | -from ravendb import SorterDefinition |
| 5 | +from ravendb import SorterDefinition, AbstractIndexCreationTask, AnalyzerDefinition, DocumentStore |
| 6 | +from ravendb.documents.indexes.definitions import FieldIndexing |
| 7 | +from ravendb.documents.operations.indexes import ResetIndexOperation |
4 | 8 | from ravendb.infrastructure.orders import Company |
| 9 | +from ravendb.serverwide.operations.analyzers import PutServerWideAnalyzersOperation, DeleteServerWideAnalyzerOperation |
5 | 10 | from ravendb.serverwide.operations.sorters import PutServerWideSortersOperation, DeleteServerWideSorterOperation |
6 | 11 | from ravendb.tests.test_base import TestBase |
7 | 12 |
|
| 13 | + |
8 | 14 | sorter_code = ( |
9 | 15 | "using System;\n" |
10 | 16 | "using System.Collections.Generic;\n" |
@@ -96,3 +102,95 @@ def test_can_use_custom_sorter(self): |
96 | 102 | @staticmethod |
97 | 103 | def get_sorter(name) -> str: |
98 | 104 | return sorter_code.replace("MySorter", name) |
| 105 | + |
| 106 | + analyzer = ( |
| 107 | + "using System.IO;\n" |
| 108 | + "using Lucene.Net.Analysis;\n" |
| 109 | + "using Lucene.Net.Analysis.Standard;\n" |
| 110 | + "\n" |
| 111 | + "namespace SlowTests.Data.RavenDB_14939\n" |
| 112 | + "{\n" |
| 113 | + " public class MyAnalyzer : StandardAnalyzer\n" |
| 114 | + " {\n" |
| 115 | + " public MyAnalyzer()\n" |
| 116 | + " : base(Lucene.Net.Util.Version.LUCENE_30)\n" |
| 117 | + " {\n" |
| 118 | + " }\n" |
| 119 | + "\n" |
| 120 | + " public override TokenStream TokenStream(string fieldName, TextReader reader)\n" |
| 121 | + " {\n" |
| 122 | + " return new ASCIIFoldingFilter(base.TokenStream(fieldName, reader));\n" |
| 123 | + " }\n" |
| 124 | + " }\n" |
| 125 | + "}\n" |
| 126 | + ) |
| 127 | + |
| 128 | + @staticmethod |
| 129 | + def _fill(store: DocumentStore) -> None: |
| 130 | + with store.open_session() as session: |
| 131 | + session.store(Customer(name="Rogério")) |
| 132 | + session.store(Customer(name="Rogerio")) |
| 133 | + session.store(Customer(name="Paulo Rogerio")) |
| 134 | + session.store(Customer(name="Paulo Rogério")) |
| 135 | + session.save_changes() |
| 136 | + |
| 137 | + def _assert_count( |
| 138 | + self, store: DocumentStore, index: Type[AbstractIndexCreationTask], expected_count: int = 4 |
| 139 | + ) -> None: |
| 140 | + self.wait_for_indexing(store) |
| 141 | + |
| 142 | + with store.open_session() as session: |
| 143 | + results = list(session.query_index_type(index, Customer).no_caching().search("name", "Rogério*")) |
| 144 | + self.assertEqual(expected_count, len(results)) |
| 145 | + |
| 146 | + def test_can_use_custom_analyzer(self): |
| 147 | + analyzer_name = "MyAnalyzer" |
| 148 | + |
| 149 | + self.assertRaisesWithMessageContaining( |
| 150 | + self.store.execute_index, |
| 151 | + Exception, |
| 152 | + "Cannot find analyzer type '" + analyzer_name + "' for field: name", |
| 153 | + self.MyIndex(analyzer_name), |
| 154 | + ) |
| 155 | + |
| 156 | + try: |
| 157 | + analyzer_definition = AnalyzerDefinition() |
| 158 | + analyzer_definition.name = analyzer_name |
| 159 | + analyzer_definition.code = self.analyzer |
| 160 | + |
| 161 | + self.store.maintenance.server.send(PutServerWideAnalyzersOperation(analyzer_definition)) |
| 162 | + |
| 163 | + self.store.execute_index(self.MyIndex(analyzer_name)) |
| 164 | + |
| 165 | + self._fill(self.store) |
| 166 | + |
| 167 | + self.wait_for_indexing(self.store) |
| 168 | + |
| 169 | + self._assert_count(self.store, self.MyIndex) |
| 170 | + |
| 171 | + self.store.maintenance.server.send(DeleteServerWideAnalyzerOperation(analyzer_name)) |
| 172 | + |
| 173 | + self.store.maintenance.send(ResetIndexOperation(self.MyIndex().index_name)) |
| 174 | + |
| 175 | + errors = self.wait_for_indexing_errors(self.store, timedelta(seconds=10)) |
| 176 | + self.assertEqual(1, len(errors)) |
| 177 | + self.assertEqual(1, len(errors[0].errors)) |
| 178 | + self.assertIn( |
| 179 | + "Cannot find analyzer type '" + analyzer_name + "' for field: name", errors[0].errors[0].error |
| 180 | + ) |
| 181 | + finally: |
| 182 | + self.store.maintenance.server.send(DeleteServerWideAnalyzerOperation(analyzer_name)) |
| 183 | + |
| 184 | + class MyIndex(AbstractIndexCreationTask): |
| 185 | + def __init__(self, analyzer_name: str = "MyAnalyzer"): |
| 186 | + super().__init__() |
| 187 | + self.map = "from customer in docs.Customers select new { customer.name }" |
| 188 | + |
| 189 | + self._index("name", FieldIndexing.SEARCH) |
| 190 | + self._analyze("name", analyzer_name) |
| 191 | + |
| 192 | + |
| 193 | +class Customer: |
| 194 | + def __init__(self, Id: str = None, name: str = None): |
| 195 | + self.Id = Id |
| 196 | + self.name = name |
0 commit comments