File Coverage

blib/lib/Data/TableData/Object/hash.pm
Criterion Covered Total %
statement 75 77 97.4
branch 20 24 83.3
condition n/a
subroutine 16 17 94.1
pod 12 13 92.3
total 123 131 93.8


line stmt bran cond sub pod time code
1             package Data::TableData::Object::hash;
2              
3 1     1   22 use 5.010001;
  1         3  
4 1     1   6 use strict;
  1         2  
  1         35  
5 1     1   6 use warnings;
  1         2  
  1         28  
6              
7 1     1   467 use parent 'Data::TableData::Object::Base';
  1         317  
  1         6  
8              
9             our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
10             our $DATE = '2021-11-17'; # DATE
11             our $DIST = 'Data-TableData-Object'; # DIST
12             our $VERSION = '0.115'; # VERSION
13              
14             sub new {
15 17     17 1 37 my ($class, $data) = @_;
16              
17 17         149 bless {
18             data => $data,
19             cols_by_name => {key=>0, value=>1},
20             cols_by_idx => ["key", "value"],
21             }, $class;
22             }
23              
24             sub row_count {
25 5     5 1 10 my $self = shift;
26 5         7 scalar keys %{ $self->{data} };
  5         16  
27             }
28              
29             sub row {
30 4     4 1 692 my ($self, $idx) = @_;
31             # XXX not very efficient
32 4         9 my $rows = $self->rows;
33 4         24 $rows->[$idx];
34             }
35              
36             sub row_as_aos {
37 16     16 1 710 my ($self, $idx) = @_;
38             # XXX not very efficient
39 16         30 my $rows = $self->rows;
40 16         55 $rows->[$idx];
41             }
42              
43             sub row_as_hos {
44 4     4 1 692 my ($self, $idx) = @_;
45             # XXX not very efficient
46 4         9 my $rows = $self->rows;
47 4         8 my $row = $rows->[$idx];
48 4 100       12 return undef unless $row; ## no critic: Subroutines::ProhibitExplicitReturnUndef
49 3         42 {key => $row->[0], value => $row->[1]};
50             }
51              
52             sub rows {
53 25     25 1 751 my $self = shift;
54 25         48 $self->rows_as_aoaos;
55             }
56              
57             sub rows_as_aoaos {
58 26     26 1 1616 my $self = shift;
59 26         49 my $data = $self->{data};
60 26         105 [map {[$_, $data->{$_}]} sort keys %$data];
  78         215  
61             }
62              
63             sub rows_as_aohos {
64 7     7 1 948 my $self = shift;
65 7         18 my $data = $self->{data};
66 7         37 [map {{key=>$_, value=>$data->{$_}}} sort keys %$data];
  21         105  
67             }
68              
69             sub uniq_col_names {
70 6     6 1 11 my $self = shift;
71              
72 6         14 my @res = ('key'); # by definition, hash key is unique
73 6         11 my %mem;
74 6         8 for (values %{$self->{data}}) {
  6         21  
75 7 100       28 return @res unless defined;
76 5 100       24 return @res if $mem{$_}++;
77             }
78 3         7 push @res, 'value';
79 3         19 @res;
80             }
81              
82             sub const_col_names {
83 6     6 1 14 my $self = shift;
84              
85             # by definition, hash key is not constant
86 6         11 my $i = -1;
87 6         10 my $val;
88             my $val_undef;
89 6         10 for (values %{$self->{data}}) {
  6         22  
90 8         12 $i++;
91 8 100       17 if ($i == 0) {
92 5         8 $val = $_;
93 5 100       17 $val_undef = 1 unless defined $val;
94             } else {
95 3 50       8 if ($val_undef) {
96 0 0       0 return () if defined;
97             } else {
98 3 100       11 return () unless defined;
99 2 100       12 return () unless $val eq $_;
100             }
101             }
102             }
103 4         21 ('value');
104             }
105              
106             sub switch_cols {
107 4     4 1 1830 die "Cannot switch column in hash table";
108             }
109              
110             sub add_col {
111 0     0 1 0 die "Cannot add_col in hash table";
112             }
113              
114             sub set_col_val {
115 3     3 0 1224 my ($self, $name_or_idx, $value_sub) = @_;
116              
117 3         11 my $col_name = $self->col_name($name_or_idx);
118 3         11 my $col_idx = $self->col_idx($name_or_idx);
119              
120 3 100       19 die "Column '$name_or_idx' does not exist" unless defined $col_name;
121              
122 2         5 my $hash = $self->{data};
123 2 100       6 if ($col_name eq 'key') {
124 1         3 my $row_idx = -1;
125 1         6 for my $key (sort keys %$hash) {
126 3         6 $row_idx++;
127             my $new_key = $value_sub->(
128             table => $self,
129             row_idx => $row_idx,
130             row_name => $key,
131             col_name => $col_name,
132             col_idx => $col_idx,
133 3         7 value => $hash->{$key},
134             );
135 3 50       32 $hash->{$new_key} = delete $hash->{$key}
136             unless $key eq $new_key;
137             }
138             } else {
139 1         3 my $row_idx = -1;
140 1         6 for my $key (sort keys %$hash) {
141 3         9 $row_idx++;
142             $hash->{$key} = $value_sub->(
143             table => $self,
144             row_idx => $row_idx,
145             row_name => $key,
146             col_name => $col_name,
147             col_idx => $col_idx,
148 3         8 value => $hash->{$key},
149             );
150             }
151             }
152             }
153              
154             1;
155             # ABSTRACT: Manipulate hash via table object
156              
157             __END__