Changeset View
Changeset View
Standalone View
Standalone View
swh/provenance/mongo/backend.py
Show First 20 Lines • Show All 277 Lines • ▼ Show 20 Lines | def revision_get(self, ids: Iterable[Sha1Git]) -> Dict[Sha1Git, RevisionData]: | ||||
} | } | ||||
def relation_add( | def relation_add( | ||||
self, relation: RelationType, data: Iterable[RelationData] | self, relation: RelationType, data: Iterable[RelationData] | ||||
) -> bool: | ) -> bool: | ||||
src_relation, *_, dst_relation = relation.value.split("_") | src_relation, *_, dst_relation = relation.value.split("_") | ||||
set_data = set(data) | set_data = set(data) | ||||
dst_sha1s = {x.dst for x in data} | dst_sha1s = {x.dst for x in set_data} | ||||
if dst_relation in ["content", "directory", "revision"]: | if dst_relation in ["content", "directory", "revision"]: | ||||
dst_obj: Dict[str, Any] = {"ts": None} | dst_obj: Dict[str, Any] = {"ts": None} | ||||
if dst_relation == "content": | if dst_relation == "content": | ||||
dst_obj["revision"] = {} | dst_obj["revision"] = {} | ||||
dst_obj["directory"] = {} | dst_obj["directory"] = {} | ||||
if dst_relation == "directory": | if dst_relation == "directory": | ||||
dst_obj["revision"] = {} | dst_obj["revision"] = {} | ||||
if dst_relation == "revision": | if dst_relation == "revision": | ||||
Show All 36 Lines | ) -> bool: | ||||
src_objs = { | src_objs = { | ||||
x["sha1"]: x | x["sha1"]: x | ||||
for x in self.db.get_collection(src_relation).find( | for x in self.db.get_collection(src_relation).find( | ||||
{"sha1": {"$in": list(denorm)}} | {"sha1": {"$in": list(denorm)}} | ||||
) | ) | ||||
} | } | ||||
for sha1, _ in denorm.items(): | for sha1, dsts in denorm.items(): | ||||
if sha1 in src_objs: | if sha1 in src_objs: | ||||
# update | # update | ||||
if src_relation != "revision": | if src_relation != "revision": | ||||
k = { | k = { | ||||
obj_id: list(set(paths + denorm[sha1][obj_id])) | obj_id: list(set(paths + dsts.get(obj_id, []))) | ||||
for obj_id, paths in src_objs[sha1][dst_relation].items() | for obj_id, paths in src_objs[sha1][dst_relation].items() | ||||
} | } | ||||
self.db.get_collection(src_relation).update_one( | self.db.get_collection(src_relation).update_one( | ||||
{"_id": src_objs[sha1]["_id"]}, | {"_id": src_objs[sha1]["_id"]}, | ||||
{"$set": {dst_relation: dict(denorm[sha1], **k)}}, | {"$set": {dst_relation: dict(dsts, **k)}}, | ||||
) | ) | ||||
else: | else: | ||||
self.db.get_collection(src_relation).update_one( | self.db.get_collection(src_relation).update_one( | ||||
{"_id": src_objs[sha1]["_id"]}, | {"_id": src_objs[sha1]["_id"]}, | ||||
{ | { | ||||
"$set": { | "$set": { | ||||
dst_relation: list( | dst_relation: list( | ||||
set(src_objs[sha1][dst_relation] + denorm[sha1]) | set(src_objs[sha1][dst_relation] + dsts) | ||||
) | ) | ||||
} | } | ||||
}, | }, | ||||
) | ) | ||||
else: | else: | ||||
# add new rev | # add new rev | ||||
src_obj: Dict[str, Any] = {"ts": None} | src_obj: Dict[str, Any] = {"ts": None} | ||||
if src_relation == "content": | if src_relation == "content": | ||||
src_obj["revision"] = {} | src_obj["revision"] = {} | ||||
src_obj["directory"] = {} | src_obj["directory"] = {} | ||||
if src_relation == "directory": | if src_relation == "directory": | ||||
src_obj["revision"] = {} | src_obj["revision"] = {} | ||||
if src_relation == "revision": | if src_relation == "revision": | ||||
src_obj["preferred"] = None | src_obj["preferred"] = None | ||||
src_obj["origin"] = [] | src_obj["origin"] = [] | ||||
src_obj["revision"] = [] | src_obj["revision"] = [] | ||||
self.db.get_collection(src_relation).insert_one( | self.db.get_collection(src_relation).insert_one( | ||||
dict(src_obj, **{"sha1": sha1, dst_relation: denorm[sha1]}) | dict(src_obj, **{"sha1": sha1, dst_relation: dsts}) | ||||
) | ) | ||||
return True | return True | ||||
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]: | ) -> Set[RelationData]: | ||||
src, *_, dst = relation.value.split("_") | src, *_, dst = relation.value.split("_") | ||||
sha1s = set(ids) | sha1s = set(ids) | ||||
▲ Show 20 Lines • Show All 105 Lines • Show Last 20 Lines |