1 package DBIx::Class::ResultSet::Role::DQMethods;
3 use Data::Query::ExprHelpers;
8 shift->result_source->schema->storage->sql_maker->converter;
12 my ($self, $where) = @_;
13 if ($where->$_isa('Data::Query::ExprBuilder')) {
14 return $self->_apply_dq_where($where->{expr});
15 } elsif (ref($where) eq 'HASH') {
16 return $self->_apply_dq_where(
17 $self->_dq_converter->_where_to_dq($where)
20 die "Argument to ->where must be ExprBuilder or SQL::Abstract hashref, got: "
21 .(defined($where) ? $where : 'undef');
25 my ($self, $expr) = @_;
26 my ($mapped, $need_join) = $self->_remap_identifiers($expr);
27 $self->search_rs(\$mapped, { join => $need_join });
30 sub _remap_identifiers {
33 my $attrs = $self->_resolved_attrs;
34 foreach my $j ( @{$attrs->{from}}[1 .. $#{$attrs->{from}} ] ) {
35 next unless $j->[0]{-alias};
36 next unless $j->[0]{-join_path};
38 $p = $p->{$_} ||= {} for map { keys %$_ } @{$j->[0]{-join_path}};
39 $p->{''} = $j->[0]{-alias};
42 my $seen_join = { %{$attrs->{seen_join}||{}} };
43 my $storage = $self->result_source->storage;
45 my $mapped = map_dq_tree {
46 return $_ unless is_Identifier;
47 my @el = @{$_->{elements}};
50 return Identifier($attrs->{alias}, $last);
53 $p = $p->{$_} ||= {} for @el;
54 if (my $alias = $p->{''}) {
55 return Identifier($alias, $last);
57 my $need = my $j = {};
58 $j = $j->{$_} = {} for @el;
59 push @need_join, $need;
60 my $alias = $storage->relname_to_table_alias(
61 $el[-1], ++$seen_join->{$el[-1]}
63 return Identifier($alias, $last);
65 return ($mapped, \@need_join);