Changeset View
Changeset View
Standalone View
Standalone View
swh/storage/cassandra/storage.py
Show All 26 Lines | from swh.model.model import ( | ||||
Snapshot, | Snapshot, | ||||
Origin, | Origin, | ||||
MetadataAuthority, | MetadataAuthority, | ||||
MetadataAuthorityType, | MetadataAuthorityType, | ||||
MetadataFetcher, | MetadataFetcher, | ||||
MetadataTargetType, | MetadataTargetType, | ||||
RawExtrinsicMetadata, | RawExtrinsicMetadata, | ||||
) | ) | ||||
from swh.storage.interface import PagedResult | from swh.storage.interface import ListOrder, PagedResult | ||||
from swh.storage.objstorage import ObjStorage | from swh.storage.objstorage import ObjStorage | ||||
from swh.storage.writer import JournalWriter | from swh.storage.writer import JournalWriter | ||||
from swh.storage.utils import map_optional, now | from swh.storage.utils import map_optional, now | ||||
from ..exc import StorageArgumentException, HashCollision | from ..exc import StorageArgumentException, HashCollision | ||||
from .common import TOKEN_BEGIN, TOKEN_END | from .common import TOKEN_BEGIN, TOKEN_END | ||||
from . import converters | from . import converters | ||||
from .cql import CqlRunner | from .cql import CqlRunner | ||||
▲ Show 20 Lines • Show All 797 Lines • ▼ Show 20 Lines | def _format_origin_visit_row(visit): | ||||
"origin": visit.origin, | "origin": visit.origin, | ||||
"date": visit.date.replace(tzinfo=datetime.timezone.utc), | "date": visit.date.replace(tzinfo=datetime.timezone.utc), | ||||
} | } | ||||
def origin_visit_get( | def origin_visit_get( | ||||
self, | self, | ||||
origin: str, | origin: str, | ||||
page_token: Optional[str] = None, | page_token: Optional[str] = None, | ||||
order: str = "asc", | order: ListOrder = ListOrder.ASC, | ||||
limit: int = 10, | limit: int = 10, | ||||
) -> PagedResult[OriginVisit]: | ) -> PagedResult[OriginVisit]: | ||||
order = order.lower() | if not isinstance(order, ListOrder): | ||||
allowed_orders = ["asc", "desc"] | raise StorageArgumentException("order must be a ListOrder value") | ||||
if order not in allowed_orders: | |||||
raise StorageArgumentException( | |||||
f"order must be one of {', '.join(allowed_orders)}." | |||||
) | |||||
if page_token and not isinstance(page_token, str): | if page_token and not isinstance(page_token, str): | ||||
raise StorageArgumentException("page_token must be a string.") | raise StorageArgumentException("page_token must be a string.") | ||||
next_page_token = None | next_page_token = None | ||||
visit_from = page_token and int(page_token) | visit_from = page_token and int(page_token) | ||||
visits: List[OriginVisit] = [] | visits: List[OriginVisit] = [] | ||||
extra_limit = limit + 1 | extra_limit = limit + 1 | ||||
rows = self._cql_runner.origin_visit_get(origin, visit_from, extra_limit, order) | rows = self._cql_runner.origin_visit_get(origin, visit_from, extra_limit, order) | ||||
for row in rows: | for row in rows: | ||||
visits.append(converters.row_to_visit(row)) | visits.append(converters.row_to_visit(row)) | ||||
assert len(visits) <= extra_limit | assert len(visits) <= extra_limit | ||||
if len(visits) == extra_limit: | if len(visits) == extra_limit: | ||||
last_visit = visits[limit] | last_visit = visits[limit] | ||||
visits = visits[:limit] | visits = visits[:limit] | ||||
assert last_visit is not None and last_visit.visit is not None | assert last_visit is not None and last_visit.visit is not None | ||||
if order == "asc": | if order == ListOrder.ASC: | ||||
next_page_token = str(last_visit.visit - 1) | next_page_token = str(last_visit.visit - 1) | ||||
else: | else: | ||||
next_page_token = str(last_visit.visit + 1) | next_page_token = str(last_visit.visit + 1) | ||||
return PagedResult(results=visits, next_page_token=next_page_token) | return PagedResult(results=visits, next_page_token=next_page_token) | ||||
def origin_visit_find_by_date( | def origin_visit_find_by_date( | ||||
self, origin: str, visit_date: datetime.datetime | self, origin: str, visit_date: datetime.datetime | ||||
▲ Show 20 Lines • Show All 307 Lines • Show Last 20 Lines |