Source code for tvb.core.entities.storage.root_dao

# -*- coding: utf-8 -*-
#
#
# TheVirtualBrain-Framework Package. This package holds all Data Management, and 
# Web-UI helpful to run brain-simulations. To use it, you also need to download
# TheVirtualBrain-Scientific Package (for simulators). See content of the
# documentation-folder for more details. See also http://www.thevirtualbrain.org
#
# (c) 2012-2023, Baycrest Centre for Geriatric Care ("Baycrest") and others
#
# This program is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software Foundation,
# either version 3 of the License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.  See the GNU General Public License for more details.
# You should have received a copy of the GNU General Public License along with this
# program.  If not, see <http://www.gnu.org/licenses/>.
#
#
#   CITATION:
# When using The Virtual Brain for scientific publications, please cite it as explained here:
# https://www.thevirtualbrain.org/tvb/zwei/neuroscience-publications
#
#

"""
Base DAO behavior.

.. moduleauthor:: bogdan.neacsa <bogdan.neacsa@codemart.ro>
.. moduleauthor:: Lia Domide <lia.domide@codemart.ro>
"""
import importlib
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.orm.exc import NoResultFound
from tvb.basic.logger.builder import get_logger
from tvb.core.entities.model.model_datatype import DataType
from tvb.core.entities.storage.session_maker import SESSION_META_CLASS
from tvb.config import SIMULATION_DATATYPE_CLASS


DEFAULT_PAGE_SIZE = 200


[docs]class RootDAO(object, metaclass=SESSION_META_CLASS): """ GLOBAL METHODS """ session = None logger = get_logger(__name__) EXCEPTION_DATATYPE_GROUP = "DataTypeGroup" EXCEPTION_DATATYPE_SIMULATION = SIMULATION_DATATYPE_CLASS
[docs] def store_entity(self, entity, merge=False): """ Store in DB one generic entity. """ self.logger.debug("We will store entity of type: %s with id %s" % (entity.__class__.__name__, str(entity.id))) if merge: self.session.merge(entity) else: self.session.add(entity) self.session.commit() self.logger.debug("After commit %s ID is %s" % (entity.__class__.__name__, str(entity.id))) saved_entity = self.session.query(entity.__class__).filter_by(id=entity.id).one() return saved_entity
[docs] def store_entities(self, entities_list): """ Store in DB a list of generic entities. """ self.session.add_all(entities_list) self.session.commit() stored_entities = [] for entity in entities_list: stored_entities.append(self.session.query(entity.__class__).filter_by(id=entity.id).one()) return stored_entities
[docs] def get_generic_entity(self, entity_type, filter_value, select_field="id"): """ Retrieve an entity of entity_type, filtered by select_field = filter_value. """ if isinstance(entity_type, str): classname = entity_type[entity_type.rfind(".") + 1:] module = importlib.import_module(entity_type[0: entity_type.rfind(".")]) entity_class = getattr(module, classname) result = self.session.query(entity_class).filter(entity_class.__dict__[select_field] == filter_value).all() else: result = self.session.query(entity_type).filter(entity_type.__dict__[select_field] == filter_value).all() # Need this since entity has attributes loaded automatically on DB load from # traited DB events. This causes the session to see the entity as dirty and issues # an invalid commit() which leaves the entity unattached to any sessions later on. self.session.expunge_all() return result
[docs] def remove_entity(self, entity_class, entity_id): """ Find entity by Id and Type, end then remove it. Return True, when entity was removed successfully, of False when exception. """ try: entity = self.session.query(entity_class).filter_by(id=entity_id).one() self.session.delete(entity) self.session.commit() return True except NoResultFound: self.logger.info("Entity from class %s with id %s has been already removed." % (entity_class, entity_id)) return True except SQLAlchemyError as excep: self.logger.exception(excep) return False
# DATA_TYPE BUT GENERIC METHODS
[docs] def remove_datatype(self, gid): """ When removing dataType, load fully so that sql-alchemy removes from all tables referenced. """ data = self.session.query(DataType).filter(DataType.gid == gid).all() for entity in data: extended_ent = self.get_generic_entity(entity.module + "." + entity.type, entity.id) self.session.delete(extended_ent[0]) self.session.commit()
[docs] def get_datatype_by_id(self, data_id): """ Retrieve DataType entity by ID. """ result = self.session.query(DataType).filter_by(id=data_id).one() result.parent_operation.project return result
[docs] def get_time_series_by_gid(self, data_gid): result = self.session.query(DataType).filter_by(gid=data_gid).one() result.data return result