diff --git a/tsplotvsql b/tsplotvsql index d0449a7..64ac417 100755 --- a/tsplotvsql +++ b/tsplotvsql @@ -1,4 +1,4 @@ -#!/usr/bin/perl -w +#!/usr/bin/perl =head1 NAME @@ -14,6 +14,10 @@ tsplotv [--output-format format ] [--stacked] [--style style] +[--time_t] +[--colors rgb-list] +[--configfile yaml] +[--yrange min:max] [query ...] =head1 DESCRIPTION @@ -37,11 +41,15 @@ other. =cut -use strict; -use TimeSeries; +use v5.24; +use warnings; + use Getopt::Long; use Pod::Usage; +use YAML qw(LoadFile); + use DBIx::SimpleConnect; +use TimeSeries; my $help; my $legend_position = 'top right'; @@ -53,6 +61,8 @@ my $finalresolution; my $time_t = 0; my $colors; my $dbname; +my $configfile; +my $yrange; GetOptions('help|?' => \$help, 'legend_position|legend-position=s' => \$legend_position, @@ -64,36 +74,56 @@ GetOptions('help|?' => \$help, 'time_t' => \$time_t, 'colors=s' => \$colors, 'dbname=s' => \$dbname, + 'configfile=s' => \$configfile, + 'yrange=s' => \$yrange, ) or pod2usage(2); pod2usage(1) if $help; +my $config = LoadFile($configfile) if $configfile; binmode STDOUT, ':raw'; -my %series; -my $ns; +my $ns = 0; my %data; -my $ts = TimeSeries->new(output_format => $output_format); +$config->{timeseries} //= {}; +for (keys $config->{timeseries}->%*) { + $ns = $config->{timeseries}{$_}{order} if ($config->{timeseries}{$_}{order} // 0) > $ns; +} + my $dbh = DBIx::SimpleConnect->connect($dbname); for my $q (@ARGV) { my $qdata = $dbh->selectall_arrayref($q); for my $r (@$qdata) { my ($timestamp, $series, $value) = @$r; - $series{$series} = ++$ns unless ($series{$series}); + $config->{timeseries}{$series}{order} = ++$ns unless ($config->{timeseries}{$series}{order}); $data{$timestamp}{$series} = $value; } } -my @series = sort { $series{$a} <=> $series{$b} } keys %series; + +my @series = sort { $config->{timeseries}{$a}{order} <=> $config->{timeseries}{$b}{order} } + keys $config->{timeseries}->%*; +if ($colors) { + my @colors = split(/,/, $colors); + while (my ($i, $c) = each(@colors)) { + $config->{timeseries}{$series[$i]}{color} = $c; + } +} + +my $ts = TimeSeries->new(output_format => $output_format); $ts->legend(@series); $ts->legend_position($legend_position); $ts->stacked($stacked); $ts->style($style); $ts->log_y($log_y); $ts->finalresolution($finalresolution) if $finalresolution; -if ($colors) { - $ts->colors(split(/,/, $colors)); +$ts->colors(map $config->{timeseries}{$_}{color}, @series); + +if ($yrange) { + $yrange =~s /^\[(.*)\]$/$1/; # remove optional brackets + my ($min, $max) = $yrange =~ /^(\*|[-+0-9E.]+):(\*|[-+0-9E.]+)$/; + $ts->yrange($min, $max); } for my $timestamp (sort keys %data) {