1 package DBIx::Class::Storage::DBI::MultiColumnIn;
6 use base 'DBIx::Class::Storage::DBI';
10 DBIx::Class::Storage::DBI::MultiColumnIn - Storage component for RDBMS supporting multicolumn in clauses
14 While ANSI SQL does not define a multicolumn in operator, many databases can
15 in fact understand WHERE (cola, colb) IN ( SELECT subcol_a, subcol_b ... )
16 The storage class for any such RDBMS should inherit from this class, in order
17 to dramatically speed up update/delete operations on joined multipk resultsets.
19 At this point the only overriden method is C<_multipk_update_delete()>
23 sub _multipk_update_delete {
25 my ($rs, $op, $values) = @_;
27 my $rsrc = $rs->result_source;
28 my @pcols = $rsrc->primary_columns;
29 my $attrs = $rs->_resolved_attrs;
31 # naive check - this is an internal method after all, we should know what we are doing
32 $self->throw_exception ('Number of columns selected by supplied resultset does not match number of primary keys')
33 if ( ref $attrs->{select} ne 'ARRAY' or @{$attrs->{select}} != @pcols );
35 # This is hideously ugly, but SQLA does not understand multicol IN expressions
36 my $sqla = $self->_sql_maker;
37 my ($sql, @bind) = @${$rs->as_query};
38 $sql = sprintf ('(%s) IN %s', # the as_query stuff is already enclosed in ()s
39 join (', ', map { $sqla->_quote ($_) } @pcols),
45 $op eq 'update' ? $values : (),
53 See L<DBIx::Class/CONTRIBUTORS>
57 You may distribute this code under the same terms as Perl itself.