From: Ian Jackson Date: Mon, 24 Aug 2009 13:08:04 +0000 (+0100) Subject: Redo aggregation X-Git-Tag: 3.4~106^2~8 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-live.git;a=commitdiff_plain;h=b6475c671134b0dba4ac23446d90a34a736290ca;ds=sidebyside Redo aggregation --- diff --git a/yarrg/web/lookup b/yarrg/web/lookup index 5217679..1453a37 100755 --- a/yarrg/web/lookup +++ b/yarrg/web/lookup @@ -74,7 +74,7 @@ my %styles; QuerySpecific => 1, }, { Name => 'ShowStalls', Before => '', - Values => [ [ 0, 'Show amount at each price' ], + Values => [ [ 0, 'Show total quantity at each price' ], [ 1, 'Show individual stalls' ], ], QuerySpecific => 1, diff --git a/yarrg/web/routetrade b/yarrg/web/routetrade index 58f21a1..91ff421 100644 --- a/yarrg/web/routetrade +++ b/yarrg/web/routetrade @@ -118,21 +118,29 @@ my $stmt= " SELECT sell_islands.islandname org_name, sell_islands.islandid org_id, sell.price org_price, + sell.qty org_qty_stall, + sell_stalls.stallname org_stallname, + sell.stallid org_stallid, sell_uploads.timestamp org_timestamp, buy_islands.islandname dst_name, buy_islands.islandid dst_id, buy.price dst_price, + buy.qty dst_qty_stall, + buy_stalls.stallname dst_stallname, + buy.stallid dst_stallid, buy_uploads.timestamp dst_timestamp, ".($qa->{ShowStalls} ? " - sell.stallid org_stallid, - sell_stalls.stallname org_stallname, - sell.qty org_qty, - buy.stallid dst_stallid, - buy_stalls.stallname dst_stallname, - buy.qty dst_qty, + sell.qty org_qty_agg, + buy.qty dst_qty_agg, " : " - sum(sell.qty) org_qty, - sum(buy.qty) dst_qty, + (SELECT sum(qty) FROM sell AS sell_agg + WHERE sell_agg.commodid = commods.commodid + AND sell_agg.islandid = sell.islandid + AND sell_agg.price = sell.price) org_qty_agg, + (SELECT sum(qty) FROM buy AS buy_agg + WHERE buy_agg.commodid = commods.commodid + AND buy_agg.islandid = buy.islandid + AND buy_agg.price = buy.price) dst_qty_agg, ")." commods.commodname commodname, commods.commodid commodid, @@ -141,27 +149,23 @@ my $stmt= " dist dist, buy.price - sell.price unitprofit FROM commods - JOIN buy ON commods.commodid = buy.commodid JOIN sell ON commods.commodid = sell.commodid + JOIN buy ON commods.commodid = buy.commodid JOIN islands AS sell_islands ON sell.islandid = sell_islands.islandid JOIN islands AS buy_islands ON buy.islandid = buy_islands.islandid JOIN uploads AS sell_uploads ON sell.islandid = sell_uploads.islandid JOIN uploads AS buy_uploads ON buy.islandid = buy_uploads.islandid -".($qa->{ShowStalls} ? " JOIN stalls AS sell_stalls ON sell.stallid = sell_stalls.stallid JOIN stalls AS buy_stalls ON buy.stallid = buy_stalls.stallid -" : "")." JOIN dists ON aiid = sell.islandid AND biid = buy.islandid WHERE ( ".join(" OR ", @flow_conds)." ) AND buy.price > sell.price -".($qa->{ShowStalls} ? "" : " - GROUP BY commods.commodid, org_id, org_price, dst_id, dst_price -")." ORDER BY org_name, dst_name, commodname, unitprofit DESC, - org_price, dst_price DESC + org_price, dst_price DESC, + org_stallname, dst_stallname "; my $sth= $dbh->prepare($stmt); @@ -191,7 +195,7 @@ if ($qa->{ShowStalls}) { } $addcols->({ Text => 1 }, qw(commodname)); $addcols->({ DoReverse => 1 }, - qw( org_price org_qty dst_price dst_qty + qw( org_price org_qty_agg dst_price dst_qty_agg )); $addcols->({ DoReverse => 1, SortColKey => 'MarginSortKey' }, qw( Margin @@ -212,25 +216,48 @@ $addcols->({ DoReverse => 1 }, <& dumptable:start, qa => $qa, sth => $sth &> % { -% my $f; -% while ($f= $sth->fetchrow_hashref()) { +% my $got; +% while ($got= $sth->fetchrow_hashref()) { <%perl> - $f->{Ix}= @flows; - $f->{Var}= "f$f->{Ix}"; + my $f= $flows[$#flows]; + if ( !$f || + $qa->{ShowStalls} || + grep { $f->{$_} ne $got->{$_} } + qw(org_id org_price dst_id dst_price commodid) + ) { + # Make a new flow rather than adding to the existing one + + $f= { + Ix => scalar(@flows), + Var => "f".@flows, + %$got + }; + $f->{"org_stallid"}= $f->{"dst_stallid"}= 'all' + if !$qa->{ShowStalls}; + push @flows, $f; + } + foreach my $od (qw(org dst)) { + $f->{"${od}Stalls"}{ + $got->{"${od}_stallname"} + } = + $got->{"${od}_qty_stall"} + ; + } - $f->{MaxQty}= $f->{'org_qty'} < $f->{'dst_qty'} - ? $f->{'org_qty'} : $f->{'dst_qty'}; - $f->{MaxProfit}= $f->{MaxQty} * $f->{'unitprofit'}; - $f->{MaxCapital}= $f->{MaxQty} * $f->{'org_price'}; + +<& dumptable:row, qa => $qa, sth => $sth, row => $f &> +% } +<& dumptable:end, qa => $qa &> +% } - $f->{MarginSortKey}= sprintf "%d", - $f->{'dst_price'} * 10000 / $f->{'org_price'}; - $f->{Margin}= sprintf "%3.1f%%", - $f->{'dst_price'} * 100.0 / $f->{'org_price'} - 100.0; +<%perl> +foreach my $f (@flows) { - $f->{"org_stallid"}= $f->{"dst_stallid"}= 'all' - if !$qa->{ShowStalls}; + $f->{MaxQty}= $f->{'org_qty_agg'} < $f->{'dst_qty_agg'} + ? $f->{'org_qty_agg'} : $f->{'dst_qty_agg'}; + $f->{MaxProfit}= $f->{MaxQty} * $f->{'unitprofit'}; + $f->{MaxCapital}= $f->{MaxQty} * $f->{'org_price'}; $f->{ExpectedUnitProfit}= $f->{'dst_price'} * (1.0 - $loss_per_league) ** $f->{'dist'} @@ -304,13 +331,8 @@ die "$cmpu $uue ?" if length $cmpu > 20; $f->{Suppress}= 1; } - push @flows, $f; - +} -<& dumptable:row, qa => $qa, sth => $sth, row => $f &> -% } -<& dumptable:end, qa => $qa &> -% } % my $optimise= $specific && !$confusing && @islandids>1; % if (!$optimise) { @@ -362,7 +384,7 @@ foreach my $flow (@flows) { ); push @{ $avail_csts{$cstname}{Flows} }, $flow->{Var}; - $avail_csts{$cstname}{Qty}= $flow->{"${od}_qty"}; + $avail_csts{$cstname}{Qty}= $flow->{"${od}_qty_agg"}; } } foreach my $cstname (sort keys %avail_csts) { @@ -538,7 +560,7 @@ $addcols->({ Total => 0, DoReverse => 1 }, qw(

Voyage trading plan

% foreach my $i (0..$#islandids) { - +<<% $td %>><% $od eq 'org' ? 'Collect' : 'Deliver' %> +<<% $td %>><% $t->{'commodname'} |h %> +% +% my @stalls= sort keys %{ $t->{Stalls} }; +% my $pstall= sub { +% my $name= $stalls[$_[0]]; +% my $avail= $t->{Stalls}{$name}; + +% $pstall->($stallix); % } - -
{ShowStalls} %>> +
% $iquery->execute($islandids[$i]); % my ($islandname) = $iquery->fetchrow_array(); % if (!$i) { @@ -560,19 +582,20 @@ Sail to <% $islandname |h %> % my $todo= \$todo{ $f->{'commodname'}, % (sprintf "%07d", $price), % $stallname }; -% $$todo= { } unless $$todo; +% $$todo= { Qty => 0 } unless $$todo; % $$todo->{'commodname'}= $f->{'commodname'}; % $$todo->{'stallname'}= $stallname; % $$todo->{Price}= $price; % $$todo->{Timestamp}= $f->{"${od}_timestamp"}; % $$todo->{Qty} += $f->{OptQty}; % $$todo->{Total}= $$todo->{Price} * $$todo->{Qty}; +% $$todo->{Stalls}= $f->{"${od}Stalls"}; % } % if (%todo && !$age_reported++) { - % my $age= $now - (values %todo)[0]->{Timestamp}; % my $cellid= "da_${i}"; % $da_ages{$cellid}= $age; +\ (Data age: <% prettyprint_age($age) %>) % } % my $total= 0; @@ -580,30 +603,35 @@ Sail to <% $islandname |h %> % foreach my $tkey (sort keys %todo) { % my $t= $todo{$tkey}; % $total += $t->{Total}; -
-% if ($od eq 'org') { -Collect -% } else { -Deliver -% } -<% $t->{'commodname'} |h %> -<% $t->{Price} |h %> each -% if ($qa->{ShowStalls}) { -<% $t->{'stallname'} |h %> +% my $span= 0 + keys %{ $t->{Stalls} }; +% my $td= "td rowspan=$span"; +
<% $avail |h %> <% $od eq 'org' ? 'avail.' : 'wanted' %> +<% $name |h %> +% }; +% +% $pstall->(0); +<<% $td %> align=right><% $t->{Price} |h %> each +<<% $td %> align=right><% $t->{Qty} |h %> unit(s) +<<% $td %> align=right><% $t->{Total} |h %> total +% +% foreach my $stallix (1..$#stalls) { +
<% $t->{Qty} |h %> unit(s) -<% $t->{Total} |h %> total +% % $dline ^= 1; % } % if (%todo) {
{ShowStalls} %>> - -% if ($od eq 'org') { -Outlay -% } else { -Proceeds -% } +<% $od eq 'org' ? 'Outlay' : 'Proceeds' %> <% $total |h %> total % } % }