File Coverage

blib/lib/Report/Porf/Table/Simple/AutoColumnConfigurator.pm
Criterion Covered Total %
statement 79 80 98.7
branch 28 40 70.0
condition 10 17 58.8
subroutine 8 8 100.0
pod 0 6 0.0
total 125 151 82.7


line stmt bran cond sub pod time code
1             # Perl
2             #
3             # Class Report::Porf::Table::Simple::AutoColumnConfigurator
4             #
5             # Perl Open Report Framework (Porf)
6             #
7             # Configure Report columns automatically
8             #
9             # Ralf Peine, Wed May 14 10:39:50 2014
10             #
11             # More documentation at the end of file
12             #------------------------------------------------------------------------------
13            
14             $VERSION = "2.000";
15            
16 1     1   6 use strict;
  1         2  
  1         42  
17 1     1   8 use warnings;
  1         2  
  1         1209  
18            
19             #--------------------------------------------------------------------------------
20             #
21             # Report::Porf::Table::Simple::AutoColumnConfigurator
22             #
23             #--------------------------------------------------------------------------------
24            
25             package Report::Porf::Table::Simple::AutoColumnConfigurator;
26            
27             # --- new Instance, Do NOT call direct!!! -----------------
28             sub new
29             {
30 13     13 0 23 my $caller = $_[0];
31 13   33     58 my $class = ref($caller) || $caller;
32            
33             # let the class go
34 13         30 my $self = {};
35 13         68 bless $self, $class;
36            
37 13         38 $self->{Configurators} = {};
38 13         29 $self->{max_column_width} = 60;
39            
40 13         42 return $self;
41             }
42            
43             # --- create_report_configuration as string list ---
44             sub report_configuration_as_string {
45 1     1 0 4 my ($self,
46             $list_ref,
47             $max_rows_to_inspect
48             ) = @_;
49            
50 1         3 my $config_list = $self->create_report_configuration($list_ref, $max_rows_to_inspect);
51 1         3 my @result;
52            
53 1         3 foreach my $config (@$config_list) {
54 6         7 my $line = '$report->cc( ';
55 6         18 foreach my $key (sort(keys(%$config))) {
56 24         49 $line .= " $key => ". $config->{$key}.', ';
57             }
58 6         12 $line .= ");";
59 6         11 push (@result, $line);
60             }
61 1         10 return \@result;
62             }
63            
64             # --- create_report_configuration ---
65             sub create_report_configuration {
66 13     13 0 23 my ($self,
67             $list_ref,
68             $max_rows_to_inspect
69             ) = @_;
70            
71 13 50 50     64 return [] unless $list_ref && scalar @$list_ref;
72            
73 13         27 my $ref_info = ref($list_ref->[0]);
74            
75 13 100       62 return $self->create_hash_report_configuration($list_ref, $max_rows_to_inspect)
76             if uc($ref_info) eq 'HASH';
77            
78 2 50       14 return $self->create_array_report_configuration($list_ref, $max_rows_to_inspect)
79             if uc($ref_info) eq 'ARRAY';
80            
81 0         0 die "cannot create auto configuration for '$ref_info' elements.";
82             }
83            
84             # --- crate the default report configuration for a list of hashes --------
85             sub create_hash_report_configuration {
86 11     11 0 14 my ($self,
87             $list_ref,
88             $max_rows_to_inspect
89             ) = @_;
90            
91 11 50 50     42 return [] unless $list_ref && scalar @$list_ref;
92            
93 11         12 my @config_list;
94            
95 11         19 my %hash_key_store = ();
96 11 100       29 $max_rows_to_inspect = 10 unless defined $max_rows_to_inspect;
97 11 100       27 $max_rows_to_inspect = $#$list_ref if $max_rows_to_inspect == -1;
98            
99 11         17 my $row_count = 0;
100 11         25 foreach my $data (@$list_ref) {
101 84         467 foreach my $key (sort(keys(%$data))) {
102 185 50       461 next unless defined $key;
103 185 100       352 $hash_key_store{$key} = length ($key) unless $hash_key_store{$key};
104 185   100     394 my $text_length = length ($data->{$key} || '0');
105 185 100       426 $hash_key_store{$key} = $text_length
106             if $hash_key_store{$key} < $text_length;
107             }
108 84 100       209 last if $row_count++ >= $max_rows_to_inspect;
109             }
110            
111 11         45 foreach my $key (sort(keys(%hash_key_store))) {
112 58         71 my $width = $hash_key_store{$key};
113 58 50       127 $width = $self->{max_column_width} if $width > $self->{max_column_width};
114 58         241 push (@config_list, {-h => $key, -vn => $key, -w => $width, -a => 'l'});
115             }
116            
117 11         59 return \@config_list;
118             }
119            
120             # --- crate the default report configuration for a list of arrays --------
121             sub create_array_report_configuration {
122 2     2 0 4 my ($self,
123             $list_ref,
124             $max_rows_to_inspect
125             ) = @_;
126            
127 2 50 50     12 return [] unless $list_ref && scalar @$list_ref;
128            
129 2         2 my @config_list;
130            
131 2 50       6 $max_rows_to_inspect = 10 unless defined $max_rows_to_inspect;
132 2 50       6 $max_rows_to_inspect = $#$list_ref if $max_rows_to_inspect == -1;
133            
134 2         3 my $row_count = 0;
135 2         4 my $max_columns = 0;
136 2         3 my @column_lengths;
137 2         4 foreach my $data (@$list_ref) {
138 12         14 my $columns = scalar @$data;
139 12 100       26 $max_columns = $columns if $columns > $max_columns;
140 12         21 foreach my $idx (0..($columns-1)) {
141 58   100     130 $column_lengths[$idx] = $column_lengths[$idx] || '0';
142 58   50     250 my $text_length = length ($data->[$idx] || '0');
143 58 100       137 $column_lengths[$idx] = $text_length
144             if $column_lengths[$idx] < $text_length;
145             }
146            
147 12 50       272 last if $row_count++ >= $max_rows_to_inspect;
148             }
149            
150 2         7 foreach my $idx (0..($max_columns-1)) {
151 11         15 my $width = $column_lengths[$idx];
152 11 50       27 $width = $self->{max_column_width} if $width > $self->{max_column_width};
153 11         63 push (@config_list, {-h => ($idx+1).'. Column', -vi => $idx, -w => $width, -a => 'l'});
154             }
155            
156 2         19 return \@config_list;
157             }
158            
159             # --- create report with automatic configured columns ------------------
160             sub create_report {
161 10     10 0 25 my ($self,
162             $list_ref,
163             $report_framework,
164             $format
165             ) = @_;
166            
167 10 50 50     50 return undef unless $list_ref && scalar @$list_ref;
168            
169 10         19 my $first_element = $list_ref->[0];
170            
171 10 50       22 $report_framework = Report::Porf::Framework::get() unless $report_framework;
172 10         60 my $report = $report_framework->create_report($format);
173            
174 10         41 $report->set_default_cell_value('');
175            
176 10         14 foreach my $config_option (@{$self->create_report_configuration($list_ref)}) {
  10         36  
177 50         220 $report->cc (%$config_option);
178             }
179            
180 10         99 $report->configure_complete();
181            
182 10         51 return $report;
183             }