File Coverage

blib/lib/OPTIMADE/Filter/ListComparison.pm
Criterion Covered Total %
statement 52 55 94.5
branch 10 14 71.4
condition 2 3 66.6
subroutine 12 12 100.0
pod 0 8 0.0
total 76 92 82.6


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;