def run(results, cmdenv, tdb): if cmdenv.lt and cmdenv.gt: if cmdenv.lt <= cmdenv.gt: raise CommandLineError("--gt must be lower than --lt") # Find out what we're looking for. queries, mode = get_lookup_list(cmdenv, tdb) cmdenv.DEBUG0("{} query: {}", mode, queries.values()) avoidSystems = {s for s in cmdenv.avoidPlaces if isinstance(s, System)} avoidStations = {s for s in cmdenv.avoidPlaces if isinstance(s, Station)} # Summarize results.summary = ResultRow() results.summary.mode = mode results.summary.queries = queries results.summary.oneStop = cmdenv.oneStop results.summary.avoidSystems = avoidSystems results.summary.avoidStations = avoidStations # In single mode with detail enabled, add average reports. # Thus if you're looking up "algae" or the "asp", it'll # tell you the average/ship cost. singleMode = len(queries) == 1 if singleMode and cmdenv.detail: first = list(queries.values())[0] if mode is SHIP_MODE: results.summary.avg = first.cost else: avgPrice = tdb.query( """ SELECT AVG(si.supply_price) FROM StationItem AS si WHERE si.item_id = ? AND si.supply_price > 0 """, [first.ID]).fetchone()[0] if not avgPrice: avgPrice = 0 results.summary.avg = int(avgPrice) # System-based search nearSystem = cmdenv.nearSystem if nearSystem: maxLy = cmdenv.maxLyPer or tdb.maxSystemLinkLy results.summary.near = nearSystem results.summary.ly = maxLy distanceFn = nearSystem.distanceTo else: distanceFn = None oneStopMode = cmdenv.oneStop padSize = cmdenv.padSize planetary = cmdenv.planetary wantNoPlanet = cmdenv.noPlanet wantBlackMarket = cmdenv.blackMarket stations = defaultdict(list) stationByID = tdb.stationByID cur = sql_query(cmdenv, tdb, queries, mode) for (ID, stationID, price, units) in cur: station = stationByID[stationID] if padSize and not station.checkPadSize(padSize): continue if planetary and not station.checkPlanetary(planetary): continue if wantNoPlanet and station.planetary != 'N': continue if wantBlackMarket and station.blackMarket != 'Y': continue if station in avoidStations: continue if station.system in avoidSystems: continue row = ResultRow() row.station = station if distanceFn: distance = distanceFn(row.station.system) if distance > maxLy: continue row.dist = distance row.item = queries[ID] row.price = price row.units = units row.age = station.itemDataAgeStr if oneStopMode: stationRows = stations[stationID] stationRows.append(row) if len(stationRows) >= len(queries): results.rows.extend(stationRows) else: results.rows.append(row) if not results.rows: if oneStopMode and len(stations): raise NoDataError("No one-stop stations found") raise NoDataError("No available items found") if oneStopMode and not singleMode: results.rows.sort(key=lambda result: result.item.name()) results.rows.sort(key=lambda result: result.station.name()) if cmdenv.sortByUnits: results.summary.sort = "units" results.rows.sort(key=lambda result: result.price) results.rows.sort(key=lambda result: result.units, reverse=True) else: if not oneStopMode: results.summary.sort = "Price" results.rows.sort(key=lambda result: result.units, reverse=True) results.rows.sort(key=lambda result: result.price) if nearSystem and not cmdenv.sortByPrice: results.summary.sort = "Ly" results.rows.sort(key=lambda result: result.dist) limit = cmdenv.limit or 0 if limit > 0: results.rows = results.rows[:limit] return results
def run(results, cmdenv, tdb): origin = cmdenv.startStation if not origin.itemCount: raise CommandLineError( "No trade data available for {}".format(origin.name()) ) buying, selling = cmdenv.buying, cmdenv.selling results.summary = ResultRow() results.summary.origin = origin results.summary.buying = cmdenv.buying results.summary.selling = cmdenv.selling tdb.getAverageSelling() tdb.getAverageBuying() cur = tdb.query(""" SELECT item_id, demand_price, demand_units, demand_level, supply_price, supply_units, supply_level, JULIANDAY('now') - JULIANDAY(modified) FROM StationItem WHERE station_id = ? """, [origin.ID]) for row in cur: it = iter(row) item = tdb.itemByID[next(it)] row = ResultRow() row.item = item row.buyCr = int(next(it) or 0) row.avgBuy = tdb.avgBuying.get(item.ID, 0) units, level = int(next(it) or 0), int(next(it) or 0) row.buyUnits = units row.buyLevel = level row.demand = render_units(units, level) if not selling: hasBuy = (row.buyCr or units or level) else: hasBuy = False row.sellCr = int(next(it) or 0) row.avgSell = tdb.avgSelling.get(item.ID, 0) units, level = int(next(it) or 0), int(next(it) or 0) row.sellUnits = units row.sellLevel = level row.supply = render_units(units, level) if not buying: hasSell = (row.sellCr or units or level) else: hasSell = False row.age = float(next(it) or 0) if hasBuy or hasSell: results.rows.append(row) if not results.rows: raise CommandLineError("No items found") results.rows.sort(key=lambda row: row.item.dbname) results.rows.sort(key=lambda row: row.item.category.dbname) return results
def run(results, cmdenv, tdb): if cmdenv.lt and cmdenv.gt: if cmdenv.lt <= cmdenv.gt: raise CommandLineError("--gt must be lower than --lt") # Find out what we're looking for. queries, mode = get_lookup_list(cmdenv, tdb) cmdenv.DEBUG0("{} query: {}", mode, queries.values()) avoidSystems = {s for s in cmdenv.avoidPlaces if isinstance(s, System)} avoidStations = {s for s in cmdenv.avoidPlaces if isinstance(s, Station)} # Summarize results.summary = ResultRow() results.summary.mode = mode results.summary.queries = queries results.summary.oneStop = cmdenv.oneStop results.summary.avoidSystems = avoidSystems results.summary.avoidStations = avoidStations # In single mode with detail enabled, add average reports. # Thus if you're looking up "algae" or the "asp", it'll # tell you the average/ship cost. singleMode = len(queries) == 1 if singleMode and cmdenv.detail: first = list(queries.values())[0] if mode is SHIP_MODE: results.summary.avg = first.cost else: avgPrice = tdb.query(""" SELECT AVG(si.supply_price) FROM StationItem AS si WHERE si.item_id = ? AND si.supply_price > 0 """, [first.ID]).fetchone()[0] results.summary.avg = int(avgPrice) # System-based search nearSystem = cmdenv.nearSystem if nearSystem: maxLy = cmdenv.maxLyPer or tdb.maxSystemLinkLy results.summary.near = nearSystem results.summary.ly = maxLy distanceFn = nearSystem.distanceTo else: distanceFn = None oneStopMode = cmdenv.oneStop padSize = cmdenv.padSize wantBlackMarket = cmdenv.blackMarket stations = defaultdict(list) stationByID = tdb.stationByID cur = sql_query(cmdenv, tdb, queries, mode) for (ID, stationID, price, units) in cur: station = stationByID[stationID] if padSize and not station.checkPadSize(padSize): continue if wantBlackMarket and station.blackMarket != 'Y': continue if station in avoidStations: continue if station.system in avoidSystems: continue row = ResultRow() row.station = station if distanceFn: distance = distanceFn(row.station.system) if distance > maxLy: continue row.dist = distance row.item = queries[ID] row.price = price row.units = units row.age = station.itemDataAgeStr if oneStopMode: stationRows = stations[stationID] stationRows.append(row) if len(stationRows) >= len(queries): results.rows.extend(stationRows) else: results.rows.append(row) if not results.rows: if oneStopMode and len(stations): raise NoDataError("No one-stop stations found") raise NoDataError("No available items found") if oneStopMode and not singleMode: results.rows.sort(key=lambda result: result.item.name()) results.rows.sort(key=lambda result: result.station.name()) if cmdenv.sortByUnits: results.summary.sort = "units" results.rows.sort(key=lambda result: result.price) results.rows.sort(key=lambda result: result.units, reverse=True) else: if not oneStopMode: results.summary.sort = "Price" results.rows.sort(key=lambda result: result.units, reverse=True) results.rows.sort(key=lambda result: result.price) if nearSystem and not cmdenv.sortByPrice: results.summary.sort = "Ly" results.rows.sort(key=lambda result: result.dist) limit = cmdenv.limit or 0 if limit > 0: results.rows = results.rows[:limit] return results