1package App::Netdisco::DB::SetOperations;
2
3use strict;
4use warnings;
5
6use parent 'DBIx::Class::Helper::ResultSet::SetOperations';
7
8sub _set_operation {
9   my ( $self, $operation, $other ) = @_;
10
11   my @sql;
12   my @params;
13
14   my $as = $self->_resolved_attrs->{as};
15
16   my @operands = ( $self, ref $other eq 'ARRAY' ? @$other : $other );
17
18   for (@operands) {
19      $self->throw_exception("ResultClass of ResultSets do not match!")
20         unless $self->result_class eq $_->result_class;
21
22      my $attrs = $_->_resolved_attrs;
23
24      $self->throw_exception('ResultSets do not all have the same selected columns!')
25         unless $self->_compare_arrays($as, $attrs->{as});
26
27      my ($sql, @bind) = @{${$_->as_query}};
28      # $sql =~ s/^\s*\((.*)\)\s*$/$1/;
29      $sql = q<(> . $sql . q<)>;
30
31      push @sql, $sql;
32      push @params, @bind;
33   }
34
35   my $query = q<(> . join(" $operation ", @sql). q<)>;
36
37   my $attrs = $self->_resolved_attrs;
38   return $self->result_source->resultset->search(undef, {
39      alias => $self->current_source_alias,
40      from => [{
41         $self->current_source_alias => \[ $query, @params ],
42         -alias                      => $self->current_source_alias,
43         -source_handle              => $self->result_source->handle,
44      }],
45      columns => $attrs->{as},
46      result_class => $self->result_class,
47   });
48}
49
501;
51