Changeset View
Changeset View
Standalone View
Standalone View
swh/storage/in_memory.py
Show First 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | from swh.model.model import ( | ||||
SHA1_SIZE, | SHA1_SIZE, | ||||
MetadataAuthority, | MetadataAuthority, | ||||
MetadataAuthorityType, | MetadataAuthorityType, | ||||
MetadataFetcher, | MetadataFetcher, | ||||
MetadataTargetType, | MetadataTargetType, | ||||
RawExtrinsicMetadata, | RawExtrinsicMetadata, | ||||
) | ) | ||||
from swh.model.hashutil import DEFAULT_ALGORITHMS, hash_to_bytes, hash_to_hex | from swh.model.hashutil import DEFAULT_ALGORITHMS, hash_to_bytes, hash_to_hex | ||||
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.utils import now | from swh.storage.utils import now | ||||
from .converters import origin_url_to_sha1 | from .converters import origin_url_to_sha1 | ||||
from .exc import StorageArgumentException, HashCollision | from .exc import StorageArgumentException, HashCollision | ||||
from .utils import get_partition_bounds_bytes | from .utils import get_partition_bounds_bytes | ||||
from .writer import JournalWriter | from .writer import JournalWriter | ||||
▲ Show 20 Lines • Show All 796 Lines • ▼ Show 20 Lines | def _origin_visit_get_updated(self, origin: str, visit_id: int) -> Dict[str, Any]: | ||||
# but keep the date of the creation of the origin visit | # but keep the date of the creation of the origin visit | ||||
"date": visit.date, | "date": visit.date, | ||||
} | } | ||||
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]: | ||||
next_page_token = None | next_page_token = None | ||||
page_token = page_token or "0" | page_token = page_token or "0" | ||||
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 not isinstance(page_token, str): | if not isinstance(page_token, str): | ||||
raise StorageArgumentException("page_token must be a string.") | raise StorageArgumentException("page_token must be a string.") | ||||
visit_from = int(page_token) | visit_from = int(page_token) | ||||
origin_url = self._get_origin_url(origin) | origin_url = self._get_origin_url(origin) | ||||
extra_limit = limit + 1 | extra_limit = limit + 1 | ||||
visits = sorted( | visits = sorted( | ||||
self._origin_visits.get(origin_url, []), | self._origin_visits.get(origin_url, []), | ||||
key=lambda v: v.visit, | key=lambda v: v.visit, | ||||
reverse=(order == "desc"), | reverse=(order == ListOrder.DESC), | ||||
) | ) | ||||
if visit_from > 0 and order == "asc": | if visit_from > 0 and order == ListOrder.ASC: | ||||
visits = [v for v in visits if v.visit > visit_from] | visits = [v for v in visits if v.visit > visit_from] | ||||
elif visit_from > 0 and order == "desc": | elif visit_from > 0 and order == ListOrder.DESC: | ||||
visits = [v for v in visits if v.visit < visit_from] | visits = [v for v in visits if v.visit < visit_from] | ||||
visits = visits[:extra_limit] | visits = visits[:extra_limit] | ||||
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 326 Lines • Show Last 20 Lines |