chiark / gitweb /
New pared-down query for ipair_gettrades
[ypp-sc-tools.db-live.git] / yarrg / rsvalue.c
index 67785239c473297ac1201f39cfca51834d36d8f6..fe9c992acb4220ce9e15b5f7fb7bd1d93c7685f7 100644 (file)
@@ -1,52 +1,45 @@
 /**/
 
+typedef struct {
+  int commodid, src_price, src_qty, dst_price, dst_qty;
+} Trade;
+
+typedef struct {
+  int ntrades;
+  Trade *trades;
+} IslandPair;
+
 #include "rscommon.h"
 
+static void ipair_gettrades(int si, int di) {
+  char *stmt= masprintf
+    ("SELECT\n"
+     " sell.commodid           commodid,\n"
+     " sell.price              src_price,\n"
+     " sum(sell.qty)           src_qty,\n"
+     " buy.price               dst_price,\n"
+     " sum(buy.qty)            dst_qty\n"
+     " FROM sell JOIN buy\n"
+     "   ON sell.commodid = buy.commodid\n"
+     "  AND buy.price > sell.price\n"
+     " WHERE sell.islandid=%d\n"
+     "  AND buy.islandid=%d\n"
+     " GROUP BY sell.commodid, sell.price, buy.price\n",
+     si, di);
+  
+  printf("SQL\n[\n%s\n]\n", stmt);
+
+  free(stmt);
+}
+
 void value_route(int nislands, const int *islands) {
-  char stmt[1024+80*nislands+40*nislands*nislands], *sp;
   int s,d;
   
-  sp= stmt;
-  sp += sprintf(sp,
-               "SELECT\n"
-               " sell.islandid         src_id,\n"
-               " sell.price            src_price,\n"
-               " sum(sell.qty)         src_qty,\n"
-               " buy.islandid          dst_id,\n"
-               " buy.price             dst_price,\n"
-               " sum(buy.qty)          dst_qty,\n"
-               " commods.commodid      commodid,\n"
-               " commods.unitmass      unitmass,\n"
-               " commods.unitvolume    unitvolume,\n"
-               " dist                  dist,\n"
-               " buy.price-sell.price  unitprofit\n"
-               " FROM commods\n"
-               " JOIN sell ON commods.commodid = sell.commodid\n"
-               " JOIN buy  ON commods.commodid = buy.commodid\n"
-               " JOIN dists ON aiid = sell.islandid AND biid = buy.islandid\n"
-               " WHERE buy.price > sell.price\n"
-               "       AND (");
   for (s=0; s<nislands; s++) {
-    sp += sprintf(sp, "%s(sell.islandid=%d AND (",
-                 !s ? "" : "\n   OR ",
-                 islands[s]);
     for (d=s; d<nislands; d++) {
-      sp += sprintf(sp, "%sbuy.islandid=%d",
-                   d==s ? "" : " OR ",
-                   islands[d]);
+      ipair_gettrades(islands[s], islands[d]);
     }
-    sp += sprintf(sp, "))");
   }
-  sp += sprintf(sp,
-               ")\n"
-               " GROUP BY commods.commodid,\n"
-               "       sell.islandid, sell.price,\n"
-               "       buy.islandid, buy.price\n"
-               );
-
-  assert(sp < stmt + sizeof(stmt) - 1);
-
-  printf("SQL\n[\n%s\n]\n", stmt);
 
   //char *tail;
   //struct sqlite_vm *sth;