Skip to content

Commit

Permalink
Merge pull request #195 from poissoncorp/RDBC-698
Browse files Browse the repository at this point in the history
RDBC-698 Python client - timeseries round 2
  • Loading branch information
ml054 authored Dec 4, 2023
2 parents 4b57c05 + 9fa19e6 commit 2fcf58e
Show file tree
Hide file tree
Showing 55 changed files with 2,855 additions and 427 deletions.
2 changes: 1 addition & 1 deletion ravendb/documents/bulk_insert_operation.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from typing import Optional, TYPE_CHECKING

import requests
from ravendb import constants
from ravendb.primitives import constants
from ravendb.exceptions.raven_exceptions import RavenException
from ravendb.http.server_node import ServerNode
from ravendb.http.raven_command import RavenCommand
Expand Down
6 changes: 3 additions & 3 deletions ravendb/documents/commands/batches.py
Original file line number Diff line number Diff line change
Expand Up @@ -563,7 +563,7 @@ def __init__(
source_name: str,
destination_document_id: str,
destination_name: str,
change_vector: str,
change_vector: Optional[str],
):
if source_document_id.isspace():
raise ValueError("source_document_id is required")
Expand Down Expand Up @@ -595,7 +595,7 @@ def __init__(
name: str,
destination_id: str,
destination_name: str,
change_vector: str,
change_vector: Optional[str],
):
if key.isspace():
raise ValueError("source_document_id is required")
Expand All @@ -621,7 +621,7 @@ def serialize(self, conventions: DocumentConventions) -> dict:


class DeleteAttachmentCommandData(CommandData):
def __init__(self, document_id: str, name: str, change_vector: str):
def __init__(self, document_id: str, name: str, change_vector: Optional[str]):
if not document_id:
raise ValueError(document_id)
if not name:
Expand Down
49 changes: 35 additions & 14 deletions ravendb/documents/commands/crud.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,15 @@
import http
import json
from typing import Optional, List
from typing import TYPE_CHECKING
import requests

from ravendb import constants
from ravendb.documents.session.time_series import (
TimeSeriesRange,
TimeSeriesTimeRange,
TimeSeriesCountRange,
AbstractTimeSeriesRange,
)
from ravendb.primitives import constants
from ravendb.documents.commands.results import GetDocumentsResult
from ravendb.documents.queries.utils import HashCalculator
from ravendb.http.misc import ResponseDisposeHandling
Expand All @@ -18,9 +23,6 @@
from ravendb.http.server_node import ServerNode
from ravendb.tools.utils import Utils

if TYPE_CHECKING:
from ravendb.documents.conventions import DocumentConventions


class PutResult:
def __init__(self, key: Optional[str] = None, change_vector: Optional[str] = None):
Expand Down Expand Up @@ -76,7 +78,7 @@ def create_request(self, node: ServerNode) -> requests.Request:


class HeadDocumentCommand(RavenCommand[str]):
def __init__(self, key: str, change_vector: str):
def __init__(self, key: str, change_vector: Optional[str]):
super(HeadDocumentCommand, self).__init__(str)
if key is None:
raise ValueError("Key cannot be None")
Expand Down Expand Up @@ -124,7 +126,7 @@ def __init__(self):
self._key: Optional[str] = None
self._counters: Optional[List[str]] = None
self._include_all_counters: Optional[bool] = None
self._time_series_includes: Optional[List] = None # todo: AbstractTimeSeriesRange
self._time_series_includes: Optional[List[AbstractTimeSeriesRange]] = None

self._compare_exchange_value_includes: Optional[List[str]] = None

Expand Down Expand Up @@ -248,19 +250,38 @@ def create_request(self, node: ServerNode) -> requests.Request:
for include in self._includes:
path_builder.append(f"&include={include}")

# todo: counters
if self._include_all_counters:
path_builder.append(f"&counter={constants.Counters.ALL}")
elif self._counters:
for counter in self._counters:
path_builder.append(f"&counter={counter}")

