예제 #1
0
    def build_single_included(self, fields, path):
        relationships = path_to_relationships(path, self.model)

        cls = relationships[-1].mapper.class_
        subalias = sa.orm.aliased(cls)
        subquery = select_correlated_expression(
            self.model,
            subalias.id,
            path,
            subalias,
            self.from_obj,
            correlate=False).with_only_columns(split_if_composite(
                subalias.id)).distinct()

        alias = sa.orm.aliased(cls)
        expr = self.build_included_json_object(alias, fields)
        query = sa.select([expr], from_obj=alias).where(
            alias.id.in_(subquery)).distinct()

        if cls is self.model:
            query = query.where(
                alias.id.notin_(
                    sa.select(split_if_composite(get_attrs(self.from_obj).id),
                              from_obj=self.from_obj)))
        return query
    def test_with_non_aggregate_function(self, session, User, Article):
        aggregate = select_correlated_expression(
            Article, sa.func.json_build_object('name', User.name),
            'comments.author', User)

        query = session.query(
            Article.id, aggregate.label('author_json')).order_by(Article.id)
        result = query.all()
        assert result == [(1, {'name': 'User 1'})]
    def test_returns_correct_results(self, session, model_mapping, model_key,
                                     related_model_key, path, result):
        model = model_mapping[model_key]
        alias = sa.orm.aliased(model_mapping[related_model_key])
        aggregate = select_correlated_expression(
            model, sa.func.count(sa.distinct(alias.id)), path, alias)

        query = session.query(model.id,
                              aggregate.label('count')).order_by(model.id)
        assert query.all() == result
예제 #4
0
 def build_relationship_data(self, relationship, alias):
     identifier = self.query_builder.build_resource_identifier(alias, alias)
     expr = sa.func.json_build_object(*identifier).label('json_object')
     query = select_correlated_expression(
         self.model,
         expr,
         relationship.key,
         alias,
         get_selectable(self.from_obj),
         order_by=relationship.order_by).alias('relationships')
     return query
 def test_order_by_intermediate_table_column(self, session, model_mapping,
                                             group_user_tbl):
     model = model_mapping['users']
     alias = sa.orm.aliased(model_mapping['groups'])
     aggregate = select_correlated_expression(
         model,
         sa.func.json_build_object('id', alias.id),
         'groups',
         alias,
         order_by=[group_user_tbl.c.user_id]).alias('test')
     # Just check that the query execution doesn't fail because of wrongly
     # constructed aliases
     assert session.execute(aggregate)
예제 #6
0
 def build_relationship_data(self, relationship, alias):
     identifier = self.query_builder.build_resource_identifier(
         alias,
         alias
     )
     expr = sa.func.json_build_object(*identifier).label('json_object')
     query = select_correlated_expression(
         self.model,
         expr,
         relationship.key,
         alias,
         get_selectable(self.from_obj),
         order_by=self.build_order_by(relationship, alias)
     ).alias('relationships')
     return query
예제 #7
0
    def build_single_included(self, fields, path):
        relationships = path_to_relationships(path, self.model)

        cls = relationships[-1].mapper.class_
        alias = sa.orm.aliased(cls)
        expr = self.build_included_json_object(alias, fields)
        query = select_correlated_expression(self.model,
                                             expr,
                                             path,
                                             alias,
                                             self.from_obj,
                                             correlate=False).distinct()
        if cls is self.model:
            query = query.where(
                alias.id.notin_(
                    sa.select([get_attrs(self.from_obj).id],
                              from_obj=self.from_obj)))
        return query
 def test_order_by_intermediate_table_column(
     self,
     session,
     model_mapping,
     group_user_tbl
 ):
     model = model_mapping['users']
     alias = sa.orm.aliased(model_mapping['groups'])
     aggregate = select_correlated_expression(
         model,
         sa.func.json_build_object('id', alias.id),
         'groups',
         alias,
         order_by=[group_user_tbl.c.user_id]
     ).alias('test')
     # Just check that the query execution doesn't fail because of wrongly
     # constructed aliases
     assert session.execute(aggregate)
    def test_with_non_aggregate_function(
        self,
        session,
        user_cls,
        article_cls
    ):
        aggregate = select_correlated_expression(
            article_cls,
            sa.func.json_build_object('name', user_cls.name),
            'comments.author',
            user_cls
        )

        query = session.query(
            article_cls.id,
            aggregate.label('author_json')
        ).order_by(article_cls.id)
        result = query.all()
        assert result == [
            (1, {'name': 'User 1'})
        ]
    def test_returns_correct_results(
        self,
        session,
        model_mapping,
        model_key,
        related_model_key,
        path,
        result
    ):
        model = model_mapping[model_key]
        alias = sa.orm.aliased(model_mapping[related_model_key])
        aggregate = select_correlated_expression(
            model,
            sa.func.count(sa.distinct(alias.id)),
            path,
            alias
        )

        query = session.query(
            model.id,
            aggregate.label('count')
        ).order_by(model.id)
        assert query.all() == result
예제 #11
0
    def build_single_included(self, fields, path):
        relationships = path_to_relationships(path, self.model)

        cls = relationships[-1].mapper.class_
        alias = sa.orm.aliased(cls)
        expr = self.build_included_json_object(alias, fields)
        query = select_correlated_expression(
            self.model,
            expr,
            path,
            alias,
            get_selectable(self.from_obj),
            correlate=False
        ).distinct()
        if cls is self.model:
            query = query.where(
                alias.id.notin_(
                    sa.select(
                        [get_attrs(self.from_obj).id],
                        from_obj=self.from_obj
                    )
                )
            )
        return query