chiark / gitweb /
Merge branch 'web' of /u/ijackson/things/ypp-sc-tools
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 17 Sep 2009 00:43:35 +0000 (01:43 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 17 Sep 2009 00:43:35 +0000 (01:43 +0100)
yarrg/web/routetrade

index 383d554..d90bf40 100644 (file)
@@ -54,7 +54,7 @@ my $loss_per_delay_slot= 1e-8;
 
 my $now= time;
 
-my %flow_conds;
+my @flow_conds;
 my @query_params;
 my %dists;
 
@@ -82,30 +82,33 @@ my @subflows;
 foreach my $org_i (0..$#islandids) {
        my $org_isle= $islandids[$org_i];
        my $org_cond= $sd_condition->('sell',$org_i);
-       my %dst_conds;
+       my @dst_conds;
        foreach my $dst_i ($org_i..$#islandids) {
                my $dst_isle= $islandids[$dst_i];
                # Don't ever consider sailing things round the houses:
-               next if grep { $dst_isle == $_ } @islandids[$org_i..$dst_i-1];
-               next if grep { $org_isle == $_ } @islandids[$org_i+1..$dst_i];
-               my $dst_cond= $sd_condition->('buy',$dst_i);
+               next if defined $dst_isle and
+                       grep { $dst_isle == $_ } @islandids[$org_i..$dst_i-1];
+               next if defined $org_isle and
+                       grep { $org_isle == $_ } @islandids[$org_i+1..$dst_i];
+               my $dst_cond;
                if ($dst_i==$org_i and !defined $org_isle) {
                        # we always want arbitrage, but mentioning an arch
                        # once shouldn't produce intra-arch trades
-                       $dst_cond=
-                               "($dst_cond AND sell.islandid = buy.islandid)";
+                       $dst_cond= "sell.islandid = buy.islandid";
+               } else {
+                       $dst_cond= $sd_condition->('buy',$dst_i);
                }
-               $dst_conds{$dst_cond}= 1;
+               push @dst_conds, $dst_cond;
 
                if ($specific) {
                        push @{ $ipair2subflowinfs{$org_isle,$dst_isle} },
                                [ $org_i, $dst_i ];
                }
        }
-       $flow_conds{ "$org_cond AND (
+       push @flow_conds, "$org_cond AND (
                        ".join("
-                    OR ", sort keys %dst_conds)."
-               )" }= 1;
+                    OR ",@dst_conds)."
+               )";
 }
 
 my $stmt= "            
@@ -154,7 +157,7 @@ my $stmt= "
        JOIN dists ON aiid = sell.islandid AND biid = buy.islandid
        WHERE   (
                ".join("
-          OR   ", sort keys %flow_conds)."
+          OR   ", @flow_conds)."
        )
          AND   buy.price > sell.price
        ORDER BY org_name, dst_name, commodname, unitprofit DESC,