Changeset View
Changeset View
Standalone View
Standalone View
swh/provenance/mongo/entity.py
- This file was added.
# Copyright (C) 2021 The Software Heritage developers | |||||
# See the AUTHORS file at the top-level directory of this distribution | |||||
# License: GNU General Public License version 3, or any later version | |||||
# See top-level LICENSE file for more information | |||||
from .errors import DBError, EntityError | |||||
def cache_get(func): | |||||
def wrapper(*args, **kw): | |||||
# implement cache as needed | |||||
return func(*args, **kw) | |||||
return wrapper | |||||
class Entity: | |||||
collection = "" | |||||
validate = True | |||||
data_model = {} | |||||
def __init__(self, db): | |||||
self.db = db | |||||
def _get_collection(self): | |||||
# FIXME, add raise as needed | |||||
return self.db.get_collection(self.collection) | |||||
@cache_get | |||||
def find_one(self, filters): | |||||
# validate the model if self.validate is true | |||||
return self._get_collection().find_one(filters) | |||||
@cache_get | |||||
def find(self, *args, **kw): | |||||
# validate the model if self.validate is true | |||||
# checking inside the list could be a bad idea, so better to skip | |||||
return self._get_collection().find(*args, **kw) | |||||
def insert(self, data): | |||||
if not data: | |||||
return None | |||||
try: | |||||
result = self._get_collection().insert_many(data, ordered=False) | |||||
except (DBError, Exception): # as e: | |||||
# Log as a mongo error | |||||
# raise e | |||||
pass | |||||
else: | |||||
return result | |||||
def insert_one(self, obj): | |||||
# validate the model if self.validate is true | |||||
# FIXME, set the obj in the cache | |||||
if not obj: | |||||
return None | |||||
try: | |||||
result = self._get_collection().insert_one(obj) | |||||
except DBError as e: | |||||
# Log as a mongo error | |||||
raise e | |||||
else: | |||||
return result | |||||
def bulk_write(self, writes): | |||||
# validate the model if self.validate is true, | |||||
# checking inside the list could be a bad idea, so better to skip | |||||
if not writes: | |||||
return None | |||||
try: | |||||
result = self._get_collection().bulk_write(writes, ordered=False) | |||||
except (DBError, Exception): # as e: | |||||
# Log as a mongo error | |||||
# raise e | |||||
pass | |||||
else: | |||||
return result | |||||
def create_index(self, fields, unique=False): | |||||
self._get_collection().create_index(fields, unique=unique) | |||||
@staticmethod | |||||
def factory(db, entity): | |||||
mapping = { | |||||
"content": Content, | |||||
"directory": Directory, | |||||
"origin": Origin, | |||||
"revision": Revision, | |||||
} | |||||
if entity in mapping: | |||||
return mapping[entity](db) | |||||
raise EntityError(f"invalid entity type {entity}") | |||||
class Content(Entity): | |||||
collection = "content" | |||||
validate = False | |||||
@property | |||||
def revision(self): | |||||
return self.data.get("revision", {}) | |||||
@property | |||||
def directory(self): | |||||
return self.data.get("directory", {}) | |||||
class Directory(Entity): | |||||
collection = "directory" | |||||
validate = False | |||||
@property | |||||
def revision(self): | |||||
return self.data.get("revision", {}) | |||||
class Origin(Entity): | |||||
collection = "origin" | |||||
validate = False | |||||
class Revision(Entity): | |||||
collection = "revision" | |||||
validate = False |