Changeset View
Changeset View
Standalone View
Standalone View
swh/provenance/postgresql/provenance.py
Show First 20 Lines • Show All 192 Lines • ▼ Show 20 Lines | def revision_get(self, ids: Iterable[Sha1Git]) -> Dict[Sha1Git, RevisionData]: | ||||
cursor.execute(query=sql, vars=sha1s) | cursor.execute(query=sql, vars=sha1s) | ||||
result.update( | result.update( | ||||
(row["sha1"], RevisionData(date=row["date"], origin=row["origin"])) | (row["sha1"], RevisionData(date=row["date"], origin=row["origin"])) | ||||
for row in cursor | for row in cursor | ||||
) | ) | ||||
return result | return result | ||||
def relation_add( | def relation_add( | ||||
self, relation: RelationType, data: Iterable[RelationData] | self, relation: RelationType, data: Dict[Sha1Git, Set[RelationData]] | ||||
) -> bool: | ) -> bool: | ||||
try: | try: | ||||
rows = [(rel.src, rel.dst, rel.path) for rel in data] | rows = [ | ||||
(src, rel.dst, rel.path) for src, dsts in data.items() for rel in dsts | |||||
] | |||||
if rows: | if rows: | ||||
rel_table = relation.value | rel_table = relation.value | ||||
src_table, *_, dst_table = rel_table.split("_") | src_table, *_, dst_table = rel_table.split("_") | ||||
# Put the next three queries in a manual single transaction: | # Put the next three queries in a manual single transaction: | ||||
# they use the same temp table | # they use the same temp table | ||||
with self.transaction() as cursor: | with self.transaction() as cursor: | ||||
cursor.execute("SELECT swh_mktemp_relation_add()") | cursor.execute("SELECT swh_mktemp_relation_add()") | ||||
Show All 9 Lines | ) -> bool: | ||||
# Unexpected error occurred, rollback all changes and log message | # Unexpected error occurred, rollback all changes and log message | ||||
LOGGER.exception("Unexpected error") | LOGGER.exception("Unexpected error") | ||||
if self.raise_on_commit: | if self.raise_on_commit: | ||||
raise | raise | ||||
return False | return False | ||||
def relation_get( | def relation_get( | ||||
self, relation: RelationType, ids: Iterable[Sha1Git], reverse: bool = False | self, relation: RelationType, ids: Iterable[Sha1Git], reverse: bool = False | ||||
) -> Set[RelationData]: | ) -> Dict[Sha1Git, Set[RelationData]]: | ||||
return self._relation_get(relation, ids, reverse) | return self._relation_get(relation, ids, reverse) | ||||
def relation_get_all(self, relation: RelationType) -> Set[RelationData]: | def relation_get_all( | ||||
self, relation: RelationType | |||||
) -> Dict[Sha1Git, Set[RelationData]]: | |||||
return self._relation_get(relation, None) | return self._relation_get(relation, None) | ||||
def _entity_get_date( | def _entity_get_date( | ||||
self, | self, | ||||
entity: Literal["content", "directory", "revision"], | entity: Literal["content", "directory", "revision"], | ||||
ids: Iterable[Sha1Git], | ids: Iterable[Sha1Git], | ||||
) -> Dict[Sha1Git, datetime]: | ) -> Dict[Sha1Git, datetime]: | ||||
dates: Dict[Sha1Git, datetime] = {} | dates: Dict[Sha1Git, datetime] = {} | ||||
Show All 34 Lines | ) -> bool: | ||||
raise | raise | ||||
return False | return False | ||||
def _relation_get( | def _relation_get( | ||||
self, | self, | ||||
relation: RelationType, | relation: RelationType, | ||||
ids: Optional[Iterable[Sha1Git]], | ids: Optional[Iterable[Sha1Git]], | ||||
reverse: bool = False, | reverse: bool = False, | ||||
) -> Set[RelationData]: | ) -> Dict[Sha1Git, Set[RelationData]]: | ||||
result: Set[RelationData] = set() | result: Dict[Sha1Git, Set[RelationData]] = {} | ||||
sha1s: List[Sha1Git] | sha1s: List[Sha1Git] | ||||
if ids is not None: | if ids is not None: | ||||
sha1s = list(ids) | sha1s = list(ids) | ||||
filter = "filter-src" if not reverse else "filter-dst" | filter = "filter-src" if not reverse else "filter-dst" | ||||
else: | else: | ||||
sha1s = [] | sha1s = [] | ||||
filter = "no-filter" | filter = "no-filter" | ||||
if filter == "no-filter" or sha1s: | if filter == "no-filter" or sha1s: | ||||
rel_table = relation.value | rel_table = relation.value | ||||
src_table, *_, dst_table = rel_table.split("_") | src_table, *_, dst_table = rel_table.split("_") | ||||
sql = "SELECT * FROM swh_provenance_relation_get(%s, %s, %s, %s, %s)" | sql = "SELECT * FROM swh_provenance_relation_get(%s, %s, %s, %s, %s)" | ||||
with self.transaction(readonly=True) as cursor: | with self.transaction(readonly=True) as cursor: | ||||
cursor.execute( | cursor.execute( | ||||
query=sql, vars=(rel_table, src_table, dst_table, filter, sha1s) | query=sql, vars=(rel_table, src_table, dst_table, filter, sha1s) | ||||
) | ) | ||||
result.update(RelationData(**row) for row in cursor) | for row in cursor: | ||||
src = row.pop("src") | |||||
result.setdefault(src, set()).add(RelationData(**row)) | |||||
return result | return result | ||||
def with_path(self) -> bool: | def with_path(self) -> bool: | ||||
return "with-path" in self.flavor | return "with-path" in self.flavor |