/**/
+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;