File Coverage

blib/lib/App/RecordStream/Clumper/Window.pm
Criterion Covered Total %
statement 38 40 95.0
branch 4 4 100.0
condition n/a
subroutine 10 12 83.3
pod 0 7 0.0
total 52 63 82.5


line stmt bran cond sub pod time code
1             package App::RecordStream::Clumper::Window;
2              
3 3     3   2300 use strict;
  3         8  
  3         97  
4 3     3   12 use warnings;
  3         7  
  3         87  
5              
6 3     3   19 use App::RecordStream::Clumper::Base;
  3         11  
  3         83  
7 3     3   16 use App::RecordStream::DomainLanguage::Registry;
  3         6  
  3         73  
8              
9 3     3   13 use base 'App::RecordStream::Clumper::Base';
  3         7  
  3         1100  
10              
11             sub new
12             {
13 2     2 0 6 my $class = shift;
14 2         5 my $size = shift;
15              
16 2         8 my $this =
17             {
18             'size' => $size,
19             };
20 2         6 bless $this, $class;
21              
22 2         11 return $this;
23             }
24              
25             sub long_usage
26             {
27 0     0 0 0 return <
28             Usage: window,
29             Clump records by a rolling window of size . The windows are strict
30             (that is partial windows are not given at the beginning or end). For
31             example, if there are five input records (1, 2, 3, 4, 5) and the window is
32             3, then the first clump will be (1, 2, 3), the second (2, 3, 4) and the
33             third and final (3, 4, 5).
34             EOF
35             }
36              
37             sub short_usage
38             {
39 0     0 0 0 return "clump records by a rolling window";
40             }
41              
42             sub argct
43             {
44 2     2 0 5 return 1;
45             }
46              
47             sub clumper_begin
48             {
49 5     5 0 7 my $this = shift;
50 5         8 my $bucket = shift;
51              
52 5         19 return [$bucket, []];
53             }
54              
55             sub clumper_push_record
56             {
57 19     19 0 25 my $this = shift;
58 19         25 my $cookie = shift;
59 19         24 my $record = shift;
60 19         25 my $next = shift;
61              
62 19         28 my $bucket = $cookie->[0];
63 19         27 my $window = $cookie->[1];
64              
65 19         29 push @$window, $record;
66 19 100       53 if(@$window > $this->{'size'})
67             {
68 7         10 shift @$window;
69             }
70 19 100       49 if(@$window >= $this->{'size'})
71             {
72 10         30 my $next_cookie = $next->clumper_callback_begin($bucket);
73 10         21 for my $record (@$window)
74             {
75 30         61 $next->clumper_callback_push_record($next_cookie, $record);
76             }
77 10         26 $next->clumper_callback_end($next_cookie);
78             }
79             }
80              
81             sub clumper_end
82       5 0   {
83             # ignore
84             }
85              
86             App::RecordStream::Clumper->register_implementation('window', __PACKAGE__);
87              
88             App::RecordStream::DomainLanguage::Registry::register_vfn(__PACKAGE__, 'new', 'window', 'SCALAR');
89              
90             1;