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   32 use strict;
  5         11  
  5         180  
4 5     5   22 use warnings;
  5         20  
  5         290  
5              
6 5     5   26 use parent 'OPTIMADE::Filter::Modifiable';
  5         8  
  5         25  
7 5     5   371 use Scalar::Util qw(blessed);
  5         31  
  5         5399  
8              
9             our $VERSION = '0.11.0'; # VERSION
10              
11             sub new {
12 28     28 0 87 my( $class, $operator ) = @_;
13 28         167 return bless { property => undef,
14             operator => $operator,
15             values => undef }, $class;
16             }
17              
18             sub property {
19 58     58 0 150 my( $self, $property ) = @_;
20 58         116 my $previous_property = $self->{property};
21 58 100       211 $self->{property} = $property if defined $property;
22 58         189 return $previous_property;
23             }
24              
25             sub operator {
26 26     26 0 59 my( $self, $operator ) = @_;
27 26         58 my $previous_operator = $self->{operator};
28 26 50       72 $self->{operator} = $operator if defined $operator;
29 26         75 return $previous_operator;
30             }
31              
32             sub values {
33 54     54 0 113 my( $self, $values ) = @_;
34 54         127 my $previous_values = $self->{values};
35 54 100       181 $self->{values} = $values if defined $values;
36 54         141 return $previous_values;
37             }
38              
39             sub to_filter {
40 26     26 0 4154 my( $self ) = @_;
41 26         85 $self->validate;
42              
43 26         46 my @values;
44 26         48 for my $i (0..$#{$self->{values}}) {
  26         92  
45 58         90 my( $operator, $arg ) = @{$self->{values}[$i]};
  58         161  
46 58 100 66     181 if( blessed $arg && $arg->can( 'to_filter' ) ) {
47 6         18 $arg = $arg->to_filter;
48             } else {
49 52         107 $arg =~ s/\\/\\\\/g;
50 52         82 $arg =~ s/"/\\"/g;
51 52         95 $arg = "\"$arg\"";
52             }
53 58         160 push @values, "$operator $arg";
54             }
55              
56             return '(' . join( ' ', $self->{property}->to_filter,
57             $self->{operator},
58 26         111 join( ', ', @values ) ) . ')';
59             }
60              
61             sub to_SQL
62             {
63 13     13 0 106 die "no SQL representation\n";
64             }
65              
66             sub modify {
67 2     2 0 5 my $self = shift;
68 2         4 my $code = shift;
69              
70 2         6 $self->property( $self->property->modify( $code, @_ ) );
71 6         50 $self->{values} = [ map { [ OPTIMADE::Filter::Modifiable::modify( $_->[0], $code, @_ ),
72             OPTIMADE::Filter::Modifiable::modify( $_->[1], $code, @_ ) ] }
73 2         6 @{$self->{values}} ];
  2         8  
74 2         21 return $code->( $self, @_ );
75             }
76              
77             sub validate
78             {
79 26     26 0 48 my $self = shift;
80              
81 26 50       87 if( !$self->property ) {
82 0         0 die 'property undefined for OPTIMADE::Filter::ListComparison';
83             }
84 26 50       89 if( !$self->operator ) {
85 0         0 die 'operator undefined for OPTIMADE::Filter::ListComparison';
86             }
87 26 50       67 if( !$self->values ) {
88 0           die 'values undefined for OPTIMADE::Filter::ListComparison';
89             }
90             }
91              
92             1;