1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
package OPTIMADE::Filter::Zip;
use strict;
use warnings;
use parent 'OPTIMADE::Filter::Modifiable';
use List::Util qw(any);
use Scalar::Util qw(blessed);
our $VERSION = '0.11.0'; # VERSION
sub new {
my( $class ) = @_;
return bless { properties => [],
operator => undef,
values => [] }, $class;
}
sub push_property {
my( $self, $property ) = @_;
push @{$self->{properties}}, $property;
}
sub unshift_property {
my( $self, $property ) = @_;
unshift @{$self->{properties}}, $property;
}
sub operator {
my( $self, $operator ) = @_;
my $previous_operator = $self->{operator};
$self->{operator} = $operator if defined $operator;
return $previous_operator;
}
sub values {
my( $self, $values ) = @_;
my $previous_values = $self->{values};
$self->{values} = $values if defined $values;
return $previous_values;
}
sub to_filter {
my( $self ) = @_;
$self->validate;
my @zip_list;
foreach my $zip (@{$self->{values}}) {
my @zip;
for my $i (0..$#$zip) {
my( $operator, $arg ) = @{$zip->[$i]};
if( blessed $arg && $arg->can( 'to_filter' ) ) {
$arg = $arg->to_filter;
} else {
$arg =~ s/\\/\\\\/g;
$arg =~ s/"/\\"/g;
$arg = "\"$arg\"";
}
push @zip, "$operator $arg";
}
push @zip_list, join( ' : ', @zip );
}
return '(' . join( ':', map { $_->to_filter } @{$self->{properties}} ) .
' ' . $self->{operator} . ' ' .
join( ', ', @zip_list ) . ')';
}
sub to_SQL
{
die "no SQL representation\n";
}
sub modify
{
my $self = shift;
my $code = shift;
$self->{properties} = [ map { $_->modify( $code, @_ ) } @{$self->{properties}} ];
$self->{values} = [ map { [ OPTIMADE::Filter::Modifiable::modify( $_->[0], $code, @_ ),
OPTIMADE::Filter::Modifiable::modify( $_->[1], $code, @_ ) ] }
@{$self->{values}} ];
return $code->( $self, @_ );
}
sub validate
{
my $self = shift;
if( !$self->{properties} ) {
die 'properties undefined for OPTIMADE::Filter::Zip';
}
if( !$self->operator ) {
die 'operator undefined for OPTIMADE::Filter::Zip';
}
if( !$self->values ) {
die 'values undefined for OPTIMADE::Filter::Zip';
}
if( any { scalar @$_ != scalar @{$self->{properties}} }
@{$self->values} ) {
die 'different number of properties and values for OPTIMADE::Filter::Zip';
}
}
1;
|