Module astrapy.results
Expand source code
# Copyright DataStax, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import annotations
from abc import ABC, abstractmethod
from dataclasses import dataclass
from typing import Any
@dataclass
class OperationResult(ABC):
"""
Class that represents the generic result of a single mutation operation.
Attributes:
raw_results: response/responses from the Data API call.
Depending on the exact delete method being used, this
list of raw responses can contain exactly one or a number of items.
"""
raw_results: list[dict[str, Any]]
def _piecewise_repr(self, pieces: list[str | None]) -> str:
return f"{self.__class__.__name__}({', '.join(pc for pc in pieces if pc)})"
@abstractmethod
def to_bulk_write_result(self, index_in_bulk_write: int) -> BulkWriteResult: ...
@dataclass
class DeleteResult(OperationResult):
"""
Class that represents the result of delete operations.
Attributes:
deleted_count: number of deleted documents
raw_results: response/responses from the Data API call.
Depending on the exact delete method being used, this
list of raw responses can contain exactly one or a number of items.
"""
deleted_count: int
def __repr__(self) -> str:
return self._piecewise_repr(
[
f"deleted_count={self.deleted_count}",
"raw_results=..." if self.raw_results is not None else None,
]
)
def to_bulk_write_result(self, index_in_bulk_write: int) -> BulkWriteResult:
return BulkWriteResult(
bulk_api_results={index_in_bulk_write: self.raw_results},
deleted_count=self.deleted_count,
inserted_count=0,
matched_count=0,
modified_count=0,
upserted_count=0,
upserted_ids={},
)
@dataclass
class InsertOneResult(OperationResult):
"""
Class that represents the result of insert_one operations.
Attributes:
raw_results: one-item list with the response from the Data API call
inserted_id: the ID of the inserted document
"""
inserted_id: Any
def __repr__(self) -> str:
return self._piecewise_repr(
[
f"inserted_id={self.inserted_id}",
"raw_results=..." if self.raw_results is not None else None,
]
)
def to_bulk_write_result(self, index_in_bulk_write: int) -> BulkWriteResult:
return BulkWriteResult(
bulk_api_results={index_in_bulk_write: self.raw_results},
deleted_count=0,
inserted_count=1,
matched_count=0,
modified_count=0,
upserted_count=0,
upserted_ids={},
)
@dataclass
class InsertManyResult(OperationResult):
"""
Class that represents the result of insert_many operations.
Attributes:
raw_results: responses from the Data API calls
inserted_ids: list of the IDs of the inserted documents
"""
inserted_ids: list[Any]
def __repr__(self) -> str:
return self._piecewise_repr(
[
f"inserted_ids={self.inserted_ids}",
"raw_results=..." if self.raw_results is not None else None,
]
)
def to_bulk_write_result(self, index_in_bulk_write: int) -> BulkWriteResult:
return BulkWriteResult(
bulk_api_results={index_in_bulk_write: self.raw_results},
deleted_count=0,
inserted_count=len(self.inserted_ids),
matched_count=0,
modified_count=0,
upserted_count=0,
upserted_ids={},
)
@dataclass
class UpdateResult(OperationResult):
"""
Class that represents the result of any update operation.
Attributes:
raw_results: responses from the Data API calls
update_info: a dictionary reporting about the update
Note:
the "update_info" field has the following fields: "n" (int),
"updatedExisting" (bool), "ok" (float), "nModified" (int)
and optionally "upserted" containing the ID of an upserted document.
"""
update_info: dict[str, Any]
def __repr__(self) -> str:
return self._piecewise_repr(
[
f"update_info={self.update_info}",
"raw_results=..." if self.raw_results is not None else None,
]
)
def to_bulk_write_result(self, index_in_bulk_write: int) -> BulkWriteResult:
inserted_count = 1 if "upserted" in self.update_info else 0
matched_count = (self.update_info.get("n") or 0) - inserted_count
if "upserted" in self.update_info:
upserted_ids = {index_in_bulk_write: self.update_info["upserted"]}
else:
upserted_ids = {}
return BulkWriteResult(
bulk_api_results={index_in_bulk_write: self.raw_results},
deleted_count=0,
inserted_count=inserted_count,
matched_count=matched_count,
modified_count=self.update_info.get("nModified") or 0,
upserted_count=1 if "upserted" in self.update_info else 0,
upserted_ids=upserted_ids,
)
@dataclass
class BulkWriteResult:
"""
Class that represents the result of a bulk write operations.
Indices in the maps below refer to the position of each write operation
in the list of operations passed to the bulk_write command.
The numeric counts refer to the whole of the bulk write.
Attributes:
bulk_api_results: a map from indices to the corresponding raw responses
deleted_count: number of deleted documents
inserted_count: number of inserted documents
matched_count: number of matched documents
modified_count: number of modified documents
upserted_count: number of upserted documents
upserted_ids: a (sparse) map from indices to ID of the upserted document
"""
bulk_api_results: dict[int, list[dict[str, Any]]]
deleted_count: int
inserted_count: int
matched_count: int
modified_count: int
upserted_count: int
upserted_ids: dict[int, Any]
def __repr__(self) -> str:
pieces = [
f"deleted_count={self.deleted_count}",
f"inserted_count={self.inserted_count}",
f"matched_count={self.matched_count}",
f"modified_count={self.modified_count}",
f"upserted_count={self.upserted_count}",
f"upserted_ids={self.upserted_ids}",
"bulk_api_results=..." if self.bulk_api_results else None,
]
return f"{self.__class__.__name__}({', '.join(pc for pc in pieces if pc)})"
@staticmethod
def zero() -> BulkWriteResult:
"""
Return an empty BulkWriteResult, for use in no-ops and list reductions.
"""
return BulkWriteResult(
bulk_api_results={},
deleted_count=0,
inserted_count=0,
matched_count=0,
modified_count=0,
upserted_count=0,
upserted_ids={},
)
Classes
class BulkWriteResult (bulk_api_results: dict[int, list[dict[str, Any]]], deleted_count: int, inserted_count: int, matched_count: int, modified_count: int, upserted_count: int, upserted_ids: dict[int, Any])
-
Class that represents the result of a bulk write operations.
Indices in the maps below refer to the position of each write operation in the list of operations passed to the bulk_write command.
The numeric counts refer to the whole of the bulk write.
Attributes
bulk_api_results
- a map from indices to the corresponding raw responses
deleted_count
- number of deleted documents
inserted_count
- number of inserted documents
matched_count
- number of matched documents
modified_count
- number of modified documents
upserted_count
- number of upserted documents
upserted_ids
- a (sparse) map from indices to ID of the upserted document
Expand source code
@dataclass class BulkWriteResult: """ Class that represents the result of a bulk write operations. Indices in the maps below refer to the position of each write operation in the list of operations passed to the bulk_write command. The numeric counts refer to the whole of the bulk write. Attributes: bulk_api_results: a map from indices to the corresponding raw responses deleted_count: number of deleted documents inserted_count: number of inserted documents matched_count: number of matched documents modified_count: number of modified documents upserted_count: number of upserted documents upserted_ids: a (sparse) map from indices to ID of the upserted document """ bulk_api_results: dict[int, list[dict[str, Any]]] deleted_count: int inserted_count: int matched_count: int modified_count: int upserted_count: int upserted_ids: dict[int, Any] def __repr__(self) -> str: pieces = [ f"deleted_count={self.deleted_count}", f"inserted_count={self.inserted_count}", f"matched_count={self.matched_count}", f"modified_count={self.modified_count}", f"upserted_count={self.upserted_count}", f"upserted_ids={self.upserted_ids}", "bulk_api_results=..." if self.bulk_api_results else None, ] return f"{self.__class__.__name__}({', '.join(pc for pc in pieces if pc)})" @staticmethod def zero() -> BulkWriteResult: """ Return an empty BulkWriteResult, for use in no-ops and list reductions. """ return BulkWriteResult( bulk_api_results={}, deleted_count=0, inserted_count=0, matched_count=0, modified_count=0, upserted_count=0, upserted_ids={}, )
Class variables
var bulk_api_results : dict[int, list[dict[str, typing.Any]]]
var deleted_count : int
var inserted_count : int
var matched_count : int
var modified_count : int
var upserted_count : int
var upserted_ids : dict[int, typing.Any]
Static methods
def zero() ‑> BulkWriteResult
-
Return an empty BulkWriteResult, for use in no-ops and list reductions.
Expand source code
@staticmethod def zero() -> BulkWriteResult: """ Return an empty BulkWriteResult, for use in no-ops and list reductions. """ return BulkWriteResult( bulk_api_results={}, deleted_count=0, inserted_count=0, matched_count=0, modified_count=0, upserted_count=0, upserted_ids={}, )
class DeleteResult (raw_results: list[dict[str, Any]], deleted_count: int)
-
Class that represents the result of delete operations.
Attributes
deleted_count
- number of deleted documents
raw_results
- response/responses from the Data API call. Depending on the exact delete method being used, this list of raw responses can contain exactly one or a number of items.
Expand source code
@dataclass class DeleteResult(OperationResult): """ Class that represents the result of delete operations. Attributes: deleted_count: number of deleted documents raw_results: response/responses from the Data API call. Depending on the exact delete method being used, this list of raw responses can contain exactly one or a number of items. """ deleted_count: int def __repr__(self) -> str: return self._piecewise_repr( [ f"deleted_count={self.deleted_count}", "raw_results=..." if self.raw_results is not None else None, ] ) def to_bulk_write_result(self, index_in_bulk_write: int) -> BulkWriteResult: return BulkWriteResult( bulk_api_results={index_in_bulk_write: self.raw_results}, deleted_count=self.deleted_count, inserted_count=0, matched_count=0, modified_count=0, upserted_count=0, upserted_ids={}, )
Ancestors
- OperationResult
- abc.ABC
Class variables
var deleted_count : int
Methods
def to_bulk_write_result(self, index_in_bulk_write: int) ‑> BulkWriteResult
-
Expand source code
def to_bulk_write_result(self, index_in_bulk_write: int) -> BulkWriteResult: return BulkWriteResult( bulk_api_results={index_in_bulk_write: self.raw_results}, deleted_count=self.deleted_count, inserted_count=0, matched_count=0, modified_count=0, upserted_count=0, upserted_ids={}, )
class InsertManyResult (raw_results: list[dict[str, Any]], inserted_ids: list[Any])
-
Class that represents the result of insert_many operations.
Attributes
raw_results
- responses from the Data API calls
inserted_ids
- list of the IDs of the inserted documents
Expand source code
@dataclass class InsertManyResult(OperationResult): """ Class that represents the result of insert_many operations. Attributes: raw_results: responses from the Data API calls inserted_ids: list of the IDs of the inserted documents """ inserted_ids: list[Any] def __repr__(self) -> str: return self._piecewise_repr( [ f"inserted_ids={self.inserted_ids}", "raw_results=..." if self.raw_results is not None else None, ] ) def to_bulk_write_result(self, index_in_bulk_write: int) -> BulkWriteResult: return BulkWriteResult( bulk_api_results={index_in_bulk_write: self.raw_results}, deleted_count=0, inserted_count=len(self.inserted_ids), matched_count=0, modified_count=0, upserted_count=0, upserted_ids={}, )
Ancestors
- OperationResult
- abc.ABC
Class variables
var inserted_ids : list[typing.Any]
Methods
def to_bulk_write_result(self, index_in_bulk_write: int) ‑> BulkWriteResult
-
Expand source code
def to_bulk_write_result(self, index_in_bulk_write: int) -> BulkWriteResult: return BulkWriteResult( bulk_api_results={index_in_bulk_write: self.raw_results}, deleted_count=0, inserted_count=len(self.inserted_ids), matched_count=0, modified_count=0, upserted_count=0, upserted_ids={}, )
class InsertOneResult (raw_results: list[dict[str, Any]], inserted_id: Any)
-
Class that represents the result of insert_one operations.
Attributes
raw_results
- one-item list with the response from the Data API call
inserted_id
- the ID of the inserted document
Expand source code
@dataclass class InsertOneResult(OperationResult): """ Class that represents the result of insert_one operations. Attributes: raw_results: one-item list with the response from the Data API call inserted_id: the ID of the inserted document """ inserted_id: Any def __repr__(self) -> str: return self._piecewise_repr( [ f"inserted_id={self.inserted_id}", "raw_results=..." if self.raw_results is not None else None, ] ) def to_bulk_write_result(self, index_in_bulk_write: int) -> BulkWriteResult: return BulkWriteResult( bulk_api_results={index_in_bulk_write: self.raw_results}, deleted_count=0, inserted_count=1, matched_count=0, modified_count=0, upserted_count=0, upserted_ids={}, )
Ancestors
- OperationResult
- abc.ABC
Class variables
var inserted_id : Any
Methods
def to_bulk_write_result(self, index_in_bulk_write: int) ‑> BulkWriteResult
-
Expand source code
def to_bulk_write_result(self, index_in_bulk_write: int) -> BulkWriteResult: return BulkWriteResult( bulk_api_results={index_in_bulk_write: self.raw_results}, deleted_count=0, inserted_count=1, matched_count=0, modified_count=0, upserted_count=0, upserted_ids={}, )
class OperationResult (raw_results: list[dict[str, Any]])
-
Class that represents the generic result of a single mutation operation.
Attributes
raw_results
- response/responses from the Data API call. Depending on the exact delete method being used, this list of raw responses can contain exactly one or a number of items.
Expand source code
@dataclass class OperationResult(ABC): """ Class that represents the generic result of a single mutation operation. Attributes: raw_results: response/responses from the Data API call. Depending on the exact delete method being used, this list of raw responses can contain exactly one or a number of items. """ raw_results: list[dict[str, Any]] def _piecewise_repr(self, pieces: list[str | None]) -> str: return f"{self.__class__.__name__}({', '.join(pc for pc in pieces if pc)})" @abstractmethod def to_bulk_write_result(self, index_in_bulk_write: int) -> BulkWriteResult: ...
Ancestors
- abc.ABC
Subclasses
Class variables
var raw_results : list[dict[str, typing.Any]]
Methods
def to_bulk_write_result(self, index_in_bulk_write: int) ‑> BulkWriteResult
-
Expand source code
@abstractmethod def to_bulk_write_result(self, index_in_bulk_write: int) -> BulkWriteResult: ...
class UpdateResult (raw_results: list[dict[str, Any]], update_info: dict[str, Any])
-
Class that represents the result of any update operation.
Attributes
raw_results
- responses from the Data API calls
update_info
- a dictionary reporting about the update
Note
the "update_info" field has the following fields: "n" (int), "updatedExisting" (bool), "ok" (float), "nModified" (int) and optionally "upserted" containing the ID of an upserted document.
Expand source code
@dataclass class UpdateResult(OperationResult): """ Class that represents the result of any update operation. Attributes: raw_results: responses from the Data API calls update_info: a dictionary reporting about the update Note: the "update_info" field has the following fields: "n" (int), "updatedExisting" (bool), "ok" (float), "nModified" (int) and optionally "upserted" containing the ID of an upserted document. """ update_info: dict[str, Any] def __repr__(self) -> str: return self._piecewise_repr( [ f"update_info={self.update_info}", "raw_results=..." if self.raw_results is not None else None, ] ) def to_bulk_write_result(self, index_in_bulk_write: int) -> BulkWriteResult: inserted_count = 1 if "upserted" in self.update_info else 0 matched_count = (self.update_info.get("n") or 0) - inserted_count if "upserted" in self.update_info: upserted_ids = {index_in_bulk_write: self.update_info["upserted"]} else: upserted_ids = {} return BulkWriteResult( bulk_api_results={index_in_bulk_write: self.raw_results}, deleted_count=0, inserted_count=inserted_count, matched_count=matched_count, modified_count=self.update_info.get("nModified") or 0, upserted_count=1 if "upserted" in self.update_info else 0, upserted_ids=upserted_ids, )
Ancestors
- OperationResult
- abc.ABC
Class variables
var update_info : dict[str, typing.Any]
Methods
def to_bulk_write_result(self, index_in_bulk_write: int) ‑> BulkWriteResult
-
Expand source code
def to_bulk_write_result(self, index_in_bulk_write: int) -> BulkWriteResult: inserted_count = 1 if "upserted" in self.update_info else 0 matched_count = (self.update_info.get("n") or 0) - inserted_count if "upserted" in self.update_info: upserted_ids = {index_in_bulk_write: self.update_info["upserted"]} else: upserted_ids = {} return BulkWriteResult( bulk_api_results={index_in_bulk_write: self.raw_results}, deleted_count=0, inserted_count=inserted_count, matched_count=matched_count, modified_count=self.update_info.get("nModified") or 0, upserted_count=1 if "upserted" in self.update_info else 0, upserted_ids=upserted_ids, )