File Coverage

blib/lib/Time/List/Rows.pm
Criterion Covered Total %
statement 89 126 70.6
branch 16 26 61.5
condition 7 15 46.6
subroutine 12 18 66.6
pod 8 10 80.0
total 132 195 67.6


line stmt bran cond sub pod time code
1             package Time::List::Rows;
2 7     7   160 use 5.008_001;
  7         17  
  7         249  
3 7     7   32 use strict;
  7         9  
  7         207  
4 7     7   28 use warnings;
  7         8  
  7         202  
5 7     7   29 use Time::Piece;
  7         8  
  7         31  
6 7     7   4110 use Class::Accessor::Lite;
  7         6544  
  7         90  
7 7     7   2697 use Time::List::Rows::Row;
  7         20  
  7         265  
8 7     7   56 use Time::List::Constant;
  7         10  
  7         44  
9              
10             our $VERSION = '0.13';
11              
12             my $unit_time = {
13             DAY() => 3600 * 24 ,
14             WEEK() => 3600 * 24 * 7 ,
15             HOUR() => 3600 ,
16             };
17              
18             my %DEFAULTS = (
19             time_unit => DAY() ,
20             output_type => ARRAY() ,
21             limit_rows => 0 ,
22             input_strftime_form => '%Y-%m-%d %H:%M:%S',
23             output_strftime_form => '%Y-%m-%d %H:%M:%S',
24             show_end_time => 0 ,
25             end_time_separate_chars => '~' ,
26             time_array => [],
27             time_rows => [],
28             unixtime_rows_hash => {},
29             datetime_rows_hash => {},
30             create_summary => 0 ,
31             summary_key_name => "summary" ,
32             filter => undef ,
33             filter_keys => [] ,
34             );
35              
36             Class::Accessor::Lite->mk_accessors(keys %DEFAULTS);
37              
38             sub new {
39 4     4 0 5 my $class = shift;
40            
41 4 50       20 my %args = @_ == 1 ? %{ $_[0] } : @_;
  0         0  
42 4         47 my $self = bless {
43             %DEFAULTS,
44             %args,
45             }, $class;
46            
47 4 50       13 die "set time array" unless $self->time_array;
48 4         22 $self->_create_time_rows(\%args);
49 4         27 $self;
50             }
51              
52             sub _create_time_rows{
53 4     4   4 my ($self , $args) = @_;
54 4         9 my $time_array = $self->time_array;
55 33         117 my $time_rows = [map{
56 4         12 Time::List::Rows::Row->new(%$args , unixtime => $_);
57             }@$time_array];
58 33         97 my $unixtime_rows_hash = {map{
59 4         6 $_->unixtime => $_,
60             }@$time_rows};
61 33         106 my $datetime_rows_hash = {map{
62 4         42 $_->datetime => $_,
63             }@$time_rows};
64 4         40 $self->time_rows($time_rows);
65 4         22 $self->unixtime_rows_hash($unixtime_rows_hash);
66 4         17 $self->datetime_rows_hash($datetime_rows_hash);
67             }
68              
69             sub get_row_from_datetime{
70 0     0 1 0 my ($self , $datetime) = @_;
71 0         0 $self->unixtime_rows_hash()->{$datetime};
72             }
73              
74             sub get_row_from_unixtime{
75 0     0 1 0 my ($self , $unixtime) = @_;
76 0         0 $self->unixtime_rows_hash()->{$unixtime};
77             }
78              
79             sub set_row_from_datetime{
80 0     0 1 0 my ($self , $datetime , $values) = @_;
81 0         0 $self->unixtime_rows_hash()->{$datetime}->set($values);
82             }
83              
84             sub set_row_from_unixtime{
85 0     0 1 0 my ($self , $unixtime , $values) = @_;
86 0         0 $self->unixtime_rows_hash()->{$unixtime}->set($values);
87             }
88              
89             sub set_rows_from_input_strftime{
90 0     0 0 0 my ($self , $rows) = @_;
91 0         0 my $strf_form = $self->input_strftime_form;
92 0         0 my $keys = {};
93 0         0 for my $time(keys %$rows){
94 0         0 my $values = $rows->{$time};
95 0         0 for(keys %$values){
96 0         0 $keys->{$_} = 1;
97             }
98 0         0 my $unixtime = Time::Piece->strptime($time , $strf_form)->strftime('%s');
99 0         0 my $row = $self->unixtime_rows_hash()->{$unixtime};
100 0 0       0 $row->set($values) if $row;
101             }
102 0         0 my $time_rows = $self->time_rows();
103 0         0 for(@$time_rows){
104 0   0     0 $_->{$keys} ||= undef;
105             }
106             }
107              
108             sub set_rows_from_datetime{
109 5     5 1 8581 my ($self , $rows) = @_;
110 5         8 my $keys = {};
111 5         18 for my $datetime(keys %$rows){
112 39         239 my $values = $rows->{$datetime};
113 39         75 for(keys %$values){
114 78         89 $keys->{$_} = 1;
115             }
116 39         71 my $row = $self->datetime_rows_hash()->{$datetime};
117 39 50       172 $row->set($values) if $row;
118             }
119 5         38 my $time_rows = $self->time_rows();
120 5         15 for(@$time_rows){
121 57   50     195 $_->{$keys} ||= undef;
122             }
123             }
124              
125             sub set_rows_from_unixtime{
126 0     0 1 0 my ($self , $rows) = @_;
127 0         0 my $keys = {};
128 0         0 for my $unixtime(keys %$rows){
129 0         0 my $values = $rows->{$unixtime};
130 0         0 for(keys %$values){
131 0         0 $keys->{$_} = 1;
132             }
133 0         0 my $row = $self->unixtime_rows_hash()->{$unixtime};
134 0 0       0 $row->set($values) if $row;
135             }
136 0         0 my $time_rows = $self->time_rows();
137 0         0 for(@$time_rows){
138 0   0     0 $_->{$keys} ||= undef;
139             }
140             }
141              
142             sub get_array{
143 9     9 1 13679 my ($self) = @_;
144 9         24 my $unixtime_rows_hash = $self->unixtime_rows_hash;
145 9 100       35 if($self->create_summary){
146 4         15 my $summary = {};
147              
148 96         197 my $rows = [map{
149 4         9 my $row = $unixtime_rows_hash->{$_->unixtime}->get_values;
150 96 100       199 if($self->filter){
151 48         263 $row = {%$row};
152 48         52 my @filter_keys = @{$self->filter_keys};
  48         80  
153 48 100 66     198 if(ref $filter_keys[0] eq "SCALAR" && ${$filter_keys[0]} eq "*"){
  24         62  
154 24         64 @filter_keys = keys %$row
155             }
156 48         60 for my $key (@filter_keys){
157 126 100       712 if(exists $row->{$key}){
158 117         195 $row->{$key} = $self->filter->($row->{$key});
159             }
160             }
161             }
162              
163 96         538 for my $key(keys %$row){
164 408         404 my $value = $row->{$key};
165 408 100 100     2326 if($value && $value =~ /(^|^-)(\d+|\d+\.\d+)$/){
166 213         322 $summary->{$key} += $value;
167             }
168             }
169              
170 96         182 $row;
171 4         5 }@{$self->time_rows}];
172 4         11 $summary->{output_time} = $self->summary_key_name;
173 4         17 push @$rows , $summary ;
174 4         7 unshift @$rows , $summary;
175              
176 4         10 return $rows;
177             }else{
178 57         107 return [map{
179 5         9 my $row = $unixtime_rows_hash->{$_->unixtime}->get_values;
180              
181 57 100       162 if($self->filter){
182 9         69 $row = {%$row};
183 9         12 my @filter_keys = @{$self->filter_keys};
  9         19  
184 9 50 33     45 if(ref $filter_keys[0] eq "SCALAR" && ${$filter_keys[0]} eq "*"){
  0         0  
185 0         0 @filter_keys = keys %$row
186             }
187 9         18 for my $key (@filter_keys){
188 0 0       0 if(exists $row->{$key}){
189 0         0 $row->{$key} = $self->filter->($row->{$key});
190             }
191             }
192             }
193              
194 57         222 $row;
195 5         17 }@{$self->time_rows}]
196             }
197             }
198              
199             sub get_hash{
200 1     1 1 5 my ($self) = @_;
201 1         1 return {map{$_->get_hash_seed}@{$self->time_rows}};
  3         104  
  1         2  
202             }
203              
204             1;
205              
206              
207             1;
208             __END__