Skip to content

Commit b3a40d7

Browse files
authored
Merge pull request ravendb#149 from poissoncorp/v5.2beta3
RDBC-610 Python - more like this
2 parents e48edb7 + f16d79c commit b3a40d7

9 files changed

Lines changed: 532 additions & 2 deletions

File tree

ravendb/documents/conventions/document_conventions.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,8 @@ def json_default(o):
209209
return o.value
210210
elif isinstance(o, ravendb.json.metadata_as_dictionary.MetadataAsDictionary):
211211
return o.metadata
212+
elif getattr(o, "to_json", None) and getattr(o.to_json, "__call__", None):
213+
return o.to_json()
212214
elif getattr(o, "__dict__", None):
213215
return o.__dict__
214216
elif isinstance(o, set):

ravendb/documents/queries/more_like_this.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ def using_any_document(self) -> MoreLikeThisOperations[_T]:
139139
def using_document(
140140
self, document_json_or_builder: Union[str, Callable[[DocumentQuery[_T]], None]]
141141
) -> MoreLikeThisOperations[_T]:
142-
if isinstance(str, document_json_or_builder):
142+
if isinstance(document_json_or_builder, str):
143143
self.__more_like_this = MoreLikeThisUsingDocument(document_json_or_builder)
144144
return self
145145
self.__more_like_this = MoreLikeThisUsingDocumentForDocumentQuery()
@@ -149,3 +149,12 @@ def using_document(
149149
def with_options(self, options: MoreLikeThisOptions) -> MoreLikeThisOperations[_T]:
150150
self.__more_like_this.options = options
151151
return self
152+
153+
154+
class MoreLikeThisStopWords:
155+
def __init__(self, Id: str = None, stop_words: List[str] = None):
156+
self.Id = Id
157+
self.stop_words = stop_words
158+
159+
def to_json(self):
160+
return {"Id": self.Id, "StopWords": self.stop_words}

ravendb/documents/queries/utils.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ def write(self, obj: object):
3030
self.__buffer.append(str(obj))
3131
elif isinstance(obj, list):
3232
self.__buffer.append(str(self.__convert_to_hashable(obj)))
33+
elif isinstance(obj, dict):
34+
self.__buffer.append(str(self.__convert_to_hashable(obj.items())))
3335
elif "__str__" in obj.__class__.__dict__:
3436
self.__buffer.append(str(obj))
3537
else:

ravendb/documents/session/query.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2184,6 +2184,7 @@ def more_like_this(
21842184
more_like_this_or_builder(f)
21852185

21862186
more_like_this = self._more_like_this()
2187+
more_like_this.with_options(f.more_like_this.options)
21872188

21882189
if isinstance(f.more_like_this, MoreLikeThisUsingDocument):
21892190
more_like_this_using_document: MoreLikeThisUsingDocument = f.more_like_this

ravendb/extensions/json_extensions.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,14 @@ def _convert_parameter_to_json(param: object, conventions: DocumentConventions)
7575
updated = set()
7676
for item in param:
7777
updated.add(JsonExtensions._convert_parameter_to_json(item, conventions))
78+
return updated
7879

7980
elif isinstance(param, dict):
8081
param: dict
8182
updated = {}
8283
for key, value in param.items():
8384
updated.update({key: JsonExtensions._convert_parameter_to_json(value, conventions)})
85+
return updated
8486

8587
elif isinstance(param, tuple):
8688
param: tuple

ravendb/infrastructure/entities.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
from __future__ import annotations
2+
from datetime import datetime
3+
from typing import List
4+
5+
16
class User:
27
def __init__(
38
self,
@@ -14,3 +19,21 @@ def __init__(
1419
self.address_id = address_id
1520
self.count = count
1621
self.age = age
22+
23+
24+
class Post:
25+
def __init__(
26+
self,
27+
Id: str = None,
28+
title: str = None,
29+
desc: str = None,
30+
comments: List[Post] = None,
31+
attachment_ids: str = None,
32+
created_at: datetime.date = None,
33+
):
34+
self.Id = Id
35+
self.title = title
36+
self.desc = desc
37+
self.comments = comments
38+
self.attachment_ids = attachment_ids
39+
self.created_at = created_at

ravendb/tests/jvm_migrated_tests/client_tests/indexing_tests/test_indexes_from_client.py

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
from ravendb import MoreLikeThisOptions
12
from ravendb.documents.indexes.definitions import FieldIndexing, FieldStorage
23
from ravendb.documents.indexes.index_creation import IndexCreation, AbstractIndexCreationTask
3-
from ravendb.infrastructure.entities import User
4+
from ravendb.infrastructure.entities import User, Post
45
from ravendb.tests.test_base import TestBase
56

67

@@ -15,6 +16,19 @@ def __init__(self):
1516
self._store("name", FieldStorage.YES)
1617

1718

19+
class Posts_ByTitleAndDesc(AbstractIndexCreationTask):
20+
def __init__(self):
21+
super(Posts_ByTitleAndDesc, self).__init__()
22+
self.map = "from p in docs.Posts select new { p.title, p.desc }"
23+
self._index("title", FieldIndexing.SEARCH)
24+
self._store("title", FieldIndexing.YES)
25+
self._analyze("title", "Lucene.Net.Analysis.SimpleAnalyzer")
26+
27+
self._index("desc", FieldIndexing.SEARCH)
28+
self._store("desc", FieldStorage.YES)
29+
self._analyze("desc", "Lucene.Net.Analysis.SimpleAnalyzer")
30+
31+
1832
class TestIndexesFromClient(TestBase):
1933
def setUp(self):
2034
super(TestIndexesFromClient, self).setUp()
@@ -32,3 +46,37 @@ def test_can_create_indexes_using_index_creation(self):
3246
with self.store.open_session() as session:
3347
users = list(session.query_index_type(Users_ByName, User))
3448
self.assertEqual(1, len(users))
49+
50+
def test_more_like_this(self):
51+
with self.store.open_session() as session:
52+
post1 = Post("posts/1", "doduck", "prototype")
53+
post2 = Post("posts/2", "doduck", "prototype your idea")
54+
post3 = Post("posts/3", "doduck", "love programming")
55+
post4 = Post("posts/4", "We do", "prototype")
56+
post5 = Post("posts/5", "We love", "challange")
57+
58+
session.store(post1)
59+
session.store(post2)
60+
session.store(post3)
61+
session.store(post4)
62+
session.store(post5)
63+
session.save_changes()
64+
65+
Posts_ByTitleAndDesc().execute(self.store)
66+
self.wait_for_indexing(self.store)
67+
68+
with self.store.open_session() as session:
69+
options = MoreLikeThisOptions(minimum_document_frequency=1, minimum_term_frequency=0)
70+
results = list(
71+
session.query_index_type(Posts_ByTitleAndDesc, Post).more_like_this(
72+
lambda f: f.using_document(lambda x: x.where_equals("id()", "posts/1")).with_options(options)
73+
)
74+
)
75+
self.assertEqual(3, len(results))
76+
77+
self.assertEqual("doduck", results[0].title)
78+
self.assertEqual("prototype your idea", results[0].desc)
79+
self.assertEqual("doduck", results[1].title)
80+
self.assertEqual("love programming", results[1].desc)
81+
self.assertEqual("We do", results[2].title)
82+
self.assertEqual("prototype", results[2].desc)

ravendb/tests/jvm_migrated_tests/more_like_this_tests/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)