Skip to content

Commit 3de569c

Browse files
committed
RDBC-644 RavenDB_16301Test::canUseConditionalLoadLazily
1 parent 8029b32 commit 3de569c

File tree

5 files changed

+96
-7
lines changed

5 files changed

+96
-7
lines changed

ravendb/documents/queries/query.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ def __init__(
8080
self.project_into: Union[None, bool] = None
8181
self.projection_behavior: Union[None, ProjectionBehavior] = None
8282

83+
@classmethod
84+
def custom_function(cls, alias: str, func: str) -> QueryData:
85+
return cls([func], [], alias, None, None, True)
86+
8387

8488
class QueryResultBase(Generic[_TResult, _TIncludes]):
8589
@abstractmethod

ravendb/documents/session/operations/lazy.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from ravendb.tools.utils import Utils, CaseInsensitiveDict
2121
from ravendb.documents.queries.query import QueryResult
2222
from ravendb.extensions.json_extensions import JsonExtensions
23-
from ravendb.documents.commands.crud import GetDocumentsResult, ConditionalGetDocumentsCommand
23+
from ravendb.documents.commands.crud import GetDocumentsResult, ConditionalGetDocumentsCommand, ConditionalGetResult
2424
from ravendb.documents.session.operations.load_operation import LoadOperation
2525
from ravendb.documents.conventions import DocumentConventions
2626
from ravendb.documents.operations.lazy.lazy_operation import LazyOperation
@@ -166,7 +166,7 @@ def handle_response(self, response: "GetResponse") -> None:
166166
if response.result is not None:
167167
etag = response.headers.get(constants.Headers.ETAG)
168168

169-
res = ConditionalGetDocumentsCommand.ConditionalGetResult.from_json(json.loads(response.result))
169+
res = ConditionalGetResult.from_json(json.loads(response.result))
170170
document_info = DocumentInfo.get_new_document_info(res.results[0])
171171
r = self.__session.track_entity_document_info(self.__object_type, document_info)
172172

@@ -227,7 +227,7 @@ def load_starting_with(
227227
def conditional_load(
228228
self, key: str, change_vector: str, object_type: Type[_T] = None
229229
) -> Lazy[ConditionalLoadResult[_T]]:
230-
if not key.isspace():
230+
if not key or key.isspace():
231231
raise ValueError("key cannot be None or whitespace")
232232

233233
if self._delegate.is_loaded(key):
@@ -236,7 +236,7 @@ def __lazy_factory():
236236
entity = self._delegate.load(key, object_type)
237237
if entity is None:
238238
return ConditionalLoadResult.create(None, None)
239-
cv = self._delegate.get_change_vector_for(entity)
239+
cv = self._delegate.advanced.get_change_vector_for(entity)
240240
return ConditionalLoadResult.create(entity, cv)
241241

242242
return Lazy(__lazy_factory)

ravendb/documents/session/operations/load_operation.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ def with_time_series(self, time_series: List[TimeSeriesRange]):
9999
self._time_series_to_include = time_series
100100
return self
101101

102-
def by_keys(self, keys: List[str]):
103-
distinct = CaseInsensitiveSet(filter(lambda key: key and key.strip(), keys))
102+
def by_keys(self, keys: List[Optional[str]]):
103+
distinct = CaseInsensitiveSet(filter(lambda x: x and not x.isspace(), keys))
104104
self._keys = list(distinct)
105105
return self
106106

ravendb/tests/jvm_migrated_tests/client_tests/test_bulk_inserts.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,3 @@ def test_killed_to_early(self):
7474
time.sleep(0.1) # todo: wait for operation to be created first, then try to kill it
7575
bulk_insert.abort()
7676
bulk_insert.store_by_entity(FooBar())
77-
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
from typing import List
2+
3+
from ravendb import Lazy, ConditionalLoadResult, QueryData
4+
from ravendb.infrastructure.orders import Company
5+
from ravendb.tests.test_base import TestBase
6+
7+
8+
class Result:
9+
def __init__(self, Id: str = None, change_vector: str = None):
10+
self.Id = Id
11+
self.change_vector = change_vector
12+
13+
14+
class TestRavenDB16301(TestBase):
15+
def setUp(self):
16+
super(TestRavenDB16301, self).setUp()
17+
18+
def test_can_use_conditional_load_lazily(self):
19+
with self.store.bulk_insert() as bulk_insert:
20+
for i in range(100):
21+
bulk_insert.store_by_entity(Company())
22+
23+
ids: List[Result] = []
24+
loads: List[Lazy[ConditionalLoadResult[Company]]] = []
25+
26+
with self.store.open_session() as session1:
27+
ids = list(
28+
session1.advanced.document_query(object_type=Company)
29+
.wait_for_non_stale_results()
30+
.select_fields_query_data(
31+
Result,
32+
QueryData.custom_function("o", "{ Id : id(o), change_vector : getMetadata(o)['@change-vector'] }"),
33+
)
34+
)
35+
36+
all_ids = [single_id.Id for single_id in ids]
37+
session1.load(all_ids, Company)
38+
39+
res_ids = all_ids[0:50]
40+
41+
res = session1.load(res_ids, Company)
42+
43+
c = 0
44+
for key in res:
45+
c += 1
46+
res[key].phone = c
47+
48+
session1.save_changes()
49+
50+
with self.store.open_session() as session:
51+
# load last 10
52+
session.load(all_ids[-10:])
53+
number_of_requests_per_session = session.advanced.number_of_requests
54+
55+
for res in ids:
56+
loads.append(session.advanced.lazily.conditional_load(res.Id, res.change_vector, Company))
57+
58+
session.advanced.eagerly.execute_all_pending_lazy_operations()
59+
60+
self.assertEqual(number_of_requests_per_session + 1, session.advanced.number_of_requests)
61+
62+
for i in range(100):
63+
l = loads[i]
64+
65+
self.assertFalse(l.is_value_created)
66+
conditional_load_resuilt = l.value
67+
68+
if i < 50:
69+
# load from server
70+
self.assertEqual(ids[i].Id, conditional_load_resuilt.entity.Id)
71+
elif i < 90:
72+
# not modified
73+
self.assertIsNone(conditional_load_resuilt.entity)
74+
self.assertEqual(ids[i].change_vector, conditional_load_resuilt.change_vector)
75+
76+
else:
77+
# tracked in session
78+
self.assertEqual(ids[i].Id, conditional_load_resuilt.entity.Id)
79+
self.assertIsNotNone(conditional_load_resuilt.entity)
80+
self.assertEqual(ids[i].change_vector, conditional_load_resuilt.change_vector)
81+
82+
# not exist on server
83+
lazy = session.advanced.lazily.conditional_load("Companies/322-A", ids[0].change_vector, Company)
84+
load = lazy.value
85+
self.assertIsNone(load.entity)
86+
self.assertIsNone(load.change_vector)

0 commit comments

Comments
 (0)