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