[Dbix-class] RFC - has_subset

Daniel Ruoso daniel at ruoso.com
Mon Mar 31 12:45:04 BST 2008


I'm working on an application that have the following classes:

  TaskType --- has_many ---> TaskTypeFile

but, that can actually be seen as two relationship types:

          ____ has_many { type => input } __
         /                                  \
  TaskType                            TaskTypeFile
         \____ has_many { type => output }__/

Or, this could be seen as:

                               /\          /\
                                |          |
                               is          is
                                |          |
                           InputFile     OutputFile
           _______ has_many__/            |
          /                               |
  TaskType --------------- has_many ------/

But one could see InputFile and OutputFile simply as a subset of
TaskTypeFile, and once this is done, we can keep the simplicity of
the first diagram, and filter on the TaskTypeFile as needed, which also
enables the input/output view independent on the TaskType relationship.

So, instead of doing


I could do


The major difference in that is that I can do 

my $rs = TaskType->find($id, { prefetch => 'files' });
while ($rs->files->input) {...}
while ($rs->files->output) {...}

With a single query, as the input/output resultset would simply
implement a filter on the previous resultset, while

TaskTypeFile->input->search({ name => 'foo.txt' });

would still be possible.

So, the proposed interface is:

__PACKAGE__->load_components( ... Subset ... );
__PACKAGE__->has_subset('input', { type => 'input' });
__PACKAGE__->has_subset('output', { type => 'output' });

It would add that as a part of the where clause when no cache is
present, and grep on the cache when already prefetched...

I still didn't go through the coding, so, this is the time for any
comments or tomatoes...


More information about the DBIx-Class mailing list