
from sa_gentestbase import *

class AB( Test_SA):
    def test1( me):
        meta=me.meta
        table_addr0 = Table( 'addr0', meta,
            Column( 'street', String, ),
            Column( 'atype',   type_= String, ),
            Column( 'db_id',   primary_key= True,   type_= Integer, ),
        )
        table_adres = Table( 'adres', meta,
            Column( 'owner_id', Integer, ForeignKey( 'person.db_id', ), ),
            Column( 'kvartal', String, ),
            Column( 'db_id', Integer, ForeignKey( 'addr0.db_id', ),   primary_key= True, ),
        )
        table_human = Table( 'human', meta,
            Column( 'name', String, ),
            Column( 'atype',   type_= String, ),
            Column( 'db_id',   primary_key= True,   type_= Integer, ),
        )
        table_person = Table( 'person', meta,
            Column( 'alias', String, ),
            Column( 'adr_id', Integer, ForeignKey( 'adres.db_id',     name= 'adr_id_fk',     use_alter= True, ), ),
            Column( 'db_id', Integer, ForeignKey( 'human.db_id', ),   primary_key= True, ),
        )

        meta.create_all()

        class Addr0( Base):
            props = ['db_id', 'street']
        class Adres( Addr0):
            props = ['db_id', 'owner', 'kvartal', 'street']
        class Human( Base):
            props = ['db_id', 'name', ]
        class Person( Human):
            props = ['db_id', 'alias', 'adr', 'name', ]

        mapper_Addr0 = mapper( Addr0, table_addr0,
                    polymorphic_identity= 'Addr0',
                    polymorphic_on= table_addr0.c.atype,
                    select_table= outerjoin( table_addr0, table_adres, table_adres.c.db_id == table_addr0.c.db_id, ),
                    )

        mapper_Adres = mapper( Adres, table_adres,
                    inherit_condition= table_adres.c.db_id == table_addr0.c.db_id,
                    inherits= mapper_Addr0,
                    polymorphic_identity= 'Adres',
                    )
        mapper_Adres.add_property( 'owner', relation( Person,
                    foreign_keys= table_adres.c.owner_id,
                    lazy= False,
                    primaryjoin= table_adres.c.owner_id == table_person.c.db_id,
                    remote_side= table_person.c.db_id,
                    uselist= False,
                    ) )

        mapper_Human = mapper( Human, table_human,
                    polymorphic_identity= 'Human',
                    polymorphic_on= table_human.c.atype,
                    select_table= outerjoin( table_human, table_person, table_person.c.db_id == table_human.c.db_id, ),
                    )

        mapper_Person = mapper( Person, table_person,
                    inherit_condition= table_person.c.db_id == table_human.c.db_id,
                    inherits= mapper_Human,
                    polymorphic_identity= 'Person',
                    )
        mapper_Person.add_property( 'adr', relation( Adres,
                    foreign_keys= table_person.c.adr_id,
                    lazy= False,
                    post_update= True,
                    primaryjoin= table_person.c.adr_id == table_adres.c.db_id,
                    remote_side= table_adres.c.db_id,
                    uselist= False,
                    ) )



        session = create_session()
        session.save( Person( name= 'pesho') )
        session.flush()
        session.clear()
        p2 = session.query( Person).filter_by( name= 'pesho').first()

    import sys
    sys.setrecursionlimit(100)



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