51 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| package App::Netdisco::DB::SetOperations;
 | ||
| 
 | ||
| use strict;
 | ||
| use warnings;
 | ||
| 
 | ||
| use parent 'DBIx::Class::Helper::ResultSet::SetOperations';
 | ||
| 
 | ||
| sub _set_operation {
 | ||
|    my ( $self, $operation, $other ) = @_;
 | ||
|  
 | ||
|    my @sql;
 | ||
|    my @params;
 | ||
|  
 | ||
|    my $as = $self->_resolved_attrs->{as};
 | ||
|  
 | ||
|    my @operands = ( $self, ref $other eq 'ARRAY' ? @$other : $other );
 | ||
|  
 | ||
|    for (@operands) {
 | ||
|       $self->throw_exception("ResultClass of ResultSets do not match!")
 | ||
|          unless $self->result_class eq $_->result_class;
 | ||
|  
 | ||
|       my $attrs = $_->_resolved_attrs;
 | ||
|  
 | ||
|       $self->throw_exception('ResultSets do not all have the same selected columns!')
 | ||
|          unless $self->_compare_arrays($as, $attrs->{as});
 | ||
|  
 | ||
|       my ($sql, @bind) = @{${$_->as_query}};
 | ||
|       # $sql =~ s/^\s*\((.*)\)\s*$/$1/;
 | ||
|       $sql = q<(> . $sql . q<)>;
 | ||
|  
 | ||
|       push @sql, $sql;
 | ||
|       push @params, @bind;
 | ||
|    }
 | ||
|  
 | ||
|    my $query = q<(> . join(" $operation ", @sql). q<)>;
 | ||
| 
 | ||
|    my $attrs = $self->_resolved_attrs;
 | ||
|    return $self->result_source->resultset->search(undef, {
 | ||
|       alias => $self->current_source_alias,
 | ||
|       from => [{
 | ||
|          $self->current_source_alias => \[ $query, @params ],
 | ||
|          -alias                      => $self->current_source_alias,
 | ||
|          -source_handle              => $self->result_source->handle,
 | ||
|       }],
 | ||
|       columns => $attrs->{as},
 | ||
|       result_class => $self->result_class,
 | ||
|    });
 | ||
| }
 | ||
| 
 | ||
| 1;
 |