File Coverage

blib/lib/Dallycot/AST/Sum.pm
Criterion Covered Total %
statement 21 57 36.8
branch 0 6 0.0
condition 0 3 0.0
subroutine 7 11 63.6
pod 0 3 0.0
total 28 80 35.0


line stmt bran cond sub pod time code
1             package Dallycot::AST::Sum;
2             our $AUTHORITY = 'cpan:JSMITH';
3              
4             # ABSTRACT: Calculates the sum of a list of values
5              
6 23     23   12557 use strict;
  23         41  
  23         702  
7 23     23   98 use warnings;
  23         31  
  23         489  
8              
9 23     23   88 use utf8;
  23         30  
  23         97  
10 23     23   559 use parent 'Dallycot::AST';
  23         32  
  23         130  
11              
12 23     23   1193 use Carp qw(croak);
  23         35  
  23         1140  
13 23     23   185 use List::MoreUtils qw(all_u);
  23         43  
  23         217  
14              
15 23     23   8950 use Readonly;
  23         39  
  23         10556  
16              
17             Readonly my $NUMERIC => ['Numeric'];
18              
19             sub to_string {
20 0     0 0   my ($self) = @_;
21              
22 0           return "(" . join( "+", map { $_->to_string } @{$self} ) . ")";
  0            
  0            
23             }
24              
25             sub to_rdf {
26 0     0 0   my($self, $model) = @_;
27              
28             #
29             # node -> expression_set -> [ ... ]
30             #
31 0           return $model -> apply(
32             $model -> meta_uri('loc:sum'),
33             [ @$self ],
34             {}
35             );
36             # my $bnode = $model->bnode;
37             # $model -> add_type($bnode, 'loc:Sum');
38             #
39             # foreach my $expr (@$self) {
40             # $model -> add_expression($bnode, $expr);
41             # }
42             # return $bnode;
43             }
44              
45             sub execute {
46 0     0 0   my ( $self, $engine ) = @_;
47              
48 0           return $engine->collect( map { [ $_, $NUMERIC ] } @$self )->then(
49             sub {
50 0     0     my $num_durations = grep { $_ -> isa('Dallycot::Value::Duration') } @_;
  0            
51 0           my $num_dates = grep { $_ -> isa('Dallycot::Value::DateTime') } @_;
  0            
52 0 0 0       if( $num_durations == @_ ) {
    0          
    0          
53 0           my (@values) = map { $_ -> value } @_;
  0            
54 0           my $first = pop @values;
55 0           my $next = pop @values;
56 0           my $acc = $first + $next;
57 0           $acc += $_ for @values;
58 0           return Dallycot::Value::Duration->new( object => $acc );
59             }
60             elsif( $num_durations + $num_dates == @_ && $num_dates == 1 ) {
61 0           my (@values) = map { $_ -> value } @_;
  0            
62 0           my $first = shift @values;
63 0           my $next = shift @values;
64 0           my $acc = $first + $next;
65 0           $acc += $_ for @values;
66 0           return Dallycot::Value::DateTime->new( object => $acc );
67             }
68             elsif( $num_dates > 1 ) {
69 0           croak 'Multiple dates can not be added together';
70             }
71             else {
72 0           my (@values) = map { $_->value } @_;
  0            
73              
74 0           my $acc = pop @values;
75 0           my $next = pop @values;
76 0           $acc = $acc + $next;
77              
78 0           $acc += $_ for @values;
79              
80 0           return Dallycot::Value::Numeric->new($acc);
81             }
82             }
83 0           );
84             }
85              
86             1;