On Mar 24, 2011, at 4:40 AM, Nickle wrote:

> I'm trying to implement a Composite Pattern, 
> http://en.wikipedia.org/wiki/Composite_pattern
> 
> In this case its to represent some holiday calendars. I need to
> implement a union calendar that is a collection of other calendars.
> 
> So a straightforward hierarchy. Calendar, abstract as the top level
> class. SimpleCalendar that inherits from Calendar. Then a union
> calendar that inherits from Calendar, but I need to implement
> children, a collection of calendars.
> 
> So its a self referential hierarchy. The point to note is that one
> calendar can appear in more than one union calendar, so its a self
> referential many to many. Its certain I need an association table as a
> result.
> 
> I'm not quite sure how to configure this.
> 
> I'm trying something along these lines
> 
> calendars_table = Table \
>    (
>    'calendars',
>    metadata,
>    Column ('id', Integer, primary_key=True),
>    Column ('code', String, nullable=False, unique=True),
>    Column ('name', String),
>    Column ('calendar_type', String (20), nullable=False),
>    Column ('monday', Boolean),
>    Column ('tuesday', Boolean),
>    Column ('wednesday', Boolean),
>    Column ('thurday', Boolean),
>    Column ('friday', Boolean),
>    Column ('saturday', Boolean),
>    Column ('sunday', Boolean)
>    )
> 
> calendar_children_table = Table \
>    (
>    'calendar_children',
>    metadata,
>    Column ('parent_id', Integer, ForeignKey ('calendars.id')),
>    Column ('child_id',  Integer, ForeignKey ('calendars.id'))
>    )
> 
> calendar_mapper = mapper (Calendar, calendars_table,
> polymorphic_on=calendars_table.c.calendar_type,
> polymorphic_identity="calendar")
> simple_calendar_mapper = mapper (SimpleCalendar,
> inherits=calendar_mapper,
> polymorphic_identity='simple',properties={'holidays':relationship(Holiday,
> backref='calendar')})
> union_calendar_mapper  = mapper (UnionCalendar,
> inherits=calendar_mapper, polymorphic_identity='union')
> 
> holidays_table = Table \
>    (
>    'holidays',
>    metadata,
>    Column ('id',          Integer, primary_key=True),
>    Column ('holiday_type',        String(20),  nullable=False),
>    Column ('calendar_id', Integer, ForeignKey ('calendars.id')),
>    Column ('description', String ),
>    Column ('year',        Integer),
>    Column ('month',       Integer),
>    Column ('day',         Integer)
>    )
> 
> holiday_mapper           = mapper (Holiday,          holidays_table,
> polymorphic_on=holidays_table.c.holiday_type,
> polymorphic_identity='holiday')
> repeating_holiday_mapper = mapper (RepeatingHoliday,
> inherits=holiday_mapper, polymorphic_identity='repeating')
> simple_holiday_mapper    = mapper (SimpleHoliday,
> inherits=holiday_mapper, polymorphic_identity='simple')
> 
> However, I'm not sure how to map the relationships with the
> association table.
> 
> Points that I think are relevant are
> 
> 1. It's only the UnionCalendar that has children.

apply a relatlonship() to the UnionCalendar mapping, the target class is 
Calendar, "secondary" is calendar_children_table.

> 2. Deleting a UnionCalendar should delete the entries in the
> association table, but not the children calendars.

This is a given when using "secondary" with relationship.   Severing the link 
between parent and child corresponds to a deletion of the row in "secondary".

> 3. Navigation is really only needed from the parent UnionCalendar to
> the underlying children calendars. However, having a collection back
> the other way might have some uses.

just add "backref='parent_containers'" or similar to the relationship().



> 4. For SimpleCalender to its Holidays, I haven't yet implemented the
> cascaded delete, but I know how to do this.
> 
> Thanks
> 
> Nick
> 
> -- 
> 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 
> sqlalchemy+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/sqlalchemy?hl=en.
> 

-- 
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 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to