Skip to content

Commit

Permalink
feat: move ShipyardListing into db
Browse files Browse the repository at this point in the history
  • Loading branch information
eseidel committed Feb 18, 2024
1 parent d5fc5af commit aad0dda
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 17 deletions.
22 changes: 22 additions & 0 deletions packages/db/lib/db.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'package:db/faction.dart';
import 'package:db/market_listing.dart';
import 'package:db/query.dart';
import 'package:db/queue.dart';
import 'package:db/shipyard_listing.dart';
import 'package:db/survey.dart';
import 'package:db/transaction.dart';
import 'package:meta/meta.dart';
Expand Down Expand Up @@ -284,4 +285,25 @@ class Database {
final query = upsertMarketListingQuery(listing);
await insertOne(query);
}

/// Get the shipyard listing for the given symbol.
Future<ShipyardListing?> shipyardListingForSymbol(
WaypointSymbol waypointSymbol,
) async {
final query = shipyardListingByWaypointSymbolQuery(waypointSymbol);
return queryOne(query, shipyardListingFromColumnMap);
}

/// Get all shipyard listings.
Future<List<ShipyardListing>> allShipyardListings() async {
final query = allShipyardListingsQuery();
return queryMany(query, shipyardListingFromColumnMap)
.then((list) => list.toList());
}

/// Update the given shipyard listing in the database.
Future<void> upsertShipyardListing(ShipyardListing listing) async {
final query = upsertShipyardListingQuery(listing);
await insertOne(query);
}
}
32 changes: 16 additions & 16 deletions packages/db/lib/market_listing.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,22 @@ Query marketListingByWaypointSymbolQuery(WaypointSymbol symbol) => Query(
parameters: {'symbol': symbol.waypoint},
);

/// Query all market listings.
Query allMarketListingsQuery() => const Query('SELECT * FROM market_listing');

/// Query to upsert a market listing.
Query upsertMarketListingQuery(MarketListing listing) => Query(
'''
INSERT INTO market_listing (symbol, exports, imports, exchange)
VALUES (@symbol, @exports, @imports, @exchange)
ON CONFLICT (symbol) DO UPDATE SET
exports = @exports,
imports = @imports,
exchange = @exchange
''',
parameters: marketListingToColumnMap(listing),
);

/// Build a column map from a market listing.
Map<String, dynamic> marketListingToColumnMap(MarketListing marketListing) => {
'symbol': marketListing.waypointSymbol.toString(),
Expand All @@ -33,19 +49,3 @@ MarketListing marketListingFromColumnMap(Map<String, dynamic> values) {
.toSet(),
);
}

/// Query all market listings.
Query allMarketListingsQuery() => const Query('SELECT * FROM market_listing');

/// Query to upsert a market listing.
Query upsertMarketListingQuery(MarketListing listing) => Query(
'''
INSERT INTO market_listing (symbol, exports, imports, exchange)
VALUES (@symbol, @exports, @imports, @exchange)
ON CONFLICT (symbol) DO UPDATE SET
exports = @exports,
imports = @imports,
exchange = @exchange
''',
parameters: marketListingToColumnMap(listing),
);
43 changes: 43 additions & 0 deletions packages/db/lib/shipyard_listing.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import 'package:db/query.dart';
import 'package:types/types.dart';

/// Lookup a shipyard listing by WaypointSymbol.
Query shipyardListingByWaypointSymbolQuery(WaypointSymbol symbol) => Query(
'SELECT * FROM shipyard_listing WHERE symbol = @symbol',
parameters: {'symbol': symbol.waypoint},
);

/// Query all shipyard listings.
Query allShipyardListingsQuery() =>
const Query('SELECT * FROM shipyard_listing');

/// Query to upsert a shipyard listing.
Query upsertShipyardListingQuery(ShipyardListing listing) => Query(
'''
INSERT INTO shipyard_listing (symbol, ships)
VALUES (@symbol, @types)
ON CONFLICT (symbol) DO UPDATE SET
types = @types
''',
parameters: shipyardListingToColumnMap(listing),
);

/// Build a column map from a shipyard listing.
Map<String, dynamic> shipyardListingToColumnMap(
ShipyardListing shipyardListing,
) =>
{
'symbol': shipyardListing.waypointSymbol.toJson(),
'types': shipyardListing.shipTypes.map((e) => e.toString()).toList(),
};

/// Build a shipyard listing from a column map.
ShipyardListing shipyardListingFromColumnMap(Map<String, dynamic> values) {
return ShipyardListing(
waypointSymbol: WaypointSymbol.fromString(values['symbol'] as String),
shipTypes: (values['ships'] as List<dynamic>)
.cast<String>()
.map((e) => ShipType.fromJson(e)!)
.toSet(),
);
}
3 changes: 2 additions & 1 deletion packages/db/sql/flows/drop_tables.sql
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ DROP TABLE IF EXISTS "extraction_" CASCADE;
DROP TABLE IF EXISTS "construction_" CASCADE;
DROP TABLE IF EXISTS "charting_" CASCADE;
DROP TABLE IF EXISTS "agent_" CASCADE;
DROP TABLE IF EXISTS "market_listing_" CASCADE;
DROP TABLE IF EXISTS "market_listing_" CASCADE;
DROP TABLE IF EXISTS "shipyard_listing_" CASCADE;
7 changes: 7 additions & 0 deletions packages/db/sql/tables/12_shipyard_listing.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
-- Describes an shipyard.
CREATE TABLE IF NOT EXISTS "shipyard_listing_" (
-- The symbol of the shipyard.
"symbol" text NOT NULL PRIMARY KEY,
-- Types of ships available at the shipyard.
"types" text [] NOT NULL,
);

0 comments on commit aad0dda

Please sign in to comment.