# todo: time series
if self._time_series_includes is not None:
for time_series in self._time_series_includes:
path_builder.append(
f"&timeseries={time_series.name}&from={time_series.from_date}&to={time_series.to_date}"
)
for ts_include in self._time_series_includes:
if isinstance(ts_include, TimeSeriesRange):
range_: TimeSeriesRange = ts_include
path_builder.append(
f"&timeseries={range_.name}"
f"&from={Utils.datetime_to_string(range_.from_date) if range_.from_date else ''}"
f"&to={Utils.datetime_to_string(range_.to_date) if range_.to_date else ''}"
)
elif isinstance(ts_include, TimeSeriesTimeRange):
time_range: TimeSeriesTimeRange = ts_include
path_builder.append(
f"&timeseriestime={time_range.name}"
f"&timeType={time_range.type.value}"
f"&timeValue={time_range.time.value}"
f"&timeUnit={time_range.time.unit.value}"
)
elif isinstance(ts_include, TimeSeriesCountRange):
count_range: TimeSeriesCountRange = ts_include
path_builder.append(
f"&timeseriescount={count_range.name}"
f"&countType={count_range.type.value}"
f"&countValue={count_range.count}"
)
else:
raise TypeError(f"Unexpected TimeSeries range {ts_include.__class__.__name__}")

if self._compare_exchange_value_includes is not None:
for compare_exchange_value in self._compare_exchange_value_includes:
Expand Down Expand Up @@ -368,7 +389,7 @@ def create_request(self, node: ServerNode) -> requests.Request:


class HeadAttachmentCommand(RavenCommand[str]):
def __init__(self, document_id: str, name: str, change_vector: str):
def __init__(self, document_id: str, name: str, change_vector: Optional[str]):
super().__init__(str)

if document_id.isspace():
Expand Down
2 changes: 1 addition & 1 deletion ravendb/documents/commands/multi_get.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import requests

from ravendb import constants
from ravendb.primitives import constants
from ravendb.http.misc import AggressiveCacheOptions, AggressiveCacheMode
from ravendb.http.request_executor import RequestExecutor
from ravendb.extensions.http_extensions import HttpExtensions
Expand Down
2 changes: 1 addition & 1 deletion ravendb/documents/conventions.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

from typing import TypeVar
from ravendb.json.metadata_as_dictionary import MetadataAsDictionary
from ravendb import constants
from ravendb.primitives import constants
from ravendb.documents.operations.configuration import ClientConfiguration, LoadBalanceBehavior, ReadBalanceBehavior
from ravendb.documents.indexes.definitions import SortOptions
from ravendb.tools.utils import Utils
Expand Down
4 changes: 2 additions & 2 deletions ravendb/documents/indexes/counters.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from typing import Dict, Set, Optional, Callable, Union
from typing import Dict, Set, Optional, Callable

