summaryrefslogtreecommitdiffstats
path: root/lib/Chart/Clicker/SQL.pm
blob: d4ca68a75118b0b304b89714993311b71d102ef0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package Chart::Clicker::SQL;
use Moose;
use 5.020;
use feature 'signatures', 'postderef';
no warnings 'experimental::signatures';
no warnings 'experimental::postderef';

use Chart::Clicker;
use Chart::Clicker::Data::DataSet;
use Chart::Clicker::Data::Series;
use DBI;

has dsn => (
    is       => 'ro',
    isa      => 'Str',
    required => 1,
);

has user => (
    is  => 'ro',
    isa => 'Str',
    default => '',
);

has pass => (
    is  => 'ro',
    isa => 'Str',
    default => '',
);

has dbh => (
    is      => 'ro',
    isa     => 'DBI::db',
    lazy    => 1,
    default => sub ($self) {
        DBI->connect(
            $self->dsn,
            $self->user,
            $self->pass,
            {
                RaiseError => 1,
                ReadOnly => 1,
            }
        )
    },
);

sub render($self, $query) {
    my $sth = $self->dbh->prepare($query);
    $sth->execute;
    my $rows = $sth->fetchall_arrayref;

    my @cols = map {
        my $idx = $_;
        [ map { $_->[$idx] } $rows->@* ]
    } 0..($sth->{NUM_OF_FIELDS} - 1);
    my @names = $sth->{NAME_lc}->@*;
    my $xaxis = shift @names;

    my $chart = Chart::Clicker->new;
    $chart->get_context('default')->domain_axis->label($xaxis);

    my $keys = shift @cols;
    for my $col (@cols) {
        my $series = Chart::Clicker::Data::Series->new(
            name   => shift @names,
            keys   => $keys,
            values => $col,
        );
        my $ds = Chart::Clicker::Data::DataSet->new(series => [ $series ]);
        $chart->add_to_datasets($ds);
    }

    return $chart;
}

__PACKAGE__->meta->make_immutable;
no Moose;

1;