Page MenuHomeSoftware Heritage
Paste P699

cass: origin-visit-status-get-latest
ActivePublic

Authored by ardumont on Jun 16 2020, 7:34 PM.
query_parts = [
"SELECT * FROM origin_visit_status ",
"WHERE origin = %s AND visit = %s ",
]
query_params: List[Any] = [origin, visit]
if require_snapshot:
query_parts.append("AND snapshot is not null ")
if allowed_statuses:
query_parts.append("AND status IN %s ")
query_params.append(tuple(allowed_statuses))
query_parts.append("ORDER BY date DESC LIMIT 1")
query = "\n".join(query_parts)
rows = list(self._execute_with_retries(query, query_params))
if not rows:
return None
row = rows[0]
visit_status = row._asdict()
visit_status['metadata'] = json.loads(row.metadata) if row.metadata else None
return visit_status

Event Timeline

def origin_visit_status_get_latest(
        self, origin: str, visit: int,
        allowed_statuses: Optional[List[str]] = None,
        require_snapshot: bool = False
) -> Optional[Dict[str, Any]]:
    """Given an origin visit id, return its latest origin_visit_status.

    """
    query = (
        "SELECT * FROM origin_visit_status "
        "WHERE origin = %s AND visit = %s "
        "ORDER BY date DESC"
    )
    rows = list(self._execute_with_retries(query, [origin, visit]))

    # filtering is done python side as we cannot do it server side
    if allowed_statuses:
        rows = [row for row in rows if row.status in allowed_statuses]
    if require_snapshot:
        rows = [row for row in rows if row.snapshot is not None]
    if not rows:
        return None
    # visit_status = max(rows, key=lambda v: (v.date, v.visit), default=None)
    return self._format_origin_visit_status_row(rows[0])