|
6 | 6 | from ravendb import constants |
7 | 7 | from ravendb.documents.conventions import DocumentConventions |
8 | 8 | from ravendb.documents.commands.batches import PutCompareExchangeCommandData, DeleteCompareExchangeCommandData |
| 9 | +from ravendb.documents.session.document_session_operations.misc import _update_metadata_modifications |
9 | 10 | from ravendb.exceptions.raven_exceptions import RavenException |
10 | 11 | from ravendb.json.metadata_as_dictionary import MetadataAsDictionary |
11 | 12 | from ravendb.documents.session.entity_to_json import EntityToJson |
@@ -98,7 +99,12 @@ def get_value( |
98 | 99 | self.__value = value |
99 | 100 | return value |
100 | 101 |
|
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 | + ) |
102 | 108 | self.__value = value |
103 | 109 |
|
104 | 110 | return value |
@@ -145,15 +151,34 @@ def get_command( |
145 | 151 | entity = EntityToJson.convert_entity_to_json_internal_static(self.__value.value, conventions, None, False) |
146 | 152 |
|
147 | 153 | 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 | + |
149 | 161 | 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 | + |
151 | 172 | entity_to_insert = None |
152 | | - if not entity_json: |
| 173 | + if not entity_json or metadata_has_changed: |
153 | 174 | entity_json = entity_to_insert = self.__convert_entity(self._key, entity, metadata) |
154 | 175 |
|
155 | 176 | 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 | + ) |
157 | 182 | self.__original_value = new_value |
158 | 183 | if not has_changed: |
159 | 184 | return None |
@@ -212,15 +237,17 @@ def update_value(self, value: CompareExchangeValue): |
212 | 237 | def prepare_metadata_for_put( |
213 | 238 | key: str, metadata_dictionary: MetadataAsDictionary, conventions: DocumentConventions |
214 | 239 | ) -> 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" |
221 | 250 | if not isinstance(obj, datetime.datetime) and not isinstance(obj, str): |
222 | 251 | raise ValueError( |
223 | 252 | f"The type of {constants.Documents.Metadata.EXPIRES} metadata for compare exchange '{key}' is not valid. Use the following type: datetime.datetime or string" |
224 | 253 | ) |
225 | | - |
226 | | - return metadata_dictionary.metadata |
|
0 commit comments