Skip to content

Commit 4c26315

Browse files
committed
RDBC-700 Misc
1 parent f532840 commit 4c26315

File tree

22 files changed

+82
-51
lines changed

22 files changed

+82
-51
lines changed

ravendb/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@
177177
from ravendb.documents.session.document_info import DocumentInfo
178178
from ravendb.documents.session.document_session import DocumentSession
179179
from ravendb.documents.session.entity_to_json import EntityToJson
180-
from ravendb.documents.session.in_memory_document_session_operations import InMemoryDocumentSessionOperations
180+
from ravendb.documents.session.document_session_operations.in_memory_document_session_operations import InMemoryDocumentSessionOperations
181181
from ravendb.documents.session.loaders.include import IncludeBuilder, IncludeBuilderBase, QueryIncludeBuilder
182182
from ravendb.documents.session.loaders.loaders import (
183183
LoaderWithInclude,

ravendb/documents/commands/batches.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
if TYPE_CHECKING:
2424
from ravendb.documents.conventions import DocumentConventions
2525
from ravendb.documents.operations.patch import PatchRequest
26-
from ravendb.documents.session.in_memory_document_session_operations import InMemoryDocumentSessionOperations
26+
from ravendb.documents.session.document_session_operations.in_memory_document_session_operations import InMemoryDocumentSessionOperations
2727

2828

2929
class CommandType(Enum):

ravendb/documents/indexes/definitions.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -519,8 +519,11 @@ def __str__(self):
519519

520520

521521
class RollingIndex:
522-
def __init__(self, active_deployments: Optional[Dict[str, RollingIndexDeployment]]):
522+
def __init__(
523+
self, active_deployments: Optional[Dict[str, RollingIndexDeployment]], raft_command_index: Optional[int] = None
524+
):
523525
self.active_deployments = active_deployments
526+
self.raft_command_index = raft_command_index
524527

525528

526529
class RollingIndexDeployment:

ravendb/documents/operations/batch.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from ravendb.tools.utils import CaseInsensitiveDict
1313

1414
if TYPE_CHECKING:
15-
from ravendb.documents.session.in_memory_document_session_operations import InMemoryDocumentSessionOperations
15+
from ravendb.documents.session.document_session_operations.in_memory_document_session_operations import InMemoryDocumentSessionOperations
1616

1717

1818
class BatchOperation:

ravendb/documents/operations/compare_exchange/compare_exchange.py

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from ravendb import constants
77
from ravendb.documents.conventions import DocumentConventions
88
from ravendb.documents.commands.batches import PutCompareExchangeCommandData, DeleteCompareExchangeCommandData
9+
from ravendb.documents.session.document_session_operations.misc import _update_metadata_modifications
910
from ravendb.exceptions.raven_exceptions import RavenException
1011
from ravendb.json.metadata_as_dictionary import MetadataAsDictionary
1112
from ravendb.documents.session.entity_to_json import EntityToJson
@@ -98,7 +99,12 @@ def get_value(
9899
self.__value = value
99100
return value
100101

101-
value = CompareExchangeValue(self._key, self._index, entity)
102+
value = CompareExchangeValue(
103+
self._key,
104+
self._index,
105+
entity,
106+
self.__original_value.metadata if self.__original_value is not None else None,
107+
)
102108
self.__value = value
103109

104110
return value
@@ -145,15 +151,34 @@ def get_command(
145151
entity = EntityToJson.convert_entity_to_json_internal_static(self.__value.value, conventions, None, False)
146152

147153
entity_json = entity if isinstance(entity, dict) else None
148-
metadata = None
154+
metadata = (
155+
self.__original_value.value.get(constants.Documents.Metadata.KEY, None)
156+
if self.__original_value is not None
157+
else None
158+
)
159+
metadata_has_changed = False
160+
149161
if self.__value.has_metadata and len(self.__value.metadata) != 0:
150-
metadata = self.prepare_metadata_for_put(self._key, self.__value.metadata, conventions)
162+
if metadata is None:
163+
metadata_has_changed = True
164+
# create new metadata (because there wasn't any metadata before)
165+
metadata = self.prepare_metadata_for_put(self._key, self.__value.metadata, conventions)
166+
else:
167+
self.validate_metadata_for_put(self._key, self.__value.metadata)
168+
metadata_has_changed = _update_metadata_modifications(
169+
self.__value.metadata, metadata
170+
)
171+
151172
entity_to_insert = None
152-
if not entity_json:
173+
if not entity_json or metadata_has_changed:
153174
entity_json = entity_to_insert = self.__convert_entity(self._key, entity, metadata)
154175

155176
new_value = CompareExchangeValue(self._key, self._index, entity_json)
156-
has_changed = self.__original_value is None or self.has_changed(self.__original_value, new_value)
177+
has_changed = (
178+
self.__original_value is None
179+
or metadata_has_changed
180+
or self.has_changed(self.__original_value, new_value)
181+
)
157182
self.__original_value = new_value
158183
if not has_changed:
159184
return None
@@ -212,15 +237,17 @@ def update_value(self, value: CompareExchangeValue):
212237
def prepare_metadata_for_put(
213238
key: str, metadata_dictionary: MetadataAsDictionary, conventions: DocumentConventions
214239
) -> dict:
215-
if constants.Documents.Metadata.EXPIRES in metadata_dictionary:
216-
obj = metadata_dictionary.get(constants.Documents.Metadata.EXPIRES)
217-
if not obj:
218-
raise ValueError(
219-
f"The values of {constants.Documents.Metadata.EXPIRES} metadata for compare exchange '{key}' is None"
220-
)
240+
CompareExchangeSessionValue.validate_metadata_for_put(key, metadata_dictionary)
241+
242+
return metadata_dictionary.metadata
243+
244+
@staticmethod
245+
def validate_metadata_for_put(key: str, metadata_as_dictionary: MetadataAsDictionary) -> None:
246+
if constants.Documents.Metadata.EXPIRES in metadata_as_dictionary:
247+
obj = metadata_as_dictionary[constants.Documents.Metadata.EXPIRES]
248+
if obj is None:
249+
f"The values of {constants.Documents.Metadata.EXPIRES} metadata for compare exchange '{key}' is None"
221250
if not isinstance(obj, datetime.datetime) and not isinstance(obj, str):
222251
raise ValueError(
223252
f"The type of {constants.Documents.Metadata.EXPIRES} metadata for compare exchange '{key}' is not valid. Use the following type: datetime.datetime or string"
224253
)
225-
226-
return metadata_dictionary.metadata

ravendb/documents/operations/executor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from ravendb.serverwide.server_operation_executor import ServerOperationExecutor
1515

1616
if TYPE_CHECKING:
17-
from ravendb.documents.session.in_memory_document_session_operations import InMemoryDocumentSessionOperations
17+
from ravendb.documents.session.document_session_operations.in_memory_document_session_operations import InMemoryDocumentSessionOperations
1818
from ravendb.http.request_executor import RequestExecutor
1919
from ravendb.documents import DocumentStore
2020

ravendb/documents/session/cluster_transaction_operation.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,9 @@
2222
from ravendb.documents.operations.compare_exchange.compare_exchange_value_result_parser import (
2323
CompareExchangeValueResultParser,
2424
)
25-
from ravendb.util.util import StartingWithOptions
2625

2726
if TYPE_CHECKING:
28-
from ravendb.documents.session.in_memory_document_session_operations import InMemoryDocumentSessionOperations
27+
from ravendb.documents.session.document_session_operations.in_memory_document_session_operations import InMemoryDocumentSessionOperations
2928
from ravendb.documents.session.document_session import DocumentSession
3029
from ravendb import Lazy
3130

ravendb/documents/session/document_session.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
from ravendb.exceptions.exceptions import InvalidOperationException
1717
from ravendb.data.operation import AttachmentType
1818
from ravendb.data.timeseries import TimeSeriesRange
19-
import ravendb.documents
2019
from ravendb.documents.indexes.definitions import AbstractCommonApiForIndexes
2120
from ravendb.documents.operations.attachments import (
2221
GetAttachmentOperation,
@@ -31,7 +30,7 @@
3130
IClusterTransactionOperations,
3231
)
3332
from ravendb.documents.session.document_info import DocumentInfo
34-
from ravendb.documents.session.in_memory_document_session_operations import InMemoryDocumentSessionOperations
33+
from ravendb.documents.session.document_session_operations.in_memory_document_session_operations import InMemoryDocumentSessionOperations
3534
from ravendb.documents.session.loaders.include import IncludeBuilder
3635
from ravendb.documents.session.loaders.loaders import LoaderWithInclude, MultiLoaderWithInclude
3736
from ravendb.documents.session.operations.lazy import LazyLoadOperation, LazySessionOperations

ravendb/documents/session/document_session_operations/__init__.py

Whitespace-only changes.

ravendb/documents/session/in_memory_document_session_operations.py renamed to ravendb/documents/session/document_session_operations/in_memory_document_session_operations.py

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from abc import abstractmethod
77

88
from ravendb.documents.operations.executor import OperationExecutor
9+
from ravendb.documents.session.document_session_operations.misc import _update_metadata_modifications
910
from ravendb.documents.session.misc import (
1011
SessionOptions,
1112
TransactionMode,
@@ -985,18 +986,6 @@ def _clear_cluster_session(self) -> None:
985986
def cluster_transaction(self) -> ClusterTransactionOperationsBase:
986987
raise RuntimeError(f"{self.__class__.__name__} must override the cluster_session property method")
987988

988-
@staticmethod
989-
def __update_metadata_modifications(document_info: DocumentInfo) -> bool:
990-
dirty = False
991-
if document_info.metadata_instance is not None:
992-
if document_info.metadata_instance.is_dirty:
993-
dirty = True
994-
for key, value in document_info.metadata_instance.items():
995-
if value is None or isinstance(value, MetadataAsDictionary) and value.is_dirty is True:
996-
dirty = True
997-
document_info.metadata[key] = json.loads(json.dumps(value, default=Utils.json_default))
998-
return dirty
999-
1000989
def __prepare_for_creating_revisions_from_ids(self, result: SaveChangesData) -> None:
1001990
for id_entry in self._ids_for_creating_forced_revisions:
1002991
result.session_commands.append(ForceRevisionCommandData(id_entry))
@@ -1056,7 +1045,7 @@ def __prepare_for_entities_puts(self, result: SaveChangesData) -> None:
10561045
if self.is_deleted(entity.value.key):
10571046
continue
10581047

1059-
dirty_metadata = self.__update_metadata_modifications(entity.value)
1048+
dirty_metadata = _update_metadata_modifications(entity.value.metadata_instance, entity.value.metadata)
10601049

10611050
document = self.entity_to_json.convert_entity_to_json(entity.key, entity.value)
10621051

@@ -1075,7 +1064,7 @@ def __prepare_for_entities_puts(self, result: SaveChangesData) -> None:
10751064
self.before_store_invoke(before_store_event_args)
10761065

10771066
if before_store_event_args.is_metadata_accessed:
1078-
self.__update_metadata_modifications(entity.value)
1067+
_update_metadata_modifications(entity.value.metadata_instance, entity.value.metadata)
10791068

10801069
if before_store_event_args.is_metadata_accessed or self._entity_changed(document, entity.value, None):
10811070
document = self.entity_to_json.convert_entity_to_json(entity.key, entity.value)
@@ -1154,7 +1143,7 @@ def _what_changed(self) -> Dict[str, List[DocumentsChanges]]:
11541143

11551144
def __get_all_entities_changes(self, changes: Dict[str, List[DocumentsChanges]]) -> None:
11561145
for key, value in self._documents_by_id.items():
1157-
self.__update_metadata_modifications(value)
1146+
_update_metadata_modifications(value.metadata_instance, value.metadata)
11581147
new_obj = self.entity_to_json.convert_entity_to_json(value.entity, value)
11591148
self._entity_changed(new_obj, value, changes)
11601149

0 commit comments

Comments
 (0)