from ravendb import constants
from ravendb.primitives import constants
from ravendb.documents.conventions import DocumentConventions
from ravendb.documents.indexes.definitions import (
FieldStorage,
Expand Down
2 changes: 1 addition & 1 deletion ravendb/documents/indexes/index_creation.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from abc import abstractmethod, ABC
from typing import Generic, TypeVar, Union, Dict, Set, Callable, Optional, List, Collection

from ravendb import constants
from ravendb.primitives import constants
from ravendb.documents.conventions import DocumentConventions
from ravendb.documents.indexes.spatial.configuration import SpatialOptionsFactory
from ravendb.documents.store.definition import DocumentStore, DocumentStoreBase
Expand Down
4 changes: 2 additions & 2 deletions ravendb/documents/operations/attachments/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import requests

from ravendb import constants
from ravendb.primitives import constants
from ravendb.data.operation import AttachmentType
from ravendb.documents.operations.definitions import IOperation, VoidOperation
from ravendb.http.http_cache import HttpCache
Expand Down Expand Up @@ -152,7 +152,7 @@ def is_read_request(self) -> bool:


class GetAttachmentOperation(IOperation):
def __init__(self, document_id: str, name: str, attachment_type: AttachmentType, change_vector: str):
def __init__(self, document_id: str, name: str, attachment_type: AttachmentType, change_vector: Optional[str]):
if document_id is None:
raise ValueError("Invalid document_id")
if name is None:
Expand Down
2 changes: 1 addition & 1 deletion ravendb/documents/operations/batch.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from copy import deepcopy
from typing import Union, List, Dict, TYPE_CHECKING, Optional

from ravendb import constants
from ravendb.primitives import constants
from ravendb.documents.commands.batches import SingleNodeBatchCommand, ClusterWideBatchCommand, CommandType
from ravendb.documents.operations.patch import PatchStatus
from ravendb.documents.session.event_args import AfterSaveChangesEventArgs
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from enum import Enum
from typing import Union, Optional, Generic, TypeVar, Type

from ravendb import constants
from ravendb.primitives import constants
from ravendb.documents.conventions import DocumentConventions
from ravendb.documents.commands.batches import PutCompareExchangeCommandData, DeleteCompareExchangeCommandData
from ravendb.documents.session.document_session_operations.misc import _update_metadata_modifications
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import json
from typing import Dict, Type, TypeVar, Optional

from ravendb import constants
from ravendb.primitives import constants
from ravendb.documents.conventions import DocumentConventions
from ravendb.documents.operations.compare_exchange.compare_exchange import CompareExchangeValue
from ravendb.json.metadata_as_dictionary import MetadataAsDictionary
Expand Down
6 changes: 3 additions & 3 deletions ravendb/documents/operations/compare_exchange/operations.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from __future__ import annotations
import json
from typing import Union, Optional, Generic, TypeVar, Dict, TYPE_CHECKING, Type, Collection
from typing import Optional, Generic, TypeVar, Dict, TYPE_CHECKING, Type, Collection

import requests

from ravendb import constants
from ravendb.primitives import constants
from ravendb.documents.conventions import DocumentConventions
from ravendb.documents.operations.compare_exchange.compare_exchange import (
CompareExchangeValue,
Expand All @@ -21,7 +21,7 @@
from ravendb.json.metadata_as_dictionary import MetadataAsDictionary
from ravendb.documents.session.entity_to_json import EntityToJson
from ravendb.tools.utils import Utils
from ravendb.util.util import RaftIdGenerator, StartingWithOptions
from ravendb.util.util import RaftIdGenerator

_T = TypeVar("_T")

Expand Down
57 changes: 23 additions & 34 deletions ravendb/documents/operations/time_series.py
Original file line number Diff line number Diff line change
@@ -1,51 +1,52 @@
from __future__ import annotations

import abc
import datetime
import json
from typing import Dict, Optional, List, Any, TYPE_CHECKING, Callable
import requests

from ravendb.constants import int_max
from ravendb.primitives.constants import int_max
from ravendb.documents.session.loaders.include import TimeSeriesIncludeBuilder
from ravendb.documents.session.time_series import TimeSeriesEntry
from ravendb.documents.session.time_series import TimeSeriesEntry, AbstractTimeSeriesRange
from ravendb.http.http_cache import HttpCache
from ravendb.http.server_node import ServerNode
from ravendb.http.topology import RaftCommand
from ravendb.http.raven_command import RavenCommand, VoidRavenCommand
from ravendb.documents.operations.definitions import MaintenanceOperation, IOperation, VoidOperation
from ravendb.primitives.time_series import TimeValue
from ravendb.tools.utils import Utils
from ravendb.util.util import RaftIdGenerator
from ravendb.documents.conventions import DocumentConventions

if TYPE_CHECKING:
from ravendb.documents.conventions import DocumentConventions
from ravendb.documents.store.definition import DocumentStore


class TimeSeriesPolicy:
def __init__(
self,
name: str,
aggregation_time: Optional[datetime.timedelta] = None,
retention_time: datetime.timedelta = datetime.timedelta.max,
name: Optional[str] = None,
aggregation_time: Optional[TimeValue] = None,
retention_time: TimeValue = TimeValue.MAX_VALUE(),
):
if not name or name.isspace():
raise ValueError("Name cannot be None or empty")

if aggregation_time is not None and aggregation_time < datetime.timedelta(0):
if aggregation_time is not None and aggregation_time.compare_to(TimeValue.ZERO()) <= 0:
raise ValueError("Aggregation time must be greater than zero")

if retention_time < datetime.timedelta(0):
if retention_time is not None and retention_time.compare_to(TimeValue.ZERO()) <= 0:
raise ValueError("Retention time must be greater than zero")

self.name = name
self.retention_time = retention_time
self.aggregation_time = aggregation_time

self.name = name

@classmethod
def from_json(cls, json_dict: Dict[str, Any]) -> TimeSeriesPolicy:
return cls(
json_dict["Name"],
json_dict["Name"], # todo: Invalid deserialization
Utils.string_to_timedelta(json_dict["AggregationTime"]),
Utils.string_to_timedelta(json_dict["RetentionTime"]),
)
Expand All @@ -55,7 +56,7 @@ def get_time_series_name(self, raw_name: str) -> str:

def to_json(self) -> Dict[str, Any]:
return {
"Name": self.name,
"Name": self.name, # todo: Invalid serialization
"AggregationTime": Utils.timedelta_to_str(self.aggregation_time),
"RetentionTime": Utils.timedelta_to_str(self.retention_time),
}
Expand All @@ -66,14 +67,14 @@ class RawTimeSeriesPolicy(TimeSeriesPolicy):

@classmethod
def DEFAULT_POLICY(cls) -> RawTimeSeriesPolicy:
return cls()
return cls(TimeValue.MAX_VALUE())

def __init__(self, retention_time: Optional[datetime.timedelta] = datetime.timedelta.max):
if retention_time != datetime.timedelta.max:
if retention_time <= datetime.timedelta(0):
raise ValueError("Retention time must be greater than zero")
def __init__(self, retention_time: TimeValue = TimeValue.MAX_VALUE()):
if retention_time.compare_to(TimeValue.ZERO()) <= 0:
raise ValueError("Retention time must be greater than zero")

super(RawTimeSeriesPolicy, self).__init__(self.POLICY_STRING, None, retention_time)
self.name = self.POLICY_STRING
self.retention_time = retention_time


class TimeSeriesCollectionConfiguration:
Expand Down Expand Up @@ -340,9 +341,9 @@ def __init__(self, name: Optional[str] = None):
def to_json(self) -> Dict[str, Any]:
json_dict = {"Name": self.name}
if self._appends:
json_dict["Appends"] = self._appends
json_dict["Appends"] = [append_op.to_json() for append_op in self._appends]
if self._deletes:
json_dict["Deletes"] = self._deletes
json_dict["Deletes"] = [delete_op.to_json() for delete_op in self._deletes]
return json_dict

def append(self, append_operation: AppendOperation) -> None:
Expand All @@ -363,18 +364,6 @@ def delete(self, delete_operation: DeleteOperation) -> None:
self._deletes.append(delete_operation)


class AbstractTimeSeriesRange(abc.ABC):
def __init__(self, name: str):
self.name = name


class TimeSeriesRange(AbstractTimeSeriesRange):
def __init__(self, name: str, from_date: Optional[datetime.datetime], to_date: Optional[datetime.datetime]):
super().__init__(name)
self.from_date = from_date
self.to_date = to_date


class TimeSeriesRangeResult:
def __init__(
self,
Expand Down Expand Up @@ -529,7 +518,7 @@ class GetMultipleTimeSeriesOperation(IOperation[TimeSeriesDetails]):
def __init__(
self,
doc_id: str,
ranges: List[TimeSeriesRange],
ranges: List[AbstractTimeSeriesRange],
start: Optional[int] = 0,
page_size: Optional[int] = int_max,
includes: Optional[Callable[[TimeSeriesIncludeBuilder], None]] = None,
Expand All @@ -555,7 +544,7 @@ class GetMultipleTimeSeriesCommand(RavenCommand[TimeSeriesDetails]):
def __init__(
self,
doc_id: str,
ranges: List[TimeSeriesRange],
ranges: List[AbstractTimeSeriesRange],
start: Optional[int] = 0,
page_size: Optional[int] = int_max,
includes: Optional[Callable[[TimeSeriesIncludeBuilder], None]] = None,
Expand Down
2 changes: 1 addition & 1 deletion ravendb/documents/queries/facets/misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import enum
from typing import Union, List, Dict

from ravendb import constants
from ravendb.primitives import constants


class FacetAggregation(enum.Enum):
Expand Down
2 changes: 1 addition & 1 deletion ravendb/documents/queries/index_query.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import datetime
from typing import TypeVar, Generic, Union, Optional, Dict

from ravendb import constants
from ravendb.primitives import constants
from ravendb.documents.queries.query import ProjectionBehavior
from ravendb.documents.queries.utils import HashCalculator

Expand Down
Loading

0 comments on commit 2fcf58e

Please sign in to comment.