Exemplo n.º 1
0
 def test_annotate_expressions(self):
     table1 = table('table1', column('col1'), column('col2'))
     for expr, expected in [(table1.c.col1, 'table1.col1'),
                            (table1.c.col1 == 5,
                            'table1.col1 = :col1_1'),
                            (table1.c.col1.in_([2, 3, 4]),
                            'table1.col1 IN (:col1_1, :col1_2, '
                            ':col1_3)')]:
         eq_(str(expr), expected)
         eq_(str(expr._annotate({})), expected)
         eq_(str(sql_util._deep_annotate(expr, {})), expected)
         eq_(str(sql_util._deep_annotate(expr, {},
             exclude=[table1.c.col1])), expected)
Exemplo n.º 2
0
 def test_annotate_expressions(self):
     table1 = table('table1', column('col1'), column('col2'))
     for expr, expected in [(table1.c.col1, 'table1.col1'),
                            (table1.c.col1 == 5,
                            'table1.col1 = :col1_1'),
                            (table1.c.col1.in_([2, 3, 4]),
                            'table1.col1 IN (:col1_1, :col1_2, '
                            ':col1_3)')]:
         eq_(str(expr), expected)
         eq_(str(expr._annotate({})), expected)
         eq_(str(sql_util._deep_annotate(expr, {})), expected)
         eq_(str(sql_util._deep_annotate(expr, {},
             exclude=[table1.c.col1])), expected)
Exemplo n.º 3
0
def _orm_annotate(element, exclude=None):
    """Deep copy the given ClauseElement, annotating each element with the "_orm_adapt" flag.

    Elements within the exclude collection will be cloned but not annotated.

    """
    return sql_util._deep_annotate(element, {'_orm_adapt':True}, exclude)
Exemplo n.º 4
0
 def test_annotate_aliased(self):
     t1 = table('t1', column('c1'))
     s = select([(t1.c.c1 + 3).label('bat')])
     a = s.alias()
     a = sql_util._deep_annotate(a, {'foo': 'bar'})
     eq_(a._annotations['foo'], 'bar')
     eq_(a.element._annotations['foo'], 'bar')
    def test_annotate_fromlist_preservation(self):
        """test the FROM list in select still works
        even when multiple annotate runs have created
        copies of the same selectable

        #2453, continued

        """
        table1 = table('table1', column('x'))
        table2 = table('table2', column('y'))
        a1 = table1.alias()
        s = select([a1.c.x]).select_from(
                a1.join(table2, a1.c.x==table2.c.y)
            )

        assert_s = select([select([s])])
        for fn in (
            sql_util._deep_deannotate,
            lambda s: sql_util._deep_annotate(s, {'foo':'bar'}),
            lambda s:visitors.cloned_traverse(s, {}, {}),
            lambda s:visitors.replacement_traverse(s, {}, lambda x:None)
        ):

            sel = fn(select([fn(select([fn(s)]))]))
            eq_(str(assert_s), str(sel))
    def test_annotate_unique_traversal(self):
        """test that items are copied only once during
        annotate, deannotate traversal

        #2453
        """
        table1 = table('table1', column('x'))
        table2 = table('table2', column('y'))
        a1 = table1.alias()
        s = select([a1.c.x]).select_from(
                a1.join(table2, a1.c.x==table2.c.y)
            )

        for sel in (
            sql_util._deep_deannotate(s),
            sql_util._deep_annotate(s, {'foo':'bar'}),
            visitors.cloned_traverse(s, {}, {}),
            visitors.replacement_traverse(s, {}, lambda x:None)
        ):
            # the columns clause isn't changed at all
            assert sel._raw_columns[0].table is a1
            # the from objects are internally consistent,
            # i.e. the Alias at position 0 is the same
            # Alias in the Join object in position 1
            assert sel._froms[0] is sel._froms[1].left
            eq_(str(s), str(sel))
Exemplo n.º 7
0
def _orm_annotate(element, exclude=None):
    """Deep copy the given ClauseElement, annotating each element with the "_orm_adapt" flag.

    Elements within the exclude collection will be cloned but not annotated.

    """
    return sql_util._deep_annotate(element, {'_orm_adapt':True}, exclude)
Exemplo n.º 8
0
    def test_annotate_fromlist_preservation(self):
        """test the FROM list in select still works
        even when multiple annotate runs have created
        copies of the same selectable

        #2453, continued

        """
        table1 = table('table1', column('x'))
        table2 = table('table2', column('y'))
        a1 = table1.alias()
        s = select([a1.c.x]).select_from(
                a1.join(table2, a1.c.x==table2.c.y)
            )

        assert_s = select([select([s])])
        for fn in (
            sql_util._deep_deannotate,
            lambda s: sql_util._deep_annotate(s, {'foo':'bar'}),
            lambda s:visitors.cloned_traverse(s, {}, {}),
            lambda s:visitors.replacement_traverse(s, {}, lambda x:None)
        ):

            sel = fn(select([fn(select([fn(s)]))]))
            eq_(str(assert_s), str(sel))
Exemplo n.º 9
0
    def test_annotate_unique_traversal(self):
        """test that items are copied only once during
        annotate, deannotate traversal

        #2453
        """
        table1 = table('table1', column('x'))
        table2 = table('table2', column('y'))
        a1 = table1.alias()
        s = select([a1.c.x]).select_from(
                a1.join(table2, a1.c.x==table2.c.y)
            )

        for sel in (
            sql_util._deep_deannotate(s),
            sql_util._deep_annotate(s, {'foo':'bar'}),
            visitors.cloned_traverse(s, {}, {}),
            visitors.replacement_traverse(s, {}, lambda x:None)
        ):
            # the columns clause isn't changed at all
            assert sel._raw_columns[0].table is a1
            # the from objects are internally consistent,
            # i.e. the Alias at position 0 is the same
            # Alias in the Join object in position 1
            assert sel._froms[0] is sel._froms[1].left
            eq_(str(s), str(sel))
Exemplo n.º 10
0
 def test_annotate_aliased(self):
     t1 = table('t1', column('c1'))
     s = select([(t1.c.c1 + 3).label('bat')])
     a = s.alias()
     a = sql_util._deep_annotate(a, {'foo': 'bar'})
     eq_(a._annotations['foo'], 'bar')
     eq_(a.element._annotations['foo'], 'bar')
Exemplo n.º 11
0
    def test_deannotate(self):
        table1 = table('table1', column("col1"), column("col2"))
        
        bin = table1.c.col1 == bindparam('foo', value=None)

        b2 = sql_util._deep_annotate(bin, {'_orm_adapt':True})
        b3 = sql_util._deep_deannotate(b2)
        b4 = sql_util._deep_deannotate(bin)

        for elem in (b2._annotations, b2.left._annotations):
            assert '_orm_adapt' in elem
        
        for elem in (b3._annotations, b3.left._annotations, b4._annotations, b4.left._annotations):
            assert elem == {}
        
        assert b2.left is not bin.left 
        assert b3.left is not b2.left is not bin.left
        assert b4.left is bin.left  # since column is immutable
        assert b4.right is not bin.right is not b2.right is not b3.right
Exemplo n.º 12
0
    def test_deannotate(self):
        table1 = table('table1', column("col1"), column("col2"))

        bin = table1.c.col1 == bindparam('foo', value=None)

        b2 = sql_util._deep_annotate(bin, {'_orm_adapt':True})
        b3 = sql_util._deep_deannotate(b2)
        b4 = sql_util._deep_deannotate(bin)

        for elem in (b2._annotations, b2.left._annotations):
            assert '_orm_adapt' in elem

        for elem in b3._annotations, b3.left._annotations, \
            b4._annotations, b4.left._annotations:
            assert elem == {}

        assert b2.left is not bin.left
        assert b3.left is not b2.left is not bin.left
        assert b4.left is bin.left  # since column is immutable
        assert b4.right is not bin.right is not b2.right is not b3.right