
from sa_gentestbase import *

class AB( Test_AB0):
    def test_AB_poly_1__inh_tableinh__Alink_A__Blink_None__BAlink_None(me):
        class A( Base):
            props = ['id', 'name', 'link1']
            data = property( lambda me: me.name)
        class B( A):
            props = ['id', 'name', 'link1', 'data2']
            data = property( lambda me: me.data2)

        table_A = Table( 'A', me.meta,
            Column( 'id', Integer, primary_key= True, ),
            Column( 'name', String, ),
            Column( 'link1_id', Integer, ForeignKey( 'A.id', name= 'whatever1', use_alter= True, ), ),
            Column( 'atype', String, ),
        )
        table_B = Table( 'B', me.meta,
            Column( 'data2', String, ),
            Column( 'id', Integer, ForeignKey( 'A.id', ), primary_key= True, ),
        )

        me.meta.create_all()

        p_union = polymorphic_union( {
                        'A': table_A.select( table_A.c.atype == 'A', ),
                        'B': join( table_A, table_B, table_B.c.id == table_A.c.id, ),
                        }, None, )
        mapper_A = mapper( A, table_A,
                    polymorphic_identity= 'A',
                    polymorphic_on= p_union.c.atype,
                    select_table= p_union,
                    )
        mapper_A.add_property( 'link1', relation( A,
                    foreignkey= table_A.c.link1_id,
                    post_update= True,
                    primaryjoin= table_A.c.link1_id == table_A.c.id,
                    remote_side= table_A.c.id,
                    uselist= False,
                    ) )

        mapper_B = mapper( B, table_B,
                    inherit_condition= table_A.c.id == table_B.c.id,
                    inherits= mapper_A,
                    polymorphic_identity= 'B',
                    )

        ts = table_A.select( table_A.c.atype == 'A', ).alias('zz')
        mapper_A1 = mapper( A, ts,
                    polymorphic_identity= 'A',
                    non_primary=True,
                    )

        if 'removing-this-fixes-it':
            mapper_A1.add_property( 'link1', relation( A,
                    foreignkey= table_A.c.link1_id,
                    post_update= True,
                    primaryjoin= table_A.c.link1_id == table_A.c.id,
                    remote_side= table_A.c.id,
                    uselist= False,
                    ) )


        #populate
        a = A()
        b = B()
        a.name = 'anna'
        a.link1 = a
        b.name = 'ben'
        b.data2 = 'gun'

        session = create_session()
        session.save(a)
        session.save(b)
        session.flush()

        sa = str(a)
        sb = str(b)
        sbmulti = [ sb ]
        samulti = [ sa, sb ]
        me.query( session, A,B, table_A,table_B, a.id, b.id, sa,sb, samulti, sbmulti )
        session.clear()
        print session.query( mapper_A1).selectfirst()

if __name__ == '__main__':
    setup()
    unittest.main()
