File Coverage

blib/lib/DataCube/MeasureUpdater.pm
Criterion Covered Total %
statement 6 64 9.3
branch 0 48 0.0
condition 0 22 0.0
subroutine 2 4 50.0
pod 0 2 0.0
total 8 140 5.7


line stmt bran cond sub pod time code
1              
2              
3              
4             package DataCube::MeasureUpdater;
5              
6              
7 1     1   6 use strict;
  1         2  
  1         41  
8 1     1   5 use warnings;
  1         1  
  1         772  
9              
10              
11             sub new {
12 0     0 0   my($class,@opts,%opts) = @_;
13            
14 0 0 0       updater_opts:{
      0        
15 0           %opts = @opts and last updater_opts if @_ > 2 && @_ % 2;
16 0 0 0       $opts{schema} = $opts[0] and last updater_opts if @_ == 2;
17             }
18            
19 0           my $schema = $opts{schema};
20            
21 0 0 0       die "DataCube::MeasureUpdater(new):\nmust pass a DataCube::Schema object to new\n$!\n"
      0        
22             unless $schema && ref($schema) && ref($schema) =~ /^datacube::schema$/i;
23            
24 0   0       my $self = bless {}, ref($class) || $class;
25 0           $self->{measures} = $schema->{measures};
26 0           return $self;
27             }
28              
29              
30             sub update {
31 0     0 0   my($self,%opts) = @_;
32              
33 0           my $source = $opts{source};
34 0           my $target = $opts{target};
35 0           my $source_key = $opts{source_key};
36 0           my $target_key = $opts{target_key};
37              
38             #local $SIG{__WARN__} = sub {
39             # die '-' x 80 . "\n" .
40             # "DataCube::MeasureUpdater(update | warnings):\n".
41             # "caught a fatal exception here:\n$_[0]\n" . '-' x 80 . "\n" .
42             # join("\n", "source_key: $source_key", "target_key: $target_key") . '-' x 80 . "\n";
43             #};
44              
45 0           update:
46 0           for(@{$self->{measures}}) {
47            
48 0 0         if($_->[0] eq 'key_count'){
49            
50 0 0         next update unless exists $source->{$source_key}->{key_count};
51            
52 0           $target->{$target_key}->{key_count} +=
53             $source->{$source_key}->{key_count};
54            
55 0           next update;
56             }
57            
58 0           my $measure_field = $_->[1];
59            
60 0 0         if($_->[0] eq 'count'){
61 0 0         next update unless exists $source->{$source_key}->{count}->{$measure_field};
62            
63 0 0         $target->{$target_key}->{count}->{$measure_field} = {}
64             unless $target->{$target_key}->{count}->{$measure_field};
65            
66 0           my $target_area = $target->{$target_key}->{count}->{$measure_field};
67 0           my $source_area = $source->{$source_key}->{count}->{$measure_field};
68            
69 0           $target_area->{$_} = undef for keys %$source_area;
70            
71 0           next update;
72             }
73            
74 0 0         if($_->[0] eq 'multi_count'){
75 0 0         next update unless exists $source->{$source_key}->{multi_count}->{$measure_field};
76            
77 0 0         $target->{$target_key}->{multi_count}->{$measure_field} = {}
78             unless $target->{$target_key}->{multi_count}->{$measure_field};
79            
80 0           my $target_area = $target->{$target_key}->{multi_count}->{$measure_field};
81 0           my $source_area = $source->{$source_key}->{multi_count}->{$measure_field};
82            
83 0           $target_area->{$_} += $source_area->{$_} for keys %$source_area;
84            
85 0           next update;
86             }
87            
88 0 0         if($_->[0] eq 'sum'){
89 0 0         next update unless exists $source->{$source_key}->{sum}->{$measure_field};
90            
91 0           $target->{$target_key}->{sum}->{$measure_field} +=
92             $source->{$source_key}->{sum}->{$measure_field};
93            
94 0           next update;
95             }
96              
97 0 0         if($_->[0] eq 'min'){
98 0 0         next update unless defined $source->{$source_key}->{min}->{$measure_field};
99            
100 0 0 0       $target->{$target_key}->{min}->{$measure_field} =
101             $source->{$source_key}->{min}->{$measure_field}
102             if !defined $target->{$target_key}->{min}->{$measure_field}
103             || $target->{$target_key}->{min}->{$measure_field}
104             > $source->{$source_key}->{min}->{$measure_field};
105            
106 0           next update;
107             }
108            
109 0 0         if($_->[0] eq 'max'){
110 0 0         next update unless defined $source->{$source_key}->{max}->{$measure_field};
111            
112 0 0 0       $target->{$target_key}->{max}->{$measure_field} =
113             $source->{$source_key}->{max}->{$measure_field}
114             if !defined $target->{$target_key}->{max}->{$measure_field}
115             || $target->{$target_key}->{max}->{$measure_field}
116             < $source->{$source_key}->{max}->{$measure_field};
117            
118 0           next update;
119             }
120            
121 0 0         if($_->[0] eq 'product'){
122 0 0         next update unless exists $source->{$source_key}->{product}->{$measure_field};
123            
124 0 0         $target->{$target_key}->{product}->{$measure_field} = 1
125             unless defined $target->{$target_key}->{product}->{$measure_field};
126            
127 0           $target->{$target_key}->{product}->{$measure_field} *=
128             $source->{$source_key}->{product}->{$measure_field};
129            
130 0           next update;
131             }
132            
133 0 0         if($_->[0] eq 'average'){
134 0 0         next update unless exists $source->{$source_key}->{average}->{$measure_field}->{sum_total};
135            
136 0           $target->{$target_key}->{average}->{$measure_field}->{sum_total} +=
137             $source->{$source_key}->{average}->{$measure_field}->{sum_total};
138            
139 0           $target->{$target_key}->{average}->{$measure_field}->{observations} +=
140             $source->{$source_key}->{average}->{$measure_field}->{observations};
141            
142 0           next update;
143             }
144            
145             }
146              
147 0           return $self;
148             }
149              
150              
151              
152              
153              
154              
155              
156              
157             1;