Source code for koapy.utils.store.sqlalchemy.Library

from sqlalchemy import Column, Integer, String, func
from sqlalchemy.orm import aliased, object_session, relationship
from sqlalchemy.orm.exc import NoResultFound

from .Base import Base
from .Snapshot import Snapshot
from .SnapshotAssociation import SnapshotAssociation
from .Symbol import Symbol
from .Version import Version


[docs]class Library(Base): __tablename__ = "libraries"
[docs] id = Column(Integer, primary_key=True)
[docs] name = Column(String, unique=True, index=True, nullable=False)
[docs] symbols = relationship("Symbol", back_populates="library")
[docs] snapshots = relationship("Snapshot", back_populates="library")
[docs] def get_symbol(self, symbol, deleted=False): symbol_name = symbol session = object_session(self) symbol = ( session.query(Symbol).with_parent(self).filter(Symbol.name == symbol_name) ) symbol = symbol.one() if not deleted: _version = symbol.get_latest_version() return symbol
[docs] def get_or_create_symbol(self, symbol): symbol_name = symbol try: symbol = self.get_symbol(symbol_name, deleted=True) except NoResultFound: symbol = Symbol(name=symbol_name) self.symbols.append(symbol) return symbol
[docs] def get_symbols(self, deleted=False): if deleted: return self.symbols session = object_session(self) symbols = session.query(Symbol).with_parent(self) versions = session.query(Version, func.max(Version.version)).group_by( Version.symbol_id ) version = aliased(Version, alias=versions.subquery()) versions = session.query(version) if not deleted: versions = versions.filter(version.deleted != True) symbols = symbols.join(versions.subquery()) symbols = symbols.all() return symbols
[docs] def get_versions(self, deleted=False): session = object_session(self) symbols = session.query(Symbol).with_parent(self) versions = session.query(Version).join(symbols.subquery()) if not deleted: versions = versions.filter(Version.deleted != True) versions = versions.all() return versions
[docs] def get_latest_versions(self, deleted=False): session = object_session(self) symbols = session.query(Symbol).with_parent(self) versions = session.query(Version, func.max(Version.version)).group_by( Version.symbol_id ) version = aliased(Version, alias=versions.subquery()) versions = session.query(version) if not deleted: versions = versions.filter(version.deleted != True) versions = versions.join(symbols.subquery()) versions = versions.all() return versions
[docs] def get_snapshot(self, snapshot): snapshot_name = snapshot session = object_session(self) snapshot = ( session.query(Snapshot) .with_parent(self) .filter(Snapshot.name == snapshot_name) .one() ) return snapshot
[docs] def create_snapshot(self, snapshot): snapshot_name = snapshot snapshot = Snapshot(name=snapshot_name) versions = self.get_latest_versions() associations = [SnapshotAssociation(version=version) for version in versions] snapshot.versions.extend(associations) self.snapshots.append(snapshot) return snapshot
[docs] def delete(self): session = object_session(self) symbols = session.query(Symbol).with_parent(self) versions = session.query(Version).join(symbols) snapshots = session.query(Snapshot).with_parent(self) associations = session.query(SnapshotAssociation).join(snapshots) associations.delete() snapshots.delete() versions.delete() symbols.delete() session.delete(self)