File Coverage

blib/lib/OPTIMADE/Filter/Zip.pm
Criterion Covered Total %
statement 51 64 79.6
branch 8 12 66.6
condition 1 3 33.3
subroutine 12 13 92.3
pod 0 9 0.0
total 72 101 71.2


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