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