Skip to content

Commit

Permalink
feat: move ShipyardListing into the db
Browse files Browse the repository at this point in the history
I'd done most of the work before but hadn't finished.
  • Loading branch information
eseidel committed Feb 18, 2024
1 parent 35b8a56 commit 9b6f153
Show file tree
Hide file tree
Showing 13 changed files with 39 additions and 99 deletions.
4 changes: 2 additions & 2 deletions packages/cli/bin/asteroids.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Future<void> command(FileSystem fs, ArgResults argResults) async {
final db = await defaultDatabase();
// List all known asteroids that have a market or shipyard.
final marketListings = await MarketListingSnapshot.load(db);
final shipyardListingCache = ShipyardListingCache.load(fs);
final shipyardListings = await ShipyardListingSnapshot.load(db);
final systemsCache = SystemsCache.load(fs)!;

for (final marketListing in marketListings.listings) {
Expand All @@ -14,7 +14,7 @@ Future<void> command(FileSystem fs, ArgResults argResults) async {
if (!waypoint.isAsteroid) {
continue;
}
final shipyardListing = shipyardListingCache[waypointSymbol];
final shipyardListing = shipyardListings[waypointSymbol];
if (shipyardListing != null) {
logger.info('Asteroid $waypointSymbol has a market and shipyard.');
} else {
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/bin/contracts.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:cli/behavior/trader.dart';
import 'package:cli/cache/contract_cache.dart';
import 'package:cli/cache/contract_snapshot.dart';
import 'package:cli/cache/market_prices.dart';
import 'package:cli/cli.dart';
import 'package:cli/printing.dart';
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/bin/shipyard_prices.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Future<void> command(FileSystem fs, ArgResults argResults) async {
'Loaded ${shipyardPrices.count} prices from '
'${shipyardPrices.waypointCount} waypoints.',
);
final shipyardListings = ShipyardListingCache.load(fs);
final shipyardListings = await ShipyardListingSnapshot.load(db);
logger.info(
'Loaded ${shipyardListings.count} listings from '
'${shipyardListings.waypointCount} waypoints.',
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/bin/system_routing.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Future<void> command(FileSystem fs, ArgResults argResults) async {
final systems = SystemsCache.load(fs)!;
final hqSystemSymbol = await myHqSystemSymbol(db);
final marketListings = await MarketListingSnapshot.load(db);
final shipyardListings = ShipyardListingCache.load(fs);
final shipyardListings = await ShipyardListingSnapshot.load(db);
final systemConnectivity = await loadSystemConnectivity(db);
final routePlanner = RoutePlanner.fromSystemsCache(
systems,
Expand Down
4 changes: 2 additions & 2 deletions packages/cli/bin/system_stats.dart
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,9 @@ Future<void> command(FileSystem fs, ArgResults argResults) async {
logger.info('$markets markets');

// How many shipyards?
final shipyardListingCache = ShipyardListingCache.load(fs);
final shipyardListings = await ShipyardListingSnapshot.load(db);
var shipyards = 0;
for (final listing in shipyardListingCache.listings) {
for (final listing in shipyardListings.listings) {
// We could sort first by system to save ourselves some lookups.
final systemSymbol = listing.waypointSymbol.system;
if (reachableSystems.contains(systemSymbol)) {
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/bin/systems_explored.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Future<void> command(FileSystem fs, ArgResults argResults) async {
final chartingSnapshot = await ChartingSnapshot.load(db);
final systemsCache = SystemsCache.load(fs)!;
final marketListings = await MarketListingSnapshot.load(db);
final shipyardListings = ShipyardListingCache.load(fs);
final shipyardListings = await ShipyardListingSnapshot.load(db);

// Having market data means it's charted (either by us or someone else).
// final systemsWithMarketPrices =
Expand Down
8 changes: 4 additions & 4 deletions packages/cli/lib/cache/caches.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'package:cli/cache/agent_cache.dart';
import 'package:cli/cache/behavior_cache.dart';
import 'package:cli/cache/charting_cache.dart';
import 'package:cli/cache/construction_cache.dart';
import 'package:cli/cache/contract_cache.dart';
import 'package:cli/cache/contract_snapshot.dart';
import 'package:cli/cache/jump_gate_cache.dart';
import 'package:cli/cache/market_cache.dart';
import 'package:cli/cache/market_prices.dart';
Expand All @@ -28,7 +28,7 @@ export 'package:cli/cache/agent_cache.dart';
export 'package:cli/cache/behavior_cache.dart';
export 'package:cli/cache/charting_cache.dart';
export 'package:cli/cache/construction_cache.dart';
export 'package:cli/cache/contract_cache.dart';
export 'package:cli/cache/contract_snapshot.dart';
export 'package:cli/cache/jump_gate_cache.dart';
export 'package:cli/cache/market_cache.dart';
export 'package:cli/cache/market_prices.dart';
Expand Down Expand Up @@ -81,7 +81,7 @@ class Caches {
ContractSnapshot contracts;

/// Known shipyard listings.
final ShipyardListingCache shipyardListings;
final ShipyardListingSnapshot shipyardListings;

/// The historical shipyard prices.
final ShipyardPrices shipyardPrices;
Expand Down Expand Up @@ -136,7 +136,7 @@ class Caches {
final ships = await ShipCache.loadOrFetch(api, fs: fs, forceRefresh: true);
final marketPrices = await MarketPrices.load(db);
final shipyardPrices = await ShipyardPrices.load(db);
final shipyardListings = ShipyardListingCache.load(fs);
final shipyardListings = await ShipyardListingSnapshot.load(db);
final systems = await SystemsCache.loadOrFetch(fs, httpGet: httpGet);
final static = StaticCaches.load(fs);
final charting = ChartingCache(db);
Expand Down
69 changes: 18 additions & 51 deletions packages/cli/lib/cache/shipyard_listing_cache.dart
Original file line number Diff line number Diff line change
@@ -1,53 +1,21 @@
import 'package:cli/cache/caches.dart';
import 'package:cli/cache/json_store.dart';
import 'package:db/db.dart';
import 'package:types/types.dart';

typedef _Record = Map<WaypointSymbol, ShipyardListing>;

/// A cached of charted values from Waypoints.
class ShipyardListingCache extends JsonStore<_Record> {
class ShipyardListingSnapshot {
/// Creates a new charting cache.
ShipyardListingCache(
super.entries, {
required super.fs,
super.path = defaultPath,
}) : super(
recordToJson: (_Record r) => r.map(
(key, value) => MapEntry(
key.toJson(),
value.toJson(),
),
),
);
ShipyardListingSnapshot(Iterable<ShipyardListing> listings)
: _listingBySymbol =
Map.fromEntries(listings.map((l) => MapEntry(l.waypointSymbol, l)));

/// Load the charted values from the cache.
factory ShipyardListingCache.load(
FileSystem fs, {
String path = defaultPath,
}) {
final valuesBySymbol = JsonStore.loadRecord<_Record>(
fs,
path,
(Map<String, dynamic> j) => j.map(
(key, value) => MapEntry(
WaypointSymbol.fromJson(key),
ShipyardListing.fromJson(value as Map<String, dynamic>),
),
),
) ??
{};
return ShipyardListingCache(
valuesBySymbol,
fs: fs,
path: path,
);
static Future<ShipyardListingSnapshot> load(Database db) async {
final values = await db.allShipyardListings();
return ShipyardListingSnapshot(values);
}

/// The default path to the cache file.
static const defaultPath = 'data/shipyard_listings.json';

/// The ShipyardListings by WaypointSymbol.
Map<WaypointSymbol, ShipyardListing> get _listingBySymbol => record;
final Map<WaypointSymbol, ShipyardListing> _listingBySymbol;

/// The ShipyardListings.
Iterable<ShipyardListing> get listings => _listingBySymbol.values;
Expand Down Expand Up @@ -75,15 +43,14 @@ class ShipyardListingCache extends JsonStore<_Record> {
/// Fetch the ShipyardListing for the given WaypointSymbol.
ShipyardListing? operator [](WaypointSymbol waypointSymbol) =>
listingForSymbol(waypointSymbol);
}

/// Add ShipyardListing for the given Shipyard to the cache.
void addShipyard(Shipyard shipyard) {
final symbol = shipyard.waypointSymbol;
final listing = ShipyardListing(
waypointSymbol: symbol,
shipTypes: shipyard.shipTypes.map((inner) => inner.type).toSet(),
);
_listingBySymbol[symbol] = listing;
save();
}
/// Add ShipyardListing for the given Shipyard to the cache.
void recordShipyardListing(Database db, Shipyard shipyard) {
final symbol = shipyard.waypointSymbol;
final listing = ShipyardListing(
waypointSymbol: symbol,
shipTypes: shipyard.shipTypes.map((inner) => inner.type).toSet(),
);
db.upsertShipyardListing(listing);
}
8 changes: 5 additions & 3 deletions packages/cli/lib/cache/shipyard_prices.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:math';

import 'package:cli/cache/prices_cache.dart';
import 'package:cli/cache/shipyard_listing_cache.dart';
import 'package:cli/cache/static_cache.dart';
import 'package:cli/config.dart';
import 'package:cli/logger.dart';
Expand Down Expand Up @@ -99,14 +100,15 @@ void recordShipyardDataAndLog(
Shipyard shipyard,
Ship ship,
) {
recordShipyardData(db, shipyard);
recordShipyardPrices(db, shipyard);
recordShipyardShips(staticCaches, shipyard.ships);
recordShipyardListing(db, shipyard);
// Powershell needs an extra space after the emoji.
shipInfo(ship, '✍️ shipyard data @ ${shipyard.symbol}');
}

/// Record shipyard data.
void recordShipyardData(
/// Record shipyard prices.
void recordShipyardPrices(
Database db,
Shipyard shipyard, {
DateTime Function() getNow = defaultGetNow,
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/lib/idle_queue.dart
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ class IdleQueue {
if (listing == null) {
logger.info(' Shipyard: $waypointSymbol');
final shipyard = await getShipyard(api, waypointSymbol);
caches.shipyardListings.addShipyard(shipyard);
recordShipyardListing(db, shipyard);
}
}

Expand Down
2 changes: 1 addition & 1 deletion packages/cli/lib/net/direct.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'package:cli/api.dart';
import 'package:cli/cache/agent_cache.dart';
import 'package:cli/cache/construction_cache.dart';
import 'package:cli/cache/contract_cache.dart';
import 'package:cli/cache/contract_snapshot.dart';
import 'package:cli/cache/ship_cache.dart';
import 'package:db/db.dart';
import 'package:types/types.dart';
Expand Down
3 changes: 2 additions & 1 deletion packages/cli/test/cache/caches_mock.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ class _MockShipMountCache extends Mock implements ShipMountCache {}

class _MockShipReactorCache extends Mock implements ShipReactorCache {}

class _MockShipyardListingCache extends Mock implements ShipyardListingCache {}
class _MockShipyardListingCache extends Mock
implements ShipyardListingSnapshot {}

class _MockShipyardPrices extends Mock implements ShipyardPrices {}

Expand Down
30 changes: 0 additions & 30 deletions packages/cli/test/cache/shipyard_listing_cache_test.dart

This file was deleted.

0 comments on commit 9b6f153

Please sign in to comment.