On Thu, Nov 6, 2008 at 4:56 PM, Ovid <[EMAIL PROTECTED]> wrote:
> Short question (I hope).  I have a resultset which inflates objects based 
> upon an id.  While the ID may exist, it's acceptable for the underlying 
> inflated object to not exist.  Unfortunately, this means that the 
> "$rs->count" might report more objects than actually exist.
>
> This is the correct behavior, but we'd like to be able to create a resultset 
> with a filter applied which represents what we really have.  Something like:
>
>  my $new_rs = $rs->filter( sub { defined $_->inflate_entity  } );
>
> '$rs->search_rs' doesn't seem appropriate because regrettably, joining across 
> tables doesn't appear to be an option here.
>
> Cheers,
> Ovid
>
> Longer description below for those who are confused.
>
> Note:  This is a greatly simplified description of the problem, reducing it 
> to its core elements.
>
> Customers require all objects to be searchable via a common ID formats.  So 
> let's say we have three tables:
>
>  brand
>  series
>  episodes
>
> And we have an 'identifier' table (again, greatly simplified):
>
>  identifier
>  ----------
>  identifier_id int primary key
>  identifier    varchar(32)
>  object_type   enum('Brand', 'Series', 'Episode')  (yuck)
>
> So if a customer gives me an id, I can check in the identifier table and see 
> that it's a key for a brand and this requires a second check in the brand 
> table to fetch the item.  Here's the problem:  if we delete a brand, series 
> or episode, we cannot delete the identifier because it must not be reused.  
> Though some of these are custom methods, you should be able to understand the 
> problem from here:
>
>    my $entity = $schema->resultset('Identifier')->search(
>        { type => 'pid' }
>    )->first->inflate_entity;
>
>    my $pid = $entity->pid;
>
>    $entity->delete;
>
>    my $rs = $schema->resultset('Identifier')->search({
>        type  => 'pid',
>        value => $pid,
>    });
>    print $rs->count;  # prints 1, even though the $entity is gone

How about adding a column that would say if a given pid is deleted to
the Identifier table?  Then
    my $rs = $schema->resultset('Identifier')->search({
        type  => 'pid',
        value => $pid,
        is_deleted => 0,
    });
    print $rs->count;  # prints 0

No joins - just a bit denormalized.

-- 
Zbigniew Lukasiak
http://brudnopis.blogspot.com/
http://perlalchemy.blogspot.com/

_______________________________________________
List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
Searchable Archive: http://www.grokbase.com/group/[email protected]

Reply via email to