示例#1
0
    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 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
     })
示例#7
0
 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
     })
示例#9
0
 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
     })
示例#11
0
 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})
示例#13
0
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
     })
示例#17
0
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))