commit 337906e21c6caebbe81dbad6f3e85b47933ea9b3
parent 9819c99d5ada437450eeb18ffa53e5e2e8279fe0
Author: Kyle Milz <kyle@getaddrinfo.net>
Date:   Wed,  4 Feb 2015 00:22:07 -0700
gen_svg: remove dependency on vendor table
Also while here add some logging and comments.
Diffstat:
| M | gen_svg.pl |  |  | 71 | +++++++++++++++++++++++++++++++++++++++++------------------------------ | 
1 file changed, 41 insertions(+), 30 deletions(-)
diff --git a/gen_svg.pl b/gen_svg.pl
@@ -22,61 +22,67 @@ my $dbh = get_dbh($cfg->{"general"});
 my $svg_dir = "/var/www/htdocs/pricechart/svg";
 mkdir $svg_dir;
 
-my ($width, $height) = (900, 160);
-my ($margin_left, $margin_right) = (30, 70);
-my ($margin_top, $margin_bottom) = (20, 20);
-my $total_width = $width + $margin_right + $margin_left;
-my $total_height = $height + $margin_top + $margin_bottom;
+my ($left, $width, $right, $top, $height, $bottom) = (30, 900, 70, 20, 160, 20);
+my $total_width = $right + $width + $left;
+my $total_height = $top + $height + $bottom;
+
+if ($args{v}) {
+	print  "info: left, width, right  = $left, $width, $right\n";
+	print  "info: top, height, bottom = $top, $height, $bottom\n";
+	printf "info: total size = %ix%i\n", $total_width, $total_height;
+}
 
-my $sql = "select date, price from prices where " .
+my $sql = "select date, price, color from prices where " .
 	"part_num = ? and vendor = ? order by date";
 my $point_sth = $dbh->prepare($sql);
 
 $sql = "select distinct vendor from prices where part_num = ?";
 my $vendor_sth = $dbh->prepare($sql);
 
-my $parts_sth = $dbh->prepare("select part_num, description from products");
-$parts_sth->execute();
-while (my ($part_num, $description) = $parts_sth->fetchrow_array()) {
+$sql = "select manufacturer, part_num, description from products";
+my $parts_sth = $dbh->prepare($sql);
 
+my $found_one = undef;
+$parts_sth->execute();
+while (my ($brand, $part_num, $description) = $parts_sth->fetchrow_array()) {
 	$sql = "select min(date), max(date), min(price), max(price) " .
 		"from prices where part_num = ?";
 	my ($x_min, $x_max, $y_min, $y_max) =
 		$dbh->selectrow_array($sql, undef, $part_num);
+	# make sure we have at least one price to work with
 	next unless (defined $x_min);
 
+	# avoid division by zero
 	my ($domain, $range) = ($x_max - $x_min, $y_max - $y_min);
 	next if ($domain == 0 || $range == 0);
 
-	print "$part_num:\n" if ($args{v});
+	print "info: $part_num: domain = $domain, range = $range" if ($args{v});
+	my $found_one = 1;
 
 	my $svg = SVG->new(viewBox => "0 0 $total_width $total_height");
 	my ($x_scale, $y_scale) = ($width / $domain, $height / $range);
 
 	$vendor_sth->execute($part_num);
 	while (my ($vendor) = $vendor_sth->fetchrow_array()) {
-		print "\t$vendor: " if ($args{v});
-
-		$sql = "select color from vendors where name = ?";
-		my ($vendor_color) = $dbh->selectrow_array($sql, undef, $vendor);
-		next unless (defined $vendor_color);
+		my $info_hdr = "info: $part_num: $vendor";
+		print "$info_hdr\n" if ($args{v});
 
 		my (@xs, @ys);
 		$point_sth->execute($part_num, $vendor);
-		while (my ($date, $price) = $point_sth->fetchrow_array) {
-			push @xs, ($date - $x_min) * $x_scale + $margin_left;
-			push @ys, ($price - $y_min) * $y_scale + $margin_top;
+		while (my ($date, $price, $color) = $point_sth->fetchrow_array) {
+			push @xs, ($date - $x_min) * $x_scale + $left;
+			push @ys, ($price - $y_min) * $y_scale + $top;
 
 			$svg->circle(
 				cx => $xs[-1], cy => $ys[-1],
 				r => 2,
 				style => {
-					"fill" => $vendor_color,
-					"stroke" => $vendor_color
+					"fill" => $color,
+					"stroke" => $color
 				}
 			);
 		}
-		printf "%i data points\n", scalar @xs if ($args{v});
+		printf "$info_hdr: %i data pairs\n", scalar @xs if ($args{v});
 
 		my $px = compute_control_points(\@xs);
 		my $py = compute_control_points(\@ys);
@@ -94,13 +100,14 @@ while (my ($part_num, $description) = $parts_sth->fetchrow_array()) {
 			id => $vendor,
 			style => {
 				"fill-opacity" => 0,
-				fill => $vendor_color,
-				stroke => $vendor_color,
+				# fill => $color,
+				# stroke => $color,
 				"stroke-width" => 2,
 			}
 		);
 	}
 
+	# when graph is loaded make a sliding motion show the graph lines
 	my $mask = $svg->rectangle(
 		x => 0, y => 0,
 		width => 1000, height => 250,
@@ -118,11 +125,11 @@ while (my ($part_num, $description) = $parts_sth->fetchrow_array()) {
 	my $num_labels = 5;
 	for (0..$num_labels) {
 		my $price = $y_max - $range * $_ / $num_labels;
-		my $y = $margin_top + $height * $_ / $num_labels;
+		my $y = $top + $height * $_ / $num_labels;
 
 		$svg->text(
 			id => $_,
-			x => $margin_left + $width + 20,
+			x => $left + $width + 20,
 			y => $y,
 			style => "font-size: 14px; fill: #666",
 			"text-anchor" => "start"
@@ -130,8 +137,8 @@ while (my ($part_num, $description) = $parts_sth->fetchrow_array()) {
 
 		$svg->line(
 			id => "line_$_",
-			x1 => $margin_left, y1 => $y,
-			x2 => $total_width - $margin_right, y2 => $y,
+			x1 => $left, y1 => $y,
+			x2 => $total_width - $right, y2 => $y,
 			fill => "#CCC",
 			stroke => "#CCC",
 			"stroke-width" => 1,
@@ -141,7 +148,7 @@ while (my ($part_num, $description) = $parts_sth->fetchrow_array()) {
 	for (0..$num_labels) {
 		my $time = $x_min + $_ * $domain / $num_labels;
 		my $date = strftime "%b %e %Y", localtime($time);
-		my $x = $margin_left + $_ / $num_labels * $width;
+		my $x = $left + $_ / $num_labels * $width;
 
 		$svg->text(
 			id => "time_$time",
@@ -152,8 +159,8 @@ while (my ($part_num, $description) = $parts_sth->fetchrow_array()) {
 
 		$svg->line(
 			id => "date_marker_$_",
-			x1 => $x, y1 => $margin_top + $height,
-			x2 => $x, y2 => $margin_top + $height + 5,
+			x1 => $x, y1 => $top + $height,
+			x2 => $x, y2 => $top + $height + 5,
 			fill => "#CCC",
 			stroke => "#CCC",
 			"stroke-width" => 1,
@@ -165,6 +172,10 @@ while (my ($part_num, $description) = $parts_sth->fetchrow_array()) {
 	close $svg_fh;
 }
 
+unless ($found_one && $args{v}) {
+	print "info: no products with non-zero domain and range found\n";
+}
+
 # print $log @$part_nums . " products generated\n";
 
 # close $log;