[Dbix-class] Fun with auto-restricted result sets

Jason Gottshall jgottshall at capwiz.com
Wed Feb 18 19:58:38 GMT 2009


David Ihnen wrote:
> So in the wake of fREW showing a modification of the classes to allow 
> the modification of the delete, I utilized a corrollary concept... 
> restricting a result set automatically/transparently, as you would in 
> case of that delete - not normally showing the deleted rows.  In my 
> case, my alerts table has a possible action window, possibly has been 
> dismissed, and possibly might be inactive.  This made the resultset 
> class more complicated, but not unmanageable. It was fun to work through 
> the logic of modifying an arbitrarily complex requested search clause.  
> If you specify values for these, it is assumed you know what you're 
> doing and this result set class won't further modify the terms.  I may 
> have missed the handling of already defined alert_expire terms though... 
> maybe I should make it inactive if you specify any of the terms anywhere 
> in the \%where tree.
> 
> 
> package DB::Schema::active_alert_resultset;
> use base 'DBIx::Class::ResultSet';
> 
> sub search {
>    my $self = shift;
>    $_[0]->{'inactive'}     ||= 0;
>    $_[0]->{'dismissed'}    ||= \"IS NULL";
>    $_[0]->{'alert_time'}   ||= { '<' => \"NOW()" };
>    my $aeor = [];
>    push @{$aeor}, { alert_expire => { '>' => \'NOW()'} };
>    push @{$aeor}, { alert_expire => \'IS NULL' };
>    if ($_[0]->{'-or'}) {  # If there is already an -or, we need to nest 
> it into an -and
>                           # so we don't overwrite the term, or change 
> the logic by orring with it.
>      my $and = $_[0]->{'-and'} ||= [];  # Use an existing -and term if 
> already supplied.
>      push @{$and}, { -or => delete $_[0]->{'-or'} }; # Move the old -and
>      push @{$and}, { -or => $aeor }; # add our alert expire or term
>    } else {
>      $_[0]->{'-or'} = $aeor;
>    }
>    return $self->next::method( @_ );
> }

You're only checking to see if the given columns have specified values 
passed in, but what if ->search was called on a resultset object that 
*already* has constraints for these columns? Until DBIC goes Moose, it's 
tricky (and not very safe) to introspect an existing RS to see what's 
already been done to it...

-- 
Jason Gottshall
jgottshall at capwiz.com




More information about the DBIx-Class mailing list