Skip to content

Commit b215aee

Browse files
committed
RDBC-644 Critical fix for DocumentInfo missing metadata bug
1 parent 3de569c commit b215aee

File tree

5 files changed

+48
-37
lines changed

5 files changed

+48
-37
lines changed

ravendb/documents/session/entity_to_json.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def convert_entity_to_json_internal_static(
5454
json_node = Utils.entity_to_dict(entity, conventions.json_default_method)
5555
EntityToJson.write_metadata(json_node, document_info)
5656
if remove_identity_property:
57-
EntityToJson.try_remove_identity_property(entity)
57+
EntityToJson.try_remove_identity_property_json(json_node)
5858
return json_node
5959

6060
@staticmethod
@@ -69,7 +69,7 @@ def _convert_entity_to_json_internal(
6969
json_node = Utils.entity_to_dict(entity, self._session.conventions.json_default_method)
7070
self.write_metadata(json_node, document_info)
7171
if remove_identity_property:
72-
self.try_remove_identity_property(json_node)
72+
self.try_remove_identity_property_json(json_node)
7373
return json_node
7474

7575
# todo: refactor this method, make it more useful/simple and less ugly (like this return...[0])
@@ -100,6 +100,14 @@ def try_remove_identity_property(document):
100100
except AttributeError:
101101
return False
102102

103+
@staticmethod
104+
def try_remove_identity_property_json(document: Dict) -> bool:
105+
try:
106+
del document["Id"]
107+
return True
108+
except KeyError:
109+
return False
110+
103111
@staticmethod
104112
def write_metadata(json_node: dict, document_info: DocumentInfo):
105113
if document_info is None:
@@ -153,7 +161,7 @@ def convert_to_entity_static(
153161
conventions: "DocumentConventions",
154162
session_hook: Optional["InMemoryDocumentSessionOperations"] = None,
155163
) -> _T:
156-
metadata = document.pop("@metadata")
164+
metadata = document.get("@metadata")
157165
document_deepcopy = deepcopy(document)
158166
type_from_metadata = conventions.try_get_type_from_metadata(metadata)
159167
is_inherit = False

ravendb/json/json_operation.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ def compare_json(
5050

5151
new_fields = new_json_props - old_json_props
5252
removed_fields = old_json_props - new_json_props
53-
removed_fields.discard("Id") # todo: Discuss about that condition - add/del Id causes changes
53+
54+
# todo: Discuss about that condition - add/del Id causes changes
55+
removed_fields.discard("Id")
5456

5557
for field in removed_fields:
5658
if changes is None:
@@ -64,7 +66,7 @@ def compare_json(
6466
prop == constants.Documents.Metadata.LAST_MODIFIED
6567
or prop == constants.Documents.Metadata.COLLECTION
6668
or prop == constants.Documents.Metadata.CHANGE_VECTOR
67-
or prop == constants.Documents.Metadata.KEY
69+
or prop == constants.Documents.Metadata.ID
6870
):
6971
continue
7072

ravendb/tests/jvm_migrated_tests/client_tests/session_tests/test_add_or_patch.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from datetime import datetime
1+
from datetime import datetime, timedelta
22
from dataclasses import dataclass
33

44
from typing import List
@@ -24,21 +24,19 @@ def test_can_add_or_patch(self):
2424
key = "users/1"
2525

2626
with self.store.open_session() as session:
27-
new_user = User(first_name="Hibernating", last_name="Rhinos", login_count=1)
27+
new_user = User(first_name="Hibernating", last_name="Rhinos", last_login=datetime.utcnow())
2828
session.store(new_user, key)
2929
session.save_changes()
30+
self.assertEqual(1, session.advanced.number_of_requests)
3031

3132
with self.store.open_session() as session:
32-
new_user = User(first_name="Hibernating", last_name="Rhinos")
33-
session.advanced.add_or_increment(key, new_user, "login_count", 3)
34-
33+
new_user = User(first_name="Hibernating", last_name="Rhinos", last_login=datetime.utcnow())
34+
new_date = datetime.utcnow() + timedelta(days=365)
35+
session.advanced.add_or_patch(key, new_user, "last_login", new_date)
3536
session.save_changes()
3637

3738
self.assertEqual(1, session.advanced.number_of_requests)
3839

39-
user = session.load(key, User)
40-
self.assertEqual(4, user.login_count)
41-
4240
session.delete(key)
4341
session.save_changes()
4442

@@ -71,7 +69,7 @@ def test_can_add_or_patch_add_item_to_an_existing_array(self):
7169

7270
with self.store.open_session() as session:
7371
user = User(first_name="Hibernating", last_name="Rhinos")
74-
datetime_now = datetime.now()
72+
datetime_now = datetime.utcnow()
7573
d2000 = datetime(
7674
2000,
7775
datetime_now.month,

ravendb/tests/jvm_migrated_tests/issues_tests/test_ravenDB_16301.py

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,71 +16,74 @@ def setUp(self):
1616
super(TestRavenDB16301, self).setUp()
1717

1818
def test_can_use_conditional_load_lazily(self):
19+
# Store 100 companies using bulk insert - it won't store identity property on the server
1920
with self.store.bulk_insert() as bulk_insert:
2021
for i in range(100):
2122
bulk_insert.store_by_entity(Company())
2223

23-
ids: List[Result] = []
24-
loads: List[Lazy[ConditionalLoadResult[Company]]] = []
24+
conditional_loads: List[Lazy[ConditionalLoadResult[Company]]] = []
2525

26-
with self.store.open_session() as session1:
27-
ids = list(
28-
session1.advanced.document_query(object_type=Company)
26+
with self.store.open_session() as query_modify_session:
27+
id_and_cv_results = list(
28+
query_modify_session.advanced.document_query(object_type=Company)
2929
.wait_for_non_stale_results()
3030
.select_fields_query_data(
3131
Result,
3232
QueryData.custom_function("o", "{ Id : id(o), change_vector : getMetadata(o)['@change-vector'] }"),
3333
)
3434
)
3535

36-
all_ids = [single_id.Id for single_id in ids]
37-
session1.load(all_ids, Company)
36+
all_ids = [single_id.Id for single_id in id_and_cv_results]
37+
query_modify_session.load(all_ids, Company)
3838

39+
# load 50 first companies and update them
3940
res_ids = all_ids[0:50]
4041

41-
res = session1.load(res_ids, Company)
42+
res = query_modify_session.load(res_ids, Company)
4243

4344
c = 0
4445
for key in res:
4546
c += 1
4647
res[key].phone = c
4748

48-
session1.save_changes()
49+
query_modify_session.save_changes()
4950

5051
with self.store.open_session() as session:
51-
# load last 10
52+
# load last 10 (track them in the session)
5253
session.load(all_ids[-10:])
5354
number_of_requests_per_session = session.advanced.number_of_requests
5455

55-
for res in ids:
56-
loads.append(session.advanced.lazily.conditional_load(res.Id, res.change_vector, Company))
56+
for res in id_and_cv_results:
57+
conditional_loads.append(session.advanced.lazily.conditional_load(res.Id, res.change_vector, Company))
5758

5859
session.advanced.eagerly.execute_all_pending_lazy_operations()
5960

6061
self.assertEqual(number_of_requests_per_session + 1, session.advanced.number_of_requests)
6162

6263
for i in range(100):
63-
l = loads[i]
64+
conditional_load = conditional_loads[i]
6465

65-
self.assertFalse(l.is_value_created)
66-
conditional_load_resuilt = l.value
66+
self.assertFalse(conditional_load.is_value_created)
67+
conditional_load_result = conditional_load.value
6768

6869
if i < 50:
6970
# load from server
70-
self.assertEqual(ids[i].Id, conditional_load_resuilt.entity.Id)
71+
self.assertEqual(id_and_cv_results[i].Id, conditional_load_result.entity.Id)
7172
elif i < 90:
7273
# not modified
73-
self.assertIsNone(conditional_load_resuilt.entity)
74-
self.assertEqual(ids[i].change_vector, conditional_load_resuilt.change_vector)
74+
self.assertEqual(id_and_cv_results[i].change_vector, conditional_load_result.change_vector)
75+
self.assertIsNone(conditional_load_result.entity)
7576

7677
else:
7778
# 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)
79+
self.assertEqual(id_and_cv_results[i].Id, conditional_load_result.entity.Id)
80+
self.assertIsNotNone(conditional_load_result.entity)
81+
self.assertEqual(id_and_cv_results[i].change_vector, conditional_load_result.change_vector)
8182

8283
# not exist on server
83-
lazy = session.advanced.lazily.conditional_load("Companies/322-A", ids[0].change_vector, Company)
84+
lazy = session.advanced.lazily.conditional_load(
85+
"Companies/322-A", id_and_cv_results[0].change_vector, Company
86+
)
8487
load = lazy.value
8588
self.assertIsNone(load.entity)
8689
self.assertIsNone(load.change_vector)

ravendb/tools/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,7 @@ def convert_to_entity(
527527
) -> Union[_T, _DynamicStructure]:
528528
if document is None:
529529
return None
530-
metadata = document.pop("@metadata")
530+
metadata = document.get("@metadata")
531531
original_document = deepcopy(document)
532532
type_from_metadata = conventions.try_get_type_from_metadata(metadata)
533533
mapper = conventions.mappers.get(object_type, None)

0 commit comments

Comments
 (0)