| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | package OPTIMADE::Filter::ListComparison; | 
| 2 |  |  |  |  |  |  |  | 
| 3 | 5 |  |  | 5 |  | 36 | use strict; | 
|  | 5 |  |  |  |  | 10 |  | 
|  | 5 |  |  |  |  | 145 |  | 
| 4 | 5 |  |  | 5 |  | 25 | use warnings; | 
|  | 5 |  |  |  |  | 9 |  | 
|  | 5 |  |  |  |  | 130 |  | 
| 5 |  |  |  |  |  |  |  | 
| 6 | 5 |  |  | 5 |  | 24 | use parent 'OPTIMADE::Filter::Modifiable'; | 
|  | 5 |  |  |  |  | 10 |  | 
|  | 5 |  |  |  |  | 20 |  | 
| 7 | 5 |  |  | 5 |  | 277 | use Scalar::Util qw(blessed); | 
|  | 5 |  |  |  |  | 10 |  | 
|  | 5 |  |  |  |  | 3615 |  | 
| 8 |  |  |  |  |  |  |  | 
| 9 |  |  |  |  |  |  | our $VERSION = '0.10.2'; # VERSION | 
| 10 |  |  |  |  |  |  |  | 
| 11 |  |  |  |  |  |  | sub new { | 
| 12 | 22 |  |  | 22 | 0 | 55 | my( $class, $operator ) = @_; | 
| 13 | 22 |  |  |  |  | 93 | return bless { property => undef, | 
| 14 |  |  |  |  |  |  | operator => $operator, | 
| 15 |  |  |  |  |  |  | values => undef }, $class; | 
| 16 |  |  |  |  |  |  | } | 
| 17 |  |  |  |  |  |  |  | 
| 18 |  |  |  |  |  |  | sub property { | 
| 19 | 46 |  |  | 46 | 0 | 112 | my( $self, $property ) = @_; | 
| 20 | 46 |  |  |  |  | 80 | my $previous_property = $self->{property}; | 
| 21 | 46 | 100 |  |  |  | 111 | $self->{property} = $property if defined $property; | 
| 22 | 46 |  |  |  |  | 121 | return $previous_property; | 
| 23 |  |  |  |  |  |  | } | 
| 24 |  |  |  |  |  |  |  | 
| 25 |  |  |  |  |  |  | sub operator { | 
| 26 | 20 |  |  | 20 | 0 | 37 | my( $self, $operator ) = @_; | 
| 27 | 20 |  |  |  |  | 39 | my $previous_operator = $self->{operator}; | 
| 28 | 20 | 50 |  |  |  | 78 | $self->{operator} = $operator if defined $operator; | 
| 29 | 20 |  |  |  |  | 49 | return $previous_operator; | 
| 30 |  |  |  |  |  |  | } | 
| 31 |  |  |  |  |  |  |  | 
| 32 |  |  |  |  |  |  | sub values { | 
| 33 | 42 |  |  | 42 | 0 | 78 | my( $self, $values ) = @_; | 
| 34 | 42 |  |  |  |  | 90 | my $previous_values = $self->{values}; | 
| 35 | 42 | 100 |  |  |  | 99 | $self->{values} = $values if defined $values; | 
| 36 | 42 |  |  |  |  | 88 | return $previous_values; | 
| 37 |  |  |  |  |  |  | } | 
| 38 |  |  |  |  |  |  |  | 
| 39 |  |  |  |  |  |  | sub to_filter { | 
| 40 | 20 |  |  | 20 | 0 | 1159 | my( $self ) = @_; | 
| 41 | 20 |  |  |  |  | 50 | $self->validate; | 
| 42 |  |  |  |  |  |  |  | 
| 43 | 20 |  |  |  |  | 32 | my @values; | 
| 44 | 20 |  |  |  |  | 31 | for my $i (0..$#{$self->{values}}) { | 
|  | 20 |  |  |  |  | 51 |  | 
| 45 | 50 |  |  |  |  | 66 | my( $operator, $arg ) = @{$self->{values}[$i]}; | 
|  | 50 |  |  |  |  | 108 |  | 
| 46 | 50 | 100 | 66 |  |  | 137 | if( blessed $arg && $arg->can( 'to_filter' ) ) { | 
| 47 | 2 |  |  |  |  | 7 | $arg = $arg->to_filter; | 
| 48 |  |  |  |  |  |  | } else { | 
| 49 | 48 |  |  |  |  | 83 | $arg =~ s/\\/\\\\/g; | 
| 50 | 48 |  |  |  |  | 73 | $arg =~ s/"/\\"/g; | 
| 51 | 48 |  |  |  |  | 93 | $arg = "\"$arg\""; | 
| 52 |  |  |  |  |  |  | } | 
| 53 | 50 |  |  |  |  | 114 | push @values, "$operator $arg"; | 
| 54 |  |  |  |  |  |  | } | 
| 55 |  |  |  |  |  |  |  | 
| 56 |  |  |  |  |  |  | return '(' . join( ' ', $self->{property}->to_filter, | 
| 57 |  |  |  |  |  |  | $self->{operator}, | 
| 58 | 20 |  |  |  |  | 56 | join( ', ', @values ) ) . ')'; | 
| 59 |  |  |  |  |  |  | } | 
| 60 |  |  |  |  |  |  |  | 
| 61 |  |  |  |  |  |  | sub to_SQL | 
| 62 |  |  |  |  |  |  | { | 
| 63 | 10 |  |  | 10 | 0 | 41 | die "no SQL representation\n"; | 
| 64 |  |  |  |  |  |  | } | 
| 65 |  |  |  |  |  |  |  | 
| 66 |  |  |  |  |  |  | sub modify { | 
| 67 | 2 |  |  | 2 | 0 | 7 | my $self = shift; | 
| 68 | 2 |  |  |  |  | 4 | my $code = shift; | 
| 69 |  |  |  |  |  |  |  | 
| 70 | 2 |  |  |  |  | 6 | $self->property( $self->property->modify( $code, @_ ) ); | 
| 71 | 6 |  |  |  |  | 42 | $self->{values} = [ map { [ OPTIMADE::Filter::Modifiable::modify( $_->[0], $code, @_ ), | 
| 72 |  |  |  |  |  |  | OPTIMADE::Filter::Modifiable::modify( $_->[1], $code, @_ ) ] } | 
| 73 | 2 |  |  |  |  | 6 | @{$self->{values}} ]; | 
|  | 2 |  |  |  |  | 5 |  | 
| 74 | 2 |  |  |  |  | 22 | return $code->( $self, @_ ); | 
| 75 |  |  |  |  |  |  | } | 
| 76 |  |  |  |  |  |  |  | 
| 77 |  |  |  |  |  |  | sub validate | 
| 78 |  |  |  |  |  |  | { | 
| 79 | 20 |  |  | 20 | 0 | 32 | my $self = shift; | 
| 80 |  |  |  |  |  |  |  | 
| 81 | 20 | 50 |  |  |  | 77 | if( !$self->property ) { | 
| 82 | 0 |  |  |  |  | 0 | die 'property undefined for OPTIMADE::Filter::ListComparison'; | 
| 83 |  |  |  |  |  |  | } | 
| 84 | 20 | 50 |  |  |  | 99 | if( !$self->operator ) { | 
| 85 | 0 |  |  |  |  | 0 | die 'operator undefined for OPTIMADE::Filter::ListComparison'; | 
| 86 |  |  |  |  |  |  | } | 
| 87 | 20 | 50 |  |  |  | 40 | if( !$self->values ) { | 
| 88 | 0 |  |  |  |  |  | die 'values undefined for OPTIMADE::Filter::ListComparison'; | 
| 89 |  |  |  |  |  |  | } | 
| 90 |  |  |  |  |  |  | } | 
| 91 |  |  |  |  |  |  |  | 
| 92 |  |  |  |  |  |  | 1; |