On Thursday 21 August 2008 17:57:31 Michael Bayer wrote:
> On Aug 21, 2008, at 9:03 AM, [EMAIL PROTECTED] wrote:
> > hi
> > i plan to implement "embedded structures" in dbcook (as opposed
> > to referenced structures living in separate tables), and
> > composite props seems to fit nicely.
> >
> > the idea is to achieve something like:
> >
> > class Point( embeddableBase):
> > x = Int()
> > y = Int()
> >
> > class Vertex( base):
> > p1 = Point()
> > p2 = Point()
> >
> > which should create a table/mapping
> > with columns ( p1_x, p1_y, p2_x, p2_y ) and a mapper with the p1,
> > p2 as composite_props.
> >
> > the plain columns are still accessible via the mapper, right?
> > e.g. query(Vertex).filter( Vertex.p1_x >4 )
> > can composite's props be used in query expressions? e.g.
> > query(Vertex).filter( Vertex.p1.x > 4 )
>
> Not by default, the composite attribute p1 and p2 would prevent
> p1_x, p1_y, etc. from being mapped.  you could try explicitly
> mapping them, i havent experimented much with that.  it becomes a
> gray area since which attribute would it favor for the ultimate
> value to be persisted?   plain descriptors look like a better
> solution here (composites are probably an unnecessary feature in
> the first place).
>
> > can composite's props be assigned separately ? e.g. would this
> > work? v = Vertex( ...)
> > v.p1.x = 3
> > v.p2 = Point( 1,2)
> > v.p1_y = 5
>
> yeah that wont work at all.  With a descriptor based approach (and
> a Point object that knows how to proxy to the parent object), it
> could.

no worries, here a simulation of what can be done under the dbcook' 
hood:

class composer( object):
    class proxy( object):
        __slots__ = 'obj name'.split()
        @staticmethod
        def make_name( name, subname): return name + '_' + subname
        def __init__( me, obj, name):
            me.obj = obj
            me.name = name
        def __getattr__( me, key):
            return getattr( me.obj, me.make_name( me.name, key))
        def __setattr__( me, key, val):
            if key in me.__slots__:
                return object.__setattr__( me, key, val)
            return setattr( me.obj, me.make_name( me.name, key), val)

    def __init__( me, name):
        me.name = name
    def __get__( me, obj, klas ):
        return me.proxy( obj or klas, me.name)


class Vertex( Base):
    a_x = Int()
    a_y = Int()
    a = composer( 'a')
    b_x = Int()
    b_y = Int()
    b = composer( 'b')

#set/save
...
    e2 = Vertex()
    e2.a.x = ax = 4
    e2.a_y = ay = 12
    e2.b.x = 3
    e2.b.y = by = 123
    assert e2.a.x == e2.a_x == ax
    assert e2.b.y == e2.b_y == by
...
#query
    print session.query( Vertex).filter( Vertex.a.x < 6 ).all() 
    print session.query( Vertex).filter( Vertex.a_x < 6 ).all() 
so far so good.

now this one obviously wont work as such - i dont know how to make a 
arbitrary descriptor behave like a column_expression.. should i 
inherit interfaces.PropComparator? (hi Eric)
    print session.query( Vertex).filter( Vertex.a == whatever( 
6,12) ).all() 

svil

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to