def _transaction_id_subquery(self, obj, next_or_prev='next', alias=None): if next_or_prev == 'next': op = operator.gt func = sa.func.min else: op = operator.lt func = sa.func.max if alias is None: alias = sa.orm.aliased(obj) table = alias.__table__ if hasattr(alias, 'c'): attrs = alias.c else: attrs = alias else: table = alias.original attrs = alias.c query = (sa.select( [func(getattr(attrs, tx_column_name(obj)))], from_obj=[table]).where( sa.and_( op(getattr(attrs, tx_column_name(obj)), getattr(obj, tx_column_name(obj))), *[ getattr(attrs, pk) == getattr(obj, pk) for pk in get_primary_keys(obj.__class__) if pk != tx_column_name(obj) ])).correlate(table)) return query
def parent_identity(obj_or_class): if ( isinstance(obj_or_class, sa.sql.selectable.Alias) or isinstance(obj_or_class, sa.Table) ): return tuple( column for column in obj_or_class.c if column.name != 'transaction_id' and column.primary_key ) return tuple( getattr(obj_or_class, column_key) for column_key in get_primary_keys(obj_or_class).keys() if column_key != tx_column_name(obj_or_class) )
def update_version_validity(self, parent, version_obj): """ Updates previous version object end_transaction_id based on given parent object and newly created version object. This method is only used when using 'validity' versioning strategy. :param parent: SQLAlchemy declarative parent object :parem version_obj: SQLAlchemy declarative version object .. seealso:: :func:`version_validity_subquery` """ session = sa.orm.object_session(version_obj) for class_ in version_obj.__class__.__mro__: if class_ in self.manager.parent_class_map: subquery = self.version_validity_subquery( parent, version_obj, alias=sa.orm.aliased(class_.__table__) ) query = ( session.query(class_.__table__) .filter( sa.and_( getattr( class_, tx_column_name(version_obj) ) == subquery, *[ getattr(version_obj, pk) == getattr(class_.__table__.c, pk) for pk in get_primary_keys(class_) if pk != tx_column_name(class_) ] ) ) ) query.update( { end_tx_column_name(version_obj): self.current_transaction.id }, synchronize_session=False )
def _transaction_id_subquery(self, obj, next_or_prev='next', alias=None): if next_or_prev == 'next': op = operator.gt func = sa.func.min else: op = operator.lt func = sa.func.max if alias is None: alias = sa.orm.aliased(obj) table = alias.__table__ if hasattr(alias, 'c'): attrs = alias.c else: attrs = alias else: table = alias.original attrs = alias.c query = ( sa.select( [func( getattr(attrs, tx_column_name(obj)) )], from_obj=[table] ) .where( sa.and_( op( getattr(attrs, tx_column_name(obj)), getattr(obj, tx_column_name(obj)) ), *[ getattr(attrs, pk) == getattr(obj, pk) for pk in get_primary_keys(obj.__class__) if pk != tx_column_name(obj) ] ) ) .correlate(table) ) return query
def test_table(self, Building): assert get_primary_keys(Building.__table__) == OrderedDict({ '_id': Building.__table__.c._id })
def test_table_alias(self): alias = sa.orm.aliased(self.Building.__table__) assert get_primary_keys(alias) == OrderedDict({ '_id': alias.c._id })
def test_class_alias(self): alias = sa.orm.aliased(self.Building) assert get_primary_keys(alias) == OrderedDict({ 'id': self.Building.__table__.c._id })
def test_declarative_object(self): assert get_primary_keys(self.Building()) == OrderedDict({ 'id': self.Building.__table__.c._id })
def test_declarative_class(self): assert get_primary_keys(self.Building) == OrderedDict({ 'id': self.Building.__table__.c._id })
def test_table(self): assert get_primary_keys(self.Building.__table__) == OrderedDict({ '_id': self.Building.__table__.c._id })
def test_declarative_class(self, Building): assert get_primary_keys(Building) == OrderedDict( {'id': Building.__table__.c._id})
def parent_identity(obj_or_class): return tuple( getattr(obj_or_class, column_key) for column_key in get_primary_keys(obj_or_class).keys() if column_key != tx_column_name(obj_or_class) )
def test_class_alias(self, Building): alias = sa.orm.aliased(Building) assert get_primary_keys(alias) == OrderedDict( {'id': Building.__table__.c._id})
def test_declarative_object(self, Building): assert get_primary_keys(Building()) == OrderedDict({ 'id': Building.__table__.c._id })
def test_table_alias(self, Building): alias = sa.orm.aliased(Building.__table__) assert get_primary_keys(alias) == OrderedDict({ '_id': alias.c._id })
def parent_identity(obj_or_class): return tuple( getattr(obj_or_class, column_key) for column_key in get_primary_keys(obj_or_class).keys() if column_key != tx_column_name(obj_or_class))