From 1ad31087a9919de54dd414037034d97d93dff289 Mon Sep 17 00:00:00 2001 From: ibanner56 Date: Tue, 21 Jul 2026 16:57:09 -0700 Subject: [PATCH 01/15] feat(core): add Venue entity, storage, migration v13 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce a first-class, reusable Venue entity so many programs can be held at the same venue with address/contact/schedule edited in one place. Mirrors the PublishedSource vertical slice. - model/venue.dart: @immutable Venue (id + required name, 20 nullable normalized strings), _normalize, copyWith clear-flags, ==/hashCode, and a computed displayName getter (app-side equivalent of CC's VenueDisplay_c). - tables.dart: new Venues table (VenueRow) + nullable soft-reference programs.venue_id (no FK — integrity guarded at the app layer). - database.dart: bump schema 12 -> 13 with an additive onUpgrade step (createTable(venues) + addColumn(programs.venueId)); no derived rebuild. - venue_repository.dart: upsert/getById/listAll(name, noCase)/delete with a guard that throws while any program still references the venue. Registered in the repositories facade. - program(.dart/_repository): carry venueId through the model, copyWith, duplicate, equality and persistence. - serialization: export/import program.venueId and embed a top-level venues array (omitted when empty, tolerated when absent for older bundles); upsert venues before programs and null a dangling venueId on import. OWASP-aligned validation for untrusted community bundles. - tests: venue model + repository (CRUD + delete-guard), v12 fixture + generator, v12 -> v13 migration group, and archive round-trip/legacy/ malformed-input coverage. Base of a stacked set (B: settings + editor/picker UI; C: display/export + docs). The 12 -> 13 bump is additive and rides a MINOR release. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../compendium_core/lib/compendium_core.dart | 2 + .../lib/src/model/program.dart | 14 + .../compendium_core/lib/src/model/venue.dart | 282 + .../lib/src/serialization/archive_codec.dart | 82 + .../src/serialization/archive_service.dart | 30 +- .../src/serialization/compendium_archive.dart | 15 +- .../lib/src/storage/database.dart | 26 +- .../lib/src/storage/database.g.dart | 10828 +++++++++------- .../repositories/program_repository.dart | 2 + .../storage/repositories/repositories.dart | 3 + .../repositories/venue_repository.dart | 102 + .../lib/src/storage/tables.dart | 47 + .../test/model/venue_test.dart | 154 + .../serialization/archive_codec_test.dart | 191 + .../serialization/archive_service_test.dart | 109 + .../fixtures/generate_v12_fixture.dart | 84 + .../test/storage/fixtures/v12.sqlite | Bin 0 -> 208896 bytes .../test/storage/migration_test.dart | 87 + .../test/storage/venue_repository_test.dart | 132 + 19 files changed, 7695 insertions(+), 4495 deletions(-) create mode 100644 packages/compendium_core/lib/src/model/venue.dart create mode 100644 packages/compendium_core/lib/src/storage/repositories/venue_repository.dart create mode 100644 packages/compendium_core/test/model/venue_test.dart create mode 100644 packages/compendium_core/test/storage/fixtures/generate_v12_fixture.dart create mode 100644 packages/compendium_core/test/storage/fixtures/v12.sqlite create mode 100644 packages/compendium_core/test/storage/venue_repository_test.dart diff --git a/packages/compendium_core/lib/compendium_core.dart b/packages/compendium_core/lib/compendium_core.dart index 4143d8f8..18da0bb2 100644 --- a/packages/compendium_core/lib/compendium_core.dart +++ b/packages/compendium_core/lib/compendium_core.dart @@ -52,6 +52,7 @@ export 'src/model/provenance.dart'; export 'src/model/published_source.dart'; export 'src/model/source_citation.dart'; export 'src/model/tag.dart'; +export 'src/model/venue.dart'; export 'src/search/search_sort.dart'; export 'src/search/title_sort_key.dart'; export 'src/search/filter.dart'; @@ -80,6 +81,7 @@ export 'src/storage/repositories/repositories.dart'; export 'src/storage/repositories/settings_repository.dart'; export 'src/storage/repositories/snapshot_repository.dart'; export 'src/storage/repositories/tag_repository.dart'; +export 'src/storage/repositories/venue_repository.dart'; export 'src/taxonomy/contra_taxonomy.dart'; export 'src/taxonomy/gate_facing.dart'; export 'src/taxonomy/move_def.dart'; diff --git a/packages/compendium_core/lib/src/model/program.dart b/packages/compendium_core/lib/src/model/program.dart index ba35f9e4..0b124297 100644 --- a/packages/compendium_core/lib/src/model/program.dart +++ b/packages/compendium_core/lib/src/model/program.dart @@ -164,6 +164,7 @@ class Program { required this.title, this.eventDate, this.venue, + this.venueId, this.band, this.caller, this.dancerLevel, @@ -189,6 +190,14 @@ class Program { final DateTime? eventDate; final String? venue; + /// Optional reference to a first-class venue entity (`venues.id`; see + /// `Venue`). A soft reference — not a DB foreign key — kept independently of + /// the free-text [venue] label so the two coexist non-destructively: the + /// display layer prefers a resolvable [venueId], falling back to [venue] + /// (`docs/design/domain-model.md`). `null` when the program has no linked + /// venue entity (the default, and every program before schema v13). + final String? venueId; + /// The band playing the event. final String? band; @@ -362,6 +371,7 @@ class Program { String? title, DateTime? eventDate, String? venue, + String? venueId, String? band, String? caller, String? dancerLevel, @@ -374,6 +384,7 @@ class Program { Provenance? provenance, bool clearEventDate = false, bool clearVenue = false, + bool clearVenueId = false, bool clearBand = false, bool clearCaller = false, bool clearDancerLevel = false, @@ -384,6 +395,7 @@ class Program { title: title ?? this.title, eventDate: clearEventDate ? null : (eventDate ?? this.eventDate), venue: clearVenue ? null : (venue ?? this.venue), + venueId: clearVenueId ? null : (venueId ?? this.venueId), band: clearBand ? null : (band ?? this.band), caller: clearCaller ? null : (caller ?? this.caller), dancerLevel: clearDancerLevel ? null : (dancerLevel ?? this.dancerLevel), @@ -411,6 +423,7 @@ class Program { title: newTitle ?? title, eventDate: eventDate, venue: venue, + venueId: venueId, band: band, caller: caller, dancerLevel: dancerLevel, @@ -475,6 +488,7 @@ class Program { other.title == title && other.eventDate == eventDate && other.venue == venue && + other.venueId == venueId && other.band == band && other.caller == caller && other.dancerLevel == dancerLevel && diff --git a/packages/compendium_core/lib/src/model/venue.dart b/packages/compendium_core/lib/src/model/venue.dart new file mode 100644 index 00000000..5821ca06 --- /dev/null +++ b/packages/compendium_core/lib/src/model/venue.dart @@ -0,0 +1,282 @@ +import 'package:meta/meta.dart'; + +/// A reusable venue (a hall, church, grange, festival site, …) that programs +/// reference. A first-class entity like [Choreographer]/[PublishedSource] — many +/// programs can be held at the same venue, so address/contact/schedule edits +/// happen in one place. +/// +/// Faithful to Caller's Companion's `Venue` table, minus its FileMaker plumbing +/// (`VenueDisplay_c`, `zc_*`/`zi_*` audit, `zk_Constant`, `SiteID`, the numeric +/// `zk_VenueID`): the app mints its own uuid [id], and CC's stored +/// `VenueDisplay_c` is reimplemented as the computed [displayName] getter rather +/// than a persisted column. +/// +/// A program links to a venue by id ([Program.venueId]); the free-text +/// [Program.venue] label persists independently so the two modes coexist +/// non-destructively (see `docs/design/domain-model.md`). +@immutable +class Venue { + Venue({ + required this.id, + required this.name, + String? address1, + String? address2, + String? city, + String? stateProv, + String? country, + String? postalCode, + String? plus4, + String? website, + String? sponsor, + String? eventName, + String? time, + String? genericSchedule, + String? price, + String? notes, + String? contact1Name, + String? contact1Phone, + String? contact1Email, + String? contact2Name, + String? contact2Phone, + String? contact2Email, + }) : address1 = _normalize(address1), + address2 = _normalize(address2), + city = _normalize(city), + stateProv = _normalize(stateProv), + country = _normalize(country), + postalCode = _normalize(postalCode), + plus4 = _normalize(plus4), + website = _normalize(website), + sponsor = _normalize(sponsor), + eventName = _normalize(eventName), + time = _normalize(time), + genericSchedule = _normalize(genericSchedule), + price = _normalize(price), + notes = _normalize(notes), + contact1Name = _normalize(contact1Name), + contact1Phone = _normalize(contact1Phone), + contact1Email = _normalize(contact1Email), + contact2Name = _normalize(contact2Name), + contact2Phone = _normalize(contact2Phone), + contact2Email = _normalize(contact2Email) { + if (name.trim().isEmpty) { + throw ArgumentError.value(name, 'name', 'must be non-empty'); + } + } + + final String id; + + /// The venue's name (CC `Venue`); required and non-empty. + final String name; + + /// First address line; nullable. + final String? address1; + + /// Second address line (suite/room/etc.); nullable. + final String? address2; + + /// City/town; nullable. + final String? city; + + /// State or province; nullable. + final String? stateProv; + + /// Country; nullable. + final String? country; + + /// Postal/ZIP code; nullable. Kept separate from [plus4] (CC parity). + final String? postalCode; + + /// The US ZIP+4 add-on; nullable. Separate field from [postalCode]. + final String? plus4; + + /// Canonical URL for the venue, if any; nullable. + final String? website; + + /// Hosting organization/sponsor; nullable. + final String? sponsor; + + /// The recurring event's name held here (CC user field); nullable. + final String? eventName; + + /// Free-text time-of-day for the event (CC user field); nullable. + final String? time; + + /// Free-text recurrence description (e.g. "2nd Saturdays"); nullable. + final String? genericSchedule; + + /// Free-text admission price; nullable. + final String? price; + + /// Freeform notes about the venue; nullable. + final String? notes; + + /// Primary contact's name; nullable. + final String? contact1Name; + + /// Primary contact's phone; nullable. + final String? contact1Phone; + + /// Primary contact's email; nullable. + final String? contact1Email; + + /// Secondary contact's name; nullable. + final String? contact2Name; + + /// Secondary contact's phone; nullable. + final String? contact2Phone; + + /// Secondary contact's email; nullable. + final String? contact2Email; + + /// A one-line human label for the venue — the app-side equivalent of CC's + /// stored `VenueDisplay_c`, but computed (never persisted) so it always + /// reflects the current fields. Concatenates [name], [address1], [city], + /// [stateProv] and [country] (in that order), skipping any that are null, + /// joined by ", ". Since [name] is always present, this is never empty. + String get displayName => + [name, address1, city, stateProv, country] + .whereType() + .join(', '); + + /// Normalizes a freeform optional string: trims and treats empty/whitespace + /// as `null`, so "unset" is a single canonical value (mirrors the + /// [PublishedSource]/[Choreographer] contact-field precedent). + static String? _normalize(String? value) { + if (value == null) return null; + final trimmed = value.trim(); + return trimmed.isEmpty ? null : trimmed; + } + + /// Returns a copy with the given fields replaced. The `clear*` flags reset + /// the respective nullable field to `null` and **win** over any value passed + /// for the same field (precedent: [PublishedSource.copyWith]). + Venue copyWith({ + String? name, + String? address1, + bool clearAddress1 = false, + String? address2, + bool clearAddress2 = false, + String? city, + bool clearCity = false, + String? stateProv, + bool clearStateProv = false, + String? country, + bool clearCountry = false, + String? postalCode, + bool clearPostalCode = false, + String? plus4, + bool clearPlus4 = false, + String? website, + bool clearWebsite = false, + String? sponsor, + bool clearSponsor = false, + String? eventName, + bool clearEventName = false, + String? time, + bool clearTime = false, + String? genericSchedule, + bool clearGenericSchedule = false, + String? price, + bool clearPrice = false, + String? notes, + bool clearNotes = false, + String? contact1Name, + bool clearContact1Name = false, + String? contact1Phone, + bool clearContact1Phone = false, + String? contact1Email, + bool clearContact1Email = false, + String? contact2Name, + bool clearContact2Name = false, + String? contact2Phone, + bool clearContact2Phone = false, + String? contact2Email, + bool clearContact2Email = false, + }) => Venue( + id: id, + name: name ?? this.name, + address1: clearAddress1 ? null : (address1 ?? this.address1), + address2: clearAddress2 ? null : (address2 ?? this.address2), + city: clearCity ? null : (city ?? this.city), + stateProv: clearStateProv ? null : (stateProv ?? this.stateProv), + country: clearCountry ? null : (country ?? this.country), + postalCode: clearPostalCode ? null : (postalCode ?? this.postalCode), + plus4: clearPlus4 ? null : (plus4 ?? this.plus4), + website: clearWebsite ? null : (website ?? this.website), + sponsor: clearSponsor ? null : (sponsor ?? this.sponsor), + eventName: clearEventName ? null : (eventName ?? this.eventName), + time: clearTime ? null : (time ?? this.time), + genericSchedule: clearGenericSchedule + ? null + : (genericSchedule ?? this.genericSchedule), + price: clearPrice ? null : (price ?? this.price), + notes: clearNotes ? null : (notes ?? this.notes), + contact1Name: clearContact1Name ? null : (contact1Name ?? this.contact1Name), + contact1Phone: clearContact1Phone + ? null + : (contact1Phone ?? this.contact1Phone), + contact1Email: clearContact1Email + ? null + : (contact1Email ?? this.contact1Email), + contact2Name: clearContact2Name ? null : (contact2Name ?? this.contact2Name), + contact2Phone: clearContact2Phone + ? null + : (contact2Phone ?? this.contact2Phone), + contact2Email: clearContact2Email + ? null + : (contact2Email ?? this.contact2Email), + ); + + @override + bool operator ==(Object other) => + other is Venue && + other.id == id && + other.name == name && + other.address1 == address1 && + other.address2 == address2 && + other.city == city && + other.stateProv == stateProv && + other.country == country && + other.postalCode == postalCode && + other.plus4 == plus4 && + other.website == website && + other.sponsor == sponsor && + other.eventName == eventName && + other.time == time && + other.genericSchedule == genericSchedule && + other.price == price && + other.notes == notes && + other.contact1Name == contact1Name && + other.contact1Phone == contact1Phone && + other.contact1Email == contact1Email && + other.contact2Name == contact2Name && + other.contact2Phone == contact2Phone && + other.contact2Email == contact2Email; + + @override + int get hashCode => Object.hashAll([ + id, + name, + address1, + address2, + city, + stateProv, + country, + postalCode, + plus4, + website, + sponsor, + eventName, + time, + genericSchedule, + price, + notes, + contact1Name, + contact1Phone, + contact1Email, + contact2Name, + contact2Phone, + contact2Email, + ]); +} diff --git a/packages/compendium_core/lib/src/serialization/archive_codec.dart b/packages/compendium_core/lib/src/serialization/archive_codec.dart index 56c49d61..8d96998a 100644 --- a/packages/compendium_core/lib/src/serialization/archive_codec.dart +++ b/packages/compendium_core/lib/src/serialization/archive_codec.dart @@ -13,6 +13,7 @@ import '../model/provenance.dart'; import '../model/published_source.dart'; import '../model/source_citation.dart'; import '../model/tag.dart'; +import '../model/venue.dart'; import 'compendium_archive.dart'; import 'figure_codec.dart'; @@ -65,6 +66,13 @@ Map archiveToJson(CompendiumArchive archive) => { for (final p in _sortedById(archive.programs, (p) => p.id)) _programToJson(p), ], + // Omit the `venues` array entirely when empty so archives produced before + // the venue entity (and any that simply have no venues) stay byte-identical + // to the pre-v13 format and older readers are unaffected. + if (archive.venues.isNotEmpty) + 'venues': [ + for (final v in _sortedById(archive.venues, (v) => v.id)) _venueToJson(v), + ], }; List _sortedById(List items, String Function(T) id) => @@ -176,6 +184,7 @@ Map _programToJson(Program p) => { 'title': p.title, if (p.eventDate != null) 'eventDate': _iso(p.eventDate!), if (p.venue != null) 'venue': p.venue, + if (p.venueId != null) 'venueId': p.venueId, if (p.band != null) 'band': p.band, if (p.caller != null) 'caller': p.caller, if (p.dancerLevel != null) 'dancerLevel': p.dancerLevel, @@ -199,6 +208,34 @@ Map _programSlotToJson(ProgramSlot s) => { if (s.performedAt != null) 'performedAt': _iso(s.performedAt!), }; +/// Emits only the venue's non-null fields (plus the always-present id/name), so +/// the serialized shape stays compact and the round-trip is stable (the model's +/// `_normalize` maps empty/whitespace to null on the way back in). +Map _venueToJson(Venue v) => { + 'id': v.id, + 'name': v.name, + if (v.address1 != null) 'address1': v.address1, + if (v.address2 != null) 'address2': v.address2, + if (v.city != null) 'city': v.city, + if (v.stateProv != null) 'stateProv': v.stateProv, + if (v.country != null) 'country': v.country, + if (v.postalCode != null) 'postalCode': v.postalCode, + if (v.plus4 != null) 'plus4': v.plus4, + if (v.website != null) 'website': v.website, + if (v.sponsor != null) 'sponsor': v.sponsor, + if (v.eventName != null) 'eventName': v.eventName, + if (v.time != null) 'time': v.time, + if (v.genericSchedule != null) 'genericSchedule': v.genericSchedule, + if (v.price != null) 'price': v.price, + if (v.notes != null) 'notes': v.notes, + if (v.contact1Name != null) 'contact1Name': v.contact1Name, + if (v.contact1Phone != null) 'contact1Phone': v.contact1Phone, + if (v.contact1Email != null) 'contact1Email': v.contact1Email, + if (v.contact2Name != null) 'contact2Name': v.contact2Name, + if (v.contact2Phone != null) 'contact2Phone': v.contact2Phone, + if (v.contact2Email != null) 'contact2Email': v.contact2Email, +}; + // --------------------------------------------------------------------------- // Decoding // --------------------------------------------------------------------------- @@ -299,6 +336,10 @@ ArchiveReadResult archiveFromJson(Map root) { _programFromJson, errors, ); + // Tolerate a missing/absent `venues` array (older bundles predate the venue + // entity): `_decodeList` returns an empty list for a null field and records + // a structured error for a present-but-malformed one, never throwing. + final venues = _decodeList(root['venues'], 'venue', _venueFromJson, errors); return ArchiveReadResult( archive: CompendiumArchive( @@ -310,6 +351,7 @@ ArchiveReadResult archiveFromJson(Map root) { publishedSources: publishedSources, customFields: customFields, tags: tags, + venues: venues, ), errors: errors, warnings: warnings, @@ -538,6 +580,7 @@ Program _programFromJson(Map m) => Program( title: _str(m, 'title'), eventDate: _dtOrNull(m, 'eventDate'), venue: _strOrNull(m, 'venue'), + venueId: _strOrNull(m, 'venueId'), band: _strOrNull(m, 'band'), caller: _strOrNull(m, 'caller'), dancerLevel: _strOrNull(m, 'dancerLevel'), @@ -576,6 +619,45 @@ List _programSlotsFromJson(Object? raw) { ]; } +/// Decodes an untrusted venue object from a shared/imported bundle. Every field +/// is type-checked (`_str`/`_strOrNull` throw a [FormatException] for a +/// non-string value); a missing/extra field is tolerated (nullable fields +/// default to null, unknown keys are ignored). The blank-name case is rejected +/// *here* with a [FormatException] — which [_decodeList] records as a per-entity +/// [ArchiveError] and skips — rather than letting the [Venue] constructor's +/// `ArgumentError` (a Dart `Error`, not an `Exception`) escape [_decodeList] and +/// abort the whole import. +Venue _venueFromJson(Map m) { + final name = _str(m, 'name'); + if (name.trim().isEmpty) { + throw const FormatException('venue "name" must be non-empty'); + } + return Venue( + id: _str(m, 'id'), + name: name, + address1: _strOrNull(m, 'address1'), + address2: _strOrNull(m, 'address2'), + city: _strOrNull(m, 'city'), + stateProv: _strOrNull(m, 'stateProv'), + country: _strOrNull(m, 'country'), + postalCode: _strOrNull(m, 'postalCode'), + plus4: _strOrNull(m, 'plus4'), + website: _strOrNull(m, 'website'), + sponsor: _strOrNull(m, 'sponsor'), + eventName: _strOrNull(m, 'eventName'), + time: _strOrNull(m, 'time'), + genericSchedule: _strOrNull(m, 'genericSchedule'), + price: _strOrNull(m, 'price'), + notes: _strOrNull(m, 'notes'), + contact1Name: _strOrNull(m, 'contact1Name'), + contact1Phone: _strOrNull(m, 'contact1Phone'), + contact1Email: _strOrNull(m, 'contact1Email'), + contact2Name: _strOrNull(m, 'contact2Name'), + contact2Phone: _strOrNull(m, 'contact2Phone'), + contact2Email: _strOrNull(m, 'contact2Email'), + ); +} + // --------------------------------------------------------------------------- // Typed field accessors (throw FormatException; caught per-entity on decode) // --------------------------------------------------------------------------- diff --git a/packages/compendium_core/lib/src/serialization/archive_service.dart b/packages/compendium_core/lib/src/serialization/archive_service.dart index 10c1e019..06990869 100644 --- a/packages/compendium_core/lib/src/serialization/archive_service.dart +++ b/packages/compendium_core/lib/src/serialization/archive_service.dart @@ -1,3 +1,4 @@ +import '../model/program.dart'; import '../storage/repositories/repositories.dart'; import 'compendium_archive.dart'; @@ -30,6 +31,7 @@ class ArchiveExporter { publishedSources: await _repos.publishedSources.listAll(), customFields: await _repos.customFieldDefs.listAll(), tags: await _repos.tags.listAll(), + venues: await _repos.venues.listAll(), ); } @@ -89,7 +91,8 @@ class ArchiveRestorer { /// Writes every archive entity in foreign-key-safe order: the entities a /// dance references (published sources, choreographers, tags, custom-field - /// defs) first, then dances, then programs (whose slots reference dances). + /// defs) first, then dances, then venues, then programs (whose slots + /// reference dances and whose `venueId` references a venue). Future _load( CompendiumArchive archive, List errors, @@ -119,13 +122,35 @@ class ArchiveRestorer { await _repos.dances.create(d); }); } + // Venues before programs: a program's `venueId` soft-references a venue, so + // the referenced record must land first for the link to resolve. + for (final v in archive.venues) { + await _guard('venue', v.id, errors, () async { + await _repos.venues.upsert(v); + }); + } for (final p in archive.programs) { await _guard('program', p.id, errors, () async { - await _repos.programs.create(p); + await _repos.programs.create(await _withResolvedVenue(p)); }); } } + /// Guards against a **dangling** `venueId` from an untrusted bundle: if the + /// program references a venue that resolves in neither the just-loaded + /// archive nor the existing dataset, the link is cleared before the program + /// is written. `venueId` is a soft reference (no DB foreign key), so a + /// dangling value would not fail at commit — but leaving one silently in + /// place is exactly what the OWASP-aligned import contract forbids, so it is + /// nulled rather than persisted as an unresolvable reference. A resolvable + /// (or already-null) `venueId` is left untouched. + Future _withResolvedVenue(Program p) async { + final venueId = p.venueId; + if (venueId == null) return p; + final exists = await _repos.venues.getById(venueId) != null; + return exists ? p : p.copyWith(clearVenueId: true); + } + /// Removes every user-content row (and its derived indexes) so a /// [RestoreMode.replace] loads into a clean database. Deletes join/derived /// tables before their parents to respect foreign keys, and clears the @@ -147,6 +172,7 @@ class ArchiveRestorer { await db.delete(db.tags).go(); await db.delete(db.choreographers).go(); await db.delete(db.publishedSources).go(); + await db.delete(db.venues).go(); } Future _guard( diff --git a/packages/compendium_core/lib/src/serialization/compendium_archive.dart b/packages/compendium_core/lib/src/serialization/compendium_archive.dart index 6915a469..f37468b5 100644 --- a/packages/compendium_core/lib/src/serialization/compendium_archive.dart +++ b/packages/compendium_core/lib/src/serialization/compendium_archive.dart @@ -7,6 +7,7 @@ import '../model/dance.dart'; import '../model/program.dart'; import '../model/published_source.dart'; import '../model/tag.dart'; +import '../model/venue.dart'; const ListEquality _listEq = ListEquality(); @@ -39,8 +40,8 @@ enum RestoreMode { /// This is the in-memory form of the canonical JSON backup/exchange format /// (`docs/design/imports.md` §"Generic JSON (6.6)"). It carries user *content* /// — dances (with figures, links, citations, provenance), programs (with -/// slots), custom-field definitions, tags, choreographers, and published -/// sources — at full fidelity. App-local concerns (settings, dialect library, +/// slots), custom-field definitions, tags, choreographers, published sources, +/// and venues — at full fidelity. App-local concerns (settings, dialect library, /// themes) are intentionally excluded; they are layered in at ROADMAP G.5. /// /// Serialize with `encodeArchive`/`decodeArchive` in `archive_codec.dart`. @@ -55,6 +56,7 @@ class CompendiumArchive { this.publishedSources = const [], this.customFields = const [], this.tags = const [], + this.venues = const [], }); /// The [archiveSchemaVersion] this archive was written under. @@ -70,6 +72,11 @@ class CompendiumArchive { final List customFields; final List tags; + /// Reusable venue entities referenced by programs' `venueId`. Added + /// alongside the schema-v13 venue entity; older archives simply omit the + /// `venues` array and decode to an empty list. + final List venues; + @override bool operator ==(Object other) => other is CompendiumArchive && @@ -80,7 +87,8 @@ class CompendiumArchive { _listEq.equals(other.choreographers, choreographers) && _listEq.equals(other.publishedSources, publishedSources) && _listEq.equals(other.customFields, customFields) && - _listEq.equals(other.tags, tags); + _listEq.equals(other.tags, tags) && + _listEq.equals(other.venues, venues); @override int get hashCode => Object.hash( @@ -92,6 +100,7 @@ class CompendiumArchive { _listEq.hash(publishedSources), _listEq.hash(customFields), _listEq.hash(tags), + _listEq.hash(venues), ); } diff --git a/packages/compendium_core/lib/src/storage/database.dart b/packages/compendium_core/lib/src/storage/database.dart index ec620764..5266e7a6 100644 --- a/packages/compendium_core/lib/src/storage/database.dart +++ b/packages/compendium_core/lib/src/storage/database.dart @@ -51,7 +51,7 @@ const String derivedRebuildRequiredKey = '__derived_rebuild_required__'; /// schemaVersion] getter) so the app-layer migration preflight can compare a /// file's persisted `user_version` against the running schema *without* opening /// the database. Keep this and the migration `onUpgrade` steps in lockstep. -const int kCompendiumSchemaVersion = 12; +const int kCompendiumSchemaVersion = 13; /// The Caller's Compendium local database. /// @@ -147,6 +147,18 @@ const int kCompendiumSchemaVersion = 12; /// or figure that can't be cleanly remapped is left byte-identical so it falls /// through to the non-destructive unknown-move path (issue #358) at read time, /// never dropped or corrupted. +/// - v13 (2026-07-21): first-class venue entity. Adds one brand-new table, +/// `venues` (a reusable venue — id/name plus 20 nullable address/contact/ +/// schedule columns, faithful to CC's `Venue` table), and a single nullable +/// `programs.venue_id` soft reference to it. Purely additive: `createTable` + +/// `addColumn`, no data back-fill (fresh table starts empty; existing +/// programs get `venue_id` NULL and keep their free-text `venue` label). The +/// free-text `programs.venue` label and the `venue_id` entity link coexist +/// non-destructively. `venue_id` is a deliberately un-constrained soft +/// reference (no FK) — referential integrity is enforced at the app layer by +/// `VenueRepository.delete`'s guard — so this migration adds NO FK and no +/// rebuild marker. Venues do NOT feed the derived `dance_fts`/`dance_figures` +/// indexes, so NO derived rebuild is required. /// /// Every future migration must (a) bump [schemaVersion], (b) add a /// `MigrationStrategy` step for the new version, and (c) ship a test that @@ -177,6 +189,7 @@ const int kCompendiumSchemaVersion = 12; Settings, Snapshots, ProgramProvenance, + Venues, ], ) class CompendiumDatabase extends _$CompendiumDatabase { @@ -348,6 +361,17 @@ class CompendiumDatabase extends _$CompendiumDatabase { ); } } + if (from < 13) { + // First-class venue entity. One brand-new table (`venues`) plus a + // single nullable soft-reference column `programs.venue_id`. Purely + // additive: existing programs get `venue_id` NULL and keep their + // free-text `venue` label (the two coexist non-destructively). `venues` + // does NOT feed the derived `dance_fts`/`dance_figures` indexes, and no + // data is back-filled, so — unlike the v9 step — NO derived rebuild is + // required and no rebuild marker is written. + await m.createTable(venues); + await m.addColumn(programs, programs.venueId); + } }, beforeOpen: (details) async { await customStatement('PRAGMA foreign_keys = ON'); diff --git a/packages/compendium_core/lib/src/storage/database.g.dart b/packages/compendium_core/lib/src/storage/database.g.dart index 2ebe09d0..9565df95 100644 --- a/packages/compendium_core/lib/src/storage/database.g.dart +++ b/packages/compendium_core/lib/src/storage/database.g.dart @@ -2480,6 +2480,17 @@ class $ProgramsTable extends Programs type: DriftSqlType.string, requiredDuringInsert: false, ); + static const VerificationMeta _venueIdMeta = const VerificationMeta( + 'venueId', + ); + @override + late final GeneratedColumn venueId = GeneratedColumn( + 'venue_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); static const VerificationMeta _bandMeta = const VerificationMeta('band'); @override late final GeneratedColumn band = GeneratedColumn( @@ -2582,6 +2593,7 @@ class $ProgramsTable extends Programs title, eventDate, venue, + venueId, band, caller, dancerLevel, @@ -2629,6 +2641,12 @@ class $ProgramsTable extends Programs venue.isAcceptableOrUnknown(data['venue']!, _venueMeta), ); } + if (data.containsKey('venue_id')) { + context.handle( + _venueIdMeta, + venueId.isAcceptableOrUnknown(data['venue_id']!, _venueIdMeta), + ); + } if (data.containsKey('band')) { context.handle( _bandMeta, @@ -2712,6 +2730,10 @@ class $ProgramsTable extends Programs DriftSqlType.string, data['${effectivePrefix}venue'], ), + venueId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}venue_id'], + ), band: attachedDatabase.typeMapping.read( DriftSqlType.string, data['${effectivePrefix}band'], @@ -2767,6 +2789,15 @@ class ProgramRow extends DataClass implements Insertable { final String title; final DateTime? eventDate; final String? venue; + + /// Optional reference to a first-class [Venues] row (`venues.id`), added in + /// schema v13. A deliberately un-constrained soft reference (no drift + /// `.references()`/FK): the free-text [venue] label and this entity link + /// coexist non-destructively, and referential integrity is enforced at the + /// app layer by `VenueRepository.delete`'s guard rather than a DB constraint + /// (so an import can carry a program whose venue record is absent without + /// tripping a foreign key). + final String? venueId; final String? band; final String? caller; final String? dancerLevel; @@ -2781,6 +2812,7 @@ class ProgramRow extends DataClass implements Insertable { required this.title, this.eventDate, this.venue, + this.venueId, this.band, this.caller, this.dancerLevel, @@ -2802,6 +2834,9 @@ class ProgramRow extends DataClass implements Insertable { if (!nullToAbsent || venue != null) { map['venue'] = Variable(venue); } + if (!nullToAbsent || venueId != null) { + map['venue_id'] = Variable(venueId); + } if (!nullToAbsent || band != null) { map['band'] = Variable(band); } @@ -2836,6 +2871,9 @@ class ProgramRow extends DataClass implements Insertable { venue: venue == null && nullToAbsent ? const Value.absent() : Value(venue), + venueId: venueId == null && nullToAbsent + ? const Value.absent() + : Value(venueId), band: band == null && nullToAbsent ? const Value.absent() : Value(band), caller: caller == null && nullToAbsent ? const Value.absent() @@ -2864,6 +2902,7 @@ class ProgramRow extends DataClass implements Insertable { title: serializer.fromJson(json['title']), eventDate: serializer.fromJson(json['eventDate']), venue: serializer.fromJson(json['venue']), + venueId: serializer.fromJson(json['venueId']), band: serializer.fromJson(json['band']), caller: serializer.fromJson(json['caller']), dancerLevel: serializer.fromJson(json['dancerLevel']), @@ -2885,6 +2924,7 @@ class ProgramRow extends DataClass implements Insertable { 'title': serializer.toJson(title), 'eventDate': serializer.toJson(eventDate), 'venue': serializer.toJson(venue), + 'venueId': serializer.toJson(venueId), 'band': serializer.toJson(band), 'caller': serializer.toJson(caller), 'dancerLevel': serializer.toJson(dancerLevel), @@ -2904,6 +2944,7 @@ class ProgramRow extends DataClass implements Insertable { String? title, Value eventDate = const Value.absent(), Value venue = const Value.absent(), + Value venueId = const Value.absent(), Value band = const Value.absent(), Value caller = const Value.absent(), Value dancerLevel = const Value.absent(), @@ -2918,6 +2959,7 @@ class ProgramRow extends DataClass implements Insertable { title: title ?? this.title, eventDate: eventDate.present ? eventDate.value : this.eventDate, venue: venue.present ? venue.value : this.venue, + venueId: venueId.present ? venueId.value : this.venueId, band: band.present ? band.value : this.band, caller: caller.present ? caller.value : this.caller, dancerLevel: dancerLevel.present ? dancerLevel.value : this.dancerLevel, @@ -2934,6 +2976,7 @@ class ProgramRow extends DataClass implements Insertable { title: data.title.present ? data.title.value : this.title, eventDate: data.eventDate.present ? data.eventDate.value : this.eventDate, venue: data.venue.present ? data.venue.value : this.venue, + venueId: data.venueId.present ? data.venueId.value : this.venueId, band: data.band.present ? data.band.value : this.band, caller: data.caller.present ? data.caller.value : this.caller, dancerLevel: data.dancerLevel.present @@ -2957,6 +3000,7 @@ class ProgramRow extends DataClass implements Insertable { ..write('title: $title, ') ..write('eventDate: $eventDate, ') ..write('venue: $venue, ') + ..write('venueId: $venueId, ') ..write('band: $band, ') ..write('caller: $caller, ') ..write('dancerLevel: $dancerLevel, ') @@ -2976,6 +3020,7 @@ class ProgramRow extends DataClass implements Insertable { title, eventDate, venue, + venueId, band, caller, dancerLevel, @@ -2994,6 +3039,7 @@ class ProgramRow extends DataClass implements Insertable { other.title == this.title && other.eventDate == this.eventDate && other.venue == this.venue && + other.venueId == this.venueId && other.band == this.band && other.caller == this.caller && other.dancerLevel == this.dancerLevel && @@ -3010,6 +3056,7 @@ class ProgramsCompanion extends UpdateCompanion { final Value title; final Value eventDate; final Value venue; + final Value venueId; final Value band; final Value caller; final Value dancerLevel; @@ -3025,6 +3072,7 @@ class ProgramsCompanion extends UpdateCompanion { this.title = const Value.absent(), this.eventDate = const Value.absent(), this.venue = const Value.absent(), + this.venueId = const Value.absent(), this.band = const Value.absent(), this.caller = const Value.absent(), this.dancerLevel = const Value.absent(), @@ -3041,6 +3089,7 @@ class ProgramsCompanion extends UpdateCompanion { required String title, this.eventDate = const Value.absent(), this.venue = const Value.absent(), + this.venueId = const Value.absent(), this.band = const Value.absent(), this.caller = const Value.absent(), this.dancerLevel = const Value.absent(), @@ -3061,6 +3110,7 @@ class ProgramsCompanion extends UpdateCompanion { Expression? title, Expression? eventDate, Expression? venue, + Expression? venueId, Expression? band, Expression? caller, Expression? dancerLevel, @@ -3077,6 +3127,7 @@ class ProgramsCompanion extends UpdateCompanion { if (title != null) 'title': title, if (eventDate != null) 'event_date': eventDate, if (venue != null) 'venue': venue, + if (venueId != null) 'venue_id': venueId, if (band != null) 'band': band, if (caller != null) 'caller': caller, if (dancerLevel != null) 'dancer_level': dancerLevel, @@ -3095,6 +3146,7 @@ class ProgramsCompanion extends UpdateCompanion { Value? title, Value? eventDate, Value? venue, + Value? venueId, Value? band, Value? caller, Value? dancerLevel, @@ -3111,6 +3163,7 @@ class ProgramsCompanion extends UpdateCompanion { title: title ?? this.title, eventDate: eventDate ?? this.eventDate, venue: venue ?? this.venue, + venueId: venueId ?? this.venueId, band: band ?? this.band, caller: caller ?? this.caller, dancerLevel: dancerLevel ?? this.dancerLevel, @@ -3139,6 +3192,9 @@ class ProgramsCompanion extends UpdateCompanion { if (venue.present) { map['venue'] = Variable(venue.value); } + if (venueId.present) { + map['venue_id'] = Variable(venueId.value); + } if (band.present) { map['band'] = Variable(band.value); } @@ -3181,6 +3237,7 @@ class ProgramsCompanion extends UpdateCompanion { ..write('title: $title, ') ..write('eventDate: $eventDate, ') ..write('venue: $venue, ') + ..write('venueId: $venueId, ') ..write('band: $band, ') ..write('caller: $caller, ') ..write('dancerLevel: $dancerLevel, ') @@ -7879,932 +7936,1745 @@ class ProgramProvenanceCompanion extends UpdateCompanion { } } -abstract class _$CompendiumDatabase extends GeneratedDatabase { - _$CompendiumDatabase(QueryExecutor e) : super(e); - $CompendiumDatabaseManager get managers => $CompendiumDatabaseManager(this); - late final $DancesTable dances = $DancesTable(this); - late final $ChoreographersTable choreographers = $ChoreographersTable(this); - late final $DanceAuthorsTable danceAuthors = $DanceAuthorsTable(this); - late final $DanceFiguresTable danceFigures = $DanceFiguresTable(this); - late final $ProgramsTable programs = $ProgramsTable(this); - late final $ProgramSlotsTable programSlots = $ProgramSlotsTable(this); - late final $CustomFieldDefsTable customFieldDefs = $CustomFieldDefsTable( - this, +class $VenuesTable extends Venues with TableInfo<$VenuesTable, VenueRow> { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + $VenuesTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _idMeta = const VerificationMeta('id'); + @override + late final GeneratedColumn id = GeneratedColumn( + 'id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, ); - late final $CustomFieldValuesTable customFieldValues = - $CustomFieldValuesTable(this); - late final $TagsTable tags = $TagsTable(this); - late final $DanceTagsTable danceTags = $DanceTagsTable(this); - late final $DanceLinksTable danceLinks = $DanceLinksTable(this); - late final $ProvenanceTable provenance = $ProvenanceTable(this); - late final $PublishedSourcesTable publishedSources = $PublishedSourcesTable( - this, + static const VerificationMeta _nameMeta = const VerificationMeta('name'); + @override + late final GeneratedColumn name = GeneratedColumn( + 'name', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _address1Meta = const VerificationMeta( + 'address1', ); - late final $DanceSourcesTable danceSources = $DanceSourcesTable(this); - late final $SettingsTable settings = $SettingsTable(this); - late final $SnapshotsTable snapshots = $SnapshotsTable(this); - late final $ProgramProvenanceTable programProvenance = - $ProgramProvenanceTable(this); @override - Iterable> get allTables => - allSchemaEntities.whereType>(); + late final GeneratedColumn address1 = GeneratedColumn( + 'address1', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _address2Meta = const VerificationMeta( + 'address2', + ); @override - List get allSchemaEntities => [ - dances, - choreographers, - danceAuthors, - danceFigures, - programs, - programSlots, - customFieldDefs, - customFieldValues, - tags, - danceTags, - danceLinks, - provenance, - publishedSources, - danceSources, - settings, - snapshots, - programProvenance, + late final GeneratedColumn address2 = GeneratedColumn( + 'address2', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _cityMeta = const VerificationMeta('city'); + @override + late final GeneratedColumn city = GeneratedColumn( + 'city', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _stateProvMeta = const VerificationMeta( + 'stateProv', + ); + @override + late final GeneratedColumn stateProv = GeneratedColumn( + 'state_prov', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _countryMeta = const VerificationMeta( + 'country', + ); + @override + late final GeneratedColumn country = GeneratedColumn( + 'country', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _postalCodeMeta = const VerificationMeta( + 'postalCode', + ); + @override + late final GeneratedColumn postalCode = GeneratedColumn( + 'postal_code', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _plus4Meta = const VerificationMeta('plus4'); + @override + late final GeneratedColumn plus4 = GeneratedColumn( + 'plus4', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _websiteMeta = const VerificationMeta( + 'website', + ); + @override + late final GeneratedColumn website = GeneratedColumn( + 'website', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _sponsorMeta = const VerificationMeta( + 'sponsor', + ); + @override + late final GeneratedColumn sponsor = GeneratedColumn( + 'sponsor', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _eventNameMeta = const VerificationMeta( + 'eventName', + ); + @override + late final GeneratedColumn eventName = GeneratedColumn( + 'event_name', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _timeMeta = const VerificationMeta('time'); + @override + late final GeneratedColumn time = GeneratedColumn( + 'time', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _genericScheduleMeta = const VerificationMeta( + 'genericSchedule', + ); + @override + late final GeneratedColumn genericSchedule = GeneratedColumn( + 'generic_schedule', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _priceMeta = const VerificationMeta('price'); + @override + late final GeneratedColumn price = GeneratedColumn( + 'price', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _notesMeta = const VerificationMeta('notes'); + @override + late final GeneratedColumn notes = GeneratedColumn( + 'notes', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _contact1NameMeta = const VerificationMeta( + 'contact1Name', + ); + @override + late final GeneratedColumn contact1Name = GeneratedColumn( + 'contact1_name', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _contact1PhoneMeta = const VerificationMeta( + 'contact1Phone', + ); + @override + late final GeneratedColumn contact1Phone = GeneratedColumn( + 'contact1_phone', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _contact1EmailMeta = const VerificationMeta( + 'contact1Email', + ); + @override + late final GeneratedColumn contact1Email = GeneratedColumn( + 'contact1_email', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _contact2NameMeta = const VerificationMeta( + 'contact2Name', + ); + @override + late final GeneratedColumn contact2Name = GeneratedColumn( + 'contact2_name', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _contact2PhoneMeta = const VerificationMeta( + 'contact2Phone', + ); + @override + late final GeneratedColumn contact2Phone = GeneratedColumn( + 'contact2_phone', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _contact2EmailMeta = const VerificationMeta( + 'contact2Email', + ); + @override + late final GeneratedColumn contact2Email = GeneratedColumn( + 'contact2_email', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + @override + List get $columns => [ + id, + name, + address1, + address2, + city, + stateProv, + country, + postalCode, + plus4, + website, + sponsor, + eventName, + time, + genericSchedule, + price, + notes, + contact1Name, + contact1Phone, + contact1Email, + contact2Name, + contact2Phone, + contact2Email, ]; @override - StreamQueryUpdateRules get streamUpdateRules => const StreamQueryUpdateRules([ - WritePropagation( - on: TableUpdateQuery.onTableName( - 'dances', - limitUpdateKind: UpdateKind.delete, - ), - result: [TableUpdate('dance_authors', kind: UpdateKind.delete)], - ), - WritePropagation( - on: TableUpdateQuery.onTableName( - 'choreographers', - limitUpdateKind: UpdateKind.delete, - ), - result: [TableUpdate('dance_authors', kind: UpdateKind.delete)], - ), - WritePropagation( - on: TableUpdateQuery.onTableName( - 'dances', - limitUpdateKind: UpdateKind.delete, - ), - result: [TableUpdate('dance_figures', kind: UpdateKind.delete)], - ), - WritePropagation( - on: TableUpdateQuery.onTableName( - 'programs', - limitUpdateKind: UpdateKind.delete, - ), - result: [TableUpdate('program_slots', kind: UpdateKind.delete)], - ), - WritePropagation( - on: TableUpdateQuery.onTableName( - 'dances', - limitUpdateKind: UpdateKind.delete, + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'venues'; + @override + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('id')) { + context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); + } else if (isInserting) { + context.missing(_idMeta); + } + if (data.containsKey('name')) { + context.handle( + _nameMeta, + name.isAcceptableOrUnknown(data['name']!, _nameMeta), + ); + } else if (isInserting) { + context.missing(_nameMeta); + } + if (data.containsKey('address1')) { + context.handle( + _address1Meta, + address1.isAcceptableOrUnknown(data['address1']!, _address1Meta), + ); + } + if (data.containsKey('address2')) { + context.handle( + _address2Meta, + address2.isAcceptableOrUnknown(data['address2']!, _address2Meta), + ); + } + if (data.containsKey('city')) { + context.handle( + _cityMeta, + city.isAcceptableOrUnknown(data['city']!, _cityMeta), + ); + } + if (data.containsKey('state_prov')) { + context.handle( + _stateProvMeta, + stateProv.isAcceptableOrUnknown(data['state_prov']!, _stateProvMeta), + ); + } + if (data.containsKey('country')) { + context.handle( + _countryMeta, + country.isAcceptableOrUnknown(data['country']!, _countryMeta), + ); + } + if (data.containsKey('postal_code')) { + context.handle( + _postalCodeMeta, + postalCode.isAcceptableOrUnknown(data['postal_code']!, _postalCodeMeta), + ); + } + if (data.containsKey('plus4')) { + context.handle( + _plus4Meta, + plus4.isAcceptableOrUnknown(data['plus4']!, _plus4Meta), + ); + } + if (data.containsKey('website')) { + context.handle( + _websiteMeta, + website.isAcceptableOrUnknown(data['website']!, _websiteMeta), + ); + } + if (data.containsKey('sponsor')) { + context.handle( + _sponsorMeta, + sponsor.isAcceptableOrUnknown(data['sponsor']!, _sponsorMeta), + ); + } + if (data.containsKey('event_name')) { + context.handle( + _eventNameMeta, + eventName.isAcceptableOrUnknown(data['event_name']!, _eventNameMeta), + ); + } + if (data.containsKey('time')) { + context.handle( + _timeMeta, + time.isAcceptableOrUnknown(data['time']!, _timeMeta), + ); + } + if (data.containsKey('generic_schedule')) { + context.handle( + _genericScheduleMeta, + genericSchedule.isAcceptableOrUnknown( + data['generic_schedule']!, + _genericScheduleMeta, + ), + ); + } + if (data.containsKey('price')) { + context.handle( + _priceMeta, + price.isAcceptableOrUnknown(data['price']!, _priceMeta), + ); + } + if (data.containsKey('notes')) { + context.handle( + _notesMeta, + notes.isAcceptableOrUnknown(data['notes']!, _notesMeta), + ); + } + if (data.containsKey('contact1_name')) { + context.handle( + _contact1NameMeta, + contact1Name.isAcceptableOrUnknown( + data['contact1_name']!, + _contact1NameMeta, + ), + ); + } + if (data.containsKey('contact1_phone')) { + context.handle( + _contact1PhoneMeta, + contact1Phone.isAcceptableOrUnknown( + data['contact1_phone']!, + _contact1PhoneMeta, + ), + ); + } + if (data.containsKey('contact1_email')) { + context.handle( + _contact1EmailMeta, + contact1Email.isAcceptableOrUnknown( + data['contact1_email']!, + _contact1EmailMeta, + ), + ); + } + if (data.containsKey('contact2_name')) { + context.handle( + _contact2NameMeta, + contact2Name.isAcceptableOrUnknown( + data['contact2_name']!, + _contact2NameMeta, + ), + ); + } + if (data.containsKey('contact2_phone')) { + context.handle( + _contact2PhoneMeta, + contact2Phone.isAcceptableOrUnknown( + data['contact2_phone']!, + _contact2PhoneMeta, + ), + ); + } + if (data.containsKey('contact2_email')) { + context.handle( + _contact2EmailMeta, + contact2Email.isAcceptableOrUnknown( + data['contact2_email']!, + _contact2EmailMeta, + ), + ); + } + return context; + } + + @override + Set get $primaryKey => {id}; + @override + VenueRow map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return VenueRow( + id: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}id'], + )!, + name: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}name'], + )!, + address1: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}address1'], ), - result: [TableUpdate('program_slots', kind: UpdateKind.update)], - ), - WritePropagation( - on: TableUpdateQuery.onTableName( - 'dances', - limitUpdateKind: UpdateKind.delete, + address2: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}address2'], ), - result: [TableUpdate('custom_field_values', kind: UpdateKind.delete)], - ), - WritePropagation( - on: TableUpdateQuery.onTableName( - 'custom_field_defs', - limitUpdateKind: UpdateKind.delete, + city: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}city'], ), - result: [TableUpdate('custom_field_values', kind: UpdateKind.delete)], - ), - WritePropagation( - on: TableUpdateQuery.onTableName( - 'dances', - limitUpdateKind: UpdateKind.delete, + stateProv: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}state_prov'], ), - result: [TableUpdate('dance_tags', kind: UpdateKind.delete)], - ), - WritePropagation( - on: TableUpdateQuery.onTableName( - 'tags', - limitUpdateKind: UpdateKind.delete, + country: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}country'], ), - result: [TableUpdate('dance_tags', kind: UpdateKind.delete)], - ), - WritePropagation( - on: TableUpdateQuery.onTableName( - 'dances', - limitUpdateKind: UpdateKind.delete, + postalCode: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}postal_code'], ), - result: [TableUpdate('dance_links', kind: UpdateKind.delete)], - ), - WritePropagation( - on: TableUpdateQuery.onTableName( - 'dances', - limitUpdateKind: UpdateKind.delete, + plus4: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}plus4'], ), - result: [TableUpdate('dance_links', kind: UpdateKind.update)], - ), - WritePropagation( - on: TableUpdateQuery.onTableName( - 'dances', - limitUpdateKind: UpdateKind.delete, + website: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}website'], ), - result: [TableUpdate('provenance', kind: UpdateKind.delete)], - ), - WritePropagation( - on: TableUpdateQuery.onTableName( - 'dances', - limitUpdateKind: UpdateKind.delete, + sponsor: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}sponsor'], ), - result: [TableUpdate('dance_sources', kind: UpdateKind.delete)], - ), - WritePropagation( - on: TableUpdateQuery.onTableName( - 'published_sources', - limitUpdateKind: UpdateKind.delete, + eventName: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}event_name'], ), - result: [TableUpdate('dance_sources', kind: UpdateKind.delete)], - ), - WritePropagation( - on: TableUpdateQuery.onTableName( - 'programs', - limitUpdateKind: UpdateKind.delete, + time: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}time'], ), - result: [TableUpdate('program_provenance', kind: UpdateKind.delete)], - ), - ]); + genericSchedule: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}generic_schedule'], + ), + price: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}price'], + ), + notes: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}notes'], + ), + contact1Name: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}contact1_name'], + ), + contact1Phone: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}contact1_phone'], + ), + contact1Email: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}contact1_email'], + ), + contact2Name: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}contact2_name'], + ), + contact2Phone: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}contact2_phone'], + ), + contact2Email: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}contact2_email'], + ), + ); + } + + @override + $VenuesTable createAlias(String alias) { + return $VenuesTable(attachedDatabase, alias); + } } -typedef $$DancesTableCreateCompanionBuilder = - DancesCompanion Function({ - required String id, - required String title, - required DanceForm form, - required FormationShape formationShape, - Value formationDetail, - required Progression progression, - Value phraseStructure, - Value figuresJson, - Value hook, - Value callingNotes, - required DanceStatus status, - Value level, - Value mixedLevel, - Value rating, - Value tunesJson, - Value composedOn, - Value revisedOn, - required DateTime createdAt, - required DateTime updatedAt, - Value deletedAt, - Value rowid, - }); -typedef $$DancesTableUpdateCompanionBuilder = - DancesCompanion Function({ - Value id, - Value title, - Value form, - Value formationShape, - Value formationDetail, - Value progression, - Value phraseStructure, - Value figuresJson, - Value hook, - Value callingNotes, - Value status, - Value level, - Value mixedLevel, - Value rating, - Value tunesJson, - Value composedOn, - Value revisedOn, - Value createdAt, - Value updatedAt, - Value deletedAt, - Value rowid, - }); - -final class $$DancesTableReferences - extends BaseReferences<_$CompendiumDatabase, $DancesTable, DanceRow> { - $$DancesTableReferences(super.$_db, super.$_table, super.$_typedResult); - - static MultiTypedResultKey<$DanceAuthorsTable, List> - _danceAuthorsRefsTable(_$CompendiumDatabase db) => - MultiTypedResultKey.fromTable( - db.danceAuthors, - aliasName: 'dances__id__dance_authors__dance_id', - ); - - $$DanceAuthorsTableProcessedTableManager get danceAuthorsRefs { - final manager = $$DanceAuthorsTableTableManager( - $_db, - $_db.danceAuthors, - ).filter((f) => f.danceId.id.sqlEquals($_itemColumn('id')!)); +class VenueRow extends DataClass implements Insertable { + final String id; + final String name; + final String? address1; + final String? address2; + final String? city; + final String? stateProv; + final String? country; + final String? postalCode; + final String? plus4; + final String? website; + final String? sponsor; + final String? eventName; + final String? time; + final String? genericSchedule; + final String? price; + final String? notes; + final String? contact1Name; + final String? contact1Phone; + final String? contact1Email; + final String? contact2Name; + final String? contact2Phone; + final String? contact2Email; + const VenueRow({ + required this.id, + required this.name, + this.address1, + this.address2, + this.city, + this.stateProv, + this.country, + this.postalCode, + this.plus4, + this.website, + this.sponsor, + this.eventName, + this.time, + this.genericSchedule, + this.price, + this.notes, + this.contact1Name, + this.contact1Phone, + this.contact1Email, + this.contact2Name, + this.contact2Phone, + this.contact2Email, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['name'] = Variable(name); + if (!nullToAbsent || address1 != null) { + map['address1'] = Variable(address1); + } + if (!nullToAbsent || address2 != null) { + map['address2'] = Variable(address2); + } + if (!nullToAbsent || city != null) { + map['city'] = Variable(city); + } + if (!nullToAbsent || stateProv != null) { + map['state_prov'] = Variable(stateProv); + } + if (!nullToAbsent || country != null) { + map['country'] = Variable(country); + } + if (!nullToAbsent || postalCode != null) { + map['postal_code'] = Variable(postalCode); + } + if (!nullToAbsent || plus4 != null) { + map['plus4'] = Variable(plus4); + } + if (!nullToAbsent || website != null) { + map['website'] = Variable(website); + } + if (!nullToAbsent || sponsor != null) { + map['sponsor'] = Variable(sponsor); + } + if (!nullToAbsent || eventName != null) { + map['event_name'] = Variable(eventName); + } + if (!nullToAbsent || time != null) { + map['time'] = Variable(time); + } + if (!nullToAbsent || genericSchedule != null) { + map['generic_schedule'] = Variable(genericSchedule); + } + if (!nullToAbsent || price != null) { + map['price'] = Variable(price); + } + if (!nullToAbsent || notes != null) { + map['notes'] = Variable(notes); + } + if (!nullToAbsent || contact1Name != null) { + map['contact1_name'] = Variable(contact1Name); + } + if (!nullToAbsent || contact1Phone != null) { + map['contact1_phone'] = Variable(contact1Phone); + } + if (!nullToAbsent || contact1Email != null) { + map['contact1_email'] = Variable(contact1Email); + } + if (!nullToAbsent || contact2Name != null) { + map['contact2_name'] = Variable(contact2Name); + } + if (!nullToAbsent || contact2Phone != null) { + map['contact2_phone'] = Variable(contact2Phone); + } + if (!nullToAbsent || contact2Email != null) { + map['contact2_email'] = Variable(contact2Email); + } + return map; + } - final cache = $_typedResult.readTableOrNull(_danceAuthorsRefsTable($_db)); - return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: cache), + VenuesCompanion toCompanion(bool nullToAbsent) { + return VenuesCompanion( + id: Value(id), + name: Value(name), + address1: address1 == null && nullToAbsent + ? const Value.absent() + : Value(address1), + address2: address2 == null && nullToAbsent + ? const Value.absent() + : Value(address2), + city: city == null && nullToAbsent ? const Value.absent() : Value(city), + stateProv: stateProv == null && nullToAbsent + ? const Value.absent() + : Value(stateProv), + country: country == null && nullToAbsent + ? const Value.absent() + : Value(country), + postalCode: postalCode == null && nullToAbsent + ? const Value.absent() + : Value(postalCode), + plus4: plus4 == null && nullToAbsent + ? const Value.absent() + : Value(plus4), + website: website == null && nullToAbsent + ? const Value.absent() + : Value(website), + sponsor: sponsor == null && nullToAbsent + ? const Value.absent() + : Value(sponsor), + eventName: eventName == null && nullToAbsent + ? const Value.absent() + : Value(eventName), + time: time == null && nullToAbsent ? const Value.absent() : Value(time), + genericSchedule: genericSchedule == null && nullToAbsent + ? const Value.absent() + : Value(genericSchedule), + price: price == null && nullToAbsent + ? const Value.absent() + : Value(price), + notes: notes == null && nullToAbsent + ? const Value.absent() + : Value(notes), + contact1Name: contact1Name == null && nullToAbsent + ? const Value.absent() + : Value(contact1Name), + contact1Phone: contact1Phone == null && nullToAbsent + ? const Value.absent() + : Value(contact1Phone), + contact1Email: contact1Email == null && nullToAbsent + ? const Value.absent() + : Value(contact1Email), + contact2Name: contact2Name == null && nullToAbsent + ? const Value.absent() + : Value(contact2Name), + contact2Phone: contact2Phone == null && nullToAbsent + ? const Value.absent() + : Value(contact2Phone), + contact2Email: contact2Email == null && nullToAbsent + ? const Value.absent() + : Value(contact2Email), ); } - static MultiTypedResultKey<$DanceFiguresTable, List> - _danceFiguresRefsTable(_$CompendiumDatabase db) => - MultiTypedResultKey.fromTable( - db.danceFigures, - aliasName: 'dances__id__dance_figures__dance_id', - ); - - $$DanceFiguresTableProcessedTableManager get danceFiguresRefs { - final manager = $$DanceFiguresTableTableManager( - $_db, - $_db.danceFigures, - ).filter((f) => f.danceId.id.sqlEquals($_itemColumn('id')!)); - - final cache = $_typedResult.readTableOrNull(_danceFiguresRefsTable($_db)); - return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: cache), + factory VenueRow.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return VenueRow( + id: serializer.fromJson(json['id']), + name: serializer.fromJson(json['name']), + address1: serializer.fromJson(json['address1']), + address2: serializer.fromJson(json['address2']), + city: serializer.fromJson(json['city']), + stateProv: serializer.fromJson(json['stateProv']), + country: serializer.fromJson(json['country']), + postalCode: serializer.fromJson(json['postalCode']), + plus4: serializer.fromJson(json['plus4']), + website: serializer.fromJson(json['website']), + sponsor: serializer.fromJson(json['sponsor']), + eventName: serializer.fromJson(json['eventName']), + time: serializer.fromJson(json['time']), + genericSchedule: serializer.fromJson(json['genericSchedule']), + price: serializer.fromJson(json['price']), + notes: serializer.fromJson(json['notes']), + contact1Name: serializer.fromJson(json['contact1Name']), + contact1Phone: serializer.fromJson(json['contact1Phone']), + contact1Email: serializer.fromJson(json['contact1Email']), + contact2Name: serializer.fromJson(json['contact2Name']), + contact2Phone: serializer.fromJson(json['contact2Phone']), + contact2Email: serializer.fromJson(json['contact2Email']), ); } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'name': serializer.toJson(name), + 'address1': serializer.toJson(address1), + 'address2': serializer.toJson(address2), + 'city': serializer.toJson(city), + 'stateProv': serializer.toJson(stateProv), + 'country': serializer.toJson(country), + 'postalCode': serializer.toJson(postalCode), + 'plus4': serializer.toJson(plus4), + 'website': serializer.toJson(website), + 'sponsor': serializer.toJson(sponsor), + 'eventName': serializer.toJson(eventName), + 'time': serializer.toJson(time), + 'genericSchedule': serializer.toJson(genericSchedule), + 'price': serializer.toJson(price), + 'notes': serializer.toJson(notes), + 'contact1Name': serializer.toJson(contact1Name), + 'contact1Phone': serializer.toJson(contact1Phone), + 'contact1Email': serializer.toJson(contact1Email), + 'contact2Name': serializer.toJson(contact2Name), + 'contact2Phone': serializer.toJson(contact2Phone), + 'contact2Email': serializer.toJson(contact2Email), + }; + } - static MultiTypedResultKey<$ProgramSlotsTable, List> - _programSlotsRefsTable(_$CompendiumDatabase db) => - MultiTypedResultKey.fromTable( - db.programSlots, - aliasName: 'dances__id__program_slots__dance_id', - ); - - $$ProgramSlotsTableProcessedTableManager get programSlotsRefs { - final manager = $$ProgramSlotsTableTableManager( - $_db, - $_db.programSlots, - ).filter((f) => f.danceId.id.sqlEquals($_itemColumn('id')!)); - - final cache = $_typedResult.readTableOrNull(_programSlotsRefsTable($_db)); - return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: cache), + VenueRow copyWith({ + String? id, + String? name, + Value address1 = const Value.absent(), + Value address2 = const Value.absent(), + Value city = const Value.absent(), + Value stateProv = const Value.absent(), + Value country = const Value.absent(), + Value postalCode = const Value.absent(), + Value plus4 = const Value.absent(), + Value website = const Value.absent(), + Value sponsor = const Value.absent(), + Value eventName = const Value.absent(), + Value time = const Value.absent(), + Value genericSchedule = const Value.absent(), + Value price = const Value.absent(), + Value notes = const Value.absent(), + Value contact1Name = const Value.absent(), + Value contact1Phone = const Value.absent(), + Value contact1Email = const Value.absent(), + Value contact2Name = const Value.absent(), + Value contact2Phone = const Value.absent(), + Value contact2Email = const Value.absent(), + }) => VenueRow( + id: id ?? this.id, + name: name ?? this.name, + address1: address1.present ? address1.value : this.address1, + address2: address2.present ? address2.value : this.address2, + city: city.present ? city.value : this.city, + stateProv: stateProv.present ? stateProv.value : this.stateProv, + country: country.present ? country.value : this.country, + postalCode: postalCode.present ? postalCode.value : this.postalCode, + plus4: plus4.present ? plus4.value : this.plus4, + website: website.present ? website.value : this.website, + sponsor: sponsor.present ? sponsor.value : this.sponsor, + eventName: eventName.present ? eventName.value : this.eventName, + time: time.present ? time.value : this.time, + genericSchedule: genericSchedule.present + ? genericSchedule.value + : this.genericSchedule, + price: price.present ? price.value : this.price, + notes: notes.present ? notes.value : this.notes, + contact1Name: contact1Name.present ? contact1Name.value : this.contact1Name, + contact1Phone: contact1Phone.present + ? contact1Phone.value + : this.contact1Phone, + contact1Email: contact1Email.present + ? contact1Email.value + : this.contact1Email, + contact2Name: contact2Name.present ? contact2Name.value : this.contact2Name, + contact2Phone: contact2Phone.present + ? contact2Phone.value + : this.contact2Phone, + contact2Email: contact2Email.present + ? contact2Email.value + : this.contact2Email, + ); + VenueRow copyWithCompanion(VenuesCompanion data) { + return VenueRow( + id: data.id.present ? data.id.value : this.id, + name: data.name.present ? data.name.value : this.name, + address1: data.address1.present ? data.address1.value : this.address1, + address2: data.address2.present ? data.address2.value : this.address2, + city: data.city.present ? data.city.value : this.city, + stateProv: data.stateProv.present ? data.stateProv.value : this.stateProv, + country: data.country.present ? data.country.value : this.country, + postalCode: data.postalCode.present + ? data.postalCode.value + : this.postalCode, + plus4: data.plus4.present ? data.plus4.value : this.plus4, + website: data.website.present ? data.website.value : this.website, + sponsor: data.sponsor.present ? data.sponsor.value : this.sponsor, + eventName: data.eventName.present ? data.eventName.value : this.eventName, + time: data.time.present ? data.time.value : this.time, + genericSchedule: data.genericSchedule.present + ? data.genericSchedule.value + : this.genericSchedule, + price: data.price.present ? data.price.value : this.price, + notes: data.notes.present ? data.notes.value : this.notes, + contact1Name: data.contact1Name.present + ? data.contact1Name.value + : this.contact1Name, + contact1Phone: data.contact1Phone.present + ? data.contact1Phone.value + : this.contact1Phone, + contact1Email: data.contact1Email.present + ? data.contact1Email.value + : this.contact1Email, + contact2Name: data.contact2Name.present + ? data.contact2Name.value + : this.contact2Name, + contact2Phone: data.contact2Phone.present + ? data.contact2Phone.value + : this.contact2Phone, + contact2Email: data.contact2Email.present + ? data.contact2Email.value + : this.contact2Email, ); } - static MultiTypedResultKey<$CustomFieldValuesTable, List> - _customFieldValuesRefsTable(_$CompendiumDatabase db) => - MultiTypedResultKey.fromTable( - db.customFieldValues, - aliasName: 'dances__id__custom_field_values__dance_id', - ); - - $$CustomFieldValuesTableProcessedTableManager get customFieldValuesRefs { - final manager = $$CustomFieldValuesTableTableManager( - $_db, - $_db.customFieldValues, - ).filter((f) => f.danceId.id.sqlEquals($_itemColumn('id')!)); - - final cache = $_typedResult.readTableOrNull( - _customFieldValuesRefsTable($_db), - ); - return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: cache), - ); + @override + String toString() { + return (StringBuffer('VenueRow(') + ..write('id: $id, ') + ..write('name: $name, ') + ..write('address1: $address1, ') + ..write('address2: $address2, ') + ..write('city: $city, ') + ..write('stateProv: $stateProv, ') + ..write('country: $country, ') + ..write('postalCode: $postalCode, ') + ..write('plus4: $plus4, ') + ..write('website: $website, ') + ..write('sponsor: $sponsor, ') + ..write('eventName: $eventName, ') + ..write('time: $time, ') + ..write('genericSchedule: $genericSchedule, ') + ..write('price: $price, ') + ..write('notes: $notes, ') + ..write('contact1Name: $contact1Name, ') + ..write('contact1Phone: $contact1Phone, ') + ..write('contact1Email: $contact1Email, ') + ..write('contact2Name: $contact2Name, ') + ..write('contact2Phone: $contact2Phone, ') + ..write('contact2Email: $contact2Email') + ..write(')')) + .toString(); } - static MultiTypedResultKey<$DanceTagsTable, List> - _danceTagsRefsTable(_$CompendiumDatabase db) => MultiTypedResultKey.fromTable( - db.danceTags, - aliasName: 'dances__id__dance_tags__dance_id', - ); + @override + int get hashCode => Object.hashAll([ + id, + name, + address1, + address2, + city, + stateProv, + country, + postalCode, + plus4, + website, + sponsor, + eventName, + time, + genericSchedule, + price, + notes, + contact1Name, + contact1Phone, + contact1Email, + contact2Name, + contact2Phone, + contact2Email, + ]); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is VenueRow && + other.id == this.id && + other.name == this.name && + other.address1 == this.address1 && + other.address2 == this.address2 && + other.city == this.city && + other.stateProv == this.stateProv && + other.country == this.country && + other.postalCode == this.postalCode && + other.plus4 == this.plus4 && + other.website == this.website && + other.sponsor == this.sponsor && + other.eventName == this.eventName && + other.time == this.time && + other.genericSchedule == this.genericSchedule && + other.price == this.price && + other.notes == this.notes && + other.contact1Name == this.contact1Name && + other.contact1Phone == this.contact1Phone && + other.contact1Email == this.contact1Email && + other.contact2Name == this.contact2Name && + other.contact2Phone == this.contact2Phone && + other.contact2Email == this.contact2Email); +} - $$DanceTagsTableProcessedTableManager get danceTagsRefs { - final manager = $$DanceTagsTableTableManager( - $_db, - $_db.danceTags, - ).filter((f) => f.danceId.id.sqlEquals($_itemColumn('id')!)); +class VenuesCompanion extends UpdateCompanion { + final Value id; + final Value name; + final Value address1; + final Value address2; + final Value city; + final Value stateProv; + final Value country; + final Value postalCode; + final Value plus4; + final Value website; + final Value sponsor; + final Value eventName; + final Value time; + final Value genericSchedule; + final Value price; + final Value notes; + final Value contact1Name; + final Value contact1Phone; + final Value contact1Email; + final Value contact2Name; + final Value contact2Phone; + final Value contact2Email; + final Value rowid; + const VenuesCompanion({ + this.id = const Value.absent(), + this.name = const Value.absent(), + this.address1 = const Value.absent(), + this.address2 = const Value.absent(), + this.city = const Value.absent(), + this.stateProv = const Value.absent(), + this.country = const Value.absent(), + this.postalCode = const Value.absent(), + this.plus4 = const Value.absent(), + this.website = const Value.absent(), + this.sponsor = const Value.absent(), + this.eventName = const Value.absent(), + this.time = const Value.absent(), + this.genericSchedule = const Value.absent(), + this.price = const Value.absent(), + this.notes = const Value.absent(), + this.contact1Name = const Value.absent(), + this.contact1Phone = const Value.absent(), + this.contact1Email = const Value.absent(), + this.contact2Name = const Value.absent(), + this.contact2Phone = const Value.absent(), + this.contact2Email = const Value.absent(), + this.rowid = const Value.absent(), + }); + VenuesCompanion.insert({ + required String id, + required String name, + this.address1 = const Value.absent(), + this.address2 = const Value.absent(), + this.city = const Value.absent(), + this.stateProv = const Value.absent(), + this.country = const Value.absent(), + this.postalCode = const Value.absent(), + this.plus4 = const Value.absent(), + this.website = const Value.absent(), + this.sponsor = const Value.absent(), + this.eventName = const Value.absent(), + this.time = const Value.absent(), + this.genericSchedule = const Value.absent(), + this.price = const Value.absent(), + this.notes = const Value.absent(), + this.contact1Name = const Value.absent(), + this.contact1Phone = const Value.absent(), + this.contact1Email = const Value.absent(), + this.contact2Name = const Value.absent(), + this.contact2Phone = const Value.absent(), + this.contact2Email = const Value.absent(), + this.rowid = const Value.absent(), + }) : id = Value(id), + name = Value(name); + static Insertable custom({ + Expression? id, + Expression? name, + Expression? address1, + Expression? address2, + Expression? city, + Expression? stateProv, + Expression? country, + Expression? postalCode, + Expression? plus4, + Expression? website, + Expression? sponsor, + Expression? eventName, + Expression? time, + Expression? genericSchedule, + Expression? price, + Expression? notes, + Expression? contact1Name, + Expression? contact1Phone, + Expression? contact1Email, + Expression? contact2Name, + Expression? contact2Phone, + Expression? contact2Email, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (name != null) 'name': name, + if (address1 != null) 'address1': address1, + if (address2 != null) 'address2': address2, + if (city != null) 'city': city, + if (stateProv != null) 'state_prov': stateProv, + if (country != null) 'country': country, + if (postalCode != null) 'postal_code': postalCode, + if (plus4 != null) 'plus4': plus4, + if (website != null) 'website': website, + if (sponsor != null) 'sponsor': sponsor, + if (eventName != null) 'event_name': eventName, + if (time != null) 'time': time, + if (genericSchedule != null) 'generic_schedule': genericSchedule, + if (price != null) 'price': price, + if (notes != null) 'notes': notes, + if (contact1Name != null) 'contact1_name': contact1Name, + if (contact1Phone != null) 'contact1_phone': contact1Phone, + if (contact1Email != null) 'contact1_email': contact1Email, + if (contact2Name != null) 'contact2_name': contact2Name, + if (contact2Phone != null) 'contact2_phone': contact2Phone, + if (contact2Email != null) 'contact2_email': contact2Email, + if (rowid != null) 'rowid': rowid, + }); + } - final cache = $_typedResult.readTableOrNull(_danceTagsRefsTable($_db)); - return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: cache), + VenuesCompanion copyWith({ + Value? id, + Value? name, + Value? address1, + Value? address2, + Value? city, + Value? stateProv, + Value? country, + Value? postalCode, + Value? plus4, + Value? website, + Value? sponsor, + Value? eventName, + Value? time, + Value? genericSchedule, + Value? price, + Value? notes, + Value? contact1Name, + Value? contact1Phone, + Value? contact1Email, + Value? contact2Name, + Value? contact2Phone, + Value? contact2Email, + Value? rowid, + }) { + return VenuesCompanion( + id: id ?? this.id, + name: name ?? this.name, + address1: address1 ?? this.address1, + address2: address2 ?? this.address2, + city: city ?? this.city, + stateProv: stateProv ?? this.stateProv, + country: country ?? this.country, + postalCode: postalCode ?? this.postalCode, + plus4: plus4 ?? this.plus4, + website: website ?? this.website, + sponsor: sponsor ?? this.sponsor, + eventName: eventName ?? this.eventName, + time: time ?? this.time, + genericSchedule: genericSchedule ?? this.genericSchedule, + price: price ?? this.price, + notes: notes ?? this.notes, + contact1Name: contact1Name ?? this.contact1Name, + contact1Phone: contact1Phone ?? this.contact1Phone, + contact1Email: contact1Email ?? this.contact1Email, + contact2Name: contact2Name ?? this.contact2Name, + contact2Phone: contact2Phone ?? this.contact2Phone, + contact2Email: contact2Email ?? this.contact2Email, + rowid: rowid ?? this.rowid, ); } - static MultiTypedResultKey<$DanceLinksTable, List> - _danceLinksRefsTable(_$CompendiumDatabase db) => - MultiTypedResultKey.fromTable( - db.danceLinks, - aliasName: 'dances__id__dance_links__dance_id', - ); - - $$DanceLinksTableProcessedTableManager get danceLinksRefs { - final manager = $$DanceLinksTableTableManager( - $_db, - $_db.danceLinks, - ).filter((f) => f.danceId.id.sqlEquals($_itemColumn('id')!)); - - final cache = $_typedResult.readTableOrNull(_danceLinksRefsTable($_db)); - return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: cache), - ); - } - - static MultiTypedResultKey<$DanceLinksTable, List> - _relatedDanceLinksTable(_$CompendiumDatabase db) => - MultiTypedResultKey.fromTable( - db.danceLinks, - aliasName: 'dances__id__dance_links__target_dance_id', - ); - - $$DanceLinksTableProcessedTableManager get relatedDanceLinks { - final manager = $$DanceLinksTableTableManager( - $_db, - $_db.danceLinks, - ).filter((f) => f.targetDanceId.id.sqlEquals($_itemColumn('id')!)); - - final cache = $_typedResult.readTableOrNull(_relatedDanceLinksTable($_db)); - return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: cache), - ); - } - - static MultiTypedResultKey<$ProvenanceTable, List> - _provenanceRefsTable(_$CompendiumDatabase db) => - MultiTypedResultKey.fromTable( - db.provenance, - aliasName: 'dances__id__provenance__dance_id', - ); - - $$ProvenanceTableProcessedTableManager get provenanceRefs { - final manager = $$ProvenanceTableTableManager( - $_db, - $_db.provenance, - ).filter((f) => f.danceId.id.sqlEquals($_itemColumn('id')!)); - - final cache = $_typedResult.readTableOrNull(_provenanceRefsTable($_db)); - return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: cache), - ); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (name.present) { + map['name'] = Variable(name.value); + } + if (address1.present) { + map['address1'] = Variable(address1.value); + } + if (address2.present) { + map['address2'] = Variable(address2.value); + } + if (city.present) { + map['city'] = Variable(city.value); + } + if (stateProv.present) { + map['state_prov'] = Variable(stateProv.value); + } + if (country.present) { + map['country'] = Variable(country.value); + } + if (postalCode.present) { + map['postal_code'] = Variable(postalCode.value); + } + if (plus4.present) { + map['plus4'] = Variable(plus4.value); + } + if (website.present) { + map['website'] = Variable(website.value); + } + if (sponsor.present) { + map['sponsor'] = Variable(sponsor.value); + } + if (eventName.present) { + map['event_name'] = Variable(eventName.value); + } + if (time.present) { + map['time'] = Variable(time.value); + } + if (genericSchedule.present) { + map['generic_schedule'] = Variable(genericSchedule.value); + } + if (price.present) { + map['price'] = Variable(price.value); + } + if (notes.present) { + map['notes'] = Variable(notes.value); + } + if (contact1Name.present) { + map['contact1_name'] = Variable(contact1Name.value); + } + if (contact1Phone.present) { + map['contact1_phone'] = Variable(contact1Phone.value); + } + if (contact1Email.present) { + map['contact1_email'] = Variable(contact1Email.value); + } + if (contact2Name.present) { + map['contact2_name'] = Variable(contact2Name.value); + } + if (contact2Phone.present) { + map['contact2_phone'] = Variable(contact2Phone.value); + } + if (contact2Email.present) { + map['contact2_email'] = Variable(contact2Email.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; } - static MultiTypedResultKey<$DanceSourcesTable, List> - _danceSourcesRefsTable(_$CompendiumDatabase db) => - MultiTypedResultKey.fromTable( - db.danceSources, - aliasName: 'dances__id__dance_sources__dance_id', - ); - - $$DanceSourcesTableProcessedTableManager get danceSourcesRefs { - final manager = $$DanceSourcesTableTableManager( - $_db, - $_db.danceSources, - ).filter((f) => f.danceId.id.sqlEquals($_itemColumn('id')!)); - - final cache = $_typedResult.readTableOrNull(_danceSourcesRefsTable($_db)); - return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: cache), - ); + @override + String toString() { + return (StringBuffer('VenuesCompanion(') + ..write('id: $id, ') + ..write('name: $name, ') + ..write('address1: $address1, ') + ..write('address2: $address2, ') + ..write('city: $city, ') + ..write('stateProv: $stateProv, ') + ..write('country: $country, ') + ..write('postalCode: $postalCode, ') + ..write('plus4: $plus4, ') + ..write('website: $website, ') + ..write('sponsor: $sponsor, ') + ..write('eventName: $eventName, ') + ..write('time: $time, ') + ..write('genericSchedule: $genericSchedule, ') + ..write('price: $price, ') + ..write('notes: $notes, ') + ..write('contact1Name: $contact1Name, ') + ..write('contact1Phone: $contact1Phone, ') + ..write('contact1Email: $contact1Email, ') + ..write('contact2Name: $contact2Name, ') + ..write('contact2Phone: $contact2Phone, ') + ..write('contact2Email: $contact2Email, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); } } -class $$DancesTableFilterComposer - extends Composer<_$CompendiumDatabase, $DancesTable> { - $$DancesTableFilterComposer({ - required super.$db, - required super.$table, - super.joinBuilder, - super.$addJoinBuilderToRootComposer, - super.$removeJoinBuilderFromRootComposer, - }); - ColumnFilters get id => $composableBuilder( - column: $table.id, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get title => $composableBuilder( - column: $table.title, - builder: (column) => ColumnFilters(column), - ); - - ColumnWithTypeConverterFilters get form => - $composableBuilder( - column: $table.form, - builder: (column) => ColumnWithTypeConverterFilters(column), - ); - - ColumnWithTypeConverterFilters - get formationShape => $composableBuilder( - column: $table.formationShape, - builder: (column) => ColumnWithTypeConverterFilters(column), - ); - - ColumnFilters get formationDetail => $composableBuilder( - column: $table.formationDetail, - builder: (column) => ColumnFilters(column), - ); - - ColumnWithTypeConverterFilters - get progression => $composableBuilder( - column: $table.progression, - builder: (column) => ColumnWithTypeConverterFilters(column), - ); - - ColumnFilters get phraseStructure => $composableBuilder( - column: $table.phraseStructure, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get figuresJson => $composableBuilder( - column: $table.figuresJson, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get hook => $composableBuilder( - column: $table.hook, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get callingNotes => $composableBuilder( - column: $table.callingNotes, - builder: (column) => ColumnFilters(column), - ); - - ColumnWithTypeConverterFilters get status => - $composableBuilder( - column: $table.status, - builder: (column) => ColumnWithTypeConverterFilters(column), - ); - - ColumnWithTypeConverterFilters get level => - $composableBuilder( - column: $table.level, - builder: (column) => ColumnWithTypeConverterFilters(column), - ); - - ColumnFilters get mixedLevel => $composableBuilder( - column: $table.mixedLevel, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get rating => $composableBuilder( - column: $table.rating, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get tunesJson => $composableBuilder( - column: $table.tunesJson, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get composedOn => $composableBuilder( - column: $table.composedOn, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get revisedOn => $composableBuilder( - column: $table.revisedOn, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get createdAt => $composableBuilder( - column: $table.createdAt, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get updatedAt => $composableBuilder( - column: $table.updatedAt, - builder: (column) => ColumnFilters(column), +abstract class _$CompendiumDatabase extends GeneratedDatabase { + _$CompendiumDatabase(QueryExecutor e) : super(e); + $CompendiumDatabaseManager get managers => $CompendiumDatabaseManager(this); + late final $DancesTable dances = $DancesTable(this); + late final $ChoreographersTable choreographers = $ChoreographersTable(this); + late final $DanceAuthorsTable danceAuthors = $DanceAuthorsTable(this); + late final $DanceFiguresTable danceFigures = $DanceFiguresTable(this); + late final $ProgramsTable programs = $ProgramsTable(this); + late final $ProgramSlotsTable programSlots = $ProgramSlotsTable(this); + late final $CustomFieldDefsTable customFieldDefs = $CustomFieldDefsTable( + this, ); - - ColumnFilters get deletedAt => $composableBuilder( - column: $table.deletedAt, - builder: (column) => ColumnFilters(column), + late final $CustomFieldValuesTable customFieldValues = + $CustomFieldValuesTable(this); + late final $TagsTable tags = $TagsTable(this); + late final $DanceTagsTable danceTags = $DanceTagsTable(this); + late final $DanceLinksTable danceLinks = $DanceLinksTable(this); + late final $ProvenanceTable provenance = $ProvenanceTable(this); + late final $PublishedSourcesTable publishedSources = $PublishedSourcesTable( + this, ); - - Expression danceAuthorsRefs( - Expression Function($$DanceAuthorsTableFilterComposer f) f, - ) { - final $$DanceAuthorsTableFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $db.danceAuthors, - getReferencedColumn: (t) => t.danceId, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$DanceAuthorsTableFilterComposer( - $db: $db, - $table: $db.danceAuthors, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), + late final $DanceSourcesTable danceSources = $DanceSourcesTable(this); + late final $SettingsTable settings = $SettingsTable(this); + late final $SnapshotsTable snapshots = $SnapshotsTable(this); + late final $ProgramProvenanceTable programProvenance = + $ProgramProvenanceTable(this); + late final $VenuesTable venues = $VenuesTable(this); + @override + Iterable> get allTables => + allSchemaEntities.whereType>(); + @override + List get allSchemaEntities => [ + dances, + choreographers, + danceAuthors, + danceFigures, + programs, + programSlots, + customFieldDefs, + customFieldValues, + tags, + danceTags, + danceLinks, + provenance, + publishedSources, + danceSources, + settings, + snapshots, + programProvenance, + venues, + ]; + @override + StreamQueryUpdateRules get streamUpdateRules => const StreamQueryUpdateRules([ + WritePropagation( + on: TableUpdateQuery.onTableName( + 'dances', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('dance_authors', kind: UpdateKind.delete)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'choreographers', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('dance_authors', kind: UpdateKind.delete)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'dances', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('dance_figures', kind: UpdateKind.delete)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'programs', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('program_slots', kind: UpdateKind.delete)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'dances', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('program_slots', kind: UpdateKind.update)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'dances', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('custom_field_values', kind: UpdateKind.delete)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'custom_field_defs', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('custom_field_values', kind: UpdateKind.delete)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'dances', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('dance_tags', kind: UpdateKind.delete)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'tags', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('dance_tags', kind: UpdateKind.delete)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'dances', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('dance_links', kind: UpdateKind.delete)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'dances', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('dance_links', kind: UpdateKind.update)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'dances', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('provenance', kind: UpdateKind.delete)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'dances', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('dance_sources', kind: UpdateKind.delete)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'published_sources', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('dance_sources', kind: UpdateKind.delete)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'programs', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('program_provenance', kind: UpdateKind.delete)], + ), + ]); +} + +typedef $$DancesTableCreateCompanionBuilder = + DancesCompanion Function({ + required String id, + required String title, + required DanceForm form, + required FormationShape formationShape, + Value formationDetail, + required Progression progression, + Value phraseStructure, + Value figuresJson, + Value hook, + Value callingNotes, + required DanceStatus status, + Value level, + Value mixedLevel, + Value rating, + Value tunesJson, + Value composedOn, + Value revisedOn, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt, + Value rowid, + }); +typedef $$DancesTableUpdateCompanionBuilder = + DancesCompanion Function({ + Value id, + Value title, + Value form, + Value formationShape, + Value formationDetail, + Value progression, + Value phraseStructure, + Value figuresJson, + Value hook, + Value callingNotes, + Value status, + Value level, + Value mixedLevel, + Value rating, + Value tunesJson, + Value composedOn, + Value revisedOn, + Value createdAt, + Value updatedAt, + Value deletedAt, + Value rowid, + }); + +final class $$DancesTableReferences + extends BaseReferences<_$CompendiumDatabase, $DancesTable, DanceRow> { + $$DancesTableReferences(super.$_db, super.$_table, super.$_typedResult); + + static MultiTypedResultKey<$DanceAuthorsTable, List> + _danceAuthorsRefsTable(_$CompendiumDatabase db) => + MultiTypedResultKey.fromTable( + db.danceAuthors, + aliasName: 'dances__id__dance_authors__dance_id', + ); + + $$DanceAuthorsTableProcessedTableManager get danceAuthorsRefs { + final manager = $$DanceAuthorsTableTableManager( + $_db, + $_db.danceAuthors, + ).filter((f) => f.danceId.id.sqlEquals($_itemColumn('id')!)); + + final cache = $_typedResult.readTableOrNull(_danceAuthorsRefsTable($_db)); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), ); - return f(composer); } - Expression danceFiguresRefs( - Expression Function($$DanceFiguresTableFilterComposer f) f, - ) { - final $$DanceFiguresTableFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $db.danceFigures, - getReferencedColumn: (t) => t.danceId, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$DanceFiguresTableFilterComposer( - $db: $db, - $table: $db.danceFigures, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), + static MultiTypedResultKey<$DanceFiguresTable, List> + _danceFiguresRefsTable(_$CompendiumDatabase db) => + MultiTypedResultKey.fromTable( + db.danceFigures, + aliasName: 'dances__id__dance_figures__dance_id', + ); + + $$DanceFiguresTableProcessedTableManager get danceFiguresRefs { + final manager = $$DanceFiguresTableTableManager( + $_db, + $_db.danceFigures, + ).filter((f) => f.danceId.id.sqlEquals($_itemColumn('id')!)); + + final cache = $_typedResult.readTableOrNull(_danceFiguresRefsTable($_db)); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), ); - return f(composer); } - Expression programSlotsRefs( - Expression Function($$ProgramSlotsTableFilterComposer f) f, - ) { - final $$ProgramSlotsTableFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $db.programSlots, - getReferencedColumn: (t) => t.danceId, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$ProgramSlotsTableFilterComposer( - $db: $db, - $table: $db.programSlots, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return f(composer); - } + static MultiTypedResultKey<$ProgramSlotsTable, List> + _programSlotsRefsTable(_$CompendiumDatabase db) => + MultiTypedResultKey.fromTable( + db.programSlots, + aliasName: 'dances__id__program_slots__dance_id', + ); - Expression customFieldValuesRefs( - Expression Function($$CustomFieldValuesTableFilterComposer f) f, - ) { - final $$CustomFieldValuesTableFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $db.customFieldValues, - getReferencedColumn: (t) => t.danceId, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$CustomFieldValuesTableFilterComposer( - $db: $db, - $table: $db.customFieldValues, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), + $$ProgramSlotsTableProcessedTableManager get programSlotsRefs { + final manager = $$ProgramSlotsTableTableManager( + $_db, + $_db.programSlots, + ).filter((f) => f.danceId.id.sqlEquals($_itemColumn('id')!)); + + final cache = $_typedResult.readTableOrNull(_programSlotsRefsTable($_db)); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), ); - return f(composer); } - Expression danceTagsRefs( - Expression Function($$DanceTagsTableFilterComposer f) f, - ) { - final $$DanceTagsTableFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $db.danceTags, - getReferencedColumn: (t) => t.danceId, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$DanceTagsTableFilterComposer( - $db: $db, - $table: $db.danceTags, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), + static MultiTypedResultKey<$CustomFieldValuesTable, List> + _customFieldValuesRefsTable(_$CompendiumDatabase db) => + MultiTypedResultKey.fromTable( + db.customFieldValues, + aliasName: 'dances__id__custom_field_values__dance_id', + ); + + $$CustomFieldValuesTableProcessedTableManager get customFieldValuesRefs { + final manager = $$CustomFieldValuesTableTableManager( + $_db, + $_db.customFieldValues, + ).filter((f) => f.danceId.id.sqlEquals($_itemColumn('id')!)); + + final cache = $_typedResult.readTableOrNull( + _customFieldValuesRefsTable($_db), + ); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), ); - return f(composer); } - Expression danceLinksRefs( - Expression Function($$DanceLinksTableFilterComposer f) f, - ) { - final $$DanceLinksTableFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $db.danceLinks, - getReferencedColumn: (t) => t.danceId, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$DanceLinksTableFilterComposer( - $db: $db, - $table: $db.danceLinks, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), + static MultiTypedResultKey<$DanceTagsTable, List> + _danceTagsRefsTable(_$CompendiumDatabase db) => MultiTypedResultKey.fromTable( + db.danceTags, + aliasName: 'dances__id__dance_tags__dance_id', + ); + + $$DanceTagsTableProcessedTableManager get danceTagsRefs { + final manager = $$DanceTagsTableTableManager( + $_db, + $_db.danceTags, + ).filter((f) => f.danceId.id.sqlEquals($_itemColumn('id')!)); + + final cache = $_typedResult.readTableOrNull(_danceTagsRefsTable($_db)); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), ); - return f(composer); } - Expression relatedDanceLinks( - Expression Function($$DanceLinksTableFilterComposer f) f, - ) { - final $$DanceLinksTableFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $db.danceLinks, - getReferencedColumn: (t) => t.targetDanceId, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$DanceLinksTableFilterComposer( - $db: $db, - $table: $db.danceLinks, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), + static MultiTypedResultKey<$DanceLinksTable, List> + _danceLinksRefsTable(_$CompendiumDatabase db) => + MultiTypedResultKey.fromTable( + db.danceLinks, + aliasName: 'dances__id__dance_links__dance_id', + ); + + $$DanceLinksTableProcessedTableManager get danceLinksRefs { + final manager = $$DanceLinksTableTableManager( + $_db, + $_db.danceLinks, + ).filter((f) => f.danceId.id.sqlEquals($_itemColumn('id')!)); + + final cache = $_typedResult.readTableOrNull(_danceLinksRefsTable($_db)); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), ); - return f(composer); } - Expression provenanceRefs( - Expression Function($$ProvenanceTableFilterComposer f) f, - ) { - final $$ProvenanceTableFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $db.provenance, - getReferencedColumn: (t) => t.danceId, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$ProvenanceTableFilterComposer( - $db: $db, - $table: $db.provenance, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), + static MultiTypedResultKey<$DanceLinksTable, List> + _relatedDanceLinksTable(_$CompendiumDatabase db) => + MultiTypedResultKey.fromTable( + db.danceLinks, + aliasName: 'dances__id__dance_links__target_dance_id', + ); + + $$DanceLinksTableProcessedTableManager get relatedDanceLinks { + final manager = $$DanceLinksTableTableManager( + $_db, + $_db.danceLinks, + ).filter((f) => f.targetDanceId.id.sqlEquals($_itemColumn('id')!)); + + final cache = $_typedResult.readTableOrNull(_relatedDanceLinksTable($_db)); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), ); - return f(composer); } - Expression danceSourcesRefs( - Expression Function($$DanceSourcesTableFilterComposer f) f, - ) { - final $$DanceSourcesTableFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $db.danceSources, - getReferencedColumn: (t) => t.danceId, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$DanceSourcesTableFilterComposer( - $db: $db, - $table: $db.danceSources, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), + static MultiTypedResultKey<$ProvenanceTable, List> + _provenanceRefsTable(_$CompendiumDatabase db) => + MultiTypedResultKey.fromTable( + db.provenance, + aliasName: 'dances__id__provenance__dance_id', + ); + + $$ProvenanceTableProcessedTableManager get provenanceRefs { + final manager = $$ProvenanceTableTableManager( + $_db, + $_db.provenance, + ).filter((f) => f.danceId.id.sqlEquals($_itemColumn('id')!)); + + final cache = $_typedResult.readTableOrNull(_provenanceRefsTable($_db)); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), ); - return f(composer); } -} -class $$DancesTableOrderingComposer - extends Composer<_$CompendiumDatabase, $DancesTable> { - $$DancesTableOrderingComposer({ - required super.$db, - required super.$table, - super.joinBuilder, - super.$addJoinBuilderToRootComposer, + static MultiTypedResultKey<$DanceSourcesTable, List> + _danceSourcesRefsTable(_$CompendiumDatabase db) => + MultiTypedResultKey.fromTable( + db.danceSources, + aliasName: 'dances__id__dance_sources__dance_id', + ); + + $$DanceSourcesTableProcessedTableManager get danceSourcesRefs { + final manager = $$DanceSourcesTableTableManager( + $_db, + $_db.danceSources, + ).filter((f) => f.danceId.id.sqlEquals($_itemColumn('id')!)); + + final cache = $_typedResult.readTableOrNull(_danceSourcesRefsTable($_db)); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), + ); + } +} + +class $$DancesTableFilterComposer + extends Composer<_$CompendiumDatabase, $DancesTable> { + $$DancesTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get id => $composableBuilder( + ColumnFilters get id => $composableBuilder( column: $table.id, - builder: (column) => ColumnOrderings(column), + builder: (column) => ColumnFilters(column), ); - ColumnOrderings get title => $composableBuilder( + ColumnFilters get title => $composableBuilder( column: $table.title, - builder: (column) => ColumnOrderings(column), + builder: (column) => ColumnFilters(column), ); - ColumnOrderings get form => $composableBuilder( - column: $table.form, - builder: (column) => ColumnOrderings(column), - ); + ColumnWithTypeConverterFilters get form => + $composableBuilder( + column: $table.form, + builder: (column) => ColumnWithTypeConverterFilters(column), + ); - ColumnOrderings get formationShape => $composableBuilder( + ColumnWithTypeConverterFilters + get formationShape => $composableBuilder( column: $table.formationShape, - builder: (column) => ColumnOrderings(column), + builder: (column) => ColumnWithTypeConverterFilters(column), ); - ColumnOrderings get formationDetail => $composableBuilder( + ColumnFilters get formationDetail => $composableBuilder( column: $table.formationDetail, - builder: (column) => ColumnOrderings(column), + builder: (column) => ColumnFilters(column), ); - ColumnOrderings get progression => $composableBuilder( + ColumnWithTypeConverterFilters + get progression => $composableBuilder( column: $table.progression, - builder: (column) => ColumnOrderings(column), + builder: (column) => ColumnWithTypeConverterFilters(column), ); - ColumnOrderings get phraseStructure => $composableBuilder( + ColumnFilters get phraseStructure => $composableBuilder( column: $table.phraseStructure, - builder: (column) => ColumnOrderings(column), + builder: (column) => ColumnFilters(column), ); - ColumnOrderings get figuresJson => $composableBuilder( + ColumnFilters get figuresJson => $composableBuilder( column: $table.figuresJson, - builder: (column) => ColumnOrderings(column), + builder: (column) => ColumnFilters(column), ); - ColumnOrderings get hook => $composableBuilder( + ColumnFilters get hook => $composableBuilder( column: $table.hook, - builder: (column) => ColumnOrderings(column), + builder: (column) => ColumnFilters(column), ); - ColumnOrderings get callingNotes => $composableBuilder( + ColumnFilters get callingNotes => $composableBuilder( column: $table.callingNotes, - builder: (column) => ColumnOrderings(column), + builder: (column) => ColumnFilters(column), ); - ColumnOrderings get status => $composableBuilder( - column: $table.status, - builder: (column) => ColumnOrderings(column), - ); + ColumnWithTypeConverterFilters get status => + $composableBuilder( + column: $table.status, + builder: (column) => ColumnWithTypeConverterFilters(column), + ); - ColumnOrderings get level => $composableBuilder( - column: $table.level, - builder: (column) => ColumnOrderings(column), - ); + ColumnWithTypeConverterFilters get level => + $composableBuilder( + column: $table.level, + builder: (column) => ColumnWithTypeConverterFilters(column), + ); - ColumnOrderings get mixedLevel => $composableBuilder( + ColumnFilters get mixedLevel => $composableBuilder( column: $table.mixedLevel, - builder: (column) => ColumnOrderings(column), + builder: (column) => ColumnFilters(column), ); - ColumnOrderings get rating => $composableBuilder( + ColumnFilters get rating => $composableBuilder( column: $table.rating, - builder: (column) => ColumnOrderings(column), + builder: (column) => ColumnFilters(column), ); - ColumnOrderings get tunesJson => $composableBuilder( + ColumnFilters get tunesJson => $composableBuilder( column: $table.tunesJson, - builder: (column) => ColumnOrderings(column), + builder: (column) => ColumnFilters(column), ); - ColumnOrderings get composedOn => $composableBuilder( + ColumnFilters get composedOn => $composableBuilder( column: $table.composedOn, - builder: (column) => ColumnOrderings(column), + builder: (column) => ColumnFilters(column), ); - ColumnOrderings get revisedOn => $composableBuilder( + ColumnFilters get revisedOn => $composableBuilder( column: $table.revisedOn, - builder: (column) => ColumnOrderings(column), + builder: (column) => ColumnFilters(column), ); - ColumnOrderings get createdAt => $composableBuilder( + ColumnFilters get createdAt => $composableBuilder( column: $table.createdAt, - builder: (column) => ColumnOrderings(column), + builder: (column) => ColumnFilters(column), ); - ColumnOrderings get updatedAt => $composableBuilder( + ColumnFilters get updatedAt => $composableBuilder( column: $table.updatedAt, - builder: (column) => ColumnOrderings(column), + builder: (column) => ColumnFilters(column), ); - ColumnOrderings get deletedAt => $composableBuilder( + ColumnFilters get deletedAt => $composableBuilder( column: $table.deletedAt, - builder: (column) => ColumnOrderings(column), - ); -} - -class $$DancesTableAnnotationComposer - extends Composer<_$CompendiumDatabase, $DancesTable> { - $$DancesTableAnnotationComposer({ - required super.$db, - required super.$table, - super.joinBuilder, - super.$addJoinBuilderToRootComposer, - super.$removeJoinBuilderFromRootComposer, - }); - GeneratedColumn get id => - $composableBuilder(column: $table.id, builder: (column) => column); - - GeneratedColumn get title => - $composableBuilder(column: $table.title, builder: (column) => column); - - GeneratedColumnWithTypeConverter get form => - $composableBuilder(column: $table.form, builder: (column) => column); - - GeneratedColumnWithTypeConverter get formationShape => - $composableBuilder( - column: $table.formationShape, - builder: (column) => column, - ); - - GeneratedColumn get formationDetail => $composableBuilder( - column: $table.formationDetail, - builder: (column) => column, - ); - - GeneratedColumnWithTypeConverter get progression => - $composableBuilder( - column: $table.progression, - builder: (column) => column, - ); - - GeneratedColumn get phraseStructure => $composableBuilder( - column: $table.phraseStructure, - builder: (column) => column, - ); - - GeneratedColumn get figuresJson => $composableBuilder( - column: $table.figuresJson, - builder: (column) => column, - ); - - GeneratedColumn get hook => - $composableBuilder(column: $table.hook, builder: (column) => column); - - GeneratedColumn get callingNotes => $composableBuilder( - column: $table.callingNotes, - builder: (column) => column, - ); - - GeneratedColumnWithTypeConverter get status => - $composableBuilder(column: $table.status, builder: (column) => column); - - GeneratedColumnWithTypeConverter get level => - $composableBuilder(column: $table.level, builder: (column) => column); - - GeneratedColumn get mixedLevel => $composableBuilder( - column: $table.mixedLevel, - builder: (column) => column, - ); - - GeneratedColumn get rating => - $composableBuilder(column: $table.rating, builder: (column) => column); - - GeneratedColumn get tunesJson => - $composableBuilder(column: $table.tunesJson, builder: (column) => column); - - GeneratedColumn get composedOn => $composableBuilder( - column: $table.composedOn, - builder: (column) => column, + builder: (column) => ColumnFilters(column), ); - GeneratedColumn get revisedOn => - $composableBuilder(column: $table.revisedOn, builder: (column) => column); - - GeneratedColumn get createdAt => - $composableBuilder(column: $table.createdAt, builder: (column) => column); - - GeneratedColumn get updatedAt => - $composableBuilder(column: $table.updatedAt, builder: (column) => column); - - GeneratedColumn get deletedAt => - $composableBuilder(column: $table.deletedAt, builder: (column) => column); - - Expression danceAuthorsRefs( - Expression Function($$DanceAuthorsTableAnnotationComposer a) f, + Expression danceAuthorsRefs( + Expression Function($$DanceAuthorsTableFilterComposer f) f, ) { - final $$DanceAuthorsTableAnnotationComposer composer = $composerBuilder( + final $$DanceAuthorsTableFilterComposer composer = $composerBuilder( composer: this, getCurrentColumn: (t) => t.id, referencedTable: $db.danceAuthors, @@ -8814,7 +9684,7 @@ class $$DancesTableAnnotationComposer joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$DanceAuthorsTableAnnotationComposer( + }) => $$DanceAuthorsTableFilterComposer( $db: $db, $table: $db.danceAuthors, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, @@ -8826,10 +9696,10 @@ class $$DancesTableAnnotationComposer return f(composer); } - Expression danceFiguresRefs( - Expression Function($$DanceFiguresTableAnnotationComposer a) f, + Expression danceFiguresRefs( + Expression Function($$DanceFiguresTableFilterComposer f) f, ) { - final $$DanceFiguresTableAnnotationComposer composer = $composerBuilder( + final $$DanceFiguresTableFilterComposer composer = $composerBuilder( composer: this, getCurrentColumn: (t) => t.id, referencedTable: $db.danceFigures, @@ -8839,7 +9709,7 @@ class $$DancesTableAnnotationComposer joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$DanceFiguresTableAnnotationComposer( + }) => $$DanceFiguresTableFilterComposer( $db: $db, $table: $db.danceFigures, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, @@ -8851,10 +9721,10 @@ class $$DancesTableAnnotationComposer return f(composer); } - Expression programSlotsRefs( - Expression Function($$ProgramSlotsTableAnnotationComposer a) f, + Expression programSlotsRefs( + Expression Function($$ProgramSlotsTableFilterComposer f) f, ) { - final $$ProgramSlotsTableAnnotationComposer composer = $composerBuilder( + final $$ProgramSlotsTableFilterComposer composer = $composerBuilder( composer: this, getCurrentColumn: (t) => t.id, referencedTable: $db.programSlots, @@ -8864,7 +9734,7 @@ class $$DancesTableAnnotationComposer joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$ProgramSlotsTableAnnotationComposer( + }) => $$ProgramSlotsTableFilterComposer( $db: $db, $table: $db.programSlots, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, @@ -8876,36 +9746,35 @@ class $$DancesTableAnnotationComposer return f(composer); } - Expression customFieldValuesRefs( - Expression Function($$CustomFieldValuesTableAnnotationComposer a) f, + Expression customFieldValuesRefs( + Expression Function($$CustomFieldValuesTableFilterComposer f) f, ) { - final $$CustomFieldValuesTableAnnotationComposer composer = - $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $db.customFieldValues, - getReferencedColumn: (t) => t.danceId, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$CustomFieldValuesTableAnnotationComposer( - $db: $db, - $table: $db.customFieldValues, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); + final $$CustomFieldValuesTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.customFieldValues, + getReferencedColumn: (t) => t.danceId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$CustomFieldValuesTableFilterComposer( + $db: $db, + $table: $db.customFieldValues, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); return f(composer); } - Expression danceTagsRefs( - Expression Function($$DanceTagsTableAnnotationComposer a) f, + Expression danceTagsRefs( + Expression Function($$DanceTagsTableFilterComposer f) f, ) { - final $$DanceTagsTableAnnotationComposer composer = $composerBuilder( + final $$DanceTagsTableFilterComposer composer = $composerBuilder( composer: this, getCurrentColumn: (t) => t.id, referencedTable: $db.danceTags, @@ -8915,7 +9784,7 @@ class $$DancesTableAnnotationComposer joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$DanceTagsTableAnnotationComposer( + }) => $$DanceTagsTableFilterComposer( $db: $db, $table: $db.danceTags, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, @@ -8927,10 +9796,10 @@ class $$DancesTableAnnotationComposer return f(composer); } - Expression danceLinksRefs( - Expression Function($$DanceLinksTableAnnotationComposer a) f, + Expression danceLinksRefs( + Expression Function($$DanceLinksTableFilterComposer f) f, ) { - final $$DanceLinksTableAnnotationComposer composer = $composerBuilder( + final $$DanceLinksTableFilterComposer composer = $composerBuilder( composer: this, getCurrentColumn: (t) => t.id, referencedTable: $db.danceLinks, @@ -8940,7 +9809,7 @@ class $$DancesTableAnnotationComposer joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$DanceLinksTableAnnotationComposer( + }) => $$DanceLinksTableFilterComposer( $db: $db, $table: $db.danceLinks, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, @@ -8952,10 +9821,10 @@ class $$DancesTableAnnotationComposer return f(composer); } - Expression relatedDanceLinks( - Expression Function($$DanceLinksTableAnnotationComposer a) f, + Expression relatedDanceLinks( + Expression Function($$DanceLinksTableFilterComposer f) f, ) { - final $$DanceLinksTableAnnotationComposer composer = $composerBuilder( + final $$DanceLinksTableFilterComposer composer = $composerBuilder( composer: this, getCurrentColumn: (t) => t.id, referencedTable: $db.danceLinks, @@ -8965,7 +9834,7 @@ class $$DancesTableAnnotationComposer joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$DanceLinksTableAnnotationComposer( + }) => $$DanceLinksTableFilterComposer( $db: $db, $table: $db.danceLinks, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, @@ -8977,10 +9846,10 @@ class $$DancesTableAnnotationComposer return f(composer); } - Expression provenanceRefs( - Expression Function($$ProvenanceTableAnnotationComposer a) f, + Expression provenanceRefs( + Expression Function($$ProvenanceTableFilterComposer f) f, ) { - final $$ProvenanceTableAnnotationComposer composer = $composerBuilder( + final $$ProvenanceTableFilterComposer composer = $composerBuilder( composer: this, getCurrentColumn: (t) => t.id, referencedTable: $db.provenance, @@ -8990,7 +9859,7 @@ class $$DancesTableAnnotationComposer joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$ProvenanceTableAnnotationComposer( + }) => $$ProvenanceTableFilterComposer( $db: $db, $table: $db.provenance, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, @@ -9002,10 +9871,10 @@ class $$DancesTableAnnotationComposer return f(composer); } - Expression danceSourcesRefs( - Expression Function($$DanceSourcesTableAnnotationComposer a) f, + Expression danceSourcesRefs( + Expression Function($$DanceSourcesTableFilterComposer f) f, ) { - final $$DanceSourcesTableAnnotationComposer composer = $composerBuilder( + final $$DanceSourcesTableFilterComposer composer = $composerBuilder( composer: this, getCurrentColumn: (t) => t.id, referencedTable: $db.danceSources, @@ -9015,7 +9884,7 @@ class $$DancesTableAnnotationComposer joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$DanceSourcesTableAnnotationComposer( + }) => $$DanceSourcesTableFilterComposer( $db: $db, $table: $db.danceSources, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, @@ -9028,199 +9897,623 @@ class $$DancesTableAnnotationComposer } } -class $$DancesTableTableManager - extends - RootTableManager< - _$CompendiumDatabase, - $DancesTable, - DanceRow, - $$DancesTableFilterComposer, - $$DancesTableOrderingComposer, - $$DancesTableAnnotationComposer, - $$DancesTableCreateCompanionBuilder, - $$DancesTableUpdateCompanionBuilder, - (DanceRow, $$DancesTableReferences), - DanceRow, - PrefetchHooks Function({ - bool danceAuthorsRefs, - bool danceFiguresRefs, - bool programSlotsRefs, - bool customFieldValuesRefs, - bool danceTagsRefs, - bool danceLinksRefs, - bool relatedDanceLinks, - bool provenanceRefs, - bool danceSourcesRefs, - }) - > { - $$DancesTableTableManager(_$CompendiumDatabase db, $DancesTable table) - : super( - TableManagerState( - db: db, - table: table, - createFilteringComposer: () => - $$DancesTableFilterComposer($db: db, $table: table), - createOrderingComposer: () => - $$DancesTableOrderingComposer($db: db, $table: table), - createComputedFieldComposer: () => - $$DancesTableAnnotationComposer($db: db, $table: table), - updateCompanionCallback: - ({ - Value id = const Value.absent(), - Value title = const Value.absent(), - Value form = const Value.absent(), - Value formationShape = const Value.absent(), - Value formationDetail = const Value.absent(), - Value progression = const Value.absent(), - Value phraseStructure = const Value.absent(), - Value figuresJson = const Value.absent(), - Value hook = const Value.absent(), - Value callingNotes = const Value.absent(), - Value status = const Value.absent(), - Value level = const Value.absent(), - Value mixedLevel = const Value.absent(), - Value rating = const Value.absent(), - Value tunesJson = const Value.absent(), - Value composedOn = const Value.absent(), - Value revisedOn = const Value.absent(), - Value createdAt = const Value.absent(), - Value updatedAt = const Value.absent(), - Value deletedAt = const Value.absent(), - Value rowid = const Value.absent(), - }) => DancesCompanion( - id: id, - title: title, - form: form, - formationShape: formationShape, - formationDetail: formationDetail, - progression: progression, - phraseStructure: phraseStructure, - figuresJson: figuresJson, - hook: hook, - callingNotes: callingNotes, - status: status, - level: level, - mixedLevel: mixedLevel, - rating: rating, - tunesJson: tunesJson, - composedOn: composedOn, - revisedOn: revisedOn, - createdAt: createdAt, - updatedAt: updatedAt, - deletedAt: deletedAt, - rowid: rowid, - ), - createCompanionCallback: - ({ - required String id, - required String title, - required DanceForm form, - required FormationShape formationShape, - Value formationDetail = const Value.absent(), - required Progression progression, - Value phraseStructure = const Value.absent(), - Value figuresJson = const Value.absent(), - Value hook = const Value.absent(), - Value callingNotes = const Value.absent(), - required DanceStatus status, - Value level = const Value.absent(), - Value mixedLevel = const Value.absent(), - Value rating = const Value.absent(), - Value tunesJson = const Value.absent(), - Value composedOn = const Value.absent(), - Value revisedOn = const Value.absent(), - required DateTime createdAt, - required DateTime updatedAt, - Value deletedAt = const Value.absent(), - Value rowid = const Value.absent(), - }) => DancesCompanion.insert( - id: id, - title: title, - form: form, - formationShape: formationShape, - formationDetail: formationDetail, - progression: progression, - phraseStructure: phraseStructure, - figuresJson: figuresJson, - hook: hook, - callingNotes: callingNotes, - status: status, - level: level, - mixedLevel: mixedLevel, - rating: rating, - tunesJson: tunesJson, - composedOn: composedOn, - revisedOn: revisedOn, - createdAt: createdAt, - updatedAt: updatedAt, - deletedAt: deletedAt, - rowid: rowid, - ), - withReferenceMapper: (p0) => p0 - .map( - (e) => - (e.readTable(table), $$DancesTableReferences(db, table, e)), - ) - .toList(), - prefetchHooksCallback: - ({ - danceAuthorsRefs = false, - danceFiguresRefs = false, - programSlotsRefs = false, - customFieldValuesRefs = false, - danceTagsRefs = false, - danceLinksRefs = false, - relatedDanceLinks = false, - provenanceRefs = false, - danceSourcesRefs = false, - }) { - return PrefetchHooks( - db: db, - explicitlyWatchedTables: [ - if (danceAuthorsRefs) db.danceAuthors, - if (danceFiguresRefs) db.danceFigures, - if (programSlotsRefs) db.programSlots, - if (customFieldValuesRefs) db.customFieldValues, - if (danceTagsRefs) db.danceTags, - if (danceLinksRefs) db.danceLinks, - if (relatedDanceLinks) db.danceLinks, - if (provenanceRefs) db.provenance, - if (danceSourcesRefs) db.danceSources, - ], - addJoins: null, - getPrefetchedDataCallback: (items) async { - return [ - if (danceAuthorsRefs) - await $_getPrefetchedData< - DanceRow, - $DancesTable, - DanceAuthorRow - >( - currentTable: table, - referencedTable: $$DancesTableReferences - ._danceAuthorsRefsTable(db), - managerFromTypedResult: (p0) => - $$DancesTableReferences( - db, - table, - p0, - ).danceAuthorsRefs, - referencedItemsForCurrentItem: - (item, referencedItems) => referencedItems.where( - (e) => e.danceId == item.id, - ), - typedResults: items, - ), - if (danceFiguresRefs) - await $_getPrefetchedData< - DanceRow, - $DancesTable, - DanceFigureRow - >( - currentTable: table, - referencedTable: $$DancesTableReferences - ._danceFiguresRefsTable(db), - managerFromTypedResult: (p0) => +class $$DancesTableOrderingComposer + extends Composer<_$CompendiumDatabase, $DancesTable> { + $$DancesTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get title => $composableBuilder( + column: $table.title, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get form => $composableBuilder( + column: $table.form, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get formationShape => $composableBuilder( + column: $table.formationShape, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get formationDetail => $composableBuilder( + column: $table.formationDetail, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get progression => $composableBuilder( + column: $table.progression, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get phraseStructure => $composableBuilder( + column: $table.phraseStructure, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get figuresJson => $composableBuilder( + column: $table.figuresJson, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get hook => $composableBuilder( + column: $table.hook, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get callingNotes => $composableBuilder( + column: $table.callingNotes, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get status => $composableBuilder( + column: $table.status, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get level => $composableBuilder( + column: $table.level, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get mixedLevel => $composableBuilder( + column: $table.mixedLevel, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get rating => $composableBuilder( + column: $table.rating, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get tunesJson => $composableBuilder( + column: $table.tunesJson, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get composedOn => $composableBuilder( + column: $table.composedOn, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get revisedOn => $composableBuilder( + column: $table.revisedOn, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnOrderings(column), + ); +} + +class $$DancesTableAnnotationComposer + extends Composer<_$CompendiumDatabase, $DancesTable> { + $$DancesTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get title => + $composableBuilder(column: $table.title, builder: (column) => column); + + GeneratedColumnWithTypeConverter get form => + $composableBuilder(column: $table.form, builder: (column) => column); + + GeneratedColumnWithTypeConverter get formationShape => + $composableBuilder( + column: $table.formationShape, + builder: (column) => column, + ); + + GeneratedColumn get formationDetail => $composableBuilder( + column: $table.formationDetail, + builder: (column) => column, + ); + + GeneratedColumnWithTypeConverter get progression => + $composableBuilder( + column: $table.progression, + builder: (column) => column, + ); + + GeneratedColumn get phraseStructure => $composableBuilder( + column: $table.phraseStructure, + builder: (column) => column, + ); + + GeneratedColumn get figuresJson => $composableBuilder( + column: $table.figuresJson, + builder: (column) => column, + ); + + GeneratedColumn get hook => + $composableBuilder(column: $table.hook, builder: (column) => column); + + GeneratedColumn get callingNotes => $composableBuilder( + column: $table.callingNotes, + builder: (column) => column, + ); + + GeneratedColumnWithTypeConverter get status => + $composableBuilder(column: $table.status, builder: (column) => column); + + GeneratedColumnWithTypeConverter get level => + $composableBuilder(column: $table.level, builder: (column) => column); + + GeneratedColumn get mixedLevel => $composableBuilder( + column: $table.mixedLevel, + builder: (column) => column, + ); + + GeneratedColumn get rating => + $composableBuilder(column: $table.rating, builder: (column) => column); + + GeneratedColumn get tunesJson => + $composableBuilder(column: $table.tunesJson, builder: (column) => column); + + GeneratedColumn get composedOn => $composableBuilder( + column: $table.composedOn, + builder: (column) => column, + ); + + GeneratedColumn get revisedOn => + $composableBuilder(column: $table.revisedOn, builder: (column) => column); + + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); + + GeneratedColumn get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => column); + + GeneratedColumn get deletedAt => + $composableBuilder(column: $table.deletedAt, builder: (column) => column); + + Expression danceAuthorsRefs( + Expression Function($$DanceAuthorsTableAnnotationComposer a) f, + ) { + final $$DanceAuthorsTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.danceAuthors, + getReferencedColumn: (t) => t.danceId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$DanceAuthorsTableAnnotationComposer( + $db: $db, + $table: $db.danceAuthors, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression danceFiguresRefs( + Expression Function($$DanceFiguresTableAnnotationComposer a) f, + ) { + final $$DanceFiguresTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.danceFigures, + getReferencedColumn: (t) => t.danceId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$DanceFiguresTableAnnotationComposer( + $db: $db, + $table: $db.danceFigures, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression programSlotsRefs( + Expression Function($$ProgramSlotsTableAnnotationComposer a) f, + ) { + final $$ProgramSlotsTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.programSlots, + getReferencedColumn: (t) => t.danceId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ProgramSlotsTableAnnotationComposer( + $db: $db, + $table: $db.programSlots, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression customFieldValuesRefs( + Expression Function($$CustomFieldValuesTableAnnotationComposer a) f, + ) { + final $$CustomFieldValuesTableAnnotationComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.customFieldValues, + getReferencedColumn: (t) => t.danceId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$CustomFieldValuesTableAnnotationComposer( + $db: $db, + $table: $db.customFieldValues, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression danceTagsRefs( + Expression Function($$DanceTagsTableAnnotationComposer a) f, + ) { + final $$DanceTagsTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.danceTags, + getReferencedColumn: (t) => t.danceId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$DanceTagsTableAnnotationComposer( + $db: $db, + $table: $db.danceTags, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression danceLinksRefs( + Expression Function($$DanceLinksTableAnnotationComposer a) f, + ) { + final $$DanceLinksTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.danceLinks, + getReferencedColumn: (t) => t.danceId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$DanceLinksTableAnnotationComposer( + $db: $db, + $table: $db.danceLinks, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression relatedDanceLinks( + Expression Function($$DanceLinksTableAnnotationComposer a) f, + ) { + final $$DanceLinksTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.danceLinks, + getReferencedColumn: (t) => t.targetDanceId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$DanceLinksTableAnnotationComposer( + $db: $db, + $table: $db.danceLinks, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression provenanceRefs( + Expression Function($$ProvenanceTableAnnotationComposer a) f, + ) { + final $$ProvenanceTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.provenance, + getReferencedColumn: (t) => t.danceId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ProvenanceTableAnnotationComposer( + $db: $db, + $table: $db.provenance, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression danceSourcesRefs( + Expression Function($$DanceSourcesTableAnnotationComposer a) f, + ) { + final $$DanceSourcesTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.danceSources, + getReferencedColumn: (t) => t.danceId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$DanceSourcesTableAnnotationComposer( + $db: $db, + $table: $db.danceSources, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } +} + +class $$DancesTableTableManager + extends + RootTableManager< + _$CompendiumDatabase, + $DancesTable, + DanceRow, + $$DancesTableFilterComposer, + $$DancesTableOrderingComposer, + $$DancesTableAnnotationComposer, + $$DancesTableCreateCompanionBuilder, + $$DancesTableUpdateCompanionBuilder, + (DanceRow, $$DancesTableReferences), + DanceRow, + PrefetchHooks Function({ + bool danceAuthorsRefs, + bool danceFiguresRefs, + bool programSlotsRefs, + bool customFieldValuesRefs, + bool danceTagsRefs, + bool danceLinksRefs, + bool relatedDanceLinks, + bool provenanceRefs, + bool danceSourcesRefs, + }) + > { + $$DancesTableTableManager(_$CompendiumDatabase db, $DancesTable table) + : super( + TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + $$DancesTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$DancesTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$DancesTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: + ({ + Value id = const Value.absent(), + Value title = const Value.absent(), + Value form = const Value.absent(), + Value formationShape = const Value.absent(), + Value formationDetail = const Value.absent(), + Value progression = const Value.absent(), + Value phraseStructure = const Value.absent(), + Value figuresJson = const Value.absent(), + Value hook = const Value.absent(), + Value callingNotes = const Value.absent(), + Value status = const Value.absent(), + Value level = const Value.absent(), + Value mixedLevel = const Value.absent(), + Value rating = const Value.absent(), + Value tunesJson = const Value.absent(), + Value composedOn = const Value.absent(), + Value revisedOn = const Value.absent(), + Value createdAt = const Value.absent(), + Value updatedAt = const Value.absent(), + Value deletedAt = const Value.absent(), + Value rowid = const Value.absent(), + }) => DancesCompanion( + id: id, + title: title, + form: form, + formationShape: formationShape, + formationDetail: formationDetail, + progression: progression, + phraseStructure: phraseStructure, + figuresJson: figuresJson, + hook: hook, + callingNotes: callingNotes, + status: status, + level: level, + mixedLevel: mixedLevel, + rating: rating, + tunesJson: tunesJson, + composedOn: composedOn, + revisedOn: revisedOn, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + rowid: rowid, + ), + createCompanionCallback: + ({ + required String id, + required String title, + required DanceForm form, + required FormationShape formationShape, + Value formationDetail = const Value.absent(), + required Progression progression, + Value phraseStructure = const Value.absent(), + Value figuresJson = const Value.absent(), + Value hook = const Value.absent(), + Value callingNotes = const Value.absent(), + required DanceStatus status, + Value level = const Value.absent(), + Value mixedLevel = const Value.absent(), + Value rating = const Value.absent(), + Value tunesJson = const Value.absent(), + Value composedOn = const Value.absent(), + Value revisedOn = const Value.absent(), + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt = const Value.absent(), + Value rowid = const Value.absent(), + }) => DancesCompanion.insert( + id: id, + title: title, + form: form, + formationShape: formationShape, + formationDetail: formationDetail, + progression: progression, + phraseStructure: phraseStructure, + figuresJson: figuresJson, + hook: hook, + callingNotes: callingNotes, + status: status, + level: level, + mixedLevel: mixedLevel, + rating: rating, + tunesJson: tunesJson, + composedOn: composedOn, + revisedOn: revisedOn, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map( + (e) => + (e.readTable(table), $$DancesTableReferences(db, table, e)), + ) + .toList(), + prefetchHooksCallback: + ({ + danceAuthorsRefs = false, + danceFiguresRefs = false, + programSlotsRefs = false, + customFieldValuesRefs = false, + danceTagsRefs = false, + danceLinksRefs = false, + relatedDanceLinks = false, + provenanceRefs = false, + danceSourcesRefs = false, + }) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [ + if (danceAuthorsRefs) db.danceAuthors, + if (danceFiguresRefs) db.danceFigures, + if (programSlotsRefs) db.programSlots, + if (customFieldValuesRefs) db.customFieldValues, + if (danceTagsRefs) db.danceTags, + if (danceLinksRefs) db.danceLinks, + if (relatedDanceLinks) db.danceLinks, + if (provenanceRefs) db.provenance, + if (danceSourcesRefs) db.danceSources, + ], + addJoins: null, + getPrefetchedDataCallback: (items) async { + return [ + if (danceAuthorsRefs) + await $_getPrefetchedData< + DanceRow, + $DancesTable, + DanceAuthorRow + >( + currentTable: table, + referencedTable: $$DancesTableReferences + ._danceAuthorsRefsTable(db), + managerFromTypedResult: (p0) => + $$DancesTableReferences( + db, + table, + p0, + ).danceAuthorsRefs, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems.where( + (e) => e.danceId == item.id, + ), + typedResults: items, + ), + if (danceFiguresRefs) + await $_getPrefetchedData< + DanceRow, + $DancesTable, + DanceFigureRow + >( + currentTable: table, + referencedTable: $$DancesTableReferences + ._danceFiguresRefsTable(db), + managerFromTypedResult: (p0) => $$DancesTableReferences( db, table, @@ -9381,368 +10674,1129 @@ class $$DancesTableTableManager ), ]; }, - ); + ); + }, + ), + ); +} + +typedef $$DancesTableProcessedTableManager = + ProcessedTableManager< + _$CompendiumDatabase, + $DancesTable, + DanceRow, + $$DancesTableFilterComposer, + $$DancesTableOrderingComposer, + $$DancesTableAnnotationComposer, + $$DancesTableCreateCompanionBuilder, + $$DancesTableUpdateCompanionBuilder, + (DanceRow, $$DancesTableReferences), + DanceRow, + PrefetchHooks Function({ + bool danceAuthorsRefs, + bool danceFiguresRefs, + bool programSlotsRefs, + bool customFieldValuesRefs, + bool danceTagsRefs, + bool danceLinksRefs, + bool relatedDanceLinks, + bool provenanceRefs, + bool danceSourcesRefs, + }) + >; +typedef $$ChoreographersTableCreateCompanionBuilder = + ChoreographersCompanion Function({ + required String id, + required String name, + Value website, + Value notes, + Value email, + Value location, + Value deceased, + Value rowid, + }); +typedef $$ChoreographersTableUpdateCompanionBuilder = + ChoreographersCompanion Function({ + Value id, + Value name, + Value website, + Value notes, + Value email, + Value location, + Value deceased, + Value rowid, + }); + +final class $$ChoreographersTableReferences + extends + BaseReferences< + _$CompendiumDatabase, + $ChoreographersTable, + ChoreographerRow + > { + $$ChoreographersTableReferences( + super.$_db, + super.$_table, + super.$_typedResult, + ); + + static MultiTypedResultKey<$DanceAuthorsTable, List> + _danceAuthorsRefsTable(_$CompendiumDatabase db) => + MultiTypedResultKey.fromTable( + db.danceAuthors, + aliasName: 'choreographers__id__dance_authors__choreographer_id', + ); + + $$DanceAuthorsTableProcessedTableManager get danceAuthorsRefs { + final manager = $$DanceAuthorsTableTableManager($_db, $_db.danceAuthors) + .filter( + (f) => f.choreographerId.id.sqlEquals($_itemColumn('id')!), + ); + + final cache = $_typedResult.readTableOrNull(_danceAuthorsRefsTable($_db)); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), + ); + } +} + +class $$ChoreographersTableFilterComposer + extends Composer<_$CompendiumDatabase, $ChoreographersTable> { + $$ChoreographersTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get name => $composableBuilder( + column: $table.name, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get website => $composableBuilder( + column: $table.website, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get notes => $composableBuilder( + column: $table.notes, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get email => $composableBuilder( + column: $table.email, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get location => $composableBuilder( + column: $table.location, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get deceased => $composableBuilder( + column: $table.deceased, + builder: (column) => ColumnFilters(column), + ); + + Expression danceAuthorsRefs( + Expression Function($$DanceAuthorsTableFilterComposer f) f, + ) { + final $$DanceAuthorsTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.danceAuthors, + getReferencedColumn: (t) => t.choreographerId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$DanceAuthorsTableFilterComposer( + $db: $db, + $table: $db.danceAuthors, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } +} + +class $$ChoreographersTableOrderingComposer + extends Composer<_$CompendiumDatabase, $ChoreographersTable> { + $$ChoreographersTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get name => $composableBuilder( + column: $table.name, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get website => $composableBuilder( + column: $table.website, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get notes => $composableBuilder( + column: $table.notes, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get email => $composableBuilder( + column: $table.email, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get location => $composableBuilder( + column: $table.location, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get deceased => $composableBuilder( + column: $table.deceased, + builder: (column) => ColumnOrderings(column), + ); +} + +class $$ChoreographersTableAnnotationComposer + extends Composer<_$CompendiumDatabase, $ChoreographersTable> { + $$ChoreographersTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get name => + $composableBuilder(column: $table.name, builder: (column) => column); + + GeneratedColumn get website => + $composableBuilder(column: $table.website, builder: (column) => column); + + GeneratedColumn get notes => + $composableBuilder(column: $table.notes, builder: (column) => column); + + GeneratedColumn get email => + $composableBuilder(column: $table.email, builder: (column) => column); + + GeneratedColumn get location => + $composableBuilder(column: $table.location, builder: (column) => column); + + GeneratedColumn get deceased => + $composableBuilder(column: $table.deceased, builder: (column) => column); + + Expression danceAuthorsRefs( + Expression Function($$DanceAuthorsTableAnnotationComposer a) f, + ) { + final $$DanceAuthorsTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.danceAuthors, + getReferencedColumn: (t) => t.choreographerId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$DanceAuthorsTableAnnotationComposer( + $db: $db, + $table: $db.danceAuthors, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } +} + +class $$ChoreographersTableTableManager + extends + RootTableManager< + _$CompendiumDatabase, + $ChoreographersTable, + ChoreographerRow, + $$ChoreographersTableFilterComposer, + $$ChoreographersTableOrderingComposer, + $$ChoreographersTableAnnotationComposer, + $$ChoreographersTableCreateCompanionBuilder, + $$ChoreographersTableUpdateCompanionBuilder, + (ChoreographerRow, $$ChoreographersTableReferences), + ChoreographerRow, + PrefetchHooks Function({bool danceAuthorsRefs}) + > { + $$ChoreographersTableTableManager( + _$CompendiumDatabase db, + $ChoreographersTable table, + ) : super( + TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + $$ChoreographersTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$ChoreographersTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$ChoreographersTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: + ({ + Value id = const Value.absent(), + Value name = const Value.absent(), + Value website = const Value.absent(), + Value notes = const Value.absent(), + Value email = const Value.absent(), + Value location = const Value.absent(), + Value deceased = const Value.absent(), + Value rowid = const Value.absent(), + }) => ChoreographersCompanion( + id: id, + name: name, + website: website, + notes: notes, + email: email, + location: location, + deceased: deceased, + rowid: rowid, + ), + createCompanionCallback: + ({ + required String id, + required String name, + Value website = const Value.absent(), + Value notes = const Value.absent(), + Value email = const Value.absent(), + Value location = const Value.absent(), + Value deceased = const Value.absent(), + Value rowid = const Value.absent(), + }) => ChoreographersCompanion.insert( + id: id, + name: name, + website: website, + notes: notes, + email: email, + location: location, + deceased: deceased, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map( + (e) => ( + e.readTable(table), + $$ChoreographersTableReferences(db, table, e), + ), + ) + .toList(), + prefetchHooksCallback: ({danceAuthorsRefs = false}) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [if (danceAuthorsRefs) db.danceAuthors], + addJoins: null, + getPrefetchedDataCallback: (items) async { + return [ + if (danceAuthorsRefs) + await $_getPrefetchedData< + ChoreographerRow, + $ChoreographersTable, + DanceAuthorRow + >( + currentTable: table, + referencedTable: $$ChoreographersTableReferences + ._danceAuthorsRefsTable(db), + managerFromTypedResult: (p0) => + $$ChoreographersTableReferences( + db, + table, + p0, + ).danceAuthorsRefs, + referencedItemsForCurrentItem: (item, referencedItems) => + referencedItems.where( + (e) => e.choreographerId == item.id, + ), + typedResults: items, + ), + ]; + }, + ); + }, + ), + ); +} + +typedef $$ChoreographersTableProcessedTableManager = + ProcessedTableManager< + _$CompendiumDatabase, + $ChoreographersTable, + ChoreographerRow, + $$ChoreographersTableFilterComposer, + $$ChoreographersTableOrderingComposer, + $$ChoreographersTableAnnotationComposer, + $$ChoreographersTableCreateCompanionBuilder, + $$ChoreographersTableUpdateCompanionBuilder, + (ChoreographerRow, $$ChoreographersTableReferences), + ChoreographerRow, + PrefetchHooks Function({bool danceAuthorsRefs}) + >; +typedef $$DanceAuthorsTableCreateCompanionBuilder = + DanceAuthorsCompanion Function({ + required String danceId, + required String choreographerId, + required int position, + Value rowid, + }); +typedef $$DanceAuthorsTableUpdateCompanionBuilder = + DanceAuthorsCompanion Function({ + Value danceId, + Value choreographerId, + Value position, + Value rowid, + }); + +final class $$DanceAuthorsTableReferences + extends + BaseReferences< + _$CompendiumDatabase, + $DanceAuthorsTable, + DanceAuthorRow + > { + $$DanceAuthorsTableReferences(super.$_db, super.$_table, super.$_typedResult); + + static $DancesTable _danceIdTable(_$CompendiumDatabase db) => + db.dances.createAlias('dance_authors__dance_id__dances__id'); + + $$DancesTableProcessedTableManager get danceId { + final $_column = $_itemColumn('dance_id')!; + + final manager = $$DancesTableTableManager( + $_db, + $_db.dances, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull(_danceIdTable($_db)); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } + + static $ChoreographersTable _choreographerIdTable(_$CompendiumDatabase db) => + db.choreographers.createAlias( + 'dance_authors__choreographer_id__choreographers__id', + ); + + $$ChoreographersTableProcessedTableManager get choreographerId { + final $_column = $_itemColumn('choreographer_id')!; + + final manager = $$ChoreographersTableTableManager( + $_db, + $_db.choreographers, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull(_choreographerIdTable($_db)); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } +} + +class $$DanceAuthorsTableFilterComposer + extends Composer<_$CompendiumDatabase, $DanceAuthorsTable> { + $$DanceAuthorsTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get position => $composableBuilder( + column: $table.position, + builder: (column) => ColumnFilters(column), + ); + + $$DancesTableFilterComposer get danceId { + final $$DancesTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.danceId, + referencedTable: $db.dances, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$DancesTableFilterComposer( + $db: $db, + $table: $db.dances, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$ChoreographersTableFilterComposer get choreographerId { + final $$ChoreographersTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.choreographerId, + referencedTable: $db.choreographers, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ChoreographersTableFilterComposer( + $db: $db, + $table: $db.choreographers, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$DanceAuthorsTableOrderingComposer + extends Composer<_$CompendiumDatabase, $DanceAuthorsTable> { + $$DanceAuthorsTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get position => $composableBuilder( + column: $table.position, + builder: (column) => ColumnOrderings(column), + ); + + $$DancesTableOrderingComposer get danceId { + final $$DancesTableOrderingComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.danceId, + referencedTable: $db.dances, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$DancesTableOrderingComposer( + $db: $db, + $table: $db.dances, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$ChoreographersTableOrderingComposer get choreographerId { + final $$ChoreographersTableOrderingComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.choreographerId, + referencedTable: $db.choreographers, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ChoreographersTableOrderingComposer( + $db: $db, + $table: $db.choreographers, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$DanceAuthorsTableAnnotationComposer + extends Composer<_$CompendiumDatabase, $DanceAuthorsTable> { + $$DanceAuthorsTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get position => + $composableBuilder(column: $table.position, builder: (column) => column); + + $$DancesTableAnnotationComposer get danceId { + final $$DancesTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.danceId, + referencedTable: $db.dances, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$DancesTableAnnotationComposer( + $db: $db, + $table: $db.dances, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$ChoreographersTableAnnotationComposer get choreographerId { + final $$ChoreographersTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.choreographerId, + referencedTable: $db.choreographers, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ChoreographersTableAnnotationComposer( + $db: $db, + $table: $db.choreographers, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$DanceAuthorsTableTableManager + extends + RootTableManager< + _$CompendiumDatabase, + $DanceAuthorsTable, + DanceAuthorRow, + $$DanceAuthorsTableFilterComposer, + $$DanceAuthorsTableOrderingComposer, + $$DanceAuthorsTableAnnotationComposer, + $$DanceAuthorsTableCreateCompanionBuilder, + $$DanceAuthorsTableUpdateCompanionBuilder, + (DanceAuthorRow, $$DanceAuthorsTableReferences), + DanceAuthorRow, + PrefetchHooks Function({bool danceId, bool choreographerId}) + > { + $$DanceAuthorsTableTableManager( + _$CompendiumDatabase db, + $DanceAuthorsTable table, + ) : super( + TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + $$DanceAuthorsTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$DanceAuthorsTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$DanceAuthorsTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: + ({ + Value danceId = const Value.absent(), + Value choreographerId = const Value.absent(), + Value position = const Value.absent(), + Value rowid = const Value.absent(), + }) => DanceAuthorsCompanion( + danceId: danceId, + choreographerId: choreographerId, + position: position, + rowid: rowid, + ), + createCompanionCallback: + ({ + required String danceId, + required String choreographerId, + required int position, + Value rowid = const Value.absent(), + }) => DanceAuthorsCompanion.insert( + danceId: danceId, + choreographerId: choreographerId, + position: position, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map( + (e) => ( + e.readTable(table), + $$DanceAuthorsTableReferences(db, table, e), + ), + ) + .toList(), + prefetchHooksCallback: ({danceId = false, choreographerId = false}) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [], + addJoins: + < + T extends TableManagerState< + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic + > + >(state) { + if (danceId) { + state = + state.withJoin( + currentTable: table, + currentColumn: table.danceId, + referencedTable: $$DanceAuthorsTableReferences + ._danceIdTable(db), + referencedColumn: $$DanceAuthorsTableReferences + ._danceIdTable(db) + .id, + ) + as T; + } + if (choreographerId) { + state = + state.withJoin( + currentTable: table, + currentColumn: table.choreographerId, + referencedTable: $$DanceAuthorsTableReferences + ._choreographerIdTable(db), + referencedColumn: $$DanceAuthorsTableReferences + ._choreographerIdTable(db) + .id, + ) + as T; + } + + return state; + }, + getPrefetchedDataCallback: (items) async { + return []; }, + ); + }, ), ); } -typedef $$DancesTableProcessedTableManager = +typedef $$DanceAuthorsTableProcessedTableManager = ProcessedTableManager< _$CompendiumDatabase, - $DancesTable, - DanceRow, - $$DancesTableFilterComposer, - $$DancesTableOrderingComposer, - $$DancesTableAnnotationComposer, - $$DancesTableCreateCompanionBuilder, - $$DancesTableUpdateCompanionBuilder, - (DanceRow, $$DancesTableReferences), - DanceRow, - PrefetchHooks Function({ - bool danceAuthorsRefs, - bool danceFiguresRefs, - bool programSlotsRefs, - bool customFieldValuesRefs, - bool danceTagsRefs, - bool danceLinksRefs, - bool relatedDanceLinks, - bool provenanceRefs, - bool danceSourcesRefs, - }) - >; -typedef $$ChoreographersTableCreateCompanionBuilder = - ChoreographersCompanion Function({ - required String id, - required String name, - Value website, - Value notes, - Value email, - Value location, - Value deceased, + $DanceAuthorsTable, + DanceAuthorRow, + $$DanceAuthorsTableFilterComposer, + $$DanceAuthorsTableOrderingComposer, + $$DanceAuthorsTableAnnotationComposer, + $$DanceAuthorsTableCreateCompanionBuilder, + $$DanceAuthorsTableUpdateCompanionBuilder, + (DanceAuthorRow, $$DanceAuthorsTableReferences), + DanceAuthorRow, + PrefetchHooks Function({bool danceId, bool choreographerId}) + >; +typedef $$DanceFiguresTableCreateCompanionBuilder = + DanceFiguresCompanion Function({ + required String danceId, + required int idx, + required String move, + Value beats, + Value progression, + Value paramsJson, + Value canonicalText, + Value section, Value rowid, }); -typedef $$ChoreographersTableUpdateCompanionBuilder = - ChoreographersCompanion Function({ - Value id, - Value name, - Value website, - Value notes, - Value email, - Value location, - Value deceased, +typedef $$DanceFiguresTableUpdateCompanionBuilder = + DanceFiguresCompanion Function({ + Value danceId, + Value idx, + Value move, + Value beats, + Value progression, + Value paramsJson, + Value canonicalText, + Value section, Value rowid, }); -final class $$ChoreographersTableReferences +final class $$DanceFiguresTableReferences extends BaseReferences< _$CompendiumDatabase, - $ChoreographersTable, - ChoreographerRow + $DanceFiguresTable, + DanceFigureRow > { - $$ChoreographersTableReferences( - super.$_db, - super.$_table, - super.$_typedResult, - ); + $$DanceFiguresTableReferences(super.$_db, super.$_table, super.$_typedResult); - static MultiTypedResultKey<$DanceAuthorsTable, List> - _danceAuthorsRefsTable(_$CompendiumDatabase db) => - MultiTypedResultKey.fromTable( - db.danceAuthors, - aliasName: 'choreographers__id__dance_authors__choreographer_id', - ); + static $DancesTable _danceIdTable(_$CompendiumDatabase db) => + db.dances.createAlias('dance_figures__dance_id__dances__id'); - $$DanceAuthorsTableProcessedTableManager get danceAuthorsRefs { - final manager = $$DanceAuthorsTableTableManager($_db, $_db.danceAuthors) - .filter( - (f) => f.choreographerId.id.sqlEquals($_itemColumn('id')!), - ); + $$DancesTableProcessedTableManager get danceId { + final $_column = $_itemColumn('dance_id')!; - final cache = $_typedResult.readTableOrNull(_danceAuthorsRefsTable($_db)); + final manager = $$DancesTableTableManager( + $_db, + $_db.dances, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull(_danceIdTable($_db)); + if (item == null) return manager; return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: cache), + manager.$state.copyWith(prefetchedData: [item]), ); } } -class $$ChoreographersTableFilterComposer - extends Composer<_$CompendiumDatabase, $ChoreographersTable> { - $$ChoreographersTableFilterComposer({ +class $$DanceFiguresTableFilterComposer + extends Composer<_$CompendiumDatabase, $DanceFiguresTable> { + $$DanceFiguresTableFilterComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnFilters get id => $composableBuilder( - column: $table.id, + ColumnFilters get idx => $composableBuilder( + column: $table.idx, builder: (column) => ColumnFilters(column), ); - ColumnFilters get name => $composableBuilder( - column: $table.name, + ColumnFilters get move => $composableBuilder( + column: $table.move, builder: (column) => ColumnFilters(column), ); - ColumnFilters get website => $composableBuilder( - column: $table.website, + ColumnFilters get beats => $composableBuilder( + column: $table.beats, builder: (column) => ColumnFilters(column), ); - ColumnFilters get notes => $composableBuilder( - column: $table.notes, + ColumnFilters get progression => $composableBuilder( + column: $table.progression, builder: (column) => ColumnFilters(column), ); - ColumnFilters get email => $composableBuilder( - column: $table.email, + ColumnFilters get paramsJson => $composableBuilder( + column: $table.paramsJson, builder: (column) => ColumnFilters(column), ); - ColumnFilters get location => $composableBuilder( - column: $table.location, + ColumnFilters get canonicalText => $composableBuilder( + column: $table.canonicalText, builder: (column) => ColumnFilters(column), ); - ColumnFilters get deceased => $composableBuilder( - column: $table.deceased, + ColumnFilters get section => $composableBuilder( + column: $table.section, builder: (column) => ColumnFilters(column), ); - Expression danceAuthorsRefs( - Expression Function($$DanceAuthorsTableFilterComposer f) f, - ) { - final $$DanceAuthorsTableFilterComposer composer = $composerBuilder( + $$DancesTableFilterComposer get danceId { + final $$DancesTableFilterComposer composer = $composerBuilder( composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $db.danceAuthors, - getReferencedColumn: (t) => t.choreographerId, + getCurrentColumn: (t) => t.danceId, + referencedTable: $db.dances, + getReferencedColumn: (t) => t.id, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$DanceAuthorsTableFilterComposer( + }) => $$DancesTableFilterComposer( $db: $db, - $table: $db.danceAuthors, + $table: $db.dances, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: $removeJoinBuilderFromRootComposer, ), ); - return f(composer); + return composer; } } -class $$ChoreographersTableOrderingComposer - extends Composer<_$CompendiumDatabase, $ChoreographersTable> { - $$ChoreographersTableOrderingComposer({ +class $$DanceFiguresTableOrderingComposer + extends Composer<_$CompendiumDatabase, $DanceFiguresTable> { + $$DanceFiguresTableOrderingComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get id => $composableBuilder( - column: $table.id, + ColumnOrderings get idx => $composableBuilder( + column: $table.idx, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get name => $composableBuilder( - column: $table.name, + ColumnOrderings get move => $composableBuilder( + column: $table.move, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get website => $composableBuilder( - column: $table.website, + ColumnOrderings get beats => $composableBuilder( + column: $table.beats, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get notes => $composableBuilder( - column: $table.notes, + ColumnOrderings get progression => $composableBuilder( + column: $table.progression, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get email => $composableBuilder( - column: $table.email, + ColumnOrderings get paramsJson => $composableBuilder( + column: $table.paramsJson, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get location => $composableBuilder( - column: $table.location, + ColumnOrderings get canonicalText => $composableBuilder( + column: $table.canonicalText, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get deceased => $composableBuilder( - column: $table.deceased, + ColumnOrderings get section => $composableBuilder( + column: $table.section, builder: (column) => ColumnOrderings(column), ); + + $$DancesTableOrderingComposer get danceId { + final $$DancesTableOrderingComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.danceId, + referencedTable: $db.dances, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$DancesTableOrderingComposer( + $db: $db, + $table: $db.dances, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } } -class $$ChoreographersTableAnnotationComposer - extends Composer<_$CompendiumDatabase, $ChoreographersTable> { - $$ChoreographersTableAnnotationComposer({ +class $$DanceFiguresTableAnnotationComposer + extends Composer<_$CompendiumDatabase, $DanceFiguresTable> { + $$DanceFiguresTableAnnotationComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - GeneratedColumn get id => - $composableBuilder(column: $table.id, builder: (column) => column); + GeneratedColumn get idx => + $composableBuilder(column: $table.idx, builder: (column) => column); - GeneratedColumn get name => - $composableBuilder(column: $table.name, builder: (column) => column); + GeneratedColumn get move => + $composableBuilder(column: $table.move, builder: (column) => column); - GeneratedColumn get website => - $composableBuilder(column: $table.website, builder: (column) => column); + GeneratedColumn get beats => + $composableBuilder(column: $table.beats, builder: (column) => column); - GeneratedColumn get notes => - $composableBuilder(column: $table.notes, builder: (column) => column); + GeneratedColumn get progression => $composableBuilder( + column: $table.progression, + builder: (column) => column, + ); - GeneratedColumn get email => - $composableBuilder(column: $table.email, builder: (column) => column); + GeneratedColumn get paramsJson => $composableBuilder( + column: $table.paramsJson, + builder: (column) => column, + ); - GeneratedColumn get location => - $composableBuilder(column: $table.location, builder: (column) => column); + GeneratedColumn get canonicalText => $composableBuilder( + column: $table.canonicalText, + builder: (column) => column, + ); - GeneratedColumn get deceased => - $composableBuilder(column: $table.deceased, builder: (column) => column); + GeneratedColumn get section => + $composableBuilder(column: $table.section, builder: (column) => column); - Expression danceAuthorsRefs( - Expression Function($$DanceAuthorsTableAnnotationComposer a) f, - ) { - final $$DanceAuthorsTableAnnotationComposer composer = $composerBuilder( + $$DancesTableAnnotationComposer get danceId { + final $$DancesTableAnnotationComposer composer = $composerBuilder( composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $db.danceAuthors, - getReferencedColumn: (t) => t.choreographerId, + getCurrentColumn: (t) => t.danceId, + referencedTable: $db.dances, + getReferencedColumn: (t) => t.id, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$DanceAuthorsTableAnnotationComposer( + }) => $$DancesTableAnnotationComposer( $db: $db, - $table: $db.danceAuthors, + $table: $db.dances, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: $removeJoinBuilderFromRootComposer, ), ); - return f(composer); - } -} - -class $$ChoreographersTableTableManager - extends - RootTableManager< - _$CompendiumDatabase, - $ChoreographersTable, - ChoreographerRow, - $$ChoreographersTableFilterComposer, - $$ChoreographersTableOrderingComposer, - $$ChoreographersTableAnnotationComposer, - $$ChoreographersTableCreateCompanionBuilder, - $$ChoreographersTableUpdateCompanionBuilder, - (ChoreographerRow, $$ChoreographersTableReferences), - ChoreographerRow, - PrefetchHooks Function({bool danceAuthorsRefs}) + return composer; + } +} + +class $$DanceFiguresTableTableManager + extends + RootTableManager< + _$CompendiumDatabase, + $DanceFiguresTable, + DanceFigureRow, + $$DanceFiguresTableFilterComposer, + $$DanceFiguresTableOrderingComposer, + $$DanceFiguresTableAnnotationComposer, + $$DanceFiguresTableCreateCompanionBuilder, + $$DanceFiguresTableUpdateCompanionBuilder, + (DanceFigureRow, $$DanceFiguresTableReferences), + DanceFigureRow, + PrefetchHooks Function({bool danceId}) > { - $$ChoreographersTableTableManager( + $$DanceFiguresTableTableManager( _$CompendiumDatabase db, - $ChoreographersTable table, + $DanceFiguresTable table, ) : super( TableManagerState( db: db, table: table, createFilteringComposer: () => - $$ChoreographersTableFilterComposer($db: db, $table: table), + $$DanceFiguresTableFilterComposer($db: db, $table: table), createOrderingComposer: () => - $$ChoreographersTableOrderingComposer($db: db, $table: table), + $$DanceFiguresTableOrderingComposer($db: db, $table: table), createComputedFieldComposer: () => - $$ChoreographersTableAnnotationComposer($db: db, $table: table), + $$DanceFiguresTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ - Value id = const Value.absent(), - Value name = const Value.absent(), - Value website = const Value.absent(), - Value notes = const Value.absent(), - Value email = const Value.absent(), - Value location = const Value.absent(), - Value deceased = const Value.absent(), + Value danceId = const Value.absent(), + Value idx = const Value.absent(), + Value move = const Value.absent(), + Value beats = const Value.absent(), + Value progression = const Value.absent(), + Value paramsJson = const Value.absent(), + Value canonicalText = const Value.absent(), + Value section = const Value.absent(), Value rowid = const Value.absent(), - }) => ChoreographersCompanion( - id: id, - name: name, - website: website, - notes: notes, - email: email, - location: location, - deceased: deceased, + }) => DanceFiguresCompanion( + danceId: danceId, + idx: idx, + move: move, + beats: beats, + progression: progression, + paramsJson: paramsJson, + canonicalText: canonicalText, + section: section, rowid: rowid, ), createCompanionCallback: ({ - required String id, - required String name, - Value website = const Value.absent(), - Value notes = const Value.absent(), - Value email = const Value.absent(), - Value location = const Value.absent(), - Value deceased = const Value.absent(), + required String danceId, + required int idx, + required String move, + Value beats = const Value.absent(), + Value progression = const Value.absent(), + Value paramsJson = const Value.absent(), + Value canonicalText = const Value.absent(), + Value section = const Value.absent(), Value rowid = const Value.absent(), - }) => ChoreographersCompanion.insert( - id: id, - name: name, - website: website, - notes: notes, - email: email, - location: location, - deceased: deceased, + }) => DanceFiguresCompanion.insert( + danceId: danceId, + idx: idx, + move: move, + beats: beats, + progression: progression, + paramsJson: paramsJson, + canonicalText: canonicalText, + section: section, rowid: rowid, ), withReferenceMapper: (p0) => p0 .map( (e) => ( e.readTable(table), - $$ChoreographersTableReferences(db, table, e), + $$DanceFiguresTableReferences(db, table, e), ), ) .toList(), - prefetchHooksCallback: ({danceAuthorsRefs = false}) { + prefetchHooksCallback: ({danceId = false}) { return PrefetchHooks( db: db, - explicitlyWatchedTables: [if (danceAuthorsRefs) db.danceAuthors], - addJoins: null, + explicitlyWatchedTables: [], + addJoins: + < + T extends TableManagerState< + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic + > + >(state) { + if (danceId) { + state = + state.withJoin( + currentTable: table, + currentColumn: table.danceId, + referencedTable: $$DanceFiguresTableReferences + ._danceIdTable(db), + referencedColumn: $$DanceFiguresTableReferences + ._danceIdTable(db) + .id, + ) + as T; + } + + return state; + }, getPrefetchedDataCallback: (items) async { - return [ - if (danceAuthorsRefs) - await $_getPrefetchedData< - ChoreographerRow, - $ChoreographersTable, - DanceAuthorRow - >( - currentTable: table, - referencedTable: $$ChoreographersTableReferences - ._danceAuthorsRefsTable(db), - managerFromTypedResult: (p0) => - $$ChoreographersTableReferences( - db, - table, - p0, - ).danceAuthorsRefs, - referencedItemsForCurrentItem: (item, referencedItems) => - referencedItems.where( - (e) => e.choreographerId == item.id, - ), - typedResults: items, - ), - ]; + return []; }, ); }, @@ -9750,434 +11804,665 @@ class $$ChoreographersTableTableManager ); } -typedef $$ChoreographersTableProcessedTableManager = +typedef $$DanceFiguresTableProcessedTableManager = ProcessedTableManager< _$CompendiumDatabase, - $ChoreographersTable, - ChoreographerRow, - $$ChoreographersTableFilterComposer, - $$ChoreographersTableOrderingComposer, - $$ChoreographersTableAnnotationComposer, - $$ChoreographersTableCreateCompanionBuilder, - $$ChoreographersTableUpdateCompanionBuilder, - (ChoreographerRow, $$ChoreographersTableReferences), - ChoreographerRow, - PrefetchHooks Function({bool danceAuthorsRefs}) + $DanceFiguresTable, + DanceFigureRow, + $$DanceFiguresTableFilterComposer, + $$DanceFiguresTableOrderingComposer, + $$DanceFiguresTableAnnotationComposer, + $$DanceFiguresTableCreateCompanionBuilder, + $$DanceFiguresTableUpdateCompanionBuilder, + (DanceFigureRow, $$DanceFiguresTableReferences), + DanceFigureRow, + PrefetchHooks Function({bool danceId}) >; -typedef $$DanceAuthorsTableCreateCompanionBuilder = - DanceAuthorsCompanion Function({ - required String danceId, - required String choreographerId, - required int position, +typedef $$ProgramsTableCreateCompanionBuilder = + ProgramsCompanion Function({ + required String id, + required String title, + Value eventDate, + Value venue, + Value venueId, + Value band, + Value caller, + Value dancerLevel, + Value notes, + required ProgramStatus status, + Value hideAlternates, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt, Value rowid, }); -typedef $$DanceAuthorsTableUpdateCompanionBuilder = - DanceAuthorsCompanion Function({ - Value danceId, - Value choreographerId, - Value position, +typedef $$ProgramsTableUpdateCompanionBuilder = + ProgramsCompanion Function({ + Value id, + Value title, + Value eventDate, + Value venue, + Value venueId, + Value band, + Value caller, + Value dancerLevel, + Value notes, + Value status, + Value hideAlternates, + Value createdAt, + Value updatedAt, + Value deletedAt, Value rowid, }); -final class $$DanceAuthorsTableReferences - extends - BaseReferences< - _$CompendiumDatabase, - $DanceAuthorsTable, - DanceAuthorRow - > { - $$DanceAuthorsTableReferences(super.$_db, super.$_table, super.$_typedResult); - - static $DancesTable _danceIdTable(_$CompendiumDatabase db) => - db.dances.createAlias('dance_authors__dance_id__dances__id'); +final class $$ProgramsTableReferences + extends BaseReferences<_$CompendiumDatabase, $ProgramsTable, ProgramRow> { + $$ProgramsTableReferences(super.$_db, super.$_table, super.$_typedResult); - $$DancesTableProcessedTableManager get danceId { - final $_column = $_itemColumn('dance_id')!; + static MultiTypedResultKey<$ProgramSlotsTable, List> + _programSlotsRefsTable(_$CompendiumDatabase db) => + MultiTypedResultKey.fromTable( + db.programSlots, + aliasName: 'programs__id__program_slots__program_id', + ); - final manager = $$DancesTableTableManager( + $$ProgramSlotsTableProcessedTableManager get programSlotsRefs { + final manager = $$ProgramSlotsTableTableManager( $_db, - $_db.dances, - ).filter((f) => f.id.sqlEquals($_column)); - final item = $_typedResult.readTableOrNull(_danceIdTable($_db)); - if (item == null) return manager; + $_db.programSlots, + ).filter((f) => f.programId.id.sqlEquals($_itemColumn('id')!)); + + final cache = $_typedResult.readTableOrNull(_programSlotsRefsTable($_db)); return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: [item]), + manager.$state.copyWith(prefetchedData: cache), ); } - static $ChoreographersTable _choreographerIdTable(_$CompendiumDatabase db) => - db.choreographers.createAlias( - 'dance_authors__choreographer_id__choreographers__id', - ); - - $$ChoreographersTableProcessedTableManager get choreographerId { - final $_column = $_itemColumn('choreographer_id')!; + static MultiTypedResultKey< + $ProgramProvenanceTable, + List + > + _programProvenanceRefsTable(_$CompendiumDatabase db) => + MultiTypedResultKey.fromTable( + db.programProvenance, + aliasName: 'programs__id__program_provenance__program_id', + ); - final manager = $$ChoreographersTableTableManager( + $$ProgramProvenanceTableProcessedTableManager get programProvenanceRefs { + final manager = $$ProgramProvenanceTableTableManager( $_db, - $_db.choreographers, - ).filter((f) => f.id.sqlEquals($_column)); - final item = $_typedResult.readTableOrNull(_choreographerIdTable($_db)); - if (item == null) return manager; + $_db.programProvenance, + ).filter((f) => f.programId.id.sqlEquals($_itemColumn('id')!)); + + final cache = $_typedResult.readTableOrNull( + _programProvenanceRefsTable($_db), + ); return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: [item]), + manager.$state.copyWith(prefetchedData: cache), ); } } -class $$DanceAuthorsTableFilterComposer - extends Composer<_$CompendiumDatabase, $DanceAuthorsTable> { - $$DanceAuthorsTableFilterComposer({ +class $$ProgramsTableFilterComposer + extends Composer<_$CompendiumDatabase, $ProgramsTable> { + $$ProgramsTableFilterComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnFilters get position => $composableBuilder( - column: $table.position, + ColumnFilters get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnFilters(column), ); - $$DancesTableFilterComposer get danceId { - final $$DancesTableFilterComposer composer = $composerBuilder( + ColumnFilters get title => $composableBuilder( + column: $table.title, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get eventDate => $composableBuilder( + column: $table.eventDate, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get venue => $composableBuilder( + column: $table.venue, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get venueId => $composableBuilder( + column: $table.venueId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get band => $composableBuilder( + column: $table.band, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get caller => $composableBuilder( + column: $table.caller, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get dancerLevel => $composableBuilder( + column: $table.dancerLevel, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get notes => $composableBuilder( + column: $table.notes, + builder: (column) => ColumnFilters(column), + ); + + ColumnWithTypeConverterFilters + get status => $composableBuilder( + column: $table.status, + builder: (column) => ColumnWithTypeConverterFilters(column), + ); + + ColumnFilters get hideAlternates => $composableBuilder( + column: $table.hideAlternates, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnFilters(column), + ); + + Expression programSlotsRefs( + Expression Function($$ProgramSlotsTableFilterComposer f) f, + ) { + final $$ProgramSlotsTableFilterComposer composer = $composerBuilder( composer: this, - getCurrentColumn: (t) => t.danceId, - referencedTable: $db.dances, - getReferencedColumn: (t) => t.id, + getCurrentColumn: (t) => t.id, + referencedTable: $db.programSlots, + getReferencedColumn: (t) => t.programId, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$DancesTableFilterComposer( + }) => $$ProgramSlotsTableFilterComposer( $db: $db, - $table: $db.dances, + $table: $db.programSlots, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: $removeJoinBuilderFromRootComposer, ), ); - return composer; + return f(composer); } - $$ChoreographersTableFilterComposer get choreographerId { - final $$ChoreographersTableFilterComposer composer = $composerBuilder( + Expression programProvenanceRefs( + Expression Function($$ProgramProvenanceTableFilterComposer f) f, + ) { + final $$ProgramProvenanceTableFilterComposer composer = $composerBuilder( composer: this, - getCurrentColumn: (t) => t.choreographerId, - referencedTable: $db.choreographers, - getReferencedColumn: (t) => t.id, + getCurrentColumn: (t) => t.id, + referencedTable: $db.programProvenance, + getReferencedColumn: (t) => t.programId, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$ChoreographersTableFilterComposer( + }) => $$ProgramProvenanceTableFilterComposer( $db: $db, - $table: $db.choreographers, + $table: $db.programProvenance, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: $removeJoinBuilderFromRootComposer, ), ); - return composer; + return f(composer); } } -class $$DanceAuthorsTableOrderingComposer - extends Composer<_$CompendiumDatabase, $DanceAuthorsTable> { - $$DanceAuthorsTableOrderingComposer({ +class $$ProgramsTableOrderingComposer + extends Composer<_$CompendiumDatabase, $ProgramsTable> { + $$ProgramsTableOrderingComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get position => $composableBuilder( - column: $table.position, + ColumnOrderings get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnOrderings(column), ); - $$DancesTableOrderingComposer get danceId { - final $$DancesTableOrderingComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.danceId, - referencedTable: $db.dances, - getReferencedColumn: (t) => t.id, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$DancesTableOrderingComposer( - $db: $db, - $table: $db.dances, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return composer; - } + ColumnOrderings get title => $composableBuilder( + column: $table.title, + builder: (column) => ColumnOrderings(column), + ); - $$ChoreographersTableOrderingComposer get choreographerId { - final $$ChoreographersTableOrderingComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.choreographerId, - referencedTable: $db.choreographers, - getReferencedColumn: (t) => t.id, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$ChoreographersTableOrderingComposer( - $db: $db, - $table: $db.choreographers, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return composer; - } + ColumnOrderings get eventDate => $composableBuilder( + column: $table.eventDate, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get venue => $composableBuilder( + column: $table.venue, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get venueId => $composableBuilder( + column: $table.venueId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get band => $composableBuilder( + column: $table.band, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get caller => $composableBuilder( + column: $table.caller, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get dancerLevel => $composableBuilder( + column: $table.dancerLevel, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get notes => $composableBuilder( + column: $table.notes, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get status => $composableBuilder( + column: $table.status, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get hideAlternates => $composableBuilder( + column: $table.hideAlternates, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnOrderings(column), + ); } -class $$DanceAuthorsTableAnnotationComposer - extends Composer<_$CompendiumDatabase, $DanceAuthorsTable> { - $$DanceAuthorsTableAnnotationComposer({ +class $$ProgramsTableAnnotationComposer + extends Composer<_$CompendiumDatabase, $ProgramsTable> { + $$ProgramsTableAnnotationComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - GeneratedColumn get position => - $composableBuilder(column: $table.position, builder: (column) => column); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); - $$DancesTableAnnotationComposer get danceId { - final $$DancesTableAnnotationComposer composer = $composerBuilder( + GeneratedColumn get title => + $composableBuilder(column: $table.title, builder: (column) => column); + + GeneratedColumn get eventDate => + $composableBuilder(column: $table.eventDate, builder: (column) => column); + + GeneratedColumn get venue => + $composableBuilder(column: $table.venue, builder: (column) => column); + + GeneratedColumn get venueId => + $composableBuilder(column: $table.venueId, builder: (column) => column); + + GeneratedColumn get band => + $composableBuilder(column: $table.band, builder: (column) => column); + + GeneratedColumn get caller => + $composableBuilder(column: $table.caller, builder: (column) => column); + + GeneratedColumn get dancerLevel => $composableBuilder( + column: $table.dancerLevel, + builder: (column) => column, + ); + + GeneratedColumn get notes => + $composableBuilder(column: $table.notes, builder: (column) => column); + + GeneratedColumnWithTypeConverter get status => + $composableBuilder(column: $table.status, builder: (column) => column); + + GeneratedColumn get hideAlternates => $composableBuilder( + column: $table.hideAlternates, + builder: (column) => column, + ); + + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); + + GeneratedColumn get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => column); + + GeneratedColumn get deletedAt => + $composableBuilder(column: $table.deletedAt, builder: (column) => column); + + Expression programSlotsRefs( + Expression Function($$ProgramSlotsTableAnnotationComposer a) f, + ) { + final $$ProgramSlotsTableAnnotationComposer composer = $composerBuilder( composer: this, - getCurrentColumn: (t) => t.danceId, - referencedTable: $db.dances, - getReferencedColumn: (t) => t.id, + getCurrentColumn: (t) => t.id, + referencedTable: $db.programSlots, + getReferencedColumn: (t) => t.programId, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$DancesTableAnnotationComposer( + }) => $$ProgramSlotsTableAnnotationComposer( $db: $db, - $table: $db.dances, + $table: $db.programSlots, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: $removeJoinBuilderFromRootComposer, ), ); - return composer; + return f(composer); } - $$ChoreographersTableAnnotationComposer get choreographerId { - final $$ChoreographersTableAnnotationComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.choreographerId, - referencedTable: $db.choreographers, - getReferencedColumn: (t) => t.id, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$ChoreographersTableAnnotationComposer( - $db: $db, - $table: $db.choreographers, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: + Expression programProvenanceRefs( + Expression Function($$ProgramProvenanceTableAnnotationComposer a) f, + ) { + final $$ProgramProvenanceTableAnnotationComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.programProvenance, + getReferencedColumn: (t) => t.programId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - ), - ); - return composer; + }) => $$ProgramProvenanceTableAnnotationComposer( + $db: $db, + $table: $db.programProvenance, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); } } -class $$DanceAuthorsTableTableManager +class $$ProgramsTableTableManager extends RootTableManager< _$CompendiumDatabase, - $DanceAuthorsTable, - DanceAuthorRow, - $$DanceAuthorsTableFilterComposer, - $$DanceAuthorsTableOrderingComposer, - $$DanceAuthorsTableAnnotationComposer, - $$DanceAuthorsTableCreateCompanionBuilder, - $$DanceAuthorsTableUpdateCompanionBuilder, - (DanceAuthorRow, $$DanceAuthorsTableReferences), - DanceAuthorRow, - PrefetchHooks Function({bool danceId, bool choreographerId}) + $ProgramsTable, + ProgramRow, + $$ProgramsTableFilterComposer, + $$ProgramsTableOrderingComposer, + $$ProgramsTableAnnotationComposer, + $$ProgramsTableCreateCompanionBuilder, + $$ProgramsTableUpdateCompanionBuilder, + (ProgramRow, $$ProgramsTableReferences), + ProgramRow, + PrefetchHooks Function({ + bool programSlotsRefs, + bool programProvenanceRefs, + }) > { - $$DanceAuthorsTableTableManager( - _$CompendiumDatabase db, - $DanceAuthorsTable table, - ) : super( + $$ProgramsTableTableManager(_$CompendiumDatabase db, $ProgramsTable table) + : super( TableManagerState( db: db, table: table, createFilteringComposer: () => - $$DanceAuthorsTableFilterComposer($db: db, $table: table), + $$ProgramsTableFilterComposer($db: db, $table: table), createOrderingComposer: () => - $$DanceAuthorsTableOrderingComposer($db: db, $table: table), + $$ProgramsTableOrderingComposer($db: db, $table: table), createComputedFieldComposer: () => - $$DanceAuthorsTableAnnotationComposer($db: db, $table: table), + $$ProgramsTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ - Value danceId = const Value.absent(), - Value choreographerId = const Value.absent(), - Value position = const Value.absent(), + Value id = const Value.absent(), + Value title = const Value.absent(), + Value eventDate = const Value.absent(), + Value venue = const Value.absent(), + Value venueId = const Value.absent(), + Value band = const Value.absent(), + Value caller = const Value.absent(), + Value dancerLevel = const Value.absent(), + Value notes = const Value.absent(), + Value status = const Value.absent(), + Value hideAlternates = const Value.absent(), + Value createdAt = const Value.absent(), + Value updatedAt = const Value.absent(), + Value deletedAt = const Value.absent(), Value rowid = const Value.absent(), - }) => DanceAuthorsCompanion( - danceId: danceId, - choreographerId: choreographerId, - position: position, + }) => ProgramsCompanion( + id: id, + title: title, + eventDate: eventDate, + venue: venue, + venueId: venueId, + band: band, + caller: caller, + dancerLevel: dancerLevel, + notes: notes, + status: status, + hideAlternates: hideAlternates, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, rowid: rowid, ), createCompanionCallback: ({ - required String danceId, - required String choreographerId, - required int position, - Value rowid = const Value.absent(), - }) => DanceAuthorsCompanion.insert( - danceId: danceId, - choreographerId: choreographerId, - position: position, - rowid: rowid, - ), - withReferenceMapper: (p0) => p0 - .map( - (e) => ( - e.readTable(table), - $$DanceAuthorsTableReferences(db, table, e), - ), - ) - .toList(), - prefetchHooksCallback: ({danceId = false, choreographerId = false}) { - return PrefetchHooks( - db: db, - explicitlyWatchedTables: [], - addJoins: - < - T extends TableManagerState< - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic - > - >(state) { - if (danceId) { - state = - state.withJoin( - currentTable: table, - currentColumn: table.danceId, - referencedTable: $$DanceAuthorsTableReferences - ._danceIdTable(db), - referencedColumn: $$DanceAuthorsTableReferences - ._danceIdTable(db) - .id, - ) - as T; - } - if (choreographerId) { - state = - state.withJoin( - currentTable: table, - currentColumn: table.choreographerId, - referencedTable: $$DanceAuthorsTableReferences - ._choreographerIdTable(db), - referencedColumn: $$DanceAuthorsTableReferences - ._choreographerIdTable(db) - .id, - ) - as T; - } - - return state; + required String id, + required String title, + Value eventDate = const Value.absent(), + Value venue = const Value.absent(), + Value venueId = const Value.absent(), + Value band = const Value.absent(), + Value caller = const Value.absent(), + Value dancerLevel = const Value.absent(), + Value notes = const Value.absent(), + required ProgramStatus status, + Value hideAlternates = const Value.absent(), + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt = const Value.absent(), + Value rowid = const Value.absent(), + }) => ProgramsCompanion.insert( + id: id, + title: title, + eventDate: eventDate, + venue: venue, + venueId: venueId, + band: band, + caller: caller, + dancerLevel: dancerLevel, + notes: notes, + status: status, + hideAlternates: hideAlternates, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map( + (e) => ( + e.readTable(table), + $$ProgramsTableReferences(db, table, e), + ), + ) + .toList(), + prefetchHooksCallback: + ({programSlotsRefs = false, programProvenanceRefs = false}) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [ + if (programSlotsRefs) db.programSlots, + if (programProvenanceRefs) db.programProvenance, + ], + addJoins: null, + getPrefetchedDataCallback: (items) async { + return [ + if (programSlotsRefs) + await $_getPrefetchedData< + ProgramRow, + $ProgramsTable, + ProgramSlotRow + >( + currentTable: table, + referencedTable: $$ProgramsTableReferences + ._programSlotsRefsTable(db), + managerFromTypedResult: (p0) => + $$ProgramsTableReferences( + db, + table, + p0, + ).programSlotsRefs, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems.where( + (e) => e.programId == item.id, + ), + typedResults: items, + ), + if (programProvenanceRefs) + await $_getPrefetchedData< + ProgramRow, + $ProgramsTable, + ProgramProvenanceRow + >( + currentTable: table, + referencedTable: $$ProgramsTableReferences + ._programProvenanceRefsTable(db), + managerFromTypedResult: (p0) => + $$ProgramsTableReferences( + db, + table, + p0, + ).programProvenanceRefs, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems.where( + (e) => e.programId == item.id, + ), + typedResults: items, + ), + ]; }, - getPrefetchedDataCallback: (items) async { - return []; + ); }, - ); - }, ), ); } -typedef $$DanceAuthorsTableProcessedTableManager = +typedef $$ProgramsTableProcessedTableManager = ProcessedTableManager< _$CompendiumDatabase, - $DanceAuthorsTable, - DanceAuthorRow, - $$DanceAuthorsTableFilterComposer, - $$DanceAuthorsTableOrderingComposer, - $$DanceAuthorsTableAnnotationComposer, - $$DanceAuthorsTableCreateCompanionBuilder, - $$DanceAuthorsTableUpdateCompanionBuilder, - (DanceAuthorRow, $$DanceAuthorsTableReferences), - DanceAuthorRow, - PrefetchHooks Function({bool danceId, bool choreographerId}) + $ProgramsTable, + ProgramRow, + $$ProgramsTableFilterComposer, + $$ProgramsTableOrderingComposer, + $$ProgramsTableAnnotationComposer, + $$ProgramsTableCreateCompanionBuilder, + $$ProgramsTableUpdateCompanionBuilder, + (ProgramRow, $$ProgramsTableReferences), + ProgramRow, + PrefetchHooks Function({ + bool programSlotsRefs, + bool programProvenanceRefs, + }) >; -typedef $$DanceFiguresTableCreateCompanionBuilder = - DanceFiguresCompanion Function({ - required String danceId, - required int idx, - required String move, - Value beats, - Value progression, - Value paramsJson, - Value canonicalText, - Value section, +typedef $$ProgramSlotsTableCreateCompanionBuilder = + ProgramSlotsCompanion Function({ + required String id, + required String programId, + required int position, + Value danceId, + Value text_, + Value isAlt, + Value guestCaller, + Value plannedMinutes, + Value performedAt, Value rowid, }); -typedef $$DanceFiguresTableUpdateCompanionBuilder = - DanceFiguresCompanion Function({ - Value danceId, - Value idx, - Value move, - Value beats, - Value progression, - Value paramsJson, - Value canonicalText, - Value section, +typedef $$ProgramSlotsTableUpdateCompanionBuilder = + ProgramSlotsCompanion Function({ + Value id, + Value programId, + Value position, + Value danceId, + Value text_, + Value isAlt, + Value guestCaller, + Value plannedMinutes, + Value performedAt, Value rowid, }); -final class $$DanceFiguresTableReferences +final class $$ProgramSlotsTableReferences extends BaseReferences< _$CompendiumDatabase, - $DanceFiguresTable, - DanceFigureRow + $ProgramSlotsTable, + ProgramSlotRow > { - $$DanceFiguresTableReferences(super.$_db, super.$_table, super.$_typedResult); + $$ProgramSlotsTableReferences(super.$_db, super.$_table, super.$_typedResult); - static $DancesTable _danceIdTable(_$CompendiumDatabase db) => - db.dances.createAlias('dance_figures__dance_id__dances__id'); + static $ProgramsTable _programIdTable(_$CompendiumDatabase db) => + db.programs.createAlias('program_slots__program_id__programs__id'); - $$DancesTableProcessedTableManager get danceId { - final $_column = $_itemColumn('dance_id')!; + $$ProgramsTableProcessedTableManager get programId { + final $_column = $_itemColumn('program_id')!; + + final manager = $$ProgramsTableTableManager( + $_db, + $_db.programs, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull(_programIdTable($_db)); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } + + static $DancesTable _danceIdTable(_$CompendiumDatabase db) => + db.dances.createAlias('program_slots__dance_id__dances__id'); + $$DancesTableProcessedTableManager? get danceId { + final $_column = $_itemColumn('dance_id'); + if ($_column == null) return null; final manager = $$DancesTableTableManager( $_db, $_db.dances, @@ -10190,50 +12475,73 @@ final class $$DanceFiguresTableReferences } } -class $$DanceFiguresTableFilterComposer - extends Composer<_$CompendiumDatabase, $DanceFiguresTable> { - $$DanceFiguresTableFilterComposer({ +class $$ProgramSlotsTableFilterComposer + extends Composer<_$CompendiumDatabase, $ProgramSlotsTable> { + $$ProgramSlotsTableFilterComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnFilters get idx => $composableBuilder( - column: $table.idx, + ColumnFilters get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnFilters(column), ); - ColumnFilters get move => $composableBuilder( - column: $table.move, + ColumnFilters get position => $composableBuilder( + column: $table.position, builder: (column) => ColumnFilters(column), ); - ColumnFilters get beats => $composableBuilder( - column: $table.beats, + ColumnFilters get text_ => $composableBuilder( + column: $table.text_, builder: (column) => ColumnFilters(column), ); - ColumnFilters get progression => $composableBuilder( - column: $table.progression, + ColumnFilters get isAlt => $composableBuilder( + column: $table.isAlt, builder: (column) => ColumnFilters(column), ); - ColumnFilters get paramsJson => $composableBuilder( - column: $table.paramsJson, + ColumnFilters get guestCaller => $composableBuilder( + column: $table.guestCaller, builder: (column) => ColumnFilters(column), ); - ColumnFilters get canonicalText => $composableBuilder( - column: $table.canonicalText, + ColumnFilters get plannedMinutes => $composableBuilder( + column: $table.plannedMinutes, builder: (column) => ColumnFilters(column), ); - ColumnFilters get section => $composableBuilder( - column: $table.section, + ColumnFilters get performedAt => $composableBuilder( + column: $table.performedAt, builder: (column) => ColumnFilters(column), ); + $$ProgramsTableFilterComposer get programId { + final $$ProgramsTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.programId, + referencedTable: $db.programs, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ProgramsTableFilterComposer( + $db: $db, + $table: $db.programs, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + $$DancesTableFilterComposer get danceId { final $$DancesTableFilterComposer composer = $composerBuilder( composer: this, @@ -10258,50 +12566,73 @@ class $$DanceFiguresTableFilterComposer } } -class $$DanceFiguresTableOrderingComposer - extends Composer<_$CompendiumDatabase, $DanceFiguresTable> { - $$DanceFiguresTableOrderingComposer({ +class $$ProgramSlotsTableOrderingComposer + extends Composer<_$CompendiumDatabase, $ProgramSlotsTable> { + $$ProgramSlotsTableOrderingComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get idx => $composableBuilder( - column: $table.idx, + ColumnOrderings get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get move => $composableBuilder( - column: $table.move, + ColumnOrderings get position => $composableBuilder( + column: $table.position, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get beats => $composableBuilder( - column: $table.beats, + ColumnOrderings get text_ => $composableBuilder( + column: $table.text_, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get progression => $composableBuilder( - column: $table.progression, + ColumnOrderings get isAlt => $composableBuilder( + column: $table.isAlt, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get paramsJson => $composableBuilder( - column: $table.paramsJson, + ColumnOrderings get guestCaller => $composableBuilder( + column: $table.guestCaller, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get canonicalText => $composableBuilder( - column: $table.canonicalText, + ColumnOrderings get plannedMinutes => $composableBuilder( + column: $table.plannedMinutes, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get section => $composableBuilder( - column: $table.section, + ColumnOrderings get performedAt => $composableBuilder( + column: $table.performedAt, builder: (column) => ColumnOrderings(column), ); + $$ProgramsTableOrderingComposer get programId { + final $$ProgramsTableOrderingComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.programId, + referencedTable: $db.programs, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ProgramsTableOrderingComposer( + $db: $db, + $table: $db.programs, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + $$DancesTableOrderingComposer get danceId { final $$DancesTableOrderingComposer composer = $composerBuilder( composer: this, @@ -10326,41 +12657,64 @@ class $$DanceFiguresTableOrderingComposer } } -class $$DanceFiguresTableAnnotationComposer - extends Composer<_$CompendiumDatabase, $DanceFiguresTable> { - $$DanceFiguresTableAnnotationComposer({ +class $$ProgramSlotsTableAnnotationComposer + extends Composer<_$CompendiumDatabase, $ProgramSlotsTable> { + $$ProgramSlotsTableAnnotationComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - GeneratedColumn get idx => - $composableBuilder(column: $table.idx, builder: (column) => column); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); - GeneratedColumn get move => - $composableBuilder(column: $table.move, builder: (column) => column); + GeneratedColumn get position => + $composableBuilder(column: $table.position, builder: (column) => column); - GeneratedColumn get beats => - $composableBuilder(column: $table.beats, builder: (column) => column); + GeneratedColumn get text_ => + $composableBuilder(column: $table.text_, builder: (column) => column); - GeneratedColumn get progression => $composableBuilder( - column: $table.progression, + GeneratedColumn get isAlt => + $composableBuilder(column: $table.isAlt, builder: (column) => column); + + GeneratedColumn get guestCaller => $composableBuilder( + column: $table.guestCaller, builder: (column) => column, ); - GeneratedColumn get paramsJson => $composableBuilder( - column: $table.paramsJson, + GeneratedColumn get plannedMinutes => $composableBuilder( + column: $table.plannedMinutes, builder: (column) => column, ); - GeneratedColumn get canonicalText => $composableBuilder( - column: $table.canonicalText, + GeneratedColumn get performedAt => $composableBuilder( + column: $table.performedAt, builder: (column) => column, ); - GeneratedColumn get section => - $composableBuilder(column: $table.section, builder: (column) => column); + $$ProgramsTableAnnotationComposer get programId { + final $$ProgramsTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.programId, + referencedTable: $db.programs, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ProgramsTableAnnotationComposer( + $db: $db, + $table: $db.programs, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } $$DancesTableAnnotationComposer get danceId { final $$DancesTableAnnotationComposer composer = $composerBuilder( @@ -10386,87 +12740,91 @@ class $$DanceFiguresTableAnnotationComposer } } -class $$DanceFiguresTableTableManager +class $$ProgramSlotsTableTableManager extends RootTableManager< _$CompendiumDatabase, - $DanceFiguresTable, - DanceFigureRow, - $$DanceFiguresTableFilterComposer, - $$DanceFiguresTableOrderingComposer, - $$DanceFiguresTableAnnotationComposer, - $$DanceFiguresTableCreateCompanionBuilder, - $$DanceFiguresTableUpdateCompanionBuilder, - (DanceFigureRow, $$DanceFiguresTableReferences), - DanceFigureRow, - PrefetchHooks Function({bool danceId}) + $ProgramSlotsTable, + ProgramSlotRow, + $$ProgramSlotsTableFilterComposer, + $$ProgramSlotsTableOrderingComposer, + $$ProgramSlotsTableAnnotationComposer, + $$ProgramSlotsTableCreateCompanionBuilder, + $$ProgramSlotsTableUpdateCompanionBuilder, + (ProgramSlotRow, $$ProgramSlotsTableReferences), + ProgramSlotRow, + PrefetchHooks Function({bool programId, bool danceId}) > { - $$DanceFiguresTableTableManager( + $$ProgramSlotsTableTableManager( _$CompendiumDatabase db, - $DanceFiguresTable table, + $ProgramSlotsTable table, ) : super( TableManagerState( db: db, table: table, createFilteringComposer: () => - $$DanceFiguresTableFilterComposer($db: db, $table: table), + $$ProgramSlotsTableFilterComposer($db: db, $table: table), createOrderingComposer: () => - $$DanceFiguresTableOrderingComposer($db: db, $table: table), + $$ProgramSlotsTableOrderingComposer($db: db, $table: table), createComputedFieldComposer: () => - $$DanceFiguresTableAnnotationComposer($db: db, $table: table), + $$ProgramSlotsTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ - Value danceId = const Value.absent(), - Value idx = const Value.absent(), - Value move = const Value.absent(), - Value beats = const Value.absent(), - Value progression = const Value.absent(), - Value paramsJson = const Value.absent(), - Value canonicalText = const Value.absent(), - Value section = const Value.absent(), + Value id = const Value.absent(), + Value programId = const Value.absent(), + Value position = const Value.absent(), + Value danceId = const Value.absent(), + Value text_ = const Value.absent(), + Value isAlt = const Value.absent(), + Value guestCaller = const Value.absent(), + Value plannedMinutes = const Value.absent(), + Value performedAt = const Value.absent(), Value rowid = const Value.absent(), - }) => DanceFiguresCompanion( + }) => ProgramSlotsCompanion( + id: id, + programId: programId, + position: position, danceId: danceId, - idx: idx, - move: move, - beats: beats, - progression: progression, - paramsJson: paramsJson, - canonicalText: canonicalText, - section: section, + text_: text_, + isAlt: isAlt, + guestCaller: guestCaller, + plannedMinutes: plannedMinutes, + performedAt: performedAt, rowid: rowid, ), createCompanionCallback: ({ - required String danceId, - required int idx, - required String move, - Value beats = const Value.absent(), - Value progression = const Value.absent(), - Value paramsJson = const Value.absent(), - Value canonicalText = const Value.absent(), - Value section = const Value.absent(), + required String id, + required String programId, + required int position, + Value danceId = const Value.absent(), + Value text_ = const Value.absent(), + Value isAlt = const Value.absent(), + Value guestCaller = const Value.absent(), + Value plannedMinutes = const Value.absent(), + Value performedAt = const Value.absent(), Value rowid = const Value.absent(), - }) => DanceFiguresCompanion.insert( + }) => ProgramSlotsCompanion.insert( + id: id, + programId: programId, + position: position, danceId: danceId, - idx: idx, - move: move, - beats: beats, - progression: progression, - paramsJson: paramsJson, - canonicalText: canonicalText, - section: section, + text_: text_, + isAlt: isAlt, + guestCaller: guestCaller, + plannedMinutes: plannedMinutes, + performedAt: performedAt, rowid: rowid, ), withReferenceMapper: (p0) => p0 .map( (e) => ( e.readTable(table), - $$DanceFiguresTableReferences(db, table, e), + $$ProgramSlotsTableReferences(db, table, e), ), ) .toList(), - prefetchHooksCallback: ({danceId = false}) { + prefetchHooksCallback: ({programId = false, danceId = false}) { return PrefetchHooks( db: db, explicitlyWatchedTables: [], @@ -10486,14 +12844,27 @@ class $$DanceFiguresTableTableManager dynamic > >(state) { + if (programId) { + state = + state.withJoin( + currentTable: table, + currentColumn: table.programId, + referencedTable: $$ProgramSlotsTableReferences + ._programIdTable(db), + referencedColumn: $$ProgramSlotsTableReferences + ._programIdTable(db) + .id, + ) + as T; + } if (danceId) { state = state.withJoin( currentTable: table, currentColumn: table.danceId, - referencedTable: $$DanceFiguresTableReferences + referencedTable: $$ProgramSlotsTableReferences ._danceIdTable(db), - referencedColumn: $$DanceFiguresTableReferences + referencedColumn: $$ProgramSlotsTableReferences ._danceIdTable(db) .id, ) @@ -10511,96 +12882,71 @@ class $$DanceFiguresTableTableManager ); } -typedef $$DanceFiguresTableProcessedTableManager = +typedef $$ProgramSlotsTableProcessedTableManager = ProcessedTableManager< _$CompendiumDatabase, - $DanceFiguresTable, - DanceFigureRow, - $$DanceFiguresTableFilterComposer, - $$DanceFiguresTableOrderingComposer, - $$DanceFiguresTableAnnotationComposer, - $$DanceFiguresTableCreateCompanionBuilder, - $$DanceFiguresTableUpdateCompanionBuilder, - (DanceFigureRow, $$DanceFiguresTableReferences), - DanceFigureRow, - PrefetchHooks Function({bool danceId}) - >; -typedef $$ProgramsTableCreateCompanionBuilder = - ProgramsCompanion Function({ - required String id, - required String title, - Value eventDate, - Value venue, - Value band, - Value caller, - Value dancerLevel, - Value notes, - required ProgramStatus status, - Value hideAlternates, - required DateTime createdAt, - required DateTime updatedAt, - Value deletedAt, + $ProgramSlotsTable, + ProgramSlotRow, + $$ProgramSlotsTableFilterComposer, + $$ProgramSlotsTableOrderingComposer, + $$ProgramSlotsTableAnnotationComposer, + $$ProgramSlotsTableCreateCompanionBuilder, + $$ProgramSlotsTableUpdateCompanionBuilder, + (ProgramSlotRow, $$ProgramSlotsTableReferences), + ProgramSlotRow, + PrefetchHooks Function({bool programId, bool danceId}) + >; +typedef $$CustomFieldDefsTableCreateCompanionBuilder = + CustomFieldDefsCompanion Function({ + required String id, + required String key, + required String label, + required CustomFieldType type, + Value choicesJson, + Value showInList, + Value searchable, Value rowid, }); -typedef $$ProgramsTableUpdateCompanionBuilder = - ProgramsCompanion Function({ +typedef $$CustomFieldDefsTableUpdateCompanionBuilder = + CustomFieldDefsCompanion Function({ Value id, - Value title, - Value eventDate, - Value venue, - Value band, - Value caller, - Value dancerLevel, - Value notes, - Value status, - Value hideAlternates, - Value createdAt, - Value updatedAt, - Value deletedAt, + Value key, + Value label, + Value type, + Value choicesJson, + Value showInList, + Value searchable, Value rowid, }); -final class $$ProgramsTableReferences - extends BaseReferences<_$CompendiumDatabase, $ProgramsTable, ProgramRow> { - $$ProgramsTableReferences(super.$_db, super.$_table, super.$_typedResult); - - static MultiTypedResultKey<$ProgramSlotsTable, List> - _programSlotsRefsTable(_$CompendiumDatabase db) => - MultiTypedResultKey.fromTable( - db.programSlots, - aliasName: 'programs__id__program_slots__program_id', - ); - - $$ProgramSlotsTableProcessedTableManager get programSlotsRefs { - final manager = $$ProgramSlotsTableTableManager( - $_db, - $_db.programSlots, - ).filter((f) => f.programId.id.sqlEquals($_itemColumn('id')!)); - - final cache = $_typedResult.readTableOrNull(_programSlotsRefsTable($_db)); - return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: cache), - ); - } +final class $$CustomFieldDefsTableReferences + extends + BaseReferences< + _$CompendiumDatabase, + $CustomFieldDefsTable, + CustomFieldDefRow + > { + $$CustomFieldDefsTableReferences( + super.$_db, + super.$_table, + super.$_typedResult, + ); - static MultiTypedResultKey< - $ProgramProvenanceTable, - List - > - _programProvenanceRefsTable(_$CompendiumDatabase db) => + static MultiTypedResultKey<$CustomFieldValuesTable, List> + _customFieldValuesRefsTable(_$CompendiumDatabase db) => MultiTypedResultKey.fromTable( - db.programProvenance, - aliasName: 'programs__id__program_provenance__program_id', + db.customFieldValues, + aliasName: 'custom_field_defs__id__custom_field_values__field_id', ); - $$ProgramProvenanceTableProcessedTableManager get programProvenanceRefs { - final manager = $$ProgramProvenanceTableTableManager( + $$CustomFieldValuesTableProcessedTableManager get customFieldValuesRefs { + final manager = $$CustomFieldValuesTableTableManager( $_db, - $_db.programProvenance, - ).filter((f) => f.programId.id.sqlEquals($_itemColumn('id')!)); + $_db.customFieldValues, + ).filter((f) => f.fieldId.id.sqlEquals($_itemColumn('id')!)); final cache = $_typedResult.readTableOrNull( - _programProvenanceRefsTable($_db), + _customFieldValuesRefsTable($_db), ); return ProcessedTableManager( manager.$state.copyWith(prefetchedData: cache), @@ -10608,9 +12954,9 @@ final class $$ProgramsTableReferences } } -class $$ProgramsTableFilterComposer - extends Composer<_$CompendiumDatabase, $ProgramsTable> { - $$ProgramsTableFilterComposer({ +class $$CustomFieldDefsTableFilterComposer + extends Composer<_$CompendiumDatabase, $CustomFieldDefsTable> { + $$CustomFieldDefsTableFilterComposer({ required super.$db, required super.$table, super.joinBuilder, @@ -10622,108 +12968,53 @@ class $$ProgramsTableFilterComposer builder: (column) => ColumnFilters(column), ); - ColumnFilters get title => $composableBuilder( - column: $table.title, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get eventDate => $composableBuilder( - column: $table.eventDate, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get venue => $composableBuilder( - column: $table.venue, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get band => $composableBuilder( - column: $table.band, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get caller => $composableBuilder( - column: $table.caller, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get dancerLevel => $composableBuilder( - column: $table.dancerLevel, + ColumnFilters get key => $composableBuilder( + column: $table.key, builder: (column) => ColumnFilters(column), ); - ColumnFilters get notes => $composableBuilder( - column: $table.notes, + ColumnFilters get label => $composableBuilder( + column: $table.label, builder: (column) => ColumnFilters(column), ); - ColumnWithTypeConverterFilters - get status => $composableBuilder( - column: $table.status, + ColumnWithTypeConverterFilters + get type => $composableBuilder( + column: $table.type, builder: (column) => ColumnWithTypeConverterFilters(column), ); - ColumnFilters get hideAlternates => $composableBuilder( - column: $table.hideAlternates, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get createdAt => $composableBuilder( - column: $table.createdAt, + ColumnFilters get choicesJson => $composableBuilder( + column: $table.choicesJson, builder: (column) => ColumnFilters(column), ); - ColumnFilters get updatedAt => $composableBuilder( - column: $table.updatedAt, + ColumnFilters get showInList => $composableBuilder( + column: $table.showInList, builder: (column) => ColumnFilters(column), ); - ColumnFilters get deletedAt => $composableBuilder( - column: $table.deletedAt, + ColumnFilters get searchable => $composableBuilder( + column: $table.searchable, builder: (column) => ColumnFilters(column), ); - Expression programSlotsRefs( - Expression Function($$ProgramSlotsTableFilterComposer f) f, - ) { - final $$ProgramSlotsTableFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $db.programSlots, - getReferencedColumn: (t) => t.programId, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$ProgramSlotsTableFilterComposer( - $db: $db, - $table: $db.programSlots, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return f(composer); - } - - Expression programProvenanceRefs( - Expression Function($$ProgramProvenanceTableFilterComposer f) f, + Expression customFieldValuesRefs( + Expression Function($$CustomFieldValuesTableFilterComposer f) f, ) { - final $$ProgramProvenanceTableFilterComposer composer = $composerBuilder( + final $$CustomFieldValuesTableFilterComposer composer = $composerBuilder( composer: this, getCurrentColumn: (t) => t.id, - referencedTable: $db.programProvenance, - getReferencedColumn: (t) => t.programId, + referencedTable: $db.customFieldValues, + getReferencedColumn: (t) => t.fieldId, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$ProgramProvenanceTableFilterComposer( + }) => $$CustomFieldValuesTableFilterComposer( $db: $db, - $table: $db.programProvenance, + $table: $db.customFieldValues, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: @@ -10734,9 +13025,9 @@ class $$ProgramsTableFilterComposer } } -class $$ProgramsTableOrderingComposer - extends Composer<_$CompendiumDatabase, $ProgramsTable> { - $$ProgramsTableOrderingComposer({ +class $$CustomFieldDefsTableOrderingComposer + extends Composer<_$CompendiumDatabase, $CustomFieldDefsTable> { + $$CustomFieldDefsTableOrderingComposer({ required super.$db, required super.$table, super.joinBuilder, @@ -10748,70 +13039,40 @@ class $$ProgramsTableOrderingComposer builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get title => $composableBuilder( - column: $table.title, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get eventDate => $composableBuilder( - column: $table.eventDate, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get venue => $composableBuilder( - column: $table.venue, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get band => $composableBuilder( - column: $table.band, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get caller => $composableBuilder( - column: $table.caller, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get dancerLevel => $composableBuilder( - column: $table.dancerLevel, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get notes => $composableBuilder( - column: $table.notes, + ColumnOrderings get key => $composableBuilder( + column: $table.key, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get status => $composableBuilder( - column: $table.status, + ColumnOrderings get label => $composableBuilder( + column: $table.label, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get hideAlternates => $composableBuilder( - column: $table.hideAlternates, + ColumnOrderings get type => $composableBuilder( + column: $table.type, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get createdAt => $composableBuilder( - column: $table.createdAt, + ColumnOrderings get choicesJson => $composableBuilder( + column: $table.choicesJson, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get updatedAt => $composableBuilder( - column: $table.updatedAt, + ColumnOrderings get showInList => $composableBuilder( + column: $table.showInList, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get deletedAt => $composableBuilder( - column: $table.deletedAt, + ColumnOrderings get searchable => $composableBuilder( + column: $table.searchable, builder: (column) => ColumnOrderings(column), ); -} - -class $$ProgramsTableAnnotationComposer - extends Composer<_$CompendiumDatabase, $ProgramsTable> { - $$ProgramsTableAnnotationComposer({ +} + +class $$CustomFieldDefsTableAnnotationComposer + extends Composer<_$CompendiumDatabase, $CustomFieldDefsTable> { + $$CustomFieldDefsTableAnnotationComposer({ required super.$db, required super.$table, super.joinBuilder, @@ -10821,88 +13082,47 @@ class $$ProgramsTableAnnotationComposer GeneratedColumn get id => $composableBuilder(column: $table.id, builder: (column) => column); - GeneratedColumn get title => - $composableBuilder(column: $table.title, builder: (column) => column); - - GeneratedColumn get eventDate => - $composableBuilder(column: $table.eventDate, builder: (column) => column); - - GeneratedColumn get venue => - $composableBuilder(column: $table.venue, builder: (column) => column); + GeneratedColumn get key => + $composableBuilder(column: $table.key, builder: (column) => column); - GeneratedColumn get band => - $composableBuilder(column: $table.band, builder: (column) => column); + GeneratedColumn get label => + $composableBuilder(column: $table.label, builder: (column) => column); - GeneratedColumn get caller => - $composableBuilder(column: $table.caller, builder: (column) => column); + GeneratedColumnWithTypeConverter get type => + $composableBuilder(column: $table.type, builder: (column) => column); - GeneratedColumn get dancerLevel => $composableBuilder( - column: $table.dancerLevel, + GeneratedColumn get choicesJson => $composableBuilder( + column: $table.choicesJson, builder: (column) => column, ); - GeneratedColumn get notes => - $composableBuilder(column: $table.notes, builder: (column) => column); - - GeneratedColumnWithTypeConverter get status => - $composableBuilder(column: $table.status, builder: (column) => column); - - GeneratedColumn get hideAlternates => $composableBuilder( - column: $table.hideAlternates, + GeneratedColumn get showInList => $composableBuilder( + column: $table.showInList, builder: (column) => column, ); - GeneratedColumn get createdAt => - $composableBuilder(column: $table.createdAt, builder: (column) => column); - - GeneratedColumn get updatedAt => - $composableBuilder(column: $table.updatedAt, builder: (column) => column); - - GeneratedColumn get deletedAt => - $composableBuilder(column: $table.deletedAt, builder: (column) => column); - - Expression programSlotsRefs( - Expression Function($$ProgramSlotsTableAnnotationComposer a) f, - ) { - final $$ProgramSlotsTableAnnotationComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $db.programSlots, - getReferencedColumn: (t) => t.programId, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$ProgramSlotsTableAnnotationComposer( - $db: $db, - $table: $db.programSlots, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return f(composer); - } + GeneratedColumn get searchable => $composableBuilder( + column: $table.searchable, + builder: (column) => column, + ); - Expression programProvenanceRefs( - Expression Function($$ProgramProvenanceTableAnnotationComposer a) f, + Expression customFieldValuesRefs( + Expression Function($$CustomFieldValuesTableAnnotationComposer a) f, ) { - final $$ProgramProvenanceTableAnnotationComposer composer = + final $$CustomFieldValuesTableAnnotationComposer composer = $composerBuilder( composer: this, getCurrentColumn: (t) => t.id, - referencedTable: $db.programProvenance, - getReferencedColumn: (t) => t.programId, + referencedTable: $db.customFieldValues, + getReferencedColumn: (t) => t.fieldId, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$ProgramProvenanceTableAnnotationComposer( + }) => $$CustomFieldValuesTableAnnotationComposer( $db: $db, - $table: $db.programProvenance, + $table: $db.customFieldValues, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: @@ -10913,249 +13133,191 @@ class $$ProgramsTableAnnotationComposer } } -class $$ProgramsTableTableManager +class $$CustomFieldDefsTableTableManager extends RootTableManager< _$CompendiumDatabase, - $ProgramsTable, - ProgramRow, - $$ProgramsTableFilterComposer, - $$ProgramsTableOrderingComposer, - $$ProgramsTableAnnotationComposer, - $$ProgramsTableCreateCompanionBuilder, - $$ProgramsTableUpdateCompanionBuilder, - (ProgramRow, $$ProgramsTableReferences), - ProgramRow, - PrefetchHooks Function({ - bool programSlotsRefs, - bool programProvenanceRefs, - }) + $CustomFieldDefsTable, + CustomFieldDefRow, + $$CustomFieldDefsTableFilterComposer, + $$CustomFieldDefsTableOrderingComposer, + $$CustomFieldDefsTableAnnotationComposer, + $$CustomFieldDefsTableCreateCompanionBuilder, + $$CustomFieldDefsTableUpdateCompanionBuilder, + (CustomFieldDefRow, $$CustomFieldDefsTableReferences), + CustomFieldDefRow, + PrefetchHooks Function({bool customFieldValuesRefs}) > { - $$ProgramsTableTableManager(_$CompendiumDatabase db, $ProgramsTable table) - : super( + $$CustomFieldDefsTableTableManager( + _$CompendiumDatabase db, + $CustomFieldDefsTable table, + ) : super( TableManagerState( db: db, table: table, createFilteringComposer: () => - $$ProgramsTableFilterComposer($db: db, $table: table), + $$CustomFieldDefsTableFilterComposer($db: db, $table: table), createOrderingComposer: () => - $$ProgramsTableOrderingComposer($db: db, $table: table), + $$CustomFieldDefsTableOrderingComposer($db: db, $table: table), createComputedFieldComposer: () => - $$ProgramsTableAnnotationComposer($db: db, $table: table), + $$CustomFieldDefsTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ Value id = const Value.absent(), - Value title = const Value.absent(), - Value eventDate = const Value.absent(), - Value venue = const Value.absent(), - Value band = const Value.absent(), - Value caller = const Value.absent(), - Value dancerLevel = const Value.absent(), - Value notes = const Value.absent(), - Value status = const Value.absent(), - Value hideAlternates = const Value.absent(), - Value createdAt = const Value.absent(), - Value updatedAt = const Value.absent(), - Value deletedAt = const Value.absent(), + Value key = const Value.absent(), + Value label = const Value.absent(), + Value type = const Value.absent(), + Value choicesJson = const Value.absent(), + Value showInList = const Value.absent(), + Value searchable = const Value.absent(), Value rowid = const Value.absent(), - }) => ProgramsCompanion( + }) => CustomFieldDefsCompanion( id: id, - title: title, - eventDate: eventDate, - venue: venue, - band: band, - caller: caller, - dancerLevel: dancerLevel, - notes: notes, - status: status, - hideAlternates: hideAlternates, - createdAt: createdAt, - updatedAt: updatedAt, - deletedAt: deletedAt, + key: key, + label: label, + type: type, + choicesJson: choicesJson, + showInList: showInList, + searchable: searchable, rowid: rowid, ), createCompanionCallback: ({ required String id, - required String title, - Value eventDate = const Value.absent(), - Value venue = const Value.absent(), - Value band = const Value.absent(), - Value caller = const Value.absent(), - Value dancerLevel = const Value.absent(), - Value notes = const Value.absent(), - required ProgramStatus status, - Value hideAlternates = const Value.absent(), - required DateTime createdAt, - required DateTime updatedAt, - Value deletedAt = const Value.absent(), - Value rowid = const Value.absent(), - }) => ProgramsCompanion.insert( - id: id, - title: title, - eventDate: eventDate, - venue: venue, - band: band, - caller: caller, - dancerLevel: dancerLevel, - notes: notes, - status: status, - hideAlternates: hideAlternates, - createdAt: createdAt, - updatedAt: updatedAt, - deletedAt: deletedAt, - rowid: rowid, - ), - withReferenceMapper: (p0) => p0 - .map( - (e) => ( - e.readTable(table), - $$ProgramsTableReferences(db, table, e), - ), - ) - .toList(), - prefetchHooksCallback: - ({programSlotsRefs = false, programProvenanceRefs = false}) { - return PrefetchHooks( - db: db, - explicitlyWatchedTables: [ - if (programSlotsRefs) db.programSlots, - if (programProvenanceRefs) db.programProvenance, - ], - addJoins: null, - getPrefetchedDataCallback: (items) async { - return [ - if (programSlotsRefs) - await $_getPrefetchedData< - ProgramRow, - $ProgramsTable, - ProgramSlotRow - >( - currentTable: table, - referencedTable: $$ProgramsTableReferences - ._programSlotsRefsTable(db), - managerFromTypedResult: (p0) => - $$ProgramsTableReferences( - db, - table, - p0, - ).programSlotsRefs, - referencedItemsForCurrentItem: - (item, referencedItems) => referencedItems.where( - (e) => e.programId == item.id, - ), - typedResults: items, - ), - if (programProvenanceRefs) - await $_getPrefetchedData< - ProgramRow, - $ProgramsTable, - ProgramProvenanceRow - >( - currentTable: table, - referencedTable: $$ProgramsTableReferences - ._programProvenanceRefsTable(db), - managerFromTypedResult: (p0) => - $$ProgramsTableReferences( - db, - table, - p0, - ).programProvenanceRefs, - referencedItemsForCurrentItem: - (item, referencedItems) => referencedItems.where( - (e) => e.programId == item.id, - ), - typedResults: items, - ), - ]; - }, - ); + required String key, + required String label, + required CustomFieldType type, + Value choicesJson = const Value.absent(), + Value showInList = const Value.absent(), + Value searchable = const Value.absent(), + Value rowid = const Value.absent(), + }) => CustomFieldDefsCompanion.insert( + id: id, + key: key, + label: label, + type: type, + choicesJson: choicesJson, + showInList: showInList, + searchable: searchable, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map( + (e) => ( + e.readTable(table), + $$CustomFieldDefsTableReferences(db, table, e), + ), + ) + .toList(), + prefetchHooksCallback: ({customFieldValuesRefs = false}) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [ + if (customFieldValuesRefs) db.customFieldValues, + ], + addJoins: null, + getPrefetchedDataCallback: (items) async { + return [ + if (customFieldValuesRefs) + await $_getPrefetchedData< + CustomFieldDefRow, + $CustomFieldDefsTable, + CustomFieldValueRow + >( + currentTable: table, + referencedTable: $$CustomFieldDefsTableReferences + ._customFieldValuesRefsTable(db), + managerFromTypedResult: (p0) => + $$CustomFieldDefsTableReferences( + db, + table, + p0, + ).customFieldValuesRefs, + referencedItemsForCurrentItem: (item, referencedItems) => + referencedItems.where((e) => e.fieldId == item.id), + typedResults: items, + ), + ]; }, + ); + }, ), ); } -typedef $$ProgramsTableProcessedTableManager = +typedef $$CustomFieldDefsTableProcessedTableManager = ProcessedTableManager< _$CompendiumDatabase, - $ProgramsTable, - ProgramRow, - $$ProgramsTableFilterComposer, - $$ProgramsTableOrderingComposer, - $$ProgramsTableAnnotationComposer, - $$ProgramsTableCreateCompanionBuilder, - $$ProgramsTableUpdateCompanionBuilder, - (ProgramRow, $$ProgramsTableReferences), - ProgramRow, - PrefetchHooks Function({ - bool programSlotsRefs, - bool programProvenanceRefs, - }) + $CustomFieldDefsTable, + CustomFieldDefRow, + $$CustomFieldDefsTableFilterComposer, + $$CustomFieldDefsTableOrderingComposer, + $$CustomFieldDefsTableAnnotationComposer, + $$CustomFieldDefsTableCreateCompanionBuilder, + $$CustomFieldDefsTableUpdateCompanionBuilder, + (CustomFieldDefRow, $$CustomFieldDefsTableReferences), + CustomFieldDefRow, + PrefetchHooks Function({bool customFieldValuesRefs}) >; -typedef $$ProgramSlotsTableCreateCompanionBuilder = - ProgramSlotsCompanion Function({ - required String id, - required String programId, - required int position, - Value danceId, - Value text_, - Value isAlt, - Value guestCaller, - Value plannedMinutes, - Value performedAt, +typedef $$CustomFieldValuesTableCreateCompanionBuilder = + CustomFieldValuesCompanion Function({ + required String danceId, + required String fieldId, + Value valueText, + Value valueNum, Value rowid, }); -typedef $$ProgramSlotsTableUpdateCompanionBuilder = - ProgramSlotsCompanion Function({ - Value id, - Value programId, - Value position, - Value danceId, - Value text_, - Value isAlt, - Value guestCaller, - Value plannedMinutes, - Value performedAt, +typedef $$CustomFieldValuesTableUpdateCompanionBuilder = + CustomFieldValuesCompanion Function({ + Value danceId, + Value fieldId, + Value valueText, + Value valueNum, Value rowid, }); -final class $$ProgramSlotsTableReferences +final class $$CustomFieldValuesTableReferences extends BaseReferences< _$CompendiumDatabase, - $ProgramSlotsTable, - ProgramSlotRow + $CustomFieldValuesTable, + CustomFieldValueRow > { - $$ProgramSlotsTableReferences(super.$_db, super.$_table, super.$_typedResult); + $$CustomFieldValuesTableReferences( + super.$_db, + super.$_table, + super.$_typedResult, + ); - static $ProgramsTable _programIdTable(_$CompendiumDatabase db) => - db.programs.createAlias('program_slots__program_id__programs__id'); + static $DancesTable _danceIdTable(_$CompendiumDatabase db) => + db.dances.createAlias('custom_field_values__dance_id__dances__id'); - $$ProgramsTableProcessedTableManager get programId { - final $_column = $_itemColumn('program_id')!; + $$DancesTableProcessedTableManager get danceId { + final $_column = $_itemColumn('dance_id')!; - final manager = $$ProgramsTableTableManager( + final manager = $$DancesTableTableManager( $_db, - $_db.programs, + $_db.dances, ).filter((f) => f.id.sqlEquals($_column)); - final item = $_typedResult.readTableOrNull(_programIdTable($_db)); + final item = $_typedResult.readTableOrNull(_danceIdTable($_db)); if (item == null) return manager; return ProcessedTableManager( manager.$state.copyWith(prefetchedData: [item]), ); } - static $DancesTable _danceIdTable(_$CompendiumDatabase db) => - db.dances.createAlias('program_slots__dance_id__dances__id'); + static $CustomFieldDefsTable _fieldIdTable(_$CompendiumDatabase db) => db + .customFieldDefs + .createAlias('custom_field_values__field_id__custom_field_defs__id'); - $$DancesTableProcessedTableManager? get danceId { - final $_column = $_itemColumn('dance_id'); - if ($_column == null) return null; - final manager = $$DancesTableTableManager( + $$CustomFieldDefsTableProcessedTableManager get fieldId { + final $_column = $_itemColumn('field_id')!; + + final manager = $$CustomFieldDefsTableTableManager( $_db, - $_db.dances, + $_db.customFieldDefs, ).filter((f) => f.id.sqlEquals($_column)); - final item = $_typedResult.readTableOrNull(_danceIdTable($_db)); + final item = $_typedResult.readTableOrNull(_fieldIdTable($_db)); if (item == null) return manager; return ProcessedTableManager( manager.$state.copyWith(prefetchedData: [item]), @@ -11163,64 +13325,39 @@ final class $$ProgramSlotsTableReferences } } -class $$ProgramSlotsTableFilterComposer - extends Composer<_$CompendiumDatabase, $ProgramSlotsTable> { - $$ProgramSlotsTableFilterComposer({ +class $$CustomFieldValuesTableFilterComposer + extends Composer<_$CompendiumDatabase, $CustomFieldValuesTable> { + $$CustomFieldValuesTableFilterComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnFilters get id => $composableBuilder( - column: $table.id, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get position => $composableBuilder( - column: $table.position, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get text_ => $composableBuilder( - column: $table.text_, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get isAlt => $composableBuilder( - column: $table.isAlt, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get guestCaller => $composableBuilder( - column: $table.guestCaller, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get plannedMinutes => $composableBuilder( - column: $table.plannedMinutes, + ColumnFilters get valueText => $composableBuilder( + column: $table.valueText, builder: (column) => ColumnFilters(column), ); - ColumnFilters get performedAt => $composableBuilder( - column: $table.performedAt, + ColumnFilters get valueNum => $composableBuilder( + column: $table.valueNum, builder: (column) => ColumnFilters(column), ); - $$ProgramsTableFilterComposer get programId { - final $$ProgramsTableFilterComposer composer = $composerBuilder( + $$DancesTableFilterComposer get danceId { + final $$DancesTableFilterComposer composer = $composerBuilder( composer: this, - getCurrentColumn: (t) => t.programId, - referencedTable: $db.programs, + getCurrentColumn: (t) => t.danceId, + referencedTable: $db.dances, getReferencedColumn: (t) => t.id, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$ProgramsTableFilterComposer( + }) => $$DancesTableFilterComposer( $db: $db, - $table: $db.programs, + $table: $db.dances, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: @@ -11230,20 +13367,20 @@ class $$ProgramSlotsTableFilterComposer return composer; } - $$DancesTableFilterComposer get danceId { - final $$DancesTableFilterComposer composer = $composerBuilder( + $$CustomFieldDefsTableFilterComposer get fieldId { + final $$CustomFieldDefsTableFilterComposer composer = $composerBuilder( composer: this, - getCurrentColumn: (t) => t.danceId, - referencedTable: $db.dances, + getCurrentColumn: (t) => t.fieldId, + referencedTable: $db.customFieldDefs, getReferencedColumn: (t) => t.id, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$DancesTableFilterComposer( + }) => $$CustomFieldDefsTableFilterComposer( $db: $db, - $table: $db.dances, + $table: $db.customFieldDefs, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: @@ -11254,64 +13391,39 @@ class $$ProgramSlotsTableFilterComposer } } -class $$ProgramSlotsTableOrderingComposer - extends Composer<_$CompendiumDatabase, $ProgramSlotsTable> { - $$ProgramSlotsTableOrderingComposer({ +class $$CustomFieldValuesTableOrderingComposer + extends Composer<_$CompendiumDatabase, $CustomFieldValuesTable> { + $$CustomFieldValuesTableOrderingComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get id => $composableBuilder( - column: $table.id, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get position => $composableBuilder( - column: $table.position, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get text_ => $composableBuilder( - column: $table.text_, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get isAlt => $composableBuilder( - column: $table.isAlt, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get guestCaller => $composableBuilder( - column: $table.guestCaller, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get plannedMinutes => $composableBuilder( - column: $table.plannedMinutes, + ColumnOrderings get valueText => $composableBuilder( + column: $table.valueText, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get performedAt => $composableBuilder( - column: $table.performedAt, + ColumnOrderings get valueNum => $composableBuilder( + column: $table.valueNum, builder: (column) => ColumnOrderings(column), ); - $$ProgramsTableOrderingComposer get programId { - final $$ProgramsTableOrderingComposer composer = $composerBuilder( + $$DancesTableOrderingComposer get danceId { + final $$DancesTableOrderingComposer composer = $composerBuilder( composer: this, - getCurrentColumn: (t) => t.programId, - referencedTable: $db.programs, + getCurrentColumn: (t) => t.danceId, + referencedTable: $db.dances, getReferencedColumn: (t) => t.id, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$ProgramsTableOrderingComposer( + }) => $$DancesTableOrderingComposer( $db: $db, - $table: $db.programs, + $table: $db.dances, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: @@ -11321,20 +13433,20 @@ class $$ProgramSlotsTableOrderingComposer return composer; } - $$DancesTableOrderingComposer get danceId { - final $$DancesTableOrderingComposer composer = $composerBuilder( + $$CustomFieldDefsTableOrderingComposer get fieldId { + final $$CustomFieldDefsTableOrderingComposer composer = $composerBuilder( composer: this, - getCurrentColumn: (t) => t.danceId, - referencedTable: $db.dances, + getCurrentColumn: (t) => t.fieldId, + referencedTable: $db.customFieldDefs, getReferencedColumn: (t) => t.id, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$DancesTableOrderingComposer( + }) => $$CustomFieldDefsTableOrderingComposer( $db: $db, - $table: $db.dances, + $table: $db.customFieldDefs, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: @@ -11345,56 +13457,35 @@ class $$ProgramSlotsTableOrderingComposer } } -class $$ProgramSlotsTableAnnotationComposer - extends Composer<_$CompendiumDatabase, $ProgramSlotsTable> { - $$ProgramSlotsTableAnnotationComposer({ +class $$CustomFieldValuesTableAnnotationComposer + extends Composer<_$CompendiumDatabase, $CustomFieldValuesTable> { + $$CustomFieldValuesTableAnnotationComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - GeneratedColumn get id => - $composableBuilder(column: $table.id, builder: (column) => column); - - GeneratedColumn get position => - $composableBuilder(column: $table.position, builder: (column) => column); - - GeneratedColumn get text_ => - $composableBuilder(column: $table.text_, builder: (column) => column); - - GeneratedColumn get isAlt => - $composableBuilder(column: $table.isAlt, builder: (column) => column); - - GeneratedColumn get guestCaller => $composableBuilder( - column: $table.guestCaller, - builder: (column) => column, - ); - - GeneratedColumn get plannedMinutes => $composableBuilder( - column: $table.plannedMinutes, - builder: (column) => column, - ); + GeneratedColumn get valueText => + $composableBuilder(column: $table.valueText, builder: (column) => column); - GeneratedColumn get performedAt => $composableBuilder( - column: $table.performedAt, - builder: (column) => column, - ); + GeneratedColumn get valueNum => + $composableBuilder(column: $table.valueNum, builder: (column) => column); - $$ProgramsTableAnnotationComposer get programId { - final $$ProgramsTableAnnotationComposer composer = $composerBuilder( + $$DancesTableAnnotationComposer get danceId { + final $$DancesTableAnnotationComposer composer = $composerBuilder( composer: this, - getCurrentColumn: (t) => t.programId, - referencedTable: $db.programs, + getCurrentColumn: (t) => t.danceId, + referencedTable: $db.dances, getReferencedColumn: (t) => t.id, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$ProgramsTableAnnotationComposer( + }) => $$DancesTableAnnotationComposer( $db: $db, - $table: $db.programs, + $table: $db.dances, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: @@ -11404,20 +13495,20 @@ class $$ProgramSlotsTableAnnotationComposer return composer; } - $$DancesTableAnnotationComposer get danceId { - final $$DancesTableAnnotationComposer composer = $composerBuilder( + $$CustomFieldDefsTableAnnotationComposer get fieldId { + final $$CustomFieldDefsTableAnnotationComposer composer = $composerBuilder( composer: this, - getCurrentColumn: (t) => t.danceId, - referencedTable: $db.dances, + getCurrentColumn: (t) => t.fieldId, + referencedTable: $db.customFieldDefs, getReferencedColumn: (t) => t.id, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$DancesTableAnnotationComposer( + }) => $$CustomFieldDefsTableAnnotationComposer( $db: $db, - $table: $db.dances, + $table: $db.customFieldDefs, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: @@ -11428,91 +13519,74 @@ class $$ProgramSlotsTableAnnotationComposer } } -class $$ProgramSlotsTableTableManager +class $$CustomFieldValuesTableTableManager extends RootTableManager< _$CompendiumDatabase, - $ProgramSlotsTable, - ProgramSlotRow, - $$ProgramSlotsTableFilterComposer, - $$ProgramSlotsTableOrderingComposer, - $$ProgramSlotsTableAnnotationComposer, - $$ProgramSlotsTableCreateCompanionBuilder, - $$ProgramSlotsTableUpdateCompanionBuilder, - (ProgramSlotRow, $$ProgramSlotsTableReferences), - ProgramSlotRow, - PrefetchHooks Function({bool programId, bool danceId}) + $CustomFieldValuesTable, + CustomFieldValueRow, + $$CustomFieldValuesTableFilterComposer, + $$CustomFieldValuesTableOrderingComposer, + $$CustomFieldValuesTableAnnotationComposer, + $$CustomFieldValuesTableCreateCompanionBuilder, + $$CustomFieldValuesTableUpdateCompanionBuilder, + (CustomFieldValueRow, $$CustomFieldValuesTableReferences), + CustomFieldValueRow, + PrefetchHooks Function({bool danceId, bool fieldId}) > { - $$ProgramSlotsTableTableManager( + $$CustomFieldValuesTableTableManager( _$CompendiumDatabase db, - $ProgramSlotsTable table, + $CustomFieldValuesTable table, ) : super( TableManagerState( db: db, table: table, createFilteringComposer: () => - $$ProgramSlotsTableFilterComposer($db: db, $table: table), + $$CustomFieldValuesTableFilterComposer($db: db, $table: table), createOrderingComposer: () => - $$ProgramSlotsTableOrderingComposer($db: db, $table: table), + $$CustomFieldValuesTableOrderingComposer($db: db, $table: table), createComputedFieldComposer: () => - $$ProgramSlotsTableAnnotationComposer($db: db, $table: table), + $$CustomFieldValuesTableAnnotationComposer( + $db: db, + $table: table, + ), updateCompanionCallback: ({ - Value id = const Value.absent(), - Value programId = const Value.absent(), - Value position = const Value.absent(), - Value danceId = const Value.absent(), - Value text_ = const Value.absent(), - Value isAlt = const Value.absent(), - Value guestCaller = const Value.absent(), - Value plannedMinutes = const Value.absent(), - Value performedAt = const Value.absent(), + Value danceId = const Value.absent(), + Value fieldId = const Value.absent(), + Value valueText = const Value.absent(), + Value valueNum = const Value.absent(), Value rowid = const Value.absent(), - }) => ProgramSlotsCompanion( - id: id, - programId: programId, - position: position, + }) => CustomFieldValuesCompanion( danceId: danceId, - text_: text_, - isAlt: isAlt, - guestCaller: guestCaller, - plannedMinutes: plannedMinutes, - performedAt: performedAt, + fieldId: fieldId, + valueText: valueText, + valueNum: valueNum, rowid: rowid, ), createCompanionCallback: ({ - required String id, - required String programId, - required int position, - Value danceId = const Value.absent(), - Value text_ = const Value.absent(), - Value isAlt = const Value.absent(), - Value guestCaller = const Value.absent(), - Value plannedMinutes = const Value.absent(), - Value performedAt = const Value.absent(), + required String danceId, + required String fieldId, + Value valueText = const Value.absent(), + Value valueNum = const Value.absent(), Value rowid = const Value.absent(), - }) => ProgramSlotsCompanion.insert( - id: id, - programId: programId, - position: position, + }) => CustomFieldValuesCompanion.insert( danceId: danceId, - text_: text_, - isAlt: isAlt, - guestCaller: guestCaller, - plannedMinutes: plannedMinutes, - performedAt: performedAt, + fieldId: fieldId, + valueText: valueText, + valueNum: valueNum, rowid: rowid, ), withReferenceMapper: (p0) => p0 .map( (e) => ( e.readTable(table), - $$ProgramSlotsTableReferences(db, table, e), + $$CustomFieldValuesTableReferences(db, table, e), ), ) .toList(), - prefetchHooksCallback: ({programId = false, danceId = false}) { + prefetchHooksCallback: ({danceId = false, fieldId = false}) { return PrefetchHooks( db: db, explicitlyWatchedTables: [], @@ -11532,29 +13606,33 @@ class $$ProgramSlotsTableTableManager dynamic > >(state) { - if (programId) { + if (danceId) { state = state.withJoin( currentTable: table, - currentColumn: table.programId, - referencedTable: $$ProgramSlotsTableReferences - ._programIdTable(db), - referencedColumn: $$ProgramSlotsTableReferences - ._programIdTable(db) - .id, + currentColumn: table.danceId, + referencedTable: + $$CustomFieldValuesTableReferences + ._danceIdTable(db), + referencedColumn: + $$CustomFieldValuesTableReferences + ._danceIdTable(db) + .id, ) as T; } - if (danceId) { + if (fieldId) { state = state.withJoin( currentTable: table, - currentColumn: table.danceId, - referencedTable: $$ProgramSlotsTableReferences - ._danceIdTable(db), - referencedColumn: $$ProgramSlotsTableReferences - ._danceIdTable(db) - .id, + currentColumn: table.fieldId, + referencedTable: + $$CustomFieldValuesTableReferences + ._fieldIdTable(db), + referencedColumn: + $$CustomFieldValuesTableReferences + ._fieldIdTable(db) + .id, ) as T; } @@ -11570,81 +13648,61 @@ class $$ProgramSlotsTableTableManager ); } -typedef $$ProgramSlotsTableProcessedTableManager = +typedef $$CustomFieldValuesTableProcessedTableManager = ProcessedTableManager< _$CompendiumDatabase, - $ProgramSlotsTable, - ProgramSlotRow, - $$ProgramSlotsTableFilterComposer, - $$ProgramSlotsTableOrderingComposer, - $$ProgramSlotsTableAnnotationComposer, - $$ProgramSlotsTableCreateCompanionBuilder, - $$ProgramSlotsTableUpdateCompanionBuilder, - (ProgramSlotRow, $$ProgramSlotsTableReferences), - ProgramSlotRow, - PrefetchHooks Function({bool programId, bool danceId}) + $CustomFieldValuesTable, + CustomFieldValueRow, + $$CustomFieldValuesTableFilterComposer, + $$CustomFieldValuesTableOrderingComposer, + $$CustomFieldValuesTableAnnotationComposer, + $$CustomFieldValuesTableCreateCompanionBuilder, + $$CustomFieldValuesTableUpdateCompanionBuilder, + (CustomFieldValueRow, $$CustomFieldValuesTableReferences), + CustomFieldValueRow, + PrefetchHooks Function({bool danceId, bool fieldId}) >; -typedef $$CustomFieldDefsTableCreateCompanionBuilder = - CustomFieldDefsCompanion Function({ +typedef $$TagsTableCreateCompanionBuilder = + TagsCompanion Function({ required String id, - required String key, - required String label, - required CustomFieldType type, - Value choicesJson, - Value showInList, - Value searchable, + required String name, + Value color, Value rowid, }); -typedef $$CustomFieldDefsTableUpdateCompanionBuilder = - CustomFieldDefsCompanion Function({ +typedef $$TagsTableUpdateCompanionBuilder = + TagsCompanion Function({ Value id, - Value key, - Value label, - Value type, - Value choicesJson, - Value showInList, - Value searchable, + Value name, + Value color, Value rowid, }); -final class $$CustomFieldDefsTableReferences - extends - BaseReferences< - _$CompendiumDatabase, - $CustomFieldDefsTable, - CustomFieldDefRow - > { - $$CustomFieldDefsTableReferences( - super.$_db, - super.$_table, - super.$_typedResult, - ); +final class $$TagsTableReferences + extends BaseReferences<_$CompendiumDatabase, $TagsTable, TagRow> { + $$TagsTableReferences(super.$_db, super.$_table, super.$_typedResult); - static MultiTypedResultKey<$CustomFieldValuesTable, List> - _customFieldValuesRefsTable(_$CompendiumDatabase db) => - MultiTypedResultKey.fromTable( - db.customFieldValues, - aliasName: 'custom_field_defs__id__custom_field_values__field_id', - ); + static MultiTypedResultKey<$DanceTagsTable, List> + _danceTagsRefsTable(_$CompendiumDatabase db) => MultiTypedResultKey.fromTable( + db.danceTags, + aliasName: 'tags__id__dance_tags__tag_id', + ); - $$CustomFieldValuesTableProcessedTableManager get customFieldValuesRefs { - final manager = $$CustomFieldValuesTableTableManager( + $$DanceTagsTableProcessedTableManager get danceTagsRefs { + final manager = $$DanceTagsTableTableManager( $_db, - $_db.customFieldValues, - ).filter((f) => f.fieldId.id.sqlEquals($_itemColumn('id')!)); + $_db.danceTags, + ).filter((f) => f.tagId.id.sqlEquals($_itemColumn('id')!)); - final cache = $_typedResult.readTableOrNull( - _customFieldValuesRefsTable($_db), - ); + final cache = $_typedResult.readTableOrNull(_danceTagsRefsTable($_db)); return ProcessedTableManager( manager.$state.copyWith(prefetchedData: cache), ); } } -class $$CustomFieldDefsTableFilterComposer - extends Composer<_$CompendiumDatabase, $CustomFieldDefsTable> { - $$CustomFieldDefsTableFilterComposer({ +class $$TagsTableFilterComposer + extends Composer<_$CompendiumDatabase, $TagsTable> { + $$TagsTableFilterComposer({ required super.$db, required super.$table, super.joinBuilder, @@ -11656,53 +13714,32 @@ class $$CustomFieldDefsTableFilterComposer builder: (column) => ColumnFilters(column), ); - ColumnFilters get key => $composableBuilder( - column: $table.key, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get label => $composableBuilder( - column: $table.label, - builder: (column) => ColumnFilters(column), - ); - - ColumnWithTypeConverterFilters - get type => $composableBuilder( - column: $table.type, - builder: (column) => ColumnWithTypeConverterFilters(column), - ); - - ColumnFilters get choicesJson => $composableBuilder( - column: $table.choicesJson, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get showInList => $composableBuilder( - column: $table.showInList, + ColumnFilters get name => $composableBuilder( + column: $table.name, builder: (column) => ColumnFilters(column), ); - ColumnFilters get searchable => $composableBuilder( - column: $table.searchable, + ColumnFilters get color => $composableBuilder( + column: $table.color, builder: (column) => ColumnFilters(column), ); - Expression customFieldValuesRefs( - Expression Function($$CustomFieldValuesTableFilterComposer f) f, + Expression danceTagsRefs( + Expression Function($$DanceTagsTableFilterComposer f) f, ) { - final $$CustomFieldValuesTableFilterComposer composer = $composerBuilder( + final $$DanceTagsTableFilterComposer composer = $composerBuilder( composer: this, getCurrentColumn: (t) => t.id, - referencedTable: $db.customFieldValues, - getReferencedColumn: (t) => t.fieldId, + referencedTable: $db.danceTags, + getReferencedColumn: (t) => t.tagId, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$CustomFieldValuesTableFilterComposer( + }) => $$DanceTagsTableFilterComposer( $db: $db, - $table: $db.customFieldValues, + $table: $db.danceTags, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: @@ -11713,9 +13750,9 @@ class $$CustomFieldDefsTableFilterComposer } } -class $$CustomFieldDefsTableOrderingComposer - extends Composer<_$CompendiumDatabase, $CustomFieldDefsTable> { - $$CustomFieldDefsTableOrderingComposer({ +class $$TagsTableOrderingComposer + extends Composer<_$CompendiumDatabase, $TagsTable> { + $$TagsTableOrderingComposer({ required super.$db, required super.$table, super.joinBuilder, @@ -11727,40 +13764,20 @@ class $$CustomFieldDefsTableOrderingComposer builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get key => $composableBuilder( - column: $table.key, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get label => $composableBuilder( - column: $table.label, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get type => $composableBuilder( - column: $table.type, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get choicesJson => $composableBuilder( - column: $table.choicesJson, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get showInList => $composableBuilder( - column: $table.showInList, + ColumnOrderings get name => $composableBuilder( + column: $table.name, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get searchable => $composableBuilder( - column: $table.searchable, + ColumnOrderings get color => $composableBuilder( + column: $table.color, builder: (column) => ColumnOrderings(column), ); } -class $$CustomFieldDefsTableAnnotationComposer - extends Composer<_$CompendiumDatabase, $CustomFieldDefsTable> { - $$CustomFieldDefsTableAnnotationComposer({ +class $$TagsTableAnnotationComposer + extends Composer<_$CompendiumDatabase, $TagsTable> { + $$TagsTableAnnotationComposer({ required super.$db, required super.$table, super.joinBuilder, @@ -11770,159 +13787,106 @@ class $$CustomFieldDefsTableAnnotationComposer GeneratedColumn get id => $composableBuilder(column: $table.id, builder: (column) => column); - GeneratedColumn get key => - $composableBuilder(column: $table.key, builder: (column) => column); - - GeneratedColumn get label => - $composableBuilder(column: $table.label, builder: (column) => column); - - GeneratedColumnWithTypeConverter get type => - $composableBuilder(column: $table.type, builder: (column) => column); - - GeneratedColumn get choicesJson => $composableBuilder( - column: $table.choicesJson, - builder: (column) => column, - ); - - GeneratedColumn get showInList => $composableBuilder( - column: $table.showInList, - builder: (column) => column, - ); + GeneratedColumn get name => + $composableBuilder(column: $table.name, builder: (column) => column); - GeneratedColumn get searchable => $composableBuilder( - column: $table.searchable, - builder: (column) => column, - ); + GeneratedColumn get color => + $composableBuilder(column: $table.color, builder: (column) => column); - Expression customFieldValuesRefs( - Expression Function($$CustomFieldValuesTableAnnotationComposer a) f, + Expression danceTagsRefs( + Expression Function($$DanceTagsTableAnnotationComposer a) f, ) { - final $$CustomFieldValuesTableAnnotationComposer composer = - $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $db.customFieldValues, - getReferencedColumn: (t) => t.fieldId, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, + final $$DanceTagsTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.danceTags, + getReferencedColumn: (t) => t.tagId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$DanceTagsTableAnnotationComposer( + $db: $db, + $table: $db.danceTags, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: $removeJoinBuilderFromRootComposer, - }) => $$CustomFieldValuesTableAnnotationComposer( - $db: $db, - $table: $db.customFieldValues, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); + ), + ); return f(composer); } } -class $$CustomFieldDefsTableTableManager +class $$TagsTableTableManager extends RootTableManager< _$CompendiumDatabase, - $CustomFieldDefsTable, - CustomFieldDefRow, - $$CustomFieldDefsTableFilterComposer, - $$CustomFieldDefsTableOrderingComposer, - $$CustomFieldDefsTableAnnotationComposer, - $$CustomFieldDefsTableCreateCompanionBuilder, - $$CustomFieldDefsTableUpdateCompanionBuilder, - (CustomFieldDefRow, $$CustomFieldDefsTableReferences), - CustomFieldDefRow, - PrefetchHooks Function({bool customFieldValuesRefs}) + $TagsTable, + TagRow, + $$TagsTableFilterComposer, + $$TagsTableOrderingComposer, + $$TagsTableAnnotationComposer, + $$TagsTableCreateCompanionBuilder, + $$TagsTableUpdateCompanionBuilder, + (TagRow, $$TagsTableReferences), + TagRow, + PrefetchHooks Function({bool danceTagsRefs}) > { - $$CustomFieldDefsTableTableManager( - _$CompendiumDatabase db, - $CustomFieldDefsTable table, - ) : super( + $$TagsTableTableManager(_$CompendiumDatabase db, $TagsTable table) + : super( TableManagerState( db: db, table: table, createFilteringComposer: () => - $$CustomFieldDefsTableFilterComposer($db: db, $table: table), + $$TagsTableFilterComposer($db: db, $table: table), createOrderingComposer: () => - $$CustomFieldDefsTableOrderingComposer($db: db, $table: table), + $$TagsTableOrderingComposer($db: db, $table: table), createComputedFieldComposer: () => - $$CustomFieldDefsTableAnnotationComposer($db: db, $table: table), + $$TagsTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ Value id = const Value.absent(), - Value key = const Value.absent(), - Value label = const Value.absent(), - Value type = const Value.absent(), - Value choicesJson = const Value.absent(), - Value showInList = const Value.absent(), - Value searchable = const Value.absent(), + Value name = const Value.absent(), + Value color = const Value.absent(), Value rowid = const Value.absent(), - }) => CustomFieldDefsCompanion( - id: id, - key: key, - label: label, - type: type, - choicesJson: choicesJson, - showInList: showInList, - searchable: searchable, - rowid: rowid, - ), - createCompanionCallback: - ({ - required String id, - required String key, - required String label, - required CustomFieldType type, - Value choicesJson = const Value.absent(), - Value showInList = const Value.absent(), - Value searchable = const Value.absent(), + }) => + TagsCompanion(id: id, name: name, color: color, rowid: rowid), + createCompanionCallback: + ({ + required String id, + required String name, + Value color = const Value.absent(), Value rowid = const Value.absent(), - }) => CustomFieldDefsCompanion.insert( + }) => TagsCompanion.insert( id: id, - key: key, - label: label, - type: type, - choicesJson: choicesJson, - showInList: showInList, - searchable: searchable, + name: name, + color: color, rowid: rowid, ), withReferenceMapper: (p0) => p0 .map( - (e) => ( - e.readTable(table), - $$CustomFieldDefsTableReferences(db, table, e), - ), + (e) => + (e.readTable(table), $$TagsTableReferences(db, table, e)), ) .toList(), - prefetchHooksCallback: ({customFieldValuesRefs = false}) { + prefetchHooksCallback: ({danceTagsRefs = false}) { return PrefetchHooks( db: db, - explicitlyWatchedTables: [ - if (customFieldValuesRefs) db.customFieldValues, - ], + explicitlyWatchedTables: [if (danceTagsRefs) db.danceTags], addJoins: null, getPrefetchedDataCallback: (items) async { return [ - if (customFieldValuesRefs) - await $_getPrefetchedData< - CustomFieldDefRow, - $CustomFieldDefsTable, - CustomFieldValueRow - >( + if (danceTagsRefs) + await $_getPrefetchedData( currentTable: table, - referencedTable: $$CustomFieldDefsTableReferences - ._customFieldValuesRefsTable(db), + referencedTable: $$TagsTableReferences + ._danceTagsRefsTable(db), managerFromTypedResult: (p0) => - $$CustomFieldDefsTableReferences( - db, - table, - p0, - ).customFieldValuesRefs, + $$TagsTableReferences(db, table, p0).danceTagsRefs, referencedItemsForCurrentItem: (item, referencedItems) => - referencedItems.where((e) => e.fieldId == item.id), + referencedItems.where((e) => e.tagId == item.id), typedResults: items, ), ]; @@ -11933,52 +13897,39 @@ class $$CustomFieldDefsTableTableManager ); } -typedef $$CustomFieldDefsTableProcessedTableManager = +typedef $$TagsTableProcessedTableManager = ProcessedTableManager< _$CompendiumDatabase, - $CustomFieldDefsTable, - CustomFieldDefRow, - $$CustomFieldDefsTableFilterComposer, - $$CustomFieldDefsTableOrderingComposer, - $$CustomFieldDefsTableAnnotationComposer, - $$CustomFieldDefsTableCreateCompanionBuilder, - $$CustomFieldDefsTableUpdateCompanionBuilder, - (CustomFieldDefRow, $$CustomFieldDefsTableReferences), - CustomFieldDefRow, - PrefetchHooks Function({bool customFieldValuesRefs}) + $TagsTable, + TagRow, + $$TagsTableFilterComposer, + $$TagsTableOrderingComposer, + $$TagsTableAnnotationComposer, + $$TagsTableCreateCompanionBuilder, + $$TagsTableUpdateCompanionBuilder, + (TagRow, $$TagsTableReferences), + TagRow, + PrefetchHooks Function({bool danceTagsRefs}) >; -typedef $$CustomFieldValuesTableCreateCompanionBuilder = - CustomFieldValuesCompanion Function({ +typedef $$DanceTagsTableCreateCompanionBuilder = + DanceTagsCompanion Function({ required String danceId, - required String fieldId, - Value valueText, - Value valueNum, + required String tagId, Value rowid, }); -typedef $$CustomFieldValuesTableUpdateCompanionBuilder = - CustomFieldValuesCompanion Function({ +typedef $$DanceTagsTableUpdateCompanionBuilder = + DanceTagsCompanion Function({ Value danceId, - Value fieldId, - Value valueText, - Value valueNum, + Value tagId, Value rowid, }); -final class $$CustomFieldValuesTableReferences - extends - BaseReferences< - _$CompendiumDatabase, - $CustomFieldValuesTable, - CustomFieldValueRow - > { - $$CustomFieldValuesTableReferences( - super.$_db, - super.$_table, - super.$_typedResult, - ); +final class $$DanceTagsTableReferences + extends BaseReferences<_$CompendiumDatabase, $DanceTagsTable, DanceTagRow> { + $$DanceTagsTableReferences(super.$_db, super.$_table, super.$_typedResult); static $DancesTable _danceIdTable(_$CompendiumDatabase db) => - db.dances.createAlias('custom_field_values__dance_id__dances__id'); + db.dances.createAlias('dance_tags__dance_id__dances__id'); $$DancesTableProcessedTableManager get danceId { final $_column = $_itemColumn('dance_id')!; @@ -11994,18 +13945,17 @@ final class $$CustomFieldValuesTableReferences ); } - static $CustomFieldDefsTable _fieldIdTable(_$CompendiumDatabase db) => db - .customFieldDefs - .createAlias('custom_field_values__field_id__custom_field_defs__id'); + static $TagsTable _tagIdTable(_$CompendiumDatabase db) => + db.tags.createAlias('dance_tags__tag_id__tags__id'); - $$CustomFieldDefsTableProcessedTableManager get fieldId { - final $_column = $_itemColumn('field_id')!; + $$TagsTableProcessedTableManager get tagId { + final $_column = $_itemColumn('tag_id')!; - final manager = $$CustomFieldDefsTableTableManager( + final manager = $$TagsTableTableManager( $_db, - $_db.customFieldDefs, + $_db.tags, ).filter((f) => f.id.sqlEquals($_column)); - final item = $_typedResult.readTableOrNull(_fieldIdTable($_db)); + final item = $_typedResult.readTableOrNull(_tagIdTable($_db)); if (item == null) return manager; return ProcessedTableManager( manager.$state.copyWith(prefetchedData: [item]), @@ -12013,25 +13963,15 @@ final class $$CustomFieldValuesTableReferences } } -class $$CustomFieldValuesTableFilterComposer - extends Composer<_$CompendiumDatabase, $CustomFieldValuesTable> { - $$CustomFieldValuesTableFilterComposer({ +class $$DanceTagsTableFilterComposer + extends Composer<_$CompendiumDatabase, $DanceTagsTable> { + $$DanceTagsTableFilterComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnFilters get valueText => $composableBuilder( - column: $table.valueText, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get valueNum => $composableBuilder( - column: $table.valueNum, - builder: (column) => ColumnFilters(column), - ); - $$DancesTableFilterComposer get danceId { final $$DancesTableFilterComposer composer = $composerBuilder( composer: this, @@ -12055,20 +13995,20 @@ class $$CustomFieldValuesTableFilterComposer return composer; } - $$CustomFieldDefsTableFilterComposer get fieldId { - final $$CustomFieldDefsTableFilterComposer composer = $composerBuilder( + $$TagsTableFilterComposer get tagId { + final $$TagsTableFilterComposer composer = $composerBuilder( composer: this, - getCurrentColumn: (t) => t.fieldId, - referencedTable: $db.customFieldDefs, + getCurrentColumn: (t) => t.tagId, + referencedTable: $db.tags, getReferencedColumn: (t) => t.id, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$CustomFieldDefsTableFilterComposer( + }) => $$TagsTableFilterComposer( $db: $db, - $table: $db.customFieldDefs, + $table: $db.tags, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: @@ -12079,25 +14019,15 @@ class $$CustomFieldValuesTableFilterComposer } } -class $$CustomFieldValuesTableOrderingComposer - extends Composer<_$CompendiumDatabase, $CustomFieldValuesTable> { - $$CustomFieldValuesTableOrderingComposer({ +class $$DanceTagsTableOrderingComposer + extends Composer<_$CompendiumDatabase, $DanceTagsTable> { + $$DanceTagsTableOrderingComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get valueText => $composableBuilder( - column: $table.valueText, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get valueNum => $composableBuilder( - column: $table.valueNum, - builder: (column) => ColumnOrderings(column), - ); - $$DancesTableOrderingComposer get danceId { final $$DancesTableOrderingComposer composer = $composerBuilder( composer: this, @@ -12121,20 +14051,20 @@ class $$CustomFieldValuesTableOrderingComposer return composer; } - $$CustomFieldDefsTableOrderingComposer get fieldId { - final $$CustomFieldDefsTableOrderingComposer composer = $composerBuilder( + $$TagsTableOrderingComposer get tagId { + final $$TagsTableOrderingComposer composer = $composerBuilder( composer: this, - getCurrentColumn: (t) => t.fieldId, - referencedTable: $db.customFieldDefs, + getCurrentColumn: (t) => t.tagId, + referencedTable: $db.tags, getReferencedColumn: (t) => t.id, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$CustomFieldDefsTableOrderingComposer( + }) => $$TagsTableOrderingComposer( $db: $db, - $table: $db.customFieldDefs, + $table: $db.tags, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: @@ -12145,21 +14075,15 @@ class $$CustomFieldValuesTableOrderingComposer } } -class $$CustomFieldValuesTableAnnotationComposer - extends Composer<_$CompendiumDatabase, $CustomFieldValuesTable> { - $$CustomFieldValuesTableAnnotationComposer({ +class $$DanceTagsTableAnnotationComposer + extends Composer<_$CompendiumDatabase, $DanceTagsTable> { + $$DanceTagsTableAnnotationComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - GeneratedColumn get valueText => - $composableBuilder(column: $table.valueText, builder: (column) => column); - - GeneratedColumn get valueNum => - $composableBuilder(column: $table.valueNum, builder: (column) => column); - $$DancesTableAnnotationComposer get danceId { final $$DancesTableAnnotationComposer composer = $composerBuilder( composer: this, @@ -12183,20 +14107,20 @@ class $$CustomFieldValuesTableAnnotationComposer return composer; } - $$CustomFieldDefsTableAnnotationComposer get fieldId { - final $$CustomFieldDefsTableAnnotationComposer composer = $composerBuilder( + $$TagsTableAnnotationComposer get tagId { + final $$TagsTableAnnotationComposer composer = $composerBuilder( composer: this, - getCurrentColumn: (t) => t.fieldId, - referencedTable: $db.customFieldDefs, + getCurrentColumn: (t) => t.tagId, + referencedTable: $db.tags, getReferencedColumn: (t) => t.id, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$CustomFieldDefsTableAnnotationComposer( + }) => $$TagsTableAnnotationComposer( $db: $db, - $table: $db.customFieldDefs, + $table: $db.tags, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: @@ -12207,74 +14131,61 @@ class $$CustomFieldValuesTableAnnotationComposer } } -class $$CustomFieldValuesTableTableManager +class $$DanceTagsTableTableManager extends RootTableManager< _$CompendiumDatabase, - $CustomFieldValuesTable, - CustomFieldValueRow, - $$CustomFieldValuesTableFilterComposer, - $$CustomFieldValuesTableOrderingComposer, - $$CustomFieldValuesTableAnnotationComposer, - $$CustomFieldValuesTableCreateCompanionBuilder, - $$CustomFieldValuesTableUpdateCompanionBuilder, - (CustomFieldValueRow, $$CustomFieldValuesTableReferences), - CustomFieldValueRow, - PrefetchHooks Function({bool danceId, bool fieldId}) + $DanceTagsTable, + DanceTagRow, + $$DanceTagsTableFilterComposer, + $$DanceTagsTableOrderingComposer, + $$DanceTagsTableAnnotationComposer, + $$DanceTagsTableCreateCompanionBuilder, + $$DanceTagsTableUpdateCompanionBuilder, + (DanceTagRow, $$DanceTagsTableReferences), + DanceTagRow, + PrefetchHooks Function({bool danceId, bool tagId}) > { - $$CustomFieldValuesTableTableManager( - _$CompendiumDatabase db, - $CustomFieldValuesTable table, - ) : super( + $$DanceTagsTableTableManager(_$CompendiumDatabase db, $DanceTagsTable table) + : super( TableManagerState( db: db, table: table, createFilteringComposer: () => - $$CustomFieldValuesTableFilterComposer($db: db, $table: table), + $$DanceTagsTableFilterComposer($db: db, $table: table), createOrderingComposer: () => - $$CustomFieldValuesTableOrderingComposer($db: db, $table: table), + $$DanceTagsTableOrderingComposer($db: db, $table: table), createComputedFieldComposer: () => - $$CustomFieldValuesTableAnnotationComposer( - $db: db, - $table: table, - ), + $$DanceTagsTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ Value danceId = const Value.absent(), - Value fieldId = const Value.absent(), - Value valueText = const Value.absent(), - Value valueNum = const Value.absent(), + Value tagId = const Value.absent(), Value rowid = const Value.absent(), - }) => CustomFieldValuesCompanion( + }) => DanceTagsCompanion( danceId: danceId, - fieldId: fieldId, - valueText: valueText, - valueNum: valueNum, + tagId: tagId, rowid: rowid, ), createCompanionCallback: ({ required String danceId, - required String fieldId, - Value valueText = const Value.absent(), - Value valueNum = const Value.absent(), + required String tagId, Value rowid = const Value.absent(), - }) => CustomFieldValuesCompanion.insert( + }) => DanceTagsCompanion.insert( danceId: danceId, - fieldId: fieldId, - valueText: valueText, - valueNum: valueNum, + tagId: tagId, rowid: rowid, ), withReferenceMapper: (p0) => p0 .map( (e) => ( e.readTable(table), - $$CustomFieldValuesTableReferences(db, table, e), + $$DanceTagsTableReferences(db, table, e), ), ) .toList(), - prefetchHooksCallback: ({danceId = false, fieldId = false}) { + prefetchHooksCallback: ({danceId = false, tagId = false}) { return PrefetchHooks( db: db, explicitlyWatchedTables: [], @@ -12299,28 +14210,24 @@ class $$CustomFieldValuesTableTableManager state.withJoin( currentTable: table, currentColumn: table.danceId, - referencedTable: - $$CustomFieldValuesTableReferences - ._danceIdTable(db), - referencedColumn: - $$CustomFieldValuesTableReferences - ._danceIdTable(db) - .id, + referencedTable: $$DanceTagsTableReferences + ._danceIdTable(db), + referencedColumn: $$DanceTagsTableReferences + ._danceIdTable(db) + .id, ) as T; } - if (fieldId) { + if (tagId) { state = state.withJoin( currentTable: table, - currentColumn: table.fieldId, - referencedTable: - $$CustomFieldValuesTableReferences - ._fieldIdTable(db), - referencedColumn: - $$CustomFieldValuesTableReferences - ._fieldIdTable(db) - .id, + currentColumn: table.tagId, + referencedTable: $$DanceTagsTableReferences + ._tagIdTable(db), + referencedColumn: $$DanceTagsTableReferences + ._tagIdTable(db) + .id, ) as T; } @@ -12336,61 +14243,84 @@ class $$CustomFieldValuesTableTableManager ); } -typedef $$CustomFieldValuesTableProcessedTableManager = +typedef $$DanceTagsTableProcessedTableManager = ProcessedTableManager< _$CompendiumDatabase, - $CustomFieldValuesTable, - CustomFieldValueRow, - $$CustomFieldValuesTableFilterComposer, - $$CustomFieldValuesTableOrderingComposer, - $$CustomFieldValuesTableAnnotationComposer, - $$CustomFieldValuesTableCreateCompanionBuilder, - $$CustomFieldValuesTableUpdateCompanionBuilder, - (CustomFieldValueRow, $$CustomFieldValuesTableReferences), - CustomFieldValueRow, - PrefetchHooks Function({bool danceId, bool fieldId}) + $DanceTagsTable, + DanceTagRow, + $$DanceTagsTableFilterComposer, + $$DanceTagsTableOrderingComposer, + $$DanceTagsTableAnnotationComposer, + $$DanceTagsTableCreateCompanionBuilder, + $$DanceTagsTableUpdateCompanionBuilder, + (DanceTagRow, $$DanceTagsTableReferences), + DanceTagRow, + PrefetchHooks Function({bool danceId, bool tagId}) >; -typedef $$TagsTableCreateCompanionBuilder = - TagsCompanion Function({ +typedef $$DanceLinksTableCreateCompanionBuilder = + DanceLinksCompanion Function({ required String id, - required String name, - Value color, + required String danceId, + required LinkKind kind, + Value url, + Value targetDanceId, + Value label, Value rowid, }); -typedef $$TagsTableUpdateCompanionBuilder = - TagsCompanion Function({ +typedef $$DanceLinksTableUpdateCompanionBuilder = + DanceLinksCompanion Function({ Value id, - Value name, - Value color, + Value danceId, + Value kind, + Value url, + Value targetDanceId, + Value label, Value rowid, }); -final class $$TagsTableReferences - extends BaseReferences<_$CompendiumDatabase, $TagsTable, TagRow> { - $$TagsTableReferences(super.$_db, super.$_table, super.$_typedResult); +final class $$DanceLinksTableReferences + extends + BaseReferences<_$CompendiumDatabase, $DanceLinksTable, DanceLinkRow> { + $$DanceLinksTableReferences(super.$_db, super.$_table, super.$_typedResult); - static MultiTypedResultKey<$DanceTagsTable, List> - _danceTagsRefsTable(_$CompendiumDatabase db) => MultiTypedResultKey.fromTable( - db.danceTags, - aliasName: 'tags__id__dance_tags__tag_id', - ); + static $DancesTable _danceIdTable(_$CompendiumDatabase db) => + db.dances.createAlias('dance_links__dance_id__dances__id'); - $$DanceTagsTableProcessedTableManager get danceTagsRefs { - final manager = $$DanceTagsTableTableManager( + $$DancesTableProcessedTableManager get danceId { + final $_column = $_itemColumn('dance_id')!; + + final manager = $$DancesTableTableManager( $_db, - $_db.danceTags, - ).filter((f) => f.tagId.id.sqlEquals($_itemColumn('id')!)); + $_db.dances, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull(_danceIdTable($_db)); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } - final cache = $_typedResult.readTableOrNull(_danceTagsRefsTable($_db)); + static $DancesTable _targetDanceIdTable(_$CompendiumDatabase db) => + db.dances.createAlias('dance_links__target_dance_id__dances__id'); + + $$DancesTableProcessedTableManager? get targetDanceId { + final $_column = $_itemColumn('target_dance_id'); + if ($_column == null) return null; + final manager = $$DancesTableTableManager( + $_db, + $_db.dances, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull(_targetDanceIdTable($_db)); + if (item == null) return manager; return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: cache), + manager.$state.copyWith(prefetchedData: [item]), ); } } -class $$TagsTableFilterComposer - extends Composer<_$CompendiumDatabase, $TagsTable> { - $$TagsTableFilterComposer({ +class $$DanceLinksTableFilterComposer + extends Composer<_$CompendiumDatabase, $DanceLinksTable> { + $$DanceLinksTableFilterComposer({ required super.$db, required super.$table, super.joinBuilder, @@ -12402,45 +14332,72 @@ class $$TagsTableFilterComposer builder: (column) => ColumnFilters(column), ); - ColumnFilters get name => $composableBuilder( - column: $table.name, + ColumnWithTypeConverterFilters get kind => + $composableBuilder( + column: $table.kind, + builder: (column) => ColumnWithTypeConverterFilters(column), + ); + + ColumnFilters get url => $composableBuilder( + column: $table.url, builder: (column) => ColumnFilters(column), ); - ColumnFilters get color => $composableBuilder( - column: $table.color, + ColumnFilters get label => $composableBuilder( + column: $table.label, builder: (column) => ColumnFilters(column), ); - Expression danceTagsRefs( - Expression Function($$DanceTagsTableFilterComposer f) f, - ) { - final $$DanceTagsTableFilterComposer composer = $composerBuilder( + $$DancesTableFilterComposer get danceId { + final $$DancesTableFilterComposer composer = $composerBuilder( composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $db.danceTags, - getReferencedColumn: (t) => t.tagId, + getCurrentColumn: (t) => t.danceId, + referencedTable: $db.dances, + getReferencedColumn: (t) => t.id, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$DanceTagsTableFilterComposer( + }) => $$DancesTableFilterComposer( $db: $db, - $table: $db.danceTags, + $table: $db.dances, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: $removeJoinBuilderFromRootComposer, ), ); - return f(composer); + return composer; + } + + $$DancesTableFilterComposer get targetDanceId { + final $$DancesTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.targetDanceId, + referencedTable: $db.dances, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$DancesTableFilterComposer( + $db: $db, + $table: $db.dances, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; } } -class $$TagsTableOrderingComposer - extends Composer<_$CompendiumDatabase, $TagsTable> { - $$TagsTableOrderingComposer({ +class $$DanceLinksTableOrderingComposer + extends Composer<_$CompendiumDatabase, $DanceLinksTable> { + $$DanceLinksTableOrderingComposer({ required super.$db, required super.$table, super.joinBuilder, @@ -12452,20 +14409,71 @@ class $$TagsTableOrderingComposer builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get name => $composableBuilder( - column: $table.name, + ColumnOrderings get kind => $composableBuilder( + column: $table.kind, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get color => $composableBuilder( - column: $table.color, + ColumnOrderings get url => $composableBuilder( + column: $table.url, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get label => $composableBuilder( + column: $table.label, builder: (column) => ColumnOrderings(column), ); + + $$DancesTableOrderingComposer get danceId { + final $$DancesTableOrderingComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.danceId, + referencedTable: $db.dances, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$DancesTableOrderingComposer( + $db: $db, + $table: $db.dances, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$DancesTableOrderingComposer get targetDanceId { + final $$DancesTableOrderingComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.targetDanceId, + referencedTable: $db.dances, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$DancesTableOrderingComposer( + $db: $db, + $table: $db.dances, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } } -class $$TagsTableAnnotationComposer - extends Composer<_$CompendiumDatabase, $TagsTable> { - $$TagsTableAnnotationComposer({ +class $$DanceLinksTableAnnotationComposer + extends Composer<_$CompendiumDatabase, $DanceLinksTable> { + $$DanceLinksTableAnnotationComposer({ required super.$db, required super.$table, super.joinBuilder, @@ -12475,109 +14483,183 @@ class $$TagsTableAnnotationComposer GeneratedColumn get id => $composableBuilder(column: $table.id, builder: (column) => column); - GeneratedColumn get name => - $composableBuilder(column: $table.name, builder: (column) => column); + GeneratedColumnWithTypeConverter get kind => + $composableBuilder(column: $table.kind, builder: (column) => column); + + GeneratedColumn get url => + $composableBuilder(column: $table.url, builder: (column) => column); + + GeneratedColumn get label => + $composableBuilder(column: $table.label, builder: (column) => column); - GeneratedColumn get color => - $composableBuilder(column: $table.color, builder: (column) => column); + $$DancesTableAnnotationComposer get danceId { + final $$DancesTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.danceId, + referencedTable: $db.dances, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$DancesTableAnnotationComposer( + $db: $db, + $table: $db.dances, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } - Expression danceTagsRefs( - Expression Function($$DanceTagsTableAnnotationComposer a) f, - ) { - final $$DanceTagsTableAnnotationComposer composer = $composerBuilder( + $$DancesTableAnnotationComposer get targetDanceId { + final $$DancesTableAnnotationComposer composer = $composerBuilder( composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $db.danceTags, - getReferencedColumn: (t) => t.tagId, + getCurrentColumn: (t) => t.targetDanceId, + referencedTable: $db.dances, + getReferencedColumn: (t) => t.id, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$DanceTagsTableAnnotationComposer( + }) => $$DancesTableAnnotationComposer( $db: $db, - $table: $db.danceTags, + $table: $db.dances, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: $removeJoinBuilderFromRootComposer, ), ); - return f(composer); + return composer; } } -class $$TagsTableTableManager +class $$DanceLinksTableTableManager extends RootTableManager< _$CompendiumDatabase, - $TagsTable, - TagRow, - $$TagsTableFilterComposer, - $$TagsTableOrderingComposer, - $$TagsTableAnnotationComposer, - $$TagsTableCreateCompanionBuilder, - $$TagsTableUpdateCompanionBuilder, - (TagRow, $$TagsTableReferences), - TagRow, - PrefetchHooks Function({bool danceTagsRefs}) + $DanceLinksTable, + DanceLinkRow, + $$DanceLinksTableFilterComposer, + $$DanceLinksTableOrderingComposer, + $$DanceLinksTableAnnotationComposer, + $$DanceLinksTableCreateCompanionBuilder, + $$DanceLinksTableUpdateCompanionBuilder, + (DanceLinkRow, $$DanceLinksTableReferences), + DanceLinkRow, + PrefetchHooks Function({bool danceId, bool targetDanceId}) > { - $$TagsTableTableManager(_$CompendiumDatabase db, $TagsTable table) + $$DanceLinksTableTableManager(_$CompendiumDatabase db, $DanceLinksTable table) : super( TableManagerState( db: db, table: table, createFilteringComposer: () => - $$TagsTableFilterComposer($db: db, $table: table), + $$DanceLinksTableFilterComposer($db: db, $table: table), createOrderingComposer: () => - $$TagsTableOrderingComposer($db: db, $table: table), + $$DanceLinksTableOrderingComposer($db: db, $table: table), createComputedFieldComposer: () => - $$TagsTableAnnotationComposer($db: db, $table: table), + $$DanceLinksTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ Value id = const Value.absent(), - Value name = const Value.absent(), - Value color = const Value.absent(), + Value danceId = const Value.absent(), + Value kind = const Value.absent(), + Value url = const Value.absent(), + Value targetDanceId = const Value.absent(), + Value label = const Value.absent(), Value rowid = const Value.absent(), - }) => - TagsCompanion(id: id, name: name, color: color, rowid: rowid), + }) => DanceLinksCompanion( + id: id, + danceId: danceId, + kind: kind, + url: url, + targetDanceId: targetDanceId, + label: label, + rowid: rowid, + ), createCompanionCallback: ({ required String id, - required String name, - Value color = const Value.absent(), + required String danceId, + required LinkKind kind, + Value url = const Value.absent(), + Value targetDanceId = const Value.absent(), + Value label = const Value.absent(), Value rowid = const Value.absent(), - }) => TagsCompanion.insert( + }) => DanceLinksCompanion.insert( id: id, - name: name, - color: color, + danceId: danceId, + kind: kind, + url: url, + targetDanceId: targetDanceId, + label: label, rowid: rowid, ), withReferenceMapper: (p0) => p0 .map( - (e) => - (e.readTable(table), $$TagsTableReferences(db, table, e)), + (e) => ( + e.readTable(table), + $$DanceLinksTableReferences(db, table, e), + ), ) .toList(), - prefetchHooksCallback: ({danceTagsRefs = false}) { + prefetchHooksCallback: ({danceId = false, targetDanceId = false}) { return PrefetchHooks( db: db, - explicitlyWatchedTables: [if (danceTagsRefs) db.danceTags], - addJoins: null, + explicitlyWatchedTables: [], + addJoins: + < + T extends TableManagerState< + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic + > + >(state) { + if (danceId) { + state = + state.withJoin( + currentTable: table, + currentColumn: table.danceId, + referencedTable: $$DanceLinksTableReferences + ._danceIdTable(db), + referencedColumn: $$DanceLinksTableReferences + ._danceIdTable(db) + .id, + ) + as T; + } + if (targetDanceId) { + state = + state.withJoin( + currentTable: table, + currentColumn: table.targetDanceId, + referencedTable: $$DanceLinksTableReferences + ._targetDanceIdTable(db), + referencedColumn: $$DanceLinksTableReferences + ._targetDanceIdTable(db) + .id, + ) + as T; + } + + return state; + }, getPrefetchedDataCallback: (items) async { - return [ - if (danceTagsRefs) - await $_getPrefetchedData( - currentTable: table, - referencedTable: $$TagsTableReferences - ._danceTagsRefsTable(db), - managerFromTypedResult: (p0) => - $$TagsTableReferences(db, table, p0).danceTagsRefs, - referencedItemsForCurrentItem: (item, referencedItems) => - referencedItems.where((e) => e.tagId == item.id), - typedResults: items, - ), - ]; + return []; }, ); }, @@ -12585,65 +14667,61 @@ class $$TagsTableTableManager ); } -typedef $$TagsTableProcessedTableManager = +typedef $$DanceLinksTableProcessedTableManager = ProcessedTableManager< _$CompendiumDatabase, - $TagsTable, - TagRow, - $$TagsTableFilterComposer, - $$TagsTableOrderingComposer, - $$TagsTableAnnotationComposer, - $$TagsTableCreateCompanionBuilder, - $$TagsTableUpdateCompanionBuilder, - (TagRow, $$TagsTableReferences), - TagRow, - PrefetchHooks Function({bool danceTagsRefs}) + $DanceLinksTable, + DanceLinkRow, + $$DanceLinksTableFilterComposer, + $$DanceLinksTableOrderingComposer, + $$DanceLinksTableAnnotationComposer, + $$DanceLinksTableCreateCompanionBuilder, + $$DanceLinksTableUpdateCompanionBuilder, + (DanceLinkRow, $$DanceLinksTableReferences), + DanceLinkRow, + PrefetchHooks Function({bool danceId, bool targetDanceId}) >; -typedef $$DanceTagsTableCreateCompanionBuilder = - DanceTagsCompanion Function({ +typedef $$ProvenanceTableCreateCompanionBuilder = + ProvenanceCompanion Function({ required String danceId, - required String tagId, + required ProvenanceSource source, + Value externalId, + required DateTime importedAt, + Value permission, + Value license, + Value rawPayload, + Value sourceVersion, Value rowid, }); -typedef $$DanceTagsTableUpdateCompanionBuilder = - DanceTagsCompanion Function({ +typedef $$ProvenanceTableUpdateCompanionBuilder = + ProvenanceCompanion Function({ Value danceId, - Value tagId, + Value source, + Value externalId, + Value importedAt, + Value permission, + Value license, + Value rawPayload, + Value sourceVersion, Value rowid, }); -final class $$DanceTagsTableReferences - extends BaseReferences<_$CompendiumDatabase, $DanceTagsTable, DanceTagRow> { - $$DanceTagsTableReferences(super.$_db, super.$_table, super.$_typedResult); +final class $$ProvenanceTableReferences + extends + BaseReferences<_$CompendiumDatabase, $ProvenanceTable, ProvenanceRow> { + $$ProvenanceTableReferences(super.$_db, super.$_table, super.$_typedResult); static $DancesTable _danceIdTable(_$CompendiumDatabase db) => - db.dances.createAlias('dance_tags__dance_id__dances__id'); - - $$DancesTableProcessedTableManager get danceId { - final $_column = $_itemColumn('dance_id')!; - - final manager = $$DancesTableTableManager( - $_db, - $_db.dances, - ).filter((f) => f.id.sqlEquals($_column)); - final item = $_typedResult.readTableOrNull(_danceIdTable($_db)); - if (item == null) return manager; - return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: [item]), - ); - } - - static $TagsTable _tagIdTable(_$CompendiumDatabase db) => - db.tags.createAlias('dance_tags__tag_id__tags__id'); + db.dances.createAlias('provenance__dance_id__dances__id'); - $$TagsTableProcessedTableManager get tagId { - final $_column = $_itemColumn('tag_id')!; + $$DancesTableProcessedTableManager get danceId { + final $_column = $_itemColumn('dance_id')!; - final manager = $$TagsTableTableManager( + final manager = $$DancesTableTableManager( $_db, - $_db.tags, + $_db.dances, ).filter((f) => f.id.sqlEquals($_column)); - final item = $_typedResult.readTableOrNull(_tagIdTable($_db)); + final item = $_typedResult.readTableOrNull(_danceIdTable($_db)); if (item == null) return manager; return ProcessedTableManager( manager.$state.copyWith(prefetchedData: [item]), @@ -12651,15 +14729,51 @@ final class $$DanceTagsTableReferences } } -class $$DanceTagsTableFilterComposer - extends Composer<_$CompendiumDatabase, $DanceTagsTable> { - $$DanceTagsTableFilterComposer({ +class $$ProvenanceTableFilterComposer + extends Composer<_$CompendiumDatabase, $ProvenanceTable> { + $$ProvenanceTableFilterComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); + ColumnWithTypeConverterFilters + get source => $composableBuilder( + column: $table.source, + builder: (column) => ColumnWithTypeConverterFilters(column), + ); + + ColumnFilters get externalId => $composableBuilder( + column: $table.externalId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get importedAt => $composableBuilder( + column: $table.importedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get permission => $composableBuilder( + column: $table.permission, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get license => $composableBuilder( + column: $table.license, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get rawPayload => $composableBuilder( + column: $table.rawPayload, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get sourceVersion => $composableBuilder( + column: $table.sourceVersion, + builder: (column) => ColumnFilters(column), + ); + $$DancesTableFilterComposer get danceId { final $$DancesTableFilterComposer composer = $composerBuilder( composer: this, @@ -12682,40 +14796,52 @@ class $$DanceTagsTableFilterComposer ); return composer; } - - $$TagsTableFilterComposer get tagId { - final $$TagsTableFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.tagId, - referencedTable: $db.tags, - getReferencedColumn: (t) => t.id, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$TagsTableFilterComposer( - $db: $db, - $table: $db.tags, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return composer; - } } -class $$DanceTagsTableOrderingComposer - extends Composer<_$CompendiumDatabase, $DanceTagsTable> { - $$DanceTagsTableOrderingComposer({ +class $$ProvenanceTableOrderingComposer + extends Composer<_$CompendiumDatabase, $ProvenanceTable> { + $$ProvenanceTableOrderingComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); + ColumnOrderings get source => $composableBuilder( + column: $table.source, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get externalId => $composableBuilder( + column: $table.externalId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get importedAt => $composableBuilder( + column: $table.importedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get permission => $composableBuilder( + column: $table.permission, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get license => $composableBuilder( + column: $table.license, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get rawPayload => $composableBuilder( + column: $table.rawPayload, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get sourceVersion => $composableBuilder( + column: $table.sourceVersion, + builder: (column) => ColumnOrderings(column), + ); + $$DancesTableOrderingComposer get danceId { final $$DancesTableOrderingComposer composer = $composerBuilder( composer: this, @@ -12738,40 +14864,48 @@ class $$DanceTagsTableOrderingComposer ); return composer; } - - $$TagsTableOrderingComposer get tagId { - final $$TagsTableOrderingComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.tagId, - referencedTable: $db.tags, - getReferencedColumn: (t) => t.id, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$TagsTableOrderingComposer( - $db: $db, - $table: $db.tags, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return composer; - } } -class $$DanceTagsTableAnnotationComposer - extends Composer<_$CompendiumDatabase, $DanceTagsTable> { - $$DanceTagsTableAnnotationComposer({ +class $$ProvenanceTableAnnotationComposer + extends Composer<_$CompendiumDatabase, $ProvenanceTable> { + $$ProvenanceTableAnnotationComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); + GeneratedColumnWithTypeConverter get source => + $composableBuilder(column: $table.source, builder: (column) => column); + + GeneratedColumn get externalId => $composableBuilder( + column: $table.externalId, + builder: (column) => column, + ); + + GeneratedColumn get importedAt => $composableBuilder( + column: $table.importedAt, + builder: (column) => column, + ); + + GeneratedColumn get permission => $composableBuilder( + column: $table.permission, + builder: (column) => column, + ); + + GeneratedColumn get license => + $composableBuilder(column: $table.license, builder: (column) => column); + + GeneratedColumn get rawPayload => $composableBuilder( + column: $table.rawPayload, + builder: (column) => column, + ); + + GeneratedColumn get sourceVersion => $composableBuilder( + column: $table.sourceVersion, + builder: (column) => column, + ); + $$DancesTableAnnotationComposer get danceId { final $$DancesTableAnnotationComposer composer = $composerBuilder( composer: this, @@ -12794,86 +14928,87 @@ class $$DanceTagsTableAnnotationComposer ); return composer; } - - $$TagsTableAnnotationComposer get tagId { - final $$TagsTableAnnotationComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.tagId, - referencedTable: $db.tags, - getReferencedColumn: (t) => t.id, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$TagsTableAnnotationComposer( - $db: $db, - $table: $db.tags, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return composer; - } } -class $$DanceTagsTableTableManager +class $$ProvenanceTableTableManager extends RootTableManager< _$CompendiumDatabase, - $DanceTagsTable, - DanceTagRow, - $$DanceTagsTableFilterComposer, - $$DanceTagsTableOrderingComposer, - $$DanceTagsTableAnnotationComposer, - $$DanceTagsTableCreateCompanionBuilder, - $$DanceTagsTableUpdateCompanionBuilder, - (DanceTagRow, $$DanceTagsTableReferences), - DanceTagRow, - PrefetchHooks Function({bool danceId, bool tagId}) + $ProvenanceTable, + ProvenanceRow, + $$ProvenanceTableFilterComposer, + $$ProvenanceTableOrderingComposer, + $$ProvenanceTableAnnotationComposer, + $$ProvenanceTableCreateCompanionBuilder, + $$ProvenanceTableUpdateCompanionBuilder, + (ProvenanceRow, $$ProvenanceTableReferences), + ProvenanceRow, + PrefetchHooks Function({bool danceId}) > { - $$DanceTagsTableTableManager(_$CompendiumDatabase db, $DanceTagsTable table) + $$ProvenanceTableTableManager(_$CompendiumDatabase db, $ProvenanceTable table) : super( TableManagerState( db: db, table: table, createFilteringComposer: () => - $$DanceTagsTableFilterComposer($db: db, $table: table), + $$ProvenanceTableFilterComposer($db: db, $table: table), createOrderingComposer: () => - $$DanceTagsTableOrderingComposer($db: db, $table: table), + $$ProvenanceTableOrderingComposer($db: db, $table: table), createComputedFieldComposer: () => - $$DanceTagsTableAnnotationComposer($db: db, $table: table), + $$ProvenanceTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ Value danceId = const Value.absent(), - Value tagId = const Value.absent(), + Value source = const Value.absent(), + Value externalId = const Value.absent(), + Value importedAt = const Value.absent(), + Value permission = const Value.absent(), + Value license = const Value.absent(), + Value rawPayload = const Value.absent(), + Value sourceVersion = const Value.absent(), Value rowid = const Value.absent(), - }) => DanceTagsCompanion( + }) => ProvenanceCompanion( danceId: danceId, - tagId: tagId, + source: source, + externalId: externalId, + importedAt: importedAt, + permission: permission, + license: license, + rawPayload: rawPayload, + sourceVersion: sourceVersion, rowid: rowid, ), createCompanionCallback: ({ required String danceId, - required String tagId, + required ProvenanceSource source, + Value externalId = const Value.absent(), + required DateTime importedAt, + Value permission = const Value.absent(), + Value license = const Value.absent(), + Value rawPayload = const Value.absent(), + Value sourceVersion = const Value.absent(), Value rowid = const Value.absent(), - }) => DanceTagsCompanion.insert( + }) => ProvenanceCompanion.insert( danceId: danceId, - tagId: tagId, + source: source, + externalId: externalId, + importedAt: importedAt, + permission: permission, + license: license, + rawPayload: rawPayload, + sourceVersion: sourceVersion, rowid: rowid, ), withReferenceMapper: (p0) => p0 .map( (e) => ( e.readTable(table), - $$DanceTagsTableReferences(db, table, e), + $$ProvenanceTableReferences(db, table, e), ), ) .toList(), - prefetchHooksCallback: ({danceId = false, tagId = false}) { + prefetchHooksCallback: ({danceId = false}) { return PrefetchHooks( db: db, explicitlyWatchedTables: [], @@ -12898,27 +15033,14 @@ class $$DanceTagsTableTableManager state.withJoin( currentTable: table, currentColumn: table.danceId, - referencedTable: $$DanceTagsTableReferences + referencedTable: $$ProvenanceTableReferences ._danceIdTable(db), - referencedColumn: $$DanceTagsTableReferences + referencedColumn: $$ProvenanceTableReferences ._danceIdTable(db) .id, ) as T; } - if (tagId) { - state = - state.withJoin( - currentTable: table, - currentColumn: table.tagId, - referencedTable: $$DanceTagsTableReferences - ._tagIdTable(db), - referencedColumn: $$DanceTagsTableReferences - ._tagIdTable(db) - .id, - ) - as T; - } return state; }, @@ -12931,84 +15053,77 @@ class $$DanceTagsTableTableManager ); } -typedef $$DanceTagsTableProcessedTableManager = +typedef $$ProvenanceTableProcessedTableManager = ProcessedTableManager< _$CompendiumDatabase, - $DanceTagsTable, - DanceTagRow, - $$DanceTagsTableFilterComposer, - $$DanceTagsTableOrderingComposer, - $$DanceTagsTableAnnotationComposer, - $$DanceTagsTableCreateCompanionBuilder, - $$DanceTagsTableUpdateCompanionBuilder, - (DanceTagRow, $$DanceTagsTableReferences), - DanceTagRow, - PrefetchHooks Function({bool danceId, bool tagId}) + $ProvenanceTable, + ProvenanceRow, + $$ProvenanceTableFilterComposer, + $$ProvenanceTableOrderingComposer, + $$ProvenanceTableAnnotationComposer, + $$ProvenanceTableCreateCompanionBuilder, + $$ProvenanceTableUpdateCompanionBuilder, + (ProvenanceRow, $$ProvenanceTableReferences), + ProvenanceRow, + PrefetchHooks Function({bool danceId}) >; -typedef $$DanceLinksTableCreateCompanionBuilder = - DanceLinksCompanion Function({ +typedef $$PublishedSourcesTableCreateCompanionBuilder = + PublishedSourcesCompanion Function({ required String id, - required String danceId, - required LinkKind kind, + required String title, + Value author, + Value year, Value url, - Value targetDanceId, - Value label, + Value notes, Value rowid, }); -typedef $$DanceLinksTableUpdateCompanionBuilder = - DanceLinksCompanion Function({ +typedef $$PublishedSourcesTableUpdateCompanionBuilder = + PublishedSourcesCompanion Function({ Value id, - Value danceId, - Value kind, + Value title, + Value author, + Value year, Value url, - Value targetDanceId, - Value label, + Value notes, Value rowid, }); -final class $$DanceLinksTableReferences +final class $$PublishedSourcesTableReferences extends - BaseReferences<_$CompendiumDatabase, $DanceLinksTable, DanceLinkRow> { - $$DanceLinksTableReferences(super.$_db, super.$_table, super.$_typedResult); - - static $DancesTable _danceIdTable(_$CompendiumDatabase db) => - db.dances.createAlias('dance_links__dance_id__dances__id'); + BaseReferences< + _$CompendiumDatabase, + $PublishedSourcesTable, + PublishedSourceRow + > { + $$PublishedSourcesTableReferences( + super.$_db, + super.$_table, + super.$_typedResult, + ); - $$DancesTableProcessedTableManager get danceId { - final $_column = $_itemColumn('dance_id')!; + static MultiTypedResultKey<$DanceSourcesTable, List> + _danceSourcesRefsTable(_$CompendiumDatabase db) => + MultiTypedResultKey.fromTable( + db.danceSources, + aliasName: 'published_sources__id__dance_sources__source_id', + ); - final manager = $$DancesTableTableManager( + $$DanceSourcesTableProcessedTableManager get danceSourcesRefs { + final manager = $$DanceSourcesTableTableManager( $_db, - $_db.dances, - ).filter((f) => f.id.sqlEquals($_column)); - final item = $_typedResult.readTableOrNull(_danceIdTable($_db)); - if (item == null) return manager; - return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: [item]), - ); - } - - static $DancesTable _targetDanceIdTable(_$CompendiumDatabase db) => - db.dances.createAlias('dance_links__target_dance_id__dances__id'); + $_db.danceSources, + ).filter((f) => f.sourceId.id.sqlEquals($_itemColumn('id')!)); - $$DancesTableProcessedTableManager? get targetDanceId { - final $_column = $_itemColumn('target_dance_id'); - if ($_column == null) return null; - final manager = $$DancesTableTableManager( - $_db, - $_db.dances, - ).filter((f) => f.id.sqlEquals($_column)); - final item = $_typedResult.readTableOrNull(_targetDanceIdTable($_db)); - if (item == null) return manager; + final cache = $_typedResult.readTableOrNull(_danceSourcesRefsTable($_db)); return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: [item]), + manager.$state.copyWith(prefetchedData: cache), ); } } -class $$DanceLinksTableFilterComposer - extends Composer<_$CompendiumDatabase, $DanceLinksTable> { - $$DanceLinksTableFilterComposer({ +class $$PublishedSourcesTableFilterComposer + extends Composer<_$CompendiumDatabase, $PublishedSourcesTable> { + $$PublishedSourcesTableFilterComposer({ required super.$db, required super.$table, super.joinBuilder, @@ -13020,148 +15135,100 @@ class $$DanceLinksTableFilterComposer builder: (column) => ColumnFilters(column), ); - ColumnWithTypeConverterFilters get kind => - $composableBuilder( - column: $table.kind, - builder: (column) => ColumnWithTypeConverterFilters(column), - ); - - ColumnFilters get url => $composableBuilder( - column: $table.url, + ColumnFilters get title => $composableBuilder( + column: $table.title, builder: (column) => ColumnFilters(column), ); - ColumnFilters get label => $composableBuilder( - column: $table.label, + ColumnFilters get author => $composableBuilder( + column: $table.author, builder: (column) => ColumnFilters(column), ); - $$DancesTableFilterComposer get danceId { - final $$DancesTableFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.danceId, - referencedTable: $db.dances, - getReferencedColumn: (t) => t.id, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$DancesTableFilterComposer( - $db: $db, - $table: $db.dances, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return composer; - } - - $$DancesTableFilterComposer get targetDanceId { - final $$DancesTableFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.targetDanceId, - referencedTable: $db.dances, - getReferencedColumn: (t) => t.id, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$DancesTableFilterComposer( - $db: $db, - $table: $db.dances, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return composer; - } -} - -class $$DanceLinksTableOrderingComposer - extends Composer<_$CompendiumDatabase, $DanceLinksTable> { - $$DanceLinksTableOrderingComposer({ - required super.$db, - required super.$table, - super.joinBuilder, - super.$addJoinBuilderToRootComposer, - super.$removeJoinBuilderFromRootComposer, - }); - ColumnOrderings get id => $composableBuilder( - column: $table.id, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get kind => $composableBuilder( - column: $table.kind, - builder: (column) => ColumnOrderings(column), + ColumnFilters get year => $composableBuilder( + column: $table.year, + builder: (column) => ColumnFilters(column), ); - ColumnOrderings get url => $composableBuilder( + ColumnFilters get url => $composableBuilder( column: $table.url, - builder: (column) => ColumnOrderings(column), + builder: (column) => ColumnFilters(column), ); - ColumnOrderings get label => $composableBuilder( - column: $table.label, - builder: (column) => ColumnOrderings(column), + ColumnFilters get notes => $composableBuilder( + column: $table.notes, + builder: (column) => ColumnFilters(column), ); - $$DancesTableOrderingComposer get danceId { - final $$DancesTableOrderingComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.danceId, - referencedTable: $db.dances, - getReferencedColumn: (t) => t.id, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$DancesTableOrderingComposer( - $db: $db, - $table: $db.dances, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return composer; - } - - $$DancesTableOrderingComposer get targetDanceId { - final $$DancesTableOrderingComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.targetDanceId, - referencedTable: $db.dances, - getReferencedColumn: (t) => t.id, + Expression danceSourcesRefs( + Expression Function($$DanceSourcesTableFilterComposer f) f, + ) { + final $$DanceSourcesTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.danceSources, + getReferencedColumn: (t) => t.sourceId, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$DancesTableOrderingComposer( + }) => $$DanceSourcesTableFilterComposer( $db: $db, - $table: $db.dances, + $table: $db.danceSources, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: $removeJoinBuilderFromRootComposer, ), ); - return composer; + return f(composer); } } -class $$DanceLinksTableAnnotationComposer - extends Composer<_$CompendiumDatabase, $DanceLinksTable> { - $$DanceLinksTableAnnotationComposer({ +class $$PublishedSourcesTableOrderingComposer + extends Composer<_$CompendiumDatabase, $PublishedSourcesTable> { + $$PublishedSourcesTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get title => $composableBuilder( + column: $table.title, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get author => $composableBuilder( + column: $table.author, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get year => $composableBuilder( + column: $table.year, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get url => $composableBuilder( + column: $table.url, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get notes => $composableBuilder( + column: $table.notes, + builder: (column) => ColumnOrderings(column), + ); +} + +class $$PublishedSourcesTableAnnotationComposer + extends Composer<_$CompendiumDatabase, $PublishedSourcesTable> { + $$PublishedSourcesTableAnnotationComposer({ required super.$db, required super.$table, super.joinBuilder, @@ -13171,183 +15238,146 @@ class $$DanceLinksTableAnnotationComposer GeneratedColumn get id => $composableBuilder(column: $table.id, builder: (column) => column); - GeneratedColumnWithTypeConverter get kind => - $composableBuilder(column: $table.kind, builder: (column) => column); + GeneratedColumn get title => + $composableBuilder(column: $table.title, builder: (column) => column); + + GeneratedColumn get author => + $composableBuilder(column: $table.author, builder: (column) => column); + + GeneratedColumn get year => + $composableBuilder(column: $table.year, builder: (column) => column); GeneratedColumn get url => $composableBuilder(column: $table.url, builder: (column) => column); - GeneratedColumn get label => - $composableBuilder(column: $table.label, builder: (column) => column); - - $$DancesTableAnnotationComposer get danceId { - final $$DancesTableAnnotationComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.danceId, - referencedTable: $db.dances, - getReferencedColumn: (t) => t.id, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$DancesTableAnnotationComposer( - $db: $db, - $table: $db.dances, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return composer; - } + GeneratedColumn get notes => + $composableBuilder(column: $table.notes, builder: (column) => column); - $$DancesTableAnnotationComposer get targetDanceId { - final $$DancesTableAnnotationComposer composer = $composerBuilder( + Expression danceSourcesRefs( + Expression Function($$DanceSourcesTableAnnotationComposer a) f, + ) { + final $$DanceSourcesTableAnnotationComposer composer = $composerBuilder( composer: this, - getCurrentColumn: (t) => t.targetDanceId, - referencedTable: $db.dances, - getReferencedColumn: (t) => t.id, + getCurrentColumn: (t) => t.id, + referencedTable: $db.danceSources, + getReferencedColumn: (t) => t.sourceId, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$DancesTableAnnotationComposer( + }) => $$DanceSourcesTableAnnotationComposer( $db: $db, - $table: $db.dances, + $table: $db.danceSources, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: $removeJoinBuilderFromRootComposer, ), ); - return composer; + return f(composer); } } -class $$DanceLinksTableTableManager +class $$PublishedSourcesTableTableManager extends RootTableManager< _$CompendiumDatabase, - $DanceLinksTable, - DanceLinkRow, - $$DanceLinksTableFilterComposer, - $$DanceLinksTableOrderingComposer, - $$DanceLinksTableAnnotationComposer, - $$DanceLinksTableCreateCompanionBuilder, - $$DanceLinksTableUpdateCompanionBuilder, - (DanceLinkRow, $$DanceLinksTableReferences), - DanceLinkRow, - PrefetchHooks Function({bool danceId, bool targetDanceId}) + $PublishedSourcesTable, + PublishedSourceRow, + $$PublishedSourcesTableFilterComposer, + $$PublishedSourcesTableOrderingComposer, + $$PublishedSourcesTableAnnotationComposer, + $$PublishedSourcesTableCreateCompanionBuilder, + $$PublishedSourcesTableUpdateCompanionBuilder, + (PublishedSourceRow, $$PublishedSourcesTableReferences), + PublishedSourceRow, + PrefetchHooks Function({bool danceSourcesRefs}) > { - $$DanceLinksTableTableManager(_$CompendiumDatabase db, $DanceLinksTable table) - : super( + $$PublishedSourcesTableTableManager( + _$CompendiumDatabase db, + $PublishedSourcesTable table, + ) : super( TableManagerState( db: db, table: table, createFilteringComposer: () => - $$DanceLinksTableFilterComposer($db: db, $table: table), + $$PublishedSourcesTableFilterComposer($db: db, $table: table), createOrderingComposer: () => - $$DanceLinksTableOrderingComposer($db: db, $table: table), + $$PublishedSourcesTableOrderingComposer($db: db, $table: table), createComputedFieldComposer: () => - $$DanceLinksTableAnnotationComposer($db: db, $table: table), + $$PublishedSourcesTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ Value id = const Value.absent(), - Value danceId = const Value.absent(), - Value kind = const Value.absent(), + Value title = const Value.absent(), + Value author = const Value.absent(), + Value year = const Value.absent(), Value url = const Value.absent(), - Value targetDanceId = const Value.absent(), - Value label = const Value.absent(), + Value notes = const Value.absent(), Value rowid = const Value.absent(), - }) => DanceLinksCompanion( + }) => PublishedSourcesCompanion( id: id, - danceId: danceId, - kind: kind, + title: title, + author: author, + year: year, url: url, - targetDanceId: targetDanceId, - label: label, + notes: notes, rowid: rowid, ), createCompanionCallback: ({ required String id, - required String danceId, - required LinkKind kind, + required String title, + Value author = const Value.absent(), + Value year = const Value.absent(), Value url = const Value.absent(), - Value targetDanceId = const Value.absent(), - Value label = const Value.absent(), + Value notes = const Value.absent(), Value rowid = const Value.absent(), - }) => DanceLinksCompanion.insert( + }) => PublishedSourcesCompanion.insert( id: id, - danceId: danceId, - kind: kind, + title: title, + author: author, + year: year, url: url, - targetDanceId: targetDanceId, - label: label, + notes: notes, rowid: rowid, ), withReferenceMapper: (p0) => p0 .map( (e) => ( e.readTable(table), - $$DanceLinksTableReferences(db, table, e), + $$PublishedSourcesTableReferences(db, table, e), ), ) .toList(), - prefetchHooksCallback: ({danceId = false, targetDanceId = false}) { + prefetchHooksCallback: ({danceSourcesRefs = false}) { return PrefetchHooks( db: db, - explicitlyWatchedTables: [], - addJoins: - < - T extends TableManagerState< - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic - > - >(state) { - if (danceId) { - state = - state.withJoin( - currentTable: table, - currentColumn: table.danceId, - referencedTable: $$DanceLinksTableReferences - ._danceIdTable(db), - referencedColumn: $$DanceLinksTableReferences - ._danceIdTable(db) - .id, - ) - as T; - } - if (targetDanceId) { - state = - state.withJoin( - currentTable: table, - currentColumn: table.targetDanceId, - referencedTable: $$DanceLinksTableReferences - ._targetDanceIdTable(db), - referencedColumn: $$DanceLinksTableReferences - ._targetDanceIdTable(db) - .id, - ) - as T; - } - - return state; - }, + explicitlyWatchedTables: [if (danceSourcesRefs) db.danceSources], + addJoins: null, getPrefetchedDataCallback: (items) async { - return []; + return [ + if (danceSourcesRefs) + await $_getPrefetchedData< + PublishedSourceRow, + $PublishedSourcesTable, + DanceSourceRow + >( + currentTable: table, + referencedTable: $$PublishedSourcesTableReferences + ._danceSourcesRefsTable(db), + managerFromTypedResult: (p0) => + $$PublishedSourcesTableReferences( + db, + table, + p0, + ).danceSourcesRefs, + referencedItemsForCurrentItem: (item, referencedItems) => + referencedItems.where((e) => e.sourceId == item.id), + typedResults: items, + ), + ]; }, ); }, @@ -13355,52 +15385,50 @@ class $$DanceLinksTableTableManager ); } -typedef $$DanceLinksTableProcessedTableManager = +typedef $$PublishedSourcesTableProcessedTableManager = ProcessedTableManager< _$CompendiumDatabase, - $DanceLinksTable, - DanceLinkRow, - $$DanceLinksTableFilterComposer, - $$DanceLinksTableOrderingComposer, - $$DanceLinksTableAnnotationComposer, - $$DanceLinksTableCreateCompanionBuilder, - $$DanceLinksTableUpdateCompanionBuilder, - (DanceLinkRow, $$DanceLinksTableReferences), - DanceLinkRow, - PrefetchHooks Function({bool danceId, bool targetDanceId}) + $PublishedSourcesTable, + PublishedSourceRow, + $$PublishedSourcesTableFilterComposer, + $$PublishedSourcesTableOrderingComposer, + $$PublishedSourcesTableAnnotationComposer, + $$PublishedSourcesTableCreateCompanionBuilder, + $$PublishedSourcesTableUpdateCompanionBuilder, + (PublishedSourceRow, $$PublishedSourcesTableReferences), + PublishedSourceRow, + PrefetchHooks Function({bool danceSourcesRefs}) >; -typedef $$ProvenanceTableCreateCompanionBuilder = - ProvenanceCompanion Function({ +typedef $$DanceSourcesTableCreateCompanionBuilder = + DanceSourcesCompanion Function({ required String danceId, - required ProvenanceSource source, - Value externalId, - required DateTime importedAt, - Value permission, - Value license, - Value rawPayload, - Value sourceVersion, + required String sourceId, + Value page, + Value number, + required int position, Value rowid, }); -typedef $$ProvenanceTableUpdateCompanionBuilder = - ProvenanceCompanion Function({ +typedef $$DanceSourcesTableUpdateCompanionBuilder = + DanceSourcesCompanion Function({ Value danceId, - Value source, - Value externalId, - Value importedAt, - Value permission, - Value license, - Value rawPayload, - Value sourceVersion, + Value sourceId, + Value page, + Value number, + Value position, Value rowid, }); -final class $$ProvenanceTableReferences +final class $$DanceSourcesTableReferences extends - BaseReferences<_$CompendiumDatabase, $ProvenanceTable, ProvenanceRow> { - $$ProvenanceTableReferences(super.$_db, super.$_table, super.$_typedResult); + BaseReferences< + _$CompendiumDatabase, + $DanceSourcesTable, + DanceSourceRow + > { + $$DanceSourcesTableReferences(super.$_db, super.$_table, super.$_typedResult); static $DancesTable _danceIdTable(_$CompendiumDatabase db) => - db.dances.createAlias('provenance__dance_id__dances__id'); + db.dances.createAlias('dance_sources__dance_id__dances__id'); $$DancesTableProcessedTableManager get danceId { final $_column = $_itemColumn('dance_id')!; @@ -13415,50 +15443,47 @@ final class $$ProvenanceTableReferences manager.$state.copyWith(prefetchedData: [item]), ); } + + static $PublishedSourcesTable _sourceIdTable(_$CompendiumDatabase db) => db + .publishedSources + .createAlias('dance_sources__source_id__published_sources__id'); + + $$PublishedSourcesTableProcessedTableManager get sourceId { + final $_column = $_itemColumn('source_id')!; + + final manager = $$PublishedSourcesTableTableManager( + $_db, + $_db.publishedSources, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull(_sourceIdTable($_db)); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } } -class $$ProvenanceTableFilterComposer - extends Composer<_$CompendiumDatabase, $ProvenanceTable> { - $$ProvenanceTableFilterComposer({ +class $$DanceSourcesTableFilterComposer + extends Composer<_$CompendiumDatabase, $DanceSourcesTable> { + $$DanceSourcesTableFilterComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnWithTypeConverterFilters - get source => $composableBuilder( - column: $table.source, - builder: (column) => ColumnWithTypeConverterFilters(column), - ); - - ColumnFilters get externalId => $composableBuilder( - column: $table.externalId, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get importedAt => $composableBuilder( - column: $table.importedAt, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get permission => $composableBuilder( - column: $table.permission, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get license => $composableBuilder( - column: $table.license, + ColumnFilters get page => $composableBuilder( + column: $table.page, builder: (column) => ColumnFilters(column), ); - ColumnFilters get rawPayload => $composableBuilder( - column: $table.rawPayload, + ColumnFilters get number => $composableBuilder( + column: $table.number, builder: (column) => ColumnFilters(column), ); - ColumnFilters get sourceVersion => $composableBuilder( - column: $table.sourceVersion, + ColumnFilters get position => $composableBuilder( + column: $table.position, builder: (column) => ColumnFilters(column), ); @@ -13484,49 +15509,52 @@ class $$ProvenanceTableFilterComposer ); return composer; } + + $$PublishedSourcesTableFilterComposer get sourceId { + final $$PublishedSourcesTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.sourceId, + referencedTable: $db.publishedSources, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$PublishedSourcesTableFilterComposer( + $db: $db, + $table: $db.publishedSources, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } } -class $$ProvenanceTableOrderingComposer - extends Composer<_$CompendiumDatabase, $ProvenanceTable> { - $$ProvenanceTableOrderingComposer({ +class $$DanceSourcesTableOrderingComposer + extends Composer<_$CompendiumDatabase, $DanceSourcesTable> { + $$DanceSourcesTableOrderingComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get source => $composableBuilder( - column: $table.source, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get externalId => $composableBuilder( - column: $table.externalId, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get importedAt => $composableBuilder( - column: $table.importedAt, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get permission => $composableBuilder( - column: $table.permission, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get license => $composableBuilder( - column: $table.license, + ColumnOrderings get page => $composableBuilder( + column: $table.page, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get rawPayload => $composableBuilder( - column: $table.rawPayload, + ColumnOrderings get number => $composableBuilder( + column: $table.number, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get sourceVersion => $composableBuilder( - column: $table.sourceVersion, + ColumnOrderings get position => $composableBuilder( + column: $table.position, builder: (column) => ColumnOrderings(column), ); @@ -13552,62 +15580,86 @@ class $$ProvenanceTableOrderingComposer ); return composer; } + + $$PublishedSourcesTableOrderingComposer get sourceId { + final $$PublishedSourcesTableOrderingComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.sourceId, + referencedTable: $db.publishedSources, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$PublishedSourcesTableOrderingComposer( + $db: $db, + $table: $db.publishedSources, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } } -class $$ProvenanceTableAnnotationComposer - extends Composer<_$CompendiumDatabase, $ProvenanceTable> { - $$ProvenanceTableAnnotationComposer({ +class $$DanceSourcesTableAnnotationComposer + extends Composer<_$CompendiumDatabase, $DanceSourcesTable> { + $$DanceSourcesTableAnnotationComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - GeneratedColumnWithTypeConverter get source => - $composableBuilder(column: $table.source, builder: (column) => column); - - GeneratedColumn get externalId => $composableBuilder( - column: $table.externalId, - builder: (column) => column, - ); - - GeneratedColumn get importedAt => $composableBuilder( - column: $table.importedAt, - builder: (column) => column, - ); - - GeneratedColumn get permission => $composableBuilder( - column: $table.permission, - builder: (column) => column, - ); + GeneratedColumn get page => + $composableBuilder(column: $table.page, builder: (column) => column); - GeneratedColumn get license => - $composableBuilder(column: $table.license, builder: (column) => column); + GeneratedColumn get number => + $composableBuilder(column: $table.number, builder: (column) => column); - GeneratedColumn get rawPayload => $composableBuilder( - column: $table.rawPayload, - builder: (column) => column, - ); + GeneratedColumn get position => + $composableBuilder(column: $table.position, builder: (column) => column); - GeneratedColumn get sourceVersion => $composableBuilder( - column: $table.sourceVersion, - builder: (column) => column, - ); + $$DancesTableAnnotationComposer get danceId { + final $$DancesTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.danceId, + referencedTable: $db.dances, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$DancesTableAnnotationComposer( + $db: $db, + $table: $db.dances, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } - $$DancesTableAnnotationComposer get danceId { - final $$DancesTableAnnotationComposer composer = $composerBuilder( + $$PublishedSourcesTableAnnotationComposer get sourceId { + final $$PublishedSourcesTableAnnotationComposer composer = $composerBuilder( composer: this, - getCurrentColumn: (t) => t.danceId, - referencedTable: $db.dances, + getCurrentColumn: (t) => t.sourceId, + referencedTable: $db.publishedSources, getReferencedColumn: (t) => t.id, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$DancesTableAnnotationComposer( + }) => $$PublishedSourcesTableAnnotationComposer( $db: $db, - $table: $db.dances, + $table: $db.publishedSources, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: @@ -13618,85 +15670,75 @@ class $$ProvenanceTableAnnotationComposer } } -class $$ProvenanceTableTableManager +class $$DanceSourcesTableTableManager extends RootTableManager< _$CompendiumDatabase, - $ProvenanceTable, - ProvenanceRow, - $$ProvenanceTableFilterComposer, - $$ProvenanceTableOrderingComposer, - $$ProvenanceTableAnnotationComposer, - $$ProvenanceTableCreateCompanionBuilder, - $$ProvenanceTableUpdateCompanionBuilder, - (ProvenanceRow, $$ProvenanceTableReferences), - ProvenanceRow, - PrefetchHooks Function({bool danceId}) + $DanceSourcesTable, + DanceSourceRow, + $$DanceSourcesTableFilterComposer, + $$DanceSourcesTableOrderingComposer, + $$DanceSourcesTableAnnotationComposer, + $$DanceSourcesTableCreateCompanionBuilder, + $$DanceSourcesTableUpdateCompanionBuilder, + (DanceSourceRow, $$DanceSourcesTableReferences), + DanceSourceRow, + PrefetchHooks Function({bool danceId, bool sourceId}) > { - $$ProvenanceTableTableManager(_$CompendiumDatabase db, $ProvenanceTable table) - : super( + $$DanceSourcesTableTableManager( + _$CompendiumDatabase db, + $DanceSourcesTable table, + ) : super( TableManagerState( db: db, table: table, createFilteringComposer: () => - $$ProvenanceTableFilterComposer($db: db, $table: table), + $$DanceSourcesTableFilterComposer($db: db, $table: table), createOrderingComposer: () => - $$ProvenanceTableOrderingComposer($db: db, $table: table), + $$DanceSourcesTableOrderingComposer($db: db, $table: table), createComputedFieldComposer: () => - $$ProvenanceTableAnnotationComposer($db: db, $table: table), + $$DanceSourcesTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ Value danceId = const Value.absent(), - Value source = const Value.absent(), - Value externalId = const Value.absent(), - Value importedAt = const Value.absent(), - Value permission = const Value.absent(), - Value license = const Value.absent(), - Value rawPayload = const Value.absent(), - Value sourceVersion = const Value.absent(), + Value sourceId = const Value.absent(), + Value page = const Value.absent(), + Value number = const Value.absent(), + Value position = const Value.absent(), Value rowid = const Value.absent(), - }) => ProvenanceCompanion( + }) => DanceSourcesCompanion( danceId: danceId, - source: source, - externalId: externalId, - importedAt: importedAt, - permission: permission, - license: license, - rawPayload: rawPayload, - sourceVersion: sourceVersion, + sourceId: sourceId, + page: page, + number: number, + position: position, rowid: rowid, ), createCompanionCallback: ({ required String danceId, - required ProvenanceSource source, - Value externalId = const Value.absent(), - required DateTime importedAt, - Value permission = const Value.absent(), - Value license = const Value.absent(), - Value rawPayload = const Value.absent(), - Value sourceVersion = const Value.absent(), + required String sourceId, + Value page = const Value.absent(), + Value number = const Value.absent(), + required int position, Value rowid = const Value.absent(), - }) => ProvenanceCompanion.insert( + }) => DanceSourcesCompanion.insert( danceId: danceId, - source: source, - externalId: externalId, - importedAt: importedAt, - permission: permission, - license: license, - rawPayload: rawPayload, - sourceVersion: sourceVersion, + sourceId: sourceId, + page: page, + number: number, + position: position, rowid: rowid, ), withReferenceMapper: (p0) => p0 .map( (e) => ( e.readTable(table), - $$ProvenanceTableReferences(db, table, e), + $$DanceSourcesTableReferences(db, table, e), ), ) .toList(), - prefetchHooksCallback: ({danceId = false}) { + prefetchHooksCallback: ({danceId = false, sourceId = false}) { return PrefetchHooks( db: db, explicitlyWatchedTables: [], @@ -13721,14 +15763,27 @@ class $$ProvenanceTableTableManager state.withJoin( currentTable: table, currentColumn: table.danceId, - referencedTable: $$ProvenanceTableReferences + referencedTable: $$DanceSourcesTableReferences ._danceIdTable(db), - referencedColumn: $$ProvenanceTableReferences + referencedColumn: $$DanceSourcesTableReferences ._danceIdTable(db) .id, ) as T; } + if (sourceId) { + state = + state.withJoin( + currentTable: table, + currentColumn: table.sourceId, + referencedTable: $$DanceSourcesTableReferences + ._sourceIdTable(db), + referencedColumn: $$DanceSourcesTableReferences + ._sourceIdTable(db) + .id, + ) + as T; + } return state; }, @@ -13741,409 +15796,399 @@ class $$ProvenanceTableTableManager ); } -typedef $$ProvenanceTableProcessedTableManager = +typedef $$DanceSourcesTableProcessedTableManager = + ProcessedTableManager< + _$CompendiumDatabase, + $DanceSourcesTable, + DanceSourceRow, + $$DanceSourcesTableFilterComposer, + $$DanceSourcesTableOrderingComposer, + $$DanceSourcesTableAnnotationComposer, + $$DanceSourcesTableCreateCompanionBuilder, + $$DanceSourcesTableUpdateCompanionBuilder, + (DanceSourceRow, $$DanceSourcesTableReferences), + DanceSourceRow, + PrefetchHooks Function({bool danceId, bool sourceId}) + >; +typedef $$SettingsTableCreateCompanionBuilder = + SettingsCompanion Function({ + required String key, + required String valueJson, + Value rowid, + }); +typedef $$SettingsTableUpdateCompanionBuilder = + SettingsCompanion Function({ + Value key, + Value valueJson, + Value rowid, + }); + +class $$SettingsTableFilterComposer + extends Composer<_$CompendiumDatabase, $SettingsTable> { + $$SettingsTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get key => $composableBuilder( + column: $table.key, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get valueJson => $composableBuilder( + column: $table.valueJson, + builder: (column) => ColumnFilters(column), + ); +} + +class $$SettingsTableOrderingComposer + extends Composer<_$CompendiumDatabase, $SettingsTable> { + $$SettingsTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get key => $composableBuilder( + column: $table.key, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get valueJson => $composableBuilder( + column: $table.valueJson, + builder: (column) => ColumnOrderings(column), + ); +} + +class $$SettingsTableAnnotationComposer + extends Composer<_$CompendiumDatabase, $SettingsTable> { + $$SettingsTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get key => + $composableBuilder(column: $table.key, builder: (column) => column); + + GeneratedColumn get valueJson => + $composableBuilder(column: $table.valueJson, builder: (column) => column); +} + +class $$SettingsTableTableManager + extends + RootTableManager< + _$CompendiumDatabase, + $SettingsTable, + SettingRow, + $$SettingsTableFilterComposer, + $$SettingsTableOrderingComposer, + $$SettingsTableAnnotationComposer, + $$SettingsTableCreateCompanionBuilder, + $$SettingsTableUpdateCompanionBuilder, + ( + SettingRow, + BaseReferences<_$CompendiumDatabase, $SettingsTable, SettingRow>, + ), + SettingRow, + PrefetchHooks Function() + > { + $$SettingsTableTableManager(_$CompendiumDatabase db, $SettingsTable table) + : super( + TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + $$SettingsTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$SettingsTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$SettingsTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: + ({ + Value key = const Value.absent(), + Value valueJson = const Value.absent(), + Value rowid = const Value.absent(), + }) => SettingsCompanion( + key: key, + valueJson: valueJson, + rowid: rowid, + ), + createCompanionCallback: + ({ + required String key, + required String valueJson, + Value rowid = const Value.absent(), + }) => SettingsCompanion.insert( + key: key, + valueJson: valueJson, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), BaseReferences(db, table, e))) + .toList(), + prefetchHooksCallback: null, + ), + ); +} + +typedef $$SettingsTableProcessedTableManager = ProcessedTableManager< _$CompendiumDatabase, - $ProvenanceTable, - ProvenanceRow, - $$ProvenanceTableFilterComposer, - $$ProvenanceTableOrderingComposer, - $$ProvenanceTableAnnotationComposer, - $$ProvenanceTableCreateCompanionBuilder, - $$ProvenanceTableUpdateCompanionBuilder, - (ProvenanceRow, $$ProvenanceTableReferences), - ProvenanceRow, - PrefetchHooks Function({bool danceId}) + $SettingsTable, + SettingRow, + $$SettingsTableFilterComposer, + $$SettingsTableOrderingComposer, + $$SettingsTableAnnotationComposer, + $$SettingsTableCreateCompanionBuilder, + $$SettingsTableUpdateCompanionBuilder, + ( + SettingRow, + BaseReferences<_$CompendiumDatabase, $SettingsTable, SettingRow>, + ), + SettingRow, + PrefetchHooks Function() >; -typedef $$PublishedSourcesTableCreateCompanionBuilder = - PublishedSourcesCompanion Function({ - required String id, - required String title, - Value author, - Value year, - Value url, - Value notes, +typedef $$SnapshotsTableCreateCompanionBuilder = + SnapshotsCompanion Function({ + required String source, + required DateTime snapshotDate, + required String manifestJson, + required DateTime importedAt, Value rowid, }); -typedef $$PublishedSourcesTableUpdateCompanionBuilder = - PublishedSourcesCompanion Function({ - Value id, - Value title, - Value author, - Value year, - Value url, - Value notes, +typedef $$SnapshotsTableUpdateCompanionBuilder = + SnapshotsCompanion Function({ + Value source, + Value snapshotDate, + Value manifestJson, + Value importedAt, Value rowid, }); -final class $$PublishedSourcesTableReferences - extends - BaseReferences< - _$CompendiumDatabase, - $PublishedSourcesTable, - PublishedSourceRow - > { - $$PublishedSourcesTableReferences( - super.$_db, - super.$_table, - super.$_typedResult, - ); - - static MultiTypedResultKey<$DanceSourcesTable, List> - _danceSourcesRefsTable(_$CompendiumDatabase db) => - MultiTypedResultKey.fromTable( - db.danceSources, - aliasName: 'published_sources__id__dance_sources__source_id', - ); - - $$DanceSourcesTableProcessedTableManager get danceSourcesRefs { - final manager = $$DanceSourcesTableTableManager( - $_db, - $_db.danceSources, - ).filter((f) => f.sourceId.id.sqlEquals($_itemColumn('id')!)); - - final cache = $_typedResult.readTableOrNull(_danceSourcesRefsTable($_db)); - return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: cache), - ); - } -} - -class $$PublishedSourcesTableFilterComposer - extends Composer<_$CompendiumDatabase, $PublishedSourcesTable> { - $$PublishedSourcesTableFilterComposer({ +class $$SnapshotsTableFilterComposer + extends Composer<_$CompendiumDatabase, $SnapshotsTable> { + $$SnapshotsTableFilterComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnFilters get id => $composableBuilder( - column: $table.id, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get title => $composableBuilder( - column: $table.title, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get author => $composableBuilder( - column: $table.author, + ColumnFilters get source => $composableBuilder( + column: $table.source, builder: (column) => ColumnFilters(column), ); - ColumnFilters get year => $composableBuilder( - column: $table.year, + ColumnFilters get snapshotDate => $composableBuilder( + column: $table.snapshotDate, builder: (column) => ColumnFilters(column), ); - ColumnFilters get url => $composableBuilder( - column: $table.url, + ColumnFilters get manifestJson => $composableBuilder( + column: $table.manifestJson, builder: (column) => ColumnFilters(column), ); - ColumnFilters get notes => $composableBuilder( - column: $table.notes, + ColumnFilters get importedAt => $composableBuilder( + column: $table.importedAt, builder: (column) => ColumnFilters(column), ); - - Expression danceSourcesRefs( - Expression Function($$DanceSourcesTableFilterComposer f) f, - ) { - final $$DanceSourcesTableFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $db.danceSources, - getReferencedColumn: (t) => t.sourceId, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$DanceSourcesTableFilterComposer( - $db: $db, - $table: $db.danceSources, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return f(composer); - } } -class $$PublishedSourcesTableOrderingComposer - extends Composer<_$CompendiumDatabase, $PublishedSourcesTable> { - $$PublishedSourcesTableOrderingComposer({ +class $$SnapshotsTableOrderingComposer + extends Composer<_$CompendiumDatabase, $SnapshotsTable> { + $$SnapshotsTableOrderingComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get id => $composableBuilder( - column: $table.id, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get title => $composableBuilder( - column: $table.title, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get author => $composableBuilder( - column: $table.author, + ColumnOrderings get source => $composableBuilder( + column: $table.source, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get year => $composableBuilder( - column: $table.year, + ColumnOrderings get snapshotDate => $composableBuilder( + column: $table.snapshotDate, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get url => $composableBuilder( - column: $table.url, + ColumnOrderings get manifestJson => $composableBuilder( + column: $table.manifestJson, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get notes => $composableBuilder( - column: $table.notes, + ColumnOrderings get importedAt => $composableBuilder( + column: $table.importedAt, builder: (column) => ColumnOrderings(column), ); } -class $$PublishedSourcesTableAnnotationComposer - extends Composer<_$CompendiumDatabase, $PublishedSourcesTable> { - $$PublishedSourcesTableAnnotationComposer({ +class $$SnapshotsTableAnnotationComposer + extends Composer<_$CompendiumDatabase, $SnapshotsTable> { + $$SnapshotsTableAnnotationComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - GeneratedColumn get id => - $composableBuilder(column: $table.id, builder: (column) => column); - - GeneratedColumn get title => - $composableBuilder(column: $table.title, builder: (column) => column); - - GeneratedColumn get author => - $composableBuilder(column: $table.author, builder: (column) => column); - - GeneratedColumn get year => - $composableBuilder(column: $table.year, builder: (column) => column); + GeneratedColumn get source => + $composableBuilder(column: $table.source, builder: (column) => column); - GeneratedColumn get url => - $composableBuilder(column: $table.url, builder: (column) => column); + GeneratedColumn get snapshotDate => $composableBuilder( + column: $table.snapshotDate, + builder: (column) => column, + ); - GeneratedColumn get notes => - $composableBuilder(column: $table.notes, builder: (column) => column); + GeneratedColumn get manifestJson => $composableBuilder( + column: $table.manifestJson, + builder: (column) => column, + ); - Expression danceSourcesRefs( - Expression Function($$DanceSourcesTableAnnotationComposer a) f, - ) { - final $$DanceSourcesTableAnnotationComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $db.danceSources, - getReferencedColumn: (t) => t.sourceId, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$DanceSourcesTableAnnotationComposer( - $db: $db, - $table: $db.danceSources, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return f(composer); - } + GeneratedColumn get importedAt => $composableBuilder( + column: $table.importedAt, + builder: (column) => column, + ); } -class $$PublishedSourcesTableTableManager +class $$SnapshotsTableTableManager extends RootTableManager< _$CompendiumDatabase, - $PublishedSourcesTable, - PublishedSourceRow, - $$PublishedSourcesTableFilterComposer, - $$PublishedSourcesTableOrderingComposer, - $$PublishedSourcesTableAnnotationComposer, - $$PublishedSourcesTableCreateCompanionBuilder, - $$PublishedSourcesTableUpdateCompanionBuilder, - (PublishedSourceRow, $$PublishedSourcesTableReferences), - PublishedSourceRow, - PrefetchHooks Function({bool danceSourcesRefs}) + $SnapshotsTable, + SnapshotRow, + $$SnapshotsTableFilterComposer, + $$SnapshotsTableOrderingComposer, + $$SnapshotsTableAnnotationComposer, + $$SnapshotsTableCreateCompanionBuilder, + $$SnapshotsTableUpdateCompanionBuilder, + ( + SnapshotRow, + BaseReferences<_$CompendiumDatabase, $SnapshotsTable, SnapshotRow>, + ), + SnapshotRow, + PrefetchHooks Function() > { - $$PublishedSourcesTableTableManager( - _$CompendiumDatabase db, - $PublishedSourcesTable table, - ) : super( + $$SnapshotsTableTableManager(_$CompendiumDatabase db, $SnapshotsTable table) + : super( TableManagerState( db: db, table: table, createFilteringComposer: () => - $$PublishedSourcesTableFilterComposer($db: db, $table: table), + $$SnapshotsTableFilterComposer($db: db, $table: table), createOrderingComposer: () => - $$PublishedSourcesTableOrderingComposer($db: db, $table: table), + $$SnapshotsTableOrderingComposer($db: db, $table: table), createComputedFieldComposer: () => - $$PublishedSourcesTableAnnotationComposer($db: db, $table: table), + $$SnapshotsTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ - Value id = const Value.absent(), - Value title = const Value.absent(), - Value author = const Value.absent(), - Value year = const Value.absent(), - Value url = const Value.absent(), - Value notes = const Value.absent(), + Value source = const Value.absent(), + Value snapshotDate = const Value.absent(), + Value manifestJson = const Value.absent(), + Value importedAt = const Value.absent(), Value rowid = const Value.absent(), - }) => PublishedSourcesCompanion( - id: id, - title: title, - author: author, - year: year, - url: url, - notes: notes, + }) => SnapshotsCompanion( + source: source, + snapshotDate: snapshotDate, + manifestJson: manifestJson, + importedAt: importedAt, rowid: rowid, ), createCompanionCallback: ({ - required String id, - required String title, - Value author = const Value.absent(), - Value year = const Value.absent(), - Value url = const Value.absent(), - Value notes = const Value.absent(), + required String source, + required DateTime snapshotDate, + required String manifestJson, + required DateTime importedAt, Value rowid = const Value.absent(), - }) => PublishedSourcesCompanion.insert( - id: id, - title: title, - author: author, - year: year, - url: url, - notes: notes, + }) => SnapshotsCompanion.insert( + source: source, + snapshotDate: snapshotDate, + manifestJson: manifestJson, + importedAt: importedAt, rowid: rowid, ), withReferenceMapper: (p0) => p0 - .map( - (e) => ( - e.readTable(table), - $$PublishedSourcesTableReferences(db, table, e), - ), - ) + .map((e) => (e.readTable(table), BaseReferences(db, table, e))) .toList(), - prefetchHooksCallback: ({danceSourcesRefs = false}) { - return PrefetchHooks( - db: db, - explicitlyWatchedTables: [if (danceSourcesRefs) db.danceSources], - addJoins: null, - getPrefetchedDataCallback: (items) async { - return [ - if (danceSourcesRefs) - await $_getPrefetchedData< - PublishedSourceRow, - $PublishedSourcesTable, - DanceSourceRow - >( - currentTable: table, - referencedTable: $$PublishedSourcesTableReferences - ._danceSourcesRefsTable(db), - managerFromTypedResult: (p0) => - $$PublishedSourcesTableReferences( - db, - table, - p0, - ).danceSourcesRefs, - referencedItemsForCurrentItem: (item, referencedItems) => - referencedItems.where((e) => e.sourceId == item.id), - typedResults: items, - ), - ]; - }, - ); - }, + prefetchHooksCallback: null, ), ); } -typedef $$PublishedSourcesTableProcessedTableManager = +typedef $$SnapshotsTableProcessedTableManager = ProcessedTableManager< _$CompendiumDatabase, - $PublishedSourcesTable, - PublishedSourceRow, - $$PublishedSourcesTableFilterComposer, - $$PublishedSourcesTableOrderingComposer, - $$PublishedSourcesTableAnnotationComposer, - $$PublishedSourcesTableCreateCompanionBuilder, - $$PublishedSourcesTableUpdateCompanionBuilder, - (PublishedSourceRow, $$PublishedSourcesTableReferences), - PublishedSourceRow, - PrefetchHooks Function({bool danceSourcesRefs}) + $SnapshotsTable, + SnapshotRow, + $$SnapshotsTableFilterComposer, + $$SnapshotsTableOrderingComposer, + $$SnapshotsTableAnnotationComposer, + $$SnapshotsTableCreateCompanionBuilder, + $$SnapshotsTableUpdateCompanionBuilder, + ( + SnapshotRow, + BaseReferences<_$CompendiumDatabase, $SnapshotsTable, SnapshotRow>, + ), + SnapshotRow, + PrefetchHooks Function() >; -typedef $$DanceSourcesTableCreateCompanionBuilder = - DanceSourcesCompanion Function({ - required String danceId, - required String sourceId, - Value page, - Value number, - required int position, +typedef $$ProgramProvenanceTableCreateCompanionBuilder = + ProgramProvenanceCompanion Function({ + required String programId, + required ProvenanceSource source, + Value externalId, + required DateTime importedAt, + Value permission, + Value license, + Value rawPayload, + Value sourceVersion, Value rowid, }); -typedef $$DanceSourcesTableUpdateCompanionBuilder = - DanceSourcesCompanion Function({ - Value danceId, - Value sourceId, - Value page, - Value number, - Value position, +typedef $$ProgramProvenanceTableUpdateCompanionBuilder = + ProgramProvenanceCompanion Function({ + Value programId, + Value source, + Value externalId, + Value importedAt, + Value permission, + Value license, + Value rawPayload, + Value sourceVersion, Value rowid, }); -final class $$DanceSourcesTableReferences +final class $$ProgramProvenanceTableReferences extends BaseReferences< _$CompendiumDatabase, - $DanceSourcesTable, - DanceSourceRow + $ProgramProvenanceTable, + ProgramProvenanceRow > { - $$DanceSourcesTableReferences(super.$_db, super.$_table, super.$_typedResult); - - static $DancesTable _danceIdTable(_$CompendiumDatabase db) => - db.dances.createAlias('dance_sources__dance_id__dances__id'); - - $$DancesTableProcessedTableManager get danceId { - final $_column = $_itemColumn('dance_id')!; - - final manager = $$DancesTableTableManager( - $_db, - $_db.dances, - ).filter((f) => f.id.sqlEquals($_column)); - final item = $_typedResult.readTableOrNull(_danceIdTable($_db)); - if (item == null) return manager; - return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: [item]), - ); - } + $$ProgramProvenanceTableReferences( + super.$_db, + super.$_table, + super.$_typedResult, + ); - static $PublishedSourcesTable _sourceIdTable(_$CompendiumDatabase db) => db - .publishedSources - .createAlias('dance_sources__source_id__published_sources__id'); + static $ProgramsTable _programIdTable(_$CompendiumDatabase db) => + db.programs.createAlias('program_provenance__program_id__programs__id'); - $$PublishedSourcesTableProcessedTableManager get sourceId { - final $_column = $_itemColumn('source_id')!; + $$ProgramsTableProcessedTableManager get programId { + final $_column = $_itemColumn('program_id')!; - final manager = $$PublishedSourcesTableTableManager( + final manager = $$ProgramsTableTableManager( $_db, - $_db.publishedSources, + $_db.programs, ).filter((f) => f.id.sqlEquals($_column)); - final item = $_typedResult.readTableOrNull(_sourceIdTable($_db)); + final item = $_typedResult.readTableOrNull(_programIdTable($_db)); if (item == null) return manager; return ProcessedTableManager( manager.$state.copyWith(prefetchedData: [item]), @@ -14151,67 +16196,65 @@ final class $$DanceSourcesTableReferences } } -class $$DanceSourcesTableFilterComposer - extends Composer<_$CompendiumDatabase, $DanceSourcesTable> { - $$DanceSourcesTableFilterComposer({ +class $$ProgramProvenanceTableFilterComposer + extends Composer<_$CompendiumDatabase, $ProgramProvenanceTable> { + $$ProgramProvenanceTableFilterComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnFilters get page => $composableBuilder( - column: $table.page, - builder: (column) => ColumnFilters(column), + ColumnWithTypeConverterFilters + get source => $composableBuilder( + column: $table.source, + builder: (column) => ColumnWithTypeConverterFilters(column), ); - ColumnFilters get number => $composableBuilder( - column: $table.number, + ColumnFilters get externalId => $composableBuilder( + column: $table.externalId, builder: (column) => ColumnFilters(column), ); - ColumnFilters get position => $composableBuilder( - column: $table.position, + ColumnFilters get importedAt => $composableBuilder( + column: $table.importedAt, builder: (column) => ColumnFilters(column), ); - $$DancesTableFilterComposer get danceId { - final $$DancesTableFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.danceId, - referencedTable: $db.dances, - getReferencedColumn: (t) => t.id, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$DancesTableFilterComposer( - $db: $db, - $table: $db.dances, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return composer; - } + ColumnFilters get permission => $composableBuilder( + column: $table.permission, + builder: (column) => ColumnFilters(column), + ); - $$PublishedSourcesTableFilterComposer get sourceId { - final $$PublishedSourcesTableFilterComposer composer = $composerBuilder( + ColumnFilters get license => $composableBuilder( + column: $table.license, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get rawPayload => $composableBuilder( + column: $table.rawPayload, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get sourceVersion => $composableBuilder( + column: $table.sourceVersion, + builder: (column) => ColumnFilters(column), + ); + + $$ProgramsTableFilterComposer get programId { + final $$ProgramsTableFilterComposer composer = $composerBuilder( composer: this, - getCurrentColumn: (t) => t.sourceId, - referencedTable: $db.publishedSources, + getCurrentColumn: (t) => t.programId, + referencedTable: $db.programs, getReferencedColumn: (t) => t.id, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$PublishedSourcesTableFilterComposer( + }) => $$ProgramsTableFilterComposer( $db: $db, - $table: $db.publishedSources, + $table: $db.programs, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: @@ -14222,67 +16265,64 @@ class $$DanceSourcesTableFilterComposer } } -class $$DanceSourcesTableOrderingComposer - extends Composer<_$CompendiumDatabase, $DanceSourcesTable> { - $$DanceSourcesTableOrderingComposer({ +class $$ProgramProvenanceTableOrderingComposer + extends Composer<_$CompendiumDatabase, $ProgramProvenanceTable> { + $$ProgramProvenanceTableOrderingComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get page => $composableBuilder( - column: $table.page, + ColumnOrderings get source => $composableBuilder( + column: $table.source, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get number => $composableBuilder( - column: $table.number, + ColumnOrderings get externalId => $composableBuilder( + column: $table.externalId, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get position => $composableBuilder( - column: $table.position, + ColumnOrderings get importedAt => $composableBuilder( + column: $table.importedAt, builder: (column) => ColumnOrderings(column), ); - $$DancesTableOrderingComposer get danceId { - final $$DancesTableOrderingComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.danceId, - referencedTable: $db.dances, - getReferencedColumn: (t) => t.id, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$DancesTableOrderingComposer( - $db: $db, - $table: $db.dances, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return composer; - } + ColumnOrderings get permission => $composableBuilder( + column: $table.permission, + builder: (column) => ColumnOrderings(column), + ); - $$PublishedSourcesTableOrderingComposer get sourceId { - final $$PublishedSourcesTableOrderingComposer composer = $composerBuilder( + ColumnOrderings get license => $composableBuilder( + column: $table.license, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get rawPayload => $composableBuilder( + column: $table.rawPayload, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get sourceVersion => $composableBuilder( + column: $table.sourceVersion, + builder: (column) => ColumnOrderings(column), + ); + + $$ProgramsTableOrderingComposer get programId { + final $$ProgramsTableOrderingComposer composer = $composerBuilder( composer: this, - getCurrentColumn: (t) => t.sourceId, - referencedTable: $db.publishedSources, + getCurrentColumn: (t) => t.programId, + referencedTable: $db.programs, getReferencedColumn: (t) => t.id, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$PublishedSourcesTableOrderingComposer( + }) => $$ProgramsTableOrderingComposer( $db: $db, - $table: $db.publishedSources, + $table: $db.programs, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: @@ -14293,61 +16333,60 @@ class $$DanceSourcesTableOrderingComposer } } -class $$DanceSourcesTableAnnotationComposer - extends Composer<_$CompendiumDatabase, $DanceSourcesTable> { - $$DanceSourcesTableAnnotationComposer({ +class $$ProgramProvenanceTableAnnotationComposer + extends Composer<_$CompendiumDatabase, $ProgramProvenanceTable> { + $$ProgramProvenanceTableAnnotationComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - GeneratedColumn get page => - $composableBuilder(column: $table.page, builder: (column) => column); + GeneratedColumnWithTypeConverter get source => + $composableBuilder(column: $table.source, builder: (column) => column); - GeneratedColumn get number => - $composableBuilder(column: $table.number, builder: (column) => column); + GeneratedColumn get externalId => $composableBuilder( + column: $table.externalId, + builder: (column) => column, + ); - GeneratedColumn get position => - $composableBuilder(column: $table.position, builder: (column) => column); + GeneratedColumn get importedAt => $composableBuilder( + column: $table.importedAt, + builder: (column) => column, + ); - $$DancesTableAnnotationComposer get danceId { - final $$DancesTableAnnotationComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.danceId, - referencedTable: $db.dances, - getReferencedColumn: (t) => t.id, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$DancesTableAnnotationComposer( - $db: $db, - $table: $db.dances, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return composer; - } + GeneratedColumn get permission => $composableBuilder( + column: $table.permission, + builder: (column) => column, + ); - $$PublishedSourcesTableAnnotationComposer get sourceId { - final $$PublishedSourcesTableAnnotationComposer composer = $composerBuilder( + GeneratedColumn get license => + $composableBuilder(column: $table.license, builder: (column) => column); + + GeneratedColumn get rawPayload => $composableBuilder( + column: $table.rawPayload, + builder: (column) => column, + ); + + GeneratedColumn get sourceVersion => $composableBuilder( + column: $table.sourceVersion, + builder: (column) => column, + ); + + $$ProgramsTableAnnotationComposer get programId { + final $$ProgramsTableAnnotationComposer composer = $composerBuilder( composer: this, - getCurrentColumn: (t) => t.sourceId, - referencedTable: $db.publishedSources, + getCurrentColumn: (t) => t.programId, + referencedTable: $db.programs, getReferencedColumn: (t) => t.id, builder: ( joinBuilder, { $addJoinBuilderToRootComposer, $removeJoinBuilderFromRootComposer, - }) => $$PublishedSourcesTableAnnotationComposer( + }) => $$ProgramsTableAnnotationComposer( $db: $db, - $table: $db.publishedSources, + $table: $db.programs, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, joinBuilder: joinBuilder, $removeJoinBuilderFromRootComposer: @@ -14358,75 +16397,90 @@ class $$DanceSourcesTableAnnotationComposer } } -class $$DanceSourcesTableTableManager +class $$ProgramProvenanceTableTableManager extends RootTableManager< _$CompendiumDatabase, - $DanceSourcesTable, - DanceSourceRow, - $$DanceSourcesTableFilterComposer, - $$DanceSourcesTableOrderingComposer, - $$DanceSourcesTableAnnotationComposer, - $$DanceSourcesTableCreateCompanionBuilder, - $$DanceSourcesTableUpdateCompanionBuilder, - (DanceSourceRow, $$DanceSourcesTableReferences), - DanceSourceRow, - PrefetchHooks Function({bool danceId, bool sourceId}) + $ProgramProvenanceTable, + ProgramProvenanceRow, + $$ProgramProvenanceTableFilterComposer, + $$ProgramProvenanceTableOrderingComposer, + $$ProgramProvenanceTableAnnotationComposer, + $$ProgramProvenanceTableCreateCompanionBuilder, + $$ProgramProvenanceTableUpdateCompanionBuilder, + (ProgramProvenanceRow, $$ProgramProvenanceTableReferences), + ProgramProvenanceRow, + PrefetchHooks Function({bool programId}) > { - $$DanceSourcesTableTableManager( + $$ProgramProvenanceTableTableManager( _$CompendiumDatabase db, - $DanceSourcesTable table, + $ProgramProvenanceTable table, ) : super( TableManagerState( db: db, table: table, createFilteringComposer: () => - $$DanceSourcesTableFilterComposer($db: db, $table: table), + $$ProgramProvenanceTableFilterComposer($db: db, $table: table), createOrderingComposer: () => - $$DanceSourcesTableOrderingComposer($db: db, $table: table), + $$ProgramProvenanceTableOrderingComposer($db: db, $table: table), createComputedFieldComposer: () => - $$DanceSourcesTableAnnotationComposer($db: db, $table: table), + $$ProgramProvenanceTableAnnotationComposer( + $db: db, + $table: table, + ), updateCompanionCallback: ({ - Value danceId = const Value.absent(), - Value sourceId = const Value.absent(), - Value page = const Value.absent(), - Value number = const Value.absent(), - Value position = const Value.absent(), + Value programId = const Value.absent(), + Value source = const Value.absent(), + Value externalId = const Value.absent(), + Value importedAt = const Value.absent(), + Value permission = const Value.absent(), + Value license = const Value.absent(), + Value rawPayload = const Value.absent(), + Value sourceVersion = const Value.absent(), Value rowid = const Value.absent(), - }) => DanceSourcesCompanion( - danceId: danceId, - sourceId: sourceId, - page: page, - number: number, - position: position, + }) => ProgramProvenanceCompanion( + programId: programId, + source: source, + externalId: externalId, + importedAt: importedAt, + permission: permission, + license: license, + rawPayload: rawPayload, + sourceVersion: sourceVersion, rowid: rowid, ), createCompanionCallback: ({ - required String danceId, - required String sourceId, - Value page = const Value.absent(), - Value number = const Value.absent(), - required int position, + required String programId, + required ProvenanceSource source, + Value externalId = const Value.absent(), + required DateTime importedAt, + Value permission = const Value.absent(), + Value license = const Value.absent(), + Value rawPayload = const Value.absent(), + Value sourceVersion = const Value.absent(), Value rowid = const Value.absent(), - }) => DanceSourcesCompanion.insert( - danceId: danceId, - sourceId: sourceId, - page: page, - number: number, - position: position, + }) => ProgramProvenanceCompanion.insert( + programId: programId, + source: source, + externalId: externalId, + importedAt: importedAt, + permission: permission, + license: license, + rawPayload: rawPayload, + sourceVersion: sourceVersion, rowid: rowid, ), withReferenceMapper: (p0) => p0 .map( (e) => ( e.readTable(table), - $$DanceSourcesTableReferences(db, table, e), + $$ProgramProvenanceTableReferences(db, table, e), ), ) .toList(), - prefetchHooksCallback: ({danceId = false, sourceId = false}) { + prefetchHooksCallback: ({programId = false}) { return PrefetchHooks( db: db, explicitlyWatchedTables: [], @@ -14446,29 +16500,18 @@ class $$DanceSourcesTableTableManager dynamic > >(state) { - if (danceId) { - state = - state.withJoin( - currentTable: table, - currentColumn: table.danceId, - referencedTable: $$DanceSourcesTableReferences - ._danceIdTable(db), - referencedColumn: $$DanceSourcesTableReferences - ._danceIdTable(db) - .id, - ) - as T; - } - if (sourceId) { + if (programId) { state = state.withJoin( currentTable: table, - currentColumn: table.sourceId, - referencedTable: $$DanceSourcesTableReferences - ._sourceIdTable(db), - referencedColumn: $$DanceSourcesTableReferences - ._sourceIdTable(db) - .id, + currentColumn: table.programId, + referencedTable: + $$ProgramProvenanceTableReferences + ._programIdTable(db), + referencedColumn: + $$ProgramProvenanceTableReferences + ._programIdTable(db) + .id, ) as T; } @@ -14484,750 +16527,555 @@ class $$DanceSourcesTableTableManager ); } -typedef $$DanceSourcesTableProcessedTableManager = +typedef $$ProgramProvenanceTableProcessedTableManager = ProcessedTableManager< _$CompendiumDatabase, - $DanceSourcesTable, - DanceSourceRow, - $$DanceSourcesTableFilterComposer, - $$DanceSourcesTableOrderingComposer, - $$DanceSourcesTableAnnotationComposer, - $$DanceSourcesTableCreateCompanionBuilder, - $$DanceSourcesTableUpdateCompanionBuilder, - (DanceSourceRow, $$DanceSourcesTableReferences), - DanceSourceRow, - PrefetchHooks Function({bool danceId, bool sourceId}) + $ProgramProvenanceTable, + ProgramProvenanceRow, + $$ProgramProvenanceTableFilterComposer, + $$ProgramProvenanceTableOrderingComposer, + $$ProgramProvenanceTableAnnotationComposer, + $$ProgramProvenanceTableCreateCompanionBuilder, + $$ProgramProvenanceTableUpdateCompanionBuilder, + (ProgramProvenanceRow, $$ProgramProvenanceTableReferences), + ProgramProvenanceRow, + PrefetchHooks Function({bool programId}) >; -typedef $$SettingsTableCreateCompanionBuilder = - SettingsCompanion Function({ - required String key, - required String valueJson, +typedef $$VenuesTableCreateCompanionBuilder = + VenuesCompanion Function({ + required String id, + required String name, + Value address1, + Value address2, + Value city, + Value stateProv, + Value country, + Value postalCode, + Value plus4, + Value website, + Value sponsor, + Value eventName, + Value time, + Value genericSchedule, + Value price, + Value notes, + Value contact1Name, + Value contact1Phone, + Value contact1Email, + Value contact2Name, + Value contact2Phone, + Value contact2Email, Value rowid, }); -typedef $$SettingsTableUpdateCompanionBuilder = - SettingsCompanion Function({ - Value key, - Value valueJson, +typedef $$VenuesTableUpdateCompanionBuilder = + VenuesCompanion Function({ + Value id, + Value name, + Value address1, + Value address2, + Value city, + Value stateProv, + Value country, + Value postalCode, + Value plus4, + Value website, + Value sponsor, + Value eventName, + Value time, + Value genericSchedule, + Value price, + Value notes, + Value contact1Name, + Value contact1Phone, + Value contact1Email, + Value contact2Name, + Value contact2Phone, + Value contact2Email, Value rowid, }); -class $$SettingsTableFilterComposer - extends Composer<_$CompendiumDatabase, $SettingsTable> { - $$SettingsTableFilterComposer({ +class $$VenuesTableFilterComposer + extends Composer<_$CompendiumDatabase, $VenuesTable> { + $$VenuesTableFilterComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnFilters get key => $composableBuilder( - column: $table.key, + ColumnFilters get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnFilters(column), ); - ColumnFilters get valueJson => $composableBuilder( - column: $table.valueJson, + ColumnFilters get name => $composableBuilder( + column: $table.name, builder: (column) => ColumnFilters(column), ); -} -class $$SettingsTableOrderingComposer - extends Composer<_$CompendiumDatabase, $SettingsTable> { - $$SettingsTableOrderingComposer({ - required super.$db, - required super.$table, - super.joinBuilder, - super.$addJoinBuilderToRootComposer, - super.$removeJoinBuilderFromRootComposer, - }); - ColumnOrderings get key => $composableBuilder( - column: $table.key, - builder: (column) => ColumnOrderings(column), + ColumnFilters get address1 => $composableBuilder( + column: $table.address1, + builder: (column) => ColumnFilters(column), ); - ColumnOrderings get valueJson => $composableBuilder( - column: $table.valueJson, - builder: (column) => ColumnOrderings(column), + ColumnFilters get address2 => $composableBuilder( + column: $table.address2, + builder: (column) => ColumnFilters(column), ); -} -class $$SettingsTableAnnotationComposer - extends Composer<_$CompendiumDatabase, $SettingsTable> { - $$SettingsTableAnnotationComposer({ - required super.$db, - required super.$table, - super.joinBuilder, - super.$addJoinBuilderToRootComposer, - super.$removeJoinBuilderFromRootComposer, - }); - GeneratedColumn get key => - $composableBuilder(column: $table.key, builder: (column) => column); + ColumnFilters get city => $composableBuilder( + column: $table.city, + builder: (column) => ColumnFilters(column), + ); - GeneratedColumn get valueJson => - $composableBuilder(column: $table.valueJson, builder: (column) => column); -} + ColumnFilters get stateProv => $composableBuilder( + column: $table.stateProv, + builder: (column) => ColumnFilters(column), + ); -class $$SettingsTableTableManager - extends - RootTableManager< - _$CompendiumDatabase, - $SettingsTable, - SettingRow, - $$SettingsTableFilterComposer, - $$SettingsTableOrderingComposer, - $$SettingsTableAnnotationComposer, - $$SettingsTableCreateCompanionBuilder, - $$SettingsTableUpdateCompanionBuilder, - ( - SettingRow, - BaseReferences<_$CompendiumDatabase, $SettingsTable, SettingRow>, - ), - SettingRow, - PrefetchHooks Function() - > { - $$SettingsTableTableManager(_$CompendiumDatabase db, $SettingsTable table) - : super( - TableManagerState( - db: db, - table: table, - createFilteringComposer: () => - $$SettingsTableFilterComposer($db: db, $table: table), - createOrderingComposer: () => - $$SettingsTableOrderingComposer($db: db, $table: table), - createComputedFieldComposer: () => - $$SettingsTableAnnotationComposer($db: db, $table: table), - updateCompanionCallback: - ({ - Value key = const Value.absent(), - Value valueJson = const Value.absent(), - Value rowid = const Value.absent(), - }) => SettingsCompanion( - key: key, - valueJson: valueJson, - rowid: rowid, - ), - createCompanionCallback: - ({ - required String key, - required String valueJson, - Value rowid = const Value.absent(), - }) => SettingsCompanion.insert( - key: key, - valueJson: valueJson, - rowid: rowid, - ), - withReferenceMapper: (p0) => p0 - .map((e) => (e.readTable(table), BaseReferences(db, table, e))) - .toList(), - prefetchHooksCallback: null, - ), - ); -} + ColumnFilters get country => $composableBuilder( + column: $table.country, + builder: (column) => ColumnFilters(column), + ); -typedef $$SettingsTableProcessedTableManager = - ProcessedTableManager< - _$CompendiumDatabase, - $SettingsTable, - SettingRow, - $$SettingsTableFilterComposer, - $$SettingsTableOrderingComposer, - $$SettingsTableAnnotationComposer, - $$SettingsTableCreateCompanionBuilder, - $$SettingsTableUpdateCompanionBuilder, - ( - SettingRow, - BaseReferences<_$CompendiumDatabase, $SettingsTable, SettingRow>, - ), - SettingRow, - PrefetchHooks Function() - >; -typedef $$SnapshotsTableCreateCompanionBuilder = - SnapshotsCompanion Function({ - required String source, - required DateTime snapshotDate, - required String manifestJson, - required DateTime importedAt, - Value rowid, - }); -typedef $$SnapshotsTableUpdateCompanionBuilder = - SnapshotsCompanion Function({ - Value source, - Value snapshotDate, - Value manifestJson, - Value importedAt, - Value rowid, - }); + ColumnFilters get postalCode => $composableBuilder( + column: $table.postalCode, + builder: (column) => ColumnFilters(column), + ); -class $$SnapshotsTableFilterComposer - extends Composer<_$CompendiumDatabase, $SnapshotsTable> { - $$SnapshotsTableFilterComposer({ - required super.$db, - required super.$table, - super.joinBuilder, - super.$addJoinBuilderToRootComposer, - super.$removeJoinBuilderFromRootComposer, - }); - ColumnFilters get source => $composableBuilder( - column: $table.source, + ColumnFilters get plus4 => $composableBuilder( + column: $table.plus4, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get website => $composableBuilder( + column: $table.website, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get sponsor => $composableBuilder( + column: $table.sponsor, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get eventName => $composableBuilder( + column: $table.eventName, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get time => $composableBuilder( + column: $table.time, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get genericSchedule => $composableBuilder( + column: $table.genericSchedule, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get price => $composableBuilder( + column: $table.price, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get notes => $composableBuilder( + column: $table.notes, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get contact1Name => $composableBuilder( + column: $table.contact1Name, builder: (column) => ColumnFilters(column), ); - ColumnFilters get snapshotDate => $composableBuilder( - column: $table.snapshotDate, + ColumnFilters get contact1Phone => $composableBuilder( + column: $table.contact1Phone, builder: (column) => ColumnFilters(column), ); - ColumnFilters get manifestJson => $composableBuilder( - column: $table.manifestJson, + ColumnFilters get contact1Email => $composableBuilder( + column: $table.contact1Email, builder: (column) => ColumnFilters(column), ); - ColumnFilters get importedAt => $composableBuilder( - column: $table.importedAt, + ColumnFilters get contact2Name => $composableBuilder( + column: $table.contact2Name, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get contact2Phone => $composableBuilder( + column: $table.contact2Phone, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get contact2Email => $composableBuilder( + column: $table.contact2Email, builder: (column) => ColumnFilters(column), ); } -class $$SnapshotsTableOrderingComposer - extends Composer<_$CompendiumDatabase, $SnapshotsTable> { - $$SnapshotsTableOrderingComposer({ +class $$VenuesTableOrderingComposer + extends Composer<_$CompendiumDatabase, $VenuesTable> { + $$VenuesTableOrderingComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get source => $composableBuilder( - column: $table.source, + ColumnOrderings get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get snapshotDate => $composableBuilder( - column: $table.snapshotDate, + ColumnOrderings get name => $composableBuilder( + column: $table.name, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get manifestJson => $composableBuilder( - column: $table.manifestJson, + ColumnOrderings get address1 => $composableBuilder( + column: $table.address1, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get importedAt => $composableBuilder( - column: $table.importedAt, + ColumnOrderings get address2 => $composableBuilder( + column: $table.address2, builder: (column) => ColumnOrderings(column), ); -} - -class $$SnapshotsTableAnnotationComposer - extends Composer<_$CompendiumDatabase, $SnapshotsTable> { - $$SnapshotsTableAnnotationComposer({ - required super.$db, - required super.$table, - super.joinBuilder, - super.$addJoinBuilderToRootComposer, - super.$removeJoinBuilderFromRootComposer, - }); - GeneratedColumn get source => - $composableBuilder(column: $table.source, builder: (column) => column); - - GeneratedColumn get snapshotDate => $composableBuilder( - column: $table.snapshotDate, - builder: (column) => column, - ); - - GeneratedColumn get manifestJson => $composableBuilder( - column: $table.manifestJson, - builder: (column) => column, - ); - GeneratedColumn get importedAt => $composableBuilder( - column: $table.importedAt, - builder: (column) => column, + ColumnOrderings get city => $composableBuilder( + column: $table.city, + builder: (column) => ColumnOrderings(column), ); -} - -class $$SnapshotsTableTableManager - extends - RootTableManager< - _$CompendiumDatabase, - $SnapshotsTable, - SnapshotRow, - $$SnapshotsTableFilterComposer, - $$SnapshotsTableOrderingComposer, - $$SnapshotsTableAnnotationComposer, - $$SnapshotsTableCreateCompanionBuilder, - $$SnapshotsTableUpdateCompanionBuilder, - ( - SnapshotRow, - BaseReferences<_$CompendiumDatabase, $SnapshotsTable, SnapshotRow>, - ), - SnapshotRow, - PrefetchHooks Function() - > { - $$SnapshotsTableTableManager(_$CompendiumDatabase db, $SnapshotsTable table) - : super( - TableManagerState( - db: db, - table: table, - createFilteringComposer: () => - $$SnapshotsTableFilterComposer($db: db, $table: table), - createOrderingComposer: () => - $$SnapshotsTableOrderingComposer($db: db, $table: table), - createComputedFieldComposer: () => - $$SnapshotsTableAnnotationComposer($db: db, $table: table), - updateCompanionCallback: - ({ - Value source = const Value.absent(), - Value snapshotDate = const Value.absent(), - Value manifestJson = const Value.absent(), - Value importedAt = const Value.absent(), - Value rowid = const Value.absent(), - }) => SnapshotsCompanion( - source: source, - snapshotDate: snapshotDate, - manifestJson: manifestJson, - importedAt: importedAt, - rowid: rowid, - ), - createCompanionCallback: - ({ - required String source, - required DateTime snapshotDate, - required String manifestJson, - required DateTime importedAt, - Value rowid = const Value.absent(), - }) => SnapshotsCompanion.insert( - source: source, - snapshotDate: snapshotDate, - manifestJson: manifestJson, - importedAt: importedAt, - rowid: rowid, - ), - withReferenceMapper: (p0) => p0 - .map((e) => (e.readTable(table), BaseReferences(db, table, e))) - .toList(), - prefetchHooksCallback: null, - ), - ); -} - -typedef $$SnapshotsTableProcessedTableManager = - ProcessedTableManager< - _$CompendiumDatabase, - $SnapshotsTable, - SnapshotRow, - $$SnapshotsTableFilterComposer, - $$SnapshotsTableOrderingComposer, - $$SnapshotsTableAnnotationComposer, - $$SnapshotsTableCreateCompanionBuilder, - $$SnapshotsTableUpdateCompanionBuilder, - ( - SnapshotRow, - BaseReferences<_$CompendiumDatabase, $SnapshotsTable, SnapshotRow>, - ), - SnapshotRow, - PrefetchHooks Function() - >; -typedef $$ProgramProvenanceTableCreateCompanionBuilder = - ProgramProvenanceCompanion Function({ - required String programId, - required ProvenanceSource source, - Value externalId, - required DateTime importedAt, - Value permission, - Value license, - Value rawPayload, - Value sourceVersion, - Value rowid, - }); -typedef $$ProgramProvenanceTableUpdateCompanionBuilder = - ProgramProvenanceCompanion Function({ - Value programId, - Value source, - Value externalId, - Value importedAt, - Value permission, - Value license, - Value rawPayload, - Value sourceVersion, - Value rowid, - }); -final class $$ProgramProvenanceTableReferences - extends - BaseReferences< - _$CompendiumDatabase, - $ProgramProvenanceTable, - ProgramProvenanceRow - > { - $$ProgramProvenanceTableReferences( - super.$_db, - super.$_table, - super.$_typedResult, + ColumnOrderings get stateProv => $composableBuilder( + column: $table.stateProv, + builder: (column) => ColumnOrderings(column), ); - static $ProgramsTable _programIdTable(_$CompendiumDatabase db) => - db.programs.createAlias('program_provenance__program_id__programs__id'); - - $$ProgramsTableProcessedTableManager get programId { - final $_column = $_itemColumn('program_id')!; - - final manager = $$ProgramsTableTableManager( - $_db, - $_db.programs, - ).filter((f) => f.id.sqlEquals($_column)); - final item = $_typedResult.readTableOrNull(_programIdTable($_db)); - if (item == null) return manager; - return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: [item]), - ); - } -} - -class $$ProgramProvenanceTableFilterComposer - extends Composer<_$CompendiumDatabase, $ProgramProvenanceTable> { - $$ProgramProvenanceTableFilterComposer({ - required super.$db, - required super.$table, - super.joinBuilder, - super.$addJoinBuilderToRootComposer, - super.$removeJoinBuilderFromRootComposer, - }); - ColumnWithTypeConverterFilters - get source => $composableBuilder( - column: $table.source, - builder: (column) => ColumnWithTypeConverterFilters(column), + ColumnOrderings get country => $composableBuilder( + column: $table.country, + builder: (column) => ColumnOrderings(column), ); - ColumnFilters get externalId => $composableBuilder( - column: $table.externalId, - builder: (column) => ColumnFilters(column), + ColumnOrderings get postalCode => $composableBuilder( + column: $table.postalCode, + builder: (column) => ColumnOrderings(column), ); - ColumnFilters get importedAt => $composableBuilder( - column: $table.importedAt, - builder: (column) => ColumnFilters(column), + ColumnOrderings get plus4 => $composableBuilder( + column: $table.plus4, + builder: (column) => ColumnOrderings(column), ); - ColumnFilters get permission => $composableBuilder( - column: $table.permission, - builder: (column) => ColumnFilters(column), + ColumnOrderings get website => $composableBuilder( + column: $table.website, + builder: (column) => ColumnOrderings(column), ); - ColumnFilters get license => $composableBuilder( - column: $table.license, - builder: (column) => ColumnFilters(column), + ColumnOrderings get sponsor => $composableBuilder( + column: $table.sponsor, + builder: (column) => ColumnOrderings(column), ); - ColumnFilters get rawPayload => $composableBuilder( - column: $table.rawPayload, - builder: (column) => ColumnFilters(column), + ColumnOrderings get eventName => $composableBuilder( + column: $table.eventName, + builder: (column) => ColumnOrderings(column), ); - ColumnFilters get sourceVersion => $composableBuilder( - column: $table.sourceVersion, - builder: (column) => ColumnFilters(column), + ColumnOrderings get time => $composableBuilder( + column: $table.time, + builder: (column) => ColumnOrderings(column), ); - $$ProgramsTableFilterComposer get programId { - final $$ProgramsTableFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.programId, - referencedTable: $db.programs, - getReferencedColumn: (t) => t.id, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$ProgramsTableFilterComposer( - $db: $db, - $table: $db.programs, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return composer; - } -} + ColumnOrderings get genericSchedule => $composableBuilder( + column: $table.genericSchedule, + builder: (column) => ColumnOrderings(column), + ); -class $$ProgramProvenanceTableOrderingComposer - extends Composer<_$CompendiumDatabase, $ProgramProvenanceTable> { - $$ProgramProvenanceTableOrderingComposer({ - required super.$db, - required super.$table, - super.joinBuilder, - super.$addJoinBuilderToRootComposer, - super.$removeJoinBuilderFromRootComposer, - }); - ColumnOrderings get source => $composableBuilder( - column: $table.source, + ColumnOrderings get price => $composableBuilder( + column: $table.price, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get externalId => $composableBuilder( - column: $table.externalId, + ColumnOrderings get notes => $composableBuilder( + column: $table.notes, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get importedAt => $composableBuilder( - column: $table.importedAt, + ColumnOrderings get contact1Name => $composableBuilder( + column: $table.contact1Name, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get permission => $composableBuilder( - column: $table.permission, + ColumnOrderings get contact1Phone => $composableBuilder( + column: $table.contact1Phone, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get license => $composableBuilder( - column: $table.license, + ColumnOrderings get contact1Email => $composableBuilder( + column: $table.contact1Email, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get rawPayload => $composableBuilder( - column: $table.rawPayload, + ColumnOrderings get contact2Name => $composableBuilder( + column: $table.contact2Name, builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get sourceVersion => $composableBuilder( - column: $table.sourceVersion, + ColumnOrderings get contact2Phone => $composableBuilder( + column: $table.contact2Phone, builder: (column) => ColumnOrderings(column), ); - $$ProgramsTableOrderingComposer get programId { - final $$ProgramsTableOrderingComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.programId, - referencedTable: $db.programs, - getReferencedColumn: (t) => t.id, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$ProgramsTableOrderingComposer( - $db: $db, - $table: $db.programs, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return composer; - } + ColumnOrderings get contact2Email => $composableBuilder( + column: $table.contact2Email, + builder: (column) => ColumnOrderings(column), + ); } -class $$ProgramProvenanceTableAnnotationComposer - extends Composer<_$CompendiumDatabase, $ProgramProvenanceTable> { - $$ProgramProvenanceTableAnnotationComposer({ +class $$VenuesTableAnnotationComposer + extends Composer<_$CompendiumDatabase, $VenuesTable> { + $$VenuesTableAnnotationComposer({ required super.$db, required super.$table, super.joinBuilder, super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - GeneratedColumnWithTypeConverter get source => - $composableBuilder(column: $table.source, builder: (column) => column); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); - GeneratedColumn get externalId => $composableBuilder( - column: $table.externalId, + GeneratedColumn get name => + $composableBuilder(column: $table.name, builder: (column) => column); + + GeneratedColumn get address1 => + $composableBuilder(column: $table.address1, builder: (column) => column); + + GeneratedColumn get address2 => + $composableBuilder(column: $table.address2, builder: (column) => column); + + GeneratedColumn get city => + $composableBuilder(column: $table.city, builder: (column) => column); + + GeneratedColumn get stateProv => + $composableBuilder(column: $table.stateProv, builder: (column) => column); + + GeneratedColumn get country => + $composableBuilder(column: $table.country, builder: (column) => column); + + GeneratedColumn get postalCode => $composableBuilder( + column: $table.postalCode, builder: (column) => column, ); - GeneratedColumn get importedAt => $composableBuilder( - column: $table.importedAt, + GeneratedColumn get plus4 => + $composableBuilder(column: $table.plus4, builder: (column) => column); + + GeneratedColumn get website => + $composableBuilder(column: $table.website, builder: (column) => column); + + GeneratedColumn get sponsor => + $composableBuilder(column: $table.sponsor, builder: (column) => column); + + GeneratedColumn get eventName => + $composableBuilder(column: $table.eventName, builder: (column) => column); + + GeneratedColumn get time => + $composableBuilder(column: $table.time, builder: (column) => column); + + GeneratedColumn get genericSchedule => $composableBuilder( + column: $table.genericSchedule, builder: (column) => column, ); - GeneratedColumn get permission => $composableBuilder( - column: $table.permission, + GeneratedColumn get price => + $composableBuilder(column: $table.price, builder: (column) => column); + + GeneratedColumn get notes => + $composableBuilder(column: $table.notes, builder: (column) => column); + + GeneratedColumn get contact1Name => $composableBuilder( + column: $table.contact1Name, builder: (column) => column, ); - GeneratedColumn get license => - $composableBuilder(column: $table.license, builder: (column) => column); + GeneratedColumn get contact1Phone => $composableBuilder( + column: $table.contact1Phone, + builder: (column) => column, + ); - GeneratedColumn get rawPayload => $composableBuilder( - column: $table.rawPayload, + GeneratedColumn get contact1Email => $composableBuilder( + column: $table.contact1Email, builder: (column) => column, ); - GeneratedColumn get sourceVersion => $composableBuilder( - column: $table.sourceVersion, + GeneratedColumn get contact2Name => $composableBuilder( + column: $table.contact2Name, builder: (column) => column, ); - $$ProgramsTableAnnotationComposer get programId { - final $$ProgramsTableAnnotationComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.programId, - referencedTable: $db.programs, - getReferencedColumn: (t) => t.id, - builder: - ( - joinBuilder, { - $addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer, - }) => $$ProgramsTableAnnotationComposer( - $db: $db, - $table: $db.programs, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - ), - ); - return composer; - } + GeneratedColumn get contact2Phone => $composableBuilder( + column: $table.contact2Phone, + builder: (column) => column, + ); + + GeneratedColumn get contact2Email => $composableBuilder( + column: $table.contact2Email, + builder: (column) => column, + ); } -class $$ProgramProvenanceTableTableManager +class $$VenuesTableTableManager extends RootTableManager< _$CompendiumDatabase, - $ProgramProvenanceTable, - ProgramProvenanceRow, - $$ProgramProvenanceTableFilterComposer, - $$ProgramProvenanceTableOrderingComposer, - $$ProgramProvenanceTableAnnotationComposer, - $$ProgramProvenanceTableCreateCompanionBuilder, - $$ProgramProvenanceTableUpdateCompanionBuilder, - (ProgramProvenanceRow, $$ProgramProvenanceTableReferences), - ProgramProvenanceRow, - PrefetchHooks Function({bool programId}) + $VenuesTable, + VenueRow, + $$VenuesTableFilterComposer, + $$VenuesTableOrderingComposer, + $$VenuesTableAnnotationComposer, + $$VenuesTableCreateCompanionBuilder, + $$VenuesTableUpdateCompanionBuilder, + ( + VenueRow, + BaseReferences<_$CompendiumDatabase, $VenuesTable, VenueRow>, + ), + VenueRow, + PrefetchHooks Function() > { - $$ProgramProvenanceTableTableManager( - _$CompendiumDatabase db, - $ProgramProvenanceTable table, - ) : super( + $$VenuesTableTableManager(_$CompendiumDatabase db, $VenuesTable table) + : super( TableManagerState( db: db, table: table, createFilteringComposer: () => - $$ProgramProvenanceTableFilterComposer($db: db, $table: table), + $$VenuesTableFilterComposer($db: db, $table: table), createOrderingComposer: () => - $$ProgramProvenanceTableOrderingComposer($db: db, $table: table), + $$VenuesTableOrderingComposer($db: db, $table: table), createComputedFieldComposer: () => - $$ProgramProvenanceTableAnnotationComposer( - $db: db, - $table: table, - ), + $$VenuesTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ - Value programId = const Value.absent(), - Value source = const Value.absent(), - Value externalId = const Value.absent(), - Value importedAt = const Value.absent(), - Value permission = const Value.absent(), - Value license = const Value.absent(), - Value rawPayload = const Value.absent(), - Value sourceVersion = const Value.absent(), + Value id = const Value.absent(), + Value name = const Value.absent(), + Value address1 = const Value.absent(), + Value address2 = const Value.absent(), + Value city = const Value.absent(), + Value stateProv = const Value.absent(), + Value country = const Value.absent(), + Value postalCode = const Value.absent(), + Value plus4 = const Value.absent(), + Value website = const Value.absent(), + Value sponsor = const Value.absent(), + Value eventName = const Value.absent(), + Value time = const Value.absent(), + Value genericSchedule = const Value.absent(), + Value price = const Value.absent(), + Value notes = const Value.absent(), + Value contact1Name = const Value.absent(), + Value contact1Phone = const Value.absent(), + Value contact1Email = const Value.absent(), + Value contact2Name = const Value.absent(), + Value contact2Phone = const Value.absent(), + Value contact2Email = const Value.absent(), Value rowid = const Value.absent(), - }) => ProgramProvenanceCompanion( - programId: programId, - source: source, - externalId: externalId, - importedAt: importedAt, - permission: permission, - license: license, - rawPayload: rawPayload, - sourceVersion: sourceVersion, + }) => VenuesCompanion( + id: id, + name: name, + address1: address1, + address2: address2, + city: city, + stateProv: stateProv, + country: country, + postalCode: postalCode, + plus4: plus4, + website: website, + sponsor: sponsor, + eventName: eventName, + time: time, + genericSchedule: genericSchedule, + price: price, + notes: notes, + contact1Name: contact1Name, + contact1Phone: contact1Phone, + contact1Email: contact1Email, + contact2Name: contact2Name, + contact2Phone: contact2Phone, + contact2Email: contact2Email, rowid: rowid, ), createCompanionCallback: ({ - required String programId, - required ProvenanceSource source, - Value externalId = const Value.absent(), - required DateTime importedAt, - Value permission = const Value.absent(), - Value license = const Value.absent(), - Value rawPayload = const Value.absent(), - Value sourceVersion = const Value.absent(), + required String id, + required String name, + Value address1 = const Value.absent(), + Value address2 = const Value.absent(), + Value city = const Value.absent(), + Value stateProv = const Value.absent(), + Value country = const Value.absent(), + Value postalCode = const Value.absent(), + Value plus4 = const Value.absent(), + Value website = const Value.absent(), + Value sponsor = const Value.absent(), + Value eventName = const Value.absent(), + Value time = const Value.absent(), + Value genericSchedule = const Value.absent(), + Value price = const Value.absent(), + Value notes = const Value.absent(), + Value contact1Name = const Value.absent(), + Value contact1Phone = const Value.absent(), + Value contact1Email = const Value.absent(), + Value contact2Name = const Value.absent(), + Value contact2Phone = const Value.absent(), + Value contact2Email = const Value.absent(), Value rowid = const Value.absent(), - }) => ProgramProvenanceCompanion.insert( - programId: programId, - source: source, - externalId: externalId, - importedAt: importedAt, - permission: permission, - license: license, - rawPayload: rawPayload, - sourceVersion: sourceVersion, + }) => VenuesCompanion.insert( + id: id, + name: name, + address1: address1, + address2: address2, + city: city, + stateProv: stateProv, + country: country, + postalCode: postalCode, + plus4: plus4, + website: website, + sponsor: sponsor, + eventName: eventName, + time: time, + genericSchedule: genericSchedule, + price: price, + notes: notes, + contact1Name: contact1Name, + contact1Phone: contact1Phone, + contact1Email: contact1Email, + contact2Name: contact2Name, + contact2Phone: contact2Phone, + contact2Email: contact2Email, rowid: rowid, ), withReferenceMapper: (p0) => p0 - .map( - (e) => ( - e.readTable(table), - $$ProgramProvenanceTableReferences(db, table, e), - ), - ) + .map((e) => (e.readTable(table), BaseReferences(db, table, e))) .toList(), - prefetchHooksCallback: ({programId = false}) { - return PrefetchHooks( - db: db, - explicitlyWatchedTables: [], - addJoins: - < - T extends TableManagerState< - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic, - dynamic - > - >(state) { - if (programId) { - state = - state.withJoin( - currentTable: table, - currentColumn: table.programId, - referencedTable: - $$ProgramProvenanceTableReferences - ._programIdTable(db), - referencedColumn: - $$ProgramProvenanceTableReferences - ._programIdTable(db) - .id, - ) - as T; - } - - return state; - }, - getPrefetchedDataCallback: (items) async { - return []; - }, - ); - }, + prefetchHooksCallback: null, ), ); } -typedef $$ProgramProvenanceTableProcessedTableManager = +typedef $$VenuesTableProcessedTableManager = ProcessedTableManager< _$CompendiumDatabase, - $ProgramProvenanceTable, - ProgramProvenanceRow, - $$ProgramProvenanceTableFilterComposer, - $$ProgramProvenanceTableOrderingComposer, - $$ProgramProvenanceTableAnnotationComposer, - $$ProgramProvenanceTableCreateCompanionBuilder, - $$ProgramProvenanceTableUpdateCompanionBuilder, - (ProgramProvenanceRow, $$ProgramProvenanceTableReferences), - ProgramProvenanceRow, - PrefetchHooks Function({bool programId}) + $VenuesTable, + VenueRow, + $$VenuesTableFilterComposer, + $$VenuesTableOrderingComposer, + $$VenuesTableAnnotationComposer, + $$VenuesTableCreateCompanionBuilder, + $$VenuesTableUpdateCompanionBuilder, + (VenueRow, BaseReferences<_$CompendiumDatabase, $VenuesTable, VenueRow>), + VenueRow, + PrefetchHooks Function() >; class $CompendiumDatabaseManager { @@ -15266,4 +17114,6 @@ class $CompendiumDatabaseManager { $$SnapshotsTableTableManager(_db, _db.snapshots); $$ProgramProvenanceTableTableManager get programProvenance => $$ProgramProvenanceTableTableManager(_db, _db.programProvenance); + $$VenuesTableTableManager get venues => + $$VenuesTableTableManager(_db, _db.venues); } diff --git a/packages/compendium_core/lib/src/storage/repositories/program_repository.dart b/packages/compendium_core/lib/src/storage/repositories/program_repository.dart index 02f97a96..bfc3c266 100644 --- a/packages/compendium_core/lib/src/storage/repositories/program_repository.dart +++ b/packages/compendium_core/lib/src/storage/repositories/program_repository.dart @@ -172,6 +172,7 @@ class ProgramRepository { title: program.title, eventDate: Value(program.eventDate), venue: Value(program.venue), + venueId: Value(program.venueId), band: Value(program.band), caller: Value(program.caller), dancerLevel: Value(program.dancerLevel), @@ -568,6 +569,7 @@ class ProgramRepository { title: row.title, eventDate: asUtcOrNull(row.eventDate), venue: row.venue, + venueId: row.venueId, band: row.band, caller: row.caller, dancerLevel: row.dancerLevel, diff --git a/packages/compendium_core/lib/src/storage/repositories/repositories.dart b/packages/compendium_core/lib/src/storage/repositories/repositories.dart index 27fd87e3..41fc7ffa 100644 --- a/packages/compendium_core/lib/src/storage/repositories/repositories.dart +++ b/packages/compendium_core/lib/src/storage/repositories/repositories.dart @@ -11,6 +11,7 @@ import 'published_source_repository.dart'; import 'settings_repository.dart'; import 'snapshot_repository.dart'; import 'tag_repository.dart'; +import 'venue_repository.dart'; /// Bundles every repository over a single [CompendiumDatabase], so app code /// wires up storage once (`CompendiumRepositories(db, taxonomy)`) instead of @@ -26,6 +27,7 @@ class CompendiumRepositories { customFieldDefs = CustomFieldDefRepository(db), programs = ProgramRepository(db), publishedSources = PublishedSourceRepository(db), + venues = VenueRepository(db), settings = settings ?? SettingsRepository(db), snapshots = SnapshotRepository(db); @@ -36,6 +38,7 @@ class CompendiumRepositories { final CustomFieldDefRepository customFieldDefs; final ProgramRepository programs; final PublishedSourceRepository publishedSources; + final VenueRepository venues; final SettingsRepository settings; final SnapshotRepository snapshots; diff --git a/packages/compendium_core/lib/src/storage/repositories/venue_repository.dart b/packages/compendium_core/lib/src/storage/repositories/venue_repository.dart new file mode 100644 index 00000000..6f30cc9f --- /dev/null +++ b/packages/compendium_core/lib/src/storage/repositories/venue_repository.dart @@ -0,0 +1,102 @@ +import 'package:drift/drift.dart'; + +import '../../model/venue.dart'; +import '../database.dart'; + +/// CRUD for [Venue] rows — the reusable venue entity many programs are held at. +/// Mirrors `PublishedSourceRepository`: editing a venue's address/contacts/ +/// schedule happens in one place and a delete is guarded while the venue is +/// still referenced by any program's `venue_id`. +class VenueRepository { + VenueRepository(this._db); + + final CompendiumDatabase _db; + + Future upsert(Venue v) => _db + .into(_db.venues) + .insertOnConflictUpdate( + VenuesCompanion.insert( + id: v.id, + name: v.name, + address1: Value(v.address1), + address2: Value(v.address2), + city: Value(v.city), + stateProv: Value(v.stateProv), + country: Value(v.country), + postalCode: Value(v.postalCode), + plus4: Value(v.plus4), + website: Value(v.website), + sponsor: Value(v.sponsor), + eventName: Value(v.eventName), + time: Value(v.time), + genericSchedule: Value(v.genericSchedule), + price: Value(v.price), + notes: Value(v.notes), + contact1Name: Value(v.contact1Name), + contact1Phone: Value(v.contact1Phone), + contact1Email: Value(v.contact1Email), + contact2Name: Value(v.contact2Name), + contact2Phone: Value(v.contact2Phone), + contact2Email: Value(v.contact2Email), + ), + ); + + Future getById(String id) async { + final row = await (_db.select( + _db.venues, + )..where((t) => t.id.equals(id))).getSingleOrNull(); + return row == null ? null : _toModel(row); + } + + Future> listAll() async { + final rows = + await (_db.select(_db.venues)..orderBy([ + (t) => OrderingTerm(expression: t.name.collate(Collate.noCase)), + ])) + .get(); + return rows.map(_toModel).toList(); + } + + /// Throws if [id] is still referenced by any `programs.venue_id` — callers + /// must unlink (or delete) the referencing programs first, since deleting a + /// venue out from under a linked program would orphan its reference. Mirrors + /// the `PublishedSourceRepository` delete guard (adapted from the + /// `dance_sources` join to the `programs.venue_id` column). + Future delete(String id) async { + final stillUsed = await (_db.select( + _db.programs, + )..where((t) => t.venueId.equals(id))).get(); + if (stillUsed.isNotEmpty) { + throw StateError( + 'cannot delete venue "$id": still referenced by ' + '${stillUsed.length} program(s)', + ); + } + await (_db.delete(_db.venues)..where((t) => t.id.equals(id))).go(); + } + + Venue _toModel(VenueRow row) => Venue( + id: row.id, + name: row.name, + address1: row.address1, + address2: row.address2, + city: row.city, + stateProv: row.stateProv, + country: row.country, + postalCode: row.postalCode, + plus4: row.plus4, + website: row.website, + sponsor: row.sponsor, + eventName: row.eventName, + time: row.time, + genericSchedule: row.genericSchedule, + price: row.price, + notes: row.notes, + contact1Name: row.contact1Name, + contact1Phone: row.contact1Phone, + contact1Email: row.contact1Email, + contact2Name: row.contact2Name, + contact2Phone: row.contact2Phone, + contact2Email: row.contact2Email, + ); +} diff --git a/packages/compendium_core/lib/src/storage/tables.dart b/packages/compendium_core/lib/src/storage/tables.dart index d926d99c..b340e3c8 100644 --- a/packages/compendium_core/lib/src/storage/tables.dart +++ b/packages/compendium_core/lib/src/storage/tables.dart @@ -145,6 +145,15 @@ class Programs extends Table { TextColumn get title => text()(); DateTimeColumn get eventDate => dateTime().nullable()(); TextColumn get venue => text().nullable()(); + + /// Optional reference to a first-class [Venues] row (`venues.id`), added in + /// schema v13. A deliberately un-constrained soft reference (no drift + /// `.references()`/FK): the free-text [venue] label and this entity link + /// coexist non-destructively, and referential integrity is enforced at the + /// app layer by `VenueRepository.delete`'s guard rather than a DB constraint + /// (so an import can carry a program whose venue record is absent without + /// tripping a foreign key). + TextColumn get venueId => text().nullable()(); TextColumn get band => text().nullable()(); TextColumn get caller => text().nullable()(); TextColumn get dancerLevel => text().nullable()(); @@ -295,6 +304,44 @@ class DanceSources extends Table { ]; } +/// A reusable venue (hall, church, grange, festival site) that programs are +/// held at. A first-class entity (like [PublishedSources]/[Choreographers]); +/// a program links to it by [Programs.venueId] while the free-text +/// [Programs.venue] label persists independently. Added in schema v13. +/// +/// Faithful to Caller's Companion's `Venue` table minus its FileMaker plumbing +/// (`VenueDisplay_c`, `zc_*`/`zi_*`, `zk_Constant`, `SiteID`): CC's stored +/// display column is reimplemented as the computed `Venue.displayName` getter, +/// not persisted here. All columns are `.nullable()` except [id] and [name]. +@DataClassName('VenueRow') +class Venues extends Table { + TextColumn get id => text()(); + TextColumn get name => text()(); + TextColumn get address1 => text().nullable()(); + TextColumn get address2 => text().nullable()(); + TextColumn get city => text().nullable()(); + TextColumn get stateProv => text().nullable()(); + TextColumn get country => text().nullable()(); + TextColumn get postalCode => text().nullable()(); + TextColumn get plus4 => text().nullable()(); + TextColumn get website => text().nullable()(); + TextColumn get sponsor => text().nullable()(); + TextColumn get eventName => text().nullable()(); + TextColumn get time => text().nullable()(); + TextColumn get genericSchedule => text().nullable()(); + TextColumn get price => text().nullable()(); + TextColumn get notes => text().nullable()(); + TextColumn get contact1Name => text().nullable()(); + TextColumn get contact1Phone => text().nullable()(); + TextColumn get contact1Email => text().nullable()(); + TextColumn get contact2Name => text().nullable()(); + TextColumn get contact2Phone => text().nullable()(); + TextColumn get contact2Email => text().nullable()(); + + @override + Set get primaryKey => {id}; +} + /// Import provenance, one row per dance (at most). @DataClassName('ProvenanceRow') class Provenance extends Table { diff --git a/packages/compendium_core/test/model/venue_test.dart b/packages/compendium_core/test/model/venue_test.dart new file mode 100644 index 00000000..65f52c8e --- /dev/null +++ b/packages/compendium_core/test/model/venue_test.dart @@ -0,0 +1,154 @@ +import 'package:compendium_core/compendium_core.dart'; +import 'package:test/test.dart'; + +void main() { + group('validation', () { + test('requires a non-empty name', () { + expect( + () => Venue(id: 'v1', name: ''), + throwsA(isA()), + ); + expect( + () => Venue(id: 'v1', name: ' '), + throwsA(isA()), + ); + }); + + test('accepts a minimal venue with just id + name', () { + final v = Venue(id: 'v1', name: 'Guiding Star Grange'); + expect(v.id, 'v1'); + expect(v.name, 'Guiding Star Grange'); + expect(v.city, isNull); + expect(v.contact1Email, isNull); + }); + }); + + group('_normalize', () { + test('maps empty/whitespace optional strings to null', () { + final v = Venue( + id: 'v1', + name: 'Hall', + address1: '', + city: ' ', + notes: '\t\n', + contact1Email: '', + ); + expect(v.address1, isNull); + expect(v.city, isNull); + expect(v.notes, isNull); + expect(v.contact1Email, isNull); + }); + + test('trims surrounding whitespace on kept values', () { + final v = Venue(id: 'v1', name: 'Hall', city: ' Greenfield '); + expect(v.city, 'Greenfield'); + }); + + test('does not trim the required name (kept verbatim once non-empty)', () { + // The name is validated (non-empty) but not normalized/trimmed. + final v = Venue(id: 'v1', name: ' The Grange '); + expect(v.name, ' The Grange '); + }); + }); + + group('copyWith', () { + final base = Venue( + id: 'v1', + name: 'Hall', + city: 'Greenfield', + stateProv: 'MA', + contact1Name: 'Pat', + contact1Email: 'pat@example.com', + ); + + test('replaces provided fields and keeps the rest', () { + final updated = base.copyWith(name: 'New Hall', city: 'Amherst'); + expect(updated.name, 'New Hall'); + expect(updated.city, 'Amherst'); + expect(updated.stateProv, 'MA'); + expect(updated.contact1Name, 'Pat'); + expect(updated.id, 'v1'); + }); + + test('clear* flags null the field', () { + final updated = base.copyWith(clearCity: true, clearContact1Email: true); + expect(updated.city, isNull); + expect(updated.contact1Email, isNull); + expect(updated.stateProv, 'MA'); + }); + + test('clear* flag wins over a value passed for the same field', () { + final updated = base.copyWith(city: 'Ignored', clearCity: true); + expect(updated.city, isNull); + }); + + test('normalizes values passed through copyWith', () { + final updated = base.copyWith(stateProv: ' '); + // An all-whitespace value normalizes to null rather than being kept. + expect(updated.stateProv, isNull); + }); + }); + + group('displayName', () { + test('joins name + address1 + city + stateProv + country, skipping nulls', () { + final v = Venue( + id: 'v1', + name: 'Guiding Star Grange', + address1: '401 Chapman St', + city: 'Greenfield', + stateProv: 'MA', + country: 'USA', + ); + expect( + v.displayName, + 'Guiding Star Grange, 401 Chapman St, Greenfield, MA, USA', + ); + }); + + test('omits missing components', () { + final v = Venue(id: 'v1', name: 'Hall', city: 'Greenfield'); + expect(v.displayName, 'Hall, Greenfield'); + }); + + test('is just the name when no location fields are set', () { + final v = Venue(id: 'v1', name: 'Hall'); + expect(v.displayName, 'Hall'); + }); + + test('does not include non-location fields (sponsor/notes/contacts)', () { + final v = Venue( + id: 'v1', + name: 'Hall', + sponsor: 'CDSS', + notes: 'bring water', + contact1Name: 'Pat', + ); + expect(v.displayName, 'Hall'); + }); + }); + + group('== / hashCode', () { + test('equal venues compare equal and share a hashCode', () { + final a = Venue(id: 'v1', name: 'Hall', city: 'Greenfield'); + final b = Venue(id: 'v1', name: 'Hall', city: 'Greenfield'); + expect(a, equals(b)); + expect(a.hashCode, b.hashCode); + }); + + test('differ when any field differs', () { + final a = Venue(id: 'v1', name: 'Hall', city: 'Greenfield'); + expect(a, isNot(equals(a.copyWith(city: 'Amherst')))); + expect(a, isNot(equals(a.copyWith(name: 'Other')))); + expect( + a, + isNot(equals(Venue(id: 'v2', name: 'Hall', city: 'Greenfield'))), + ); + }); + + test('normalized-empty equals explicit null', () { + final a = Venue(id: 'v1', name: 'Hall', address2: ' '); + final b = Venue(id: 'v1', name: 'Hall'); + expect(a, equals(b)); + }); + }); +} diff --git a/packages/compendium_core/test/serialization/archive_codec_test.dart b/packages/compendium_core/test/serialization/archive_codec_test.dart index 7a162312..d9b93d22 100644 --- a/packages/compendium_core/test/serialization/archive_codec_test.dart +++ b/packages/compendium_core/test/serialization/archive_codec_test.dart @@ -401,4 +401,195 @@ void main() { expect(result.archive.dances, hasLength(2)); }); }); + + group('venue serialization', () { + // A program that references an embedded venue, plus a standalone venue. + CompendiumArchive archiveWithVenues() { + final linked = Venue( + id: 'v1', + name: 'Guiding Star Grange', + address1: '401 Chapman St', + city: 'Greenfield', + stateProv: 'MA', + country: 'USA', + postalCode: '01301', + plus4: '1234', + website: 'https://example.com', + sponsor: 'Greenfield Dance', + eventName: 'Second Saturday Contra', + time: '8pm', + genericSchedule: '2nd Saturdays', + price: '\$10', + notes: 'wooden floor', + contact1Name: 'Pat', + contact1Phone: '555-0001', + contact1Email: 'pat@example.com', + contact2Name: 'Sam', + contact2Phone: '555-0002', + contact2Email: 'sam@example.com', + ); + final other = Venue(id: 'v2', name: 'Town Hall'); + final program = Program( + id: 'p1', + title: 'Spring Fling', + venueId: 'v1', + slots: const [], + createdAt: DateTime.utc(2026, 4, 1), + updatedAt: DateTime.utc(2026, 4, 20), + ); + return CompendiumArchive( + exportedAt: DateTime.utc(2026, 7, 15), + programs: [program], + venues: [linked, other], + ); + } + + test('round-trips an embedded venue and a program.venueId', () { + final archive = archiveWithVenues(); + final json = encodeArchive(archive); + final result = decodeArchive(json); + + expect(result.hasErrors, isFalse, reason: result.errors.join('\n')); + expect(result.warnings, isEmpty); + // Design property: re-encoding reproduces the exact bytes. + expect(encodeArchive(result.archive), json); + + final v1 = result.archive.venues.firstWhere((v) => v.id == 'v1'); + expect(v1, equals(archiveWithVenues().venues.first)); + expect(v1.contact2Email, 'sam@example.com'); + expect(v1.plus4, '1234'); + expect(v1.genericSchedule, '2nd Saturdays'); + + final program = result.archive.programs.single; + expect(program.venueId, 'v1'); + }); + + test('omits the venues array entirely when there are no venues', () { + final archive = CompendiumArchive( + exportedAt: DateTime.utc(2026), + programs: [ + Program( + id: 'p1', + title: 'No venue', + createdAt: DateTime.utc(2026), + updatedAt: DateTime.utc(2026), + ), + ], + ); + final map = jsonDecode(encodeArchive(archive)) as Map; + expect(map.containsKey('venues'), isFalse); + // A program without a venue omits the venueId key too. + final program = (map['programs'] as List).cast>().single; + expect(program.containsKey('venueId'), isFalse); + }); + + test('a legacy bundle with no venues array imports cleanly', () { + final map = jsonDecode(encodeArchive(archiveWithVenues())) + as Map; + // Simulate a bundle produced before the venue entity existed. + map.remove('venues'); + + final result = decodeArchive(jsonEncode(map)); + expect(result.hasErrors, isFalse, reason: result.errors.join('\n')); + expect(result.archive.venues, isEmpty); + // The program still decodes; its venueId (a soft reference) is preserved + // here — resolving/clearing a now-dangling reference is the restorer's job. + expect(result.archive.programs.single.venueId, 'v1'); + }); + + test('a non-array venues field is reported and skipped', () { + final map = jsonDecode(encodeArchive(archiveWithVenues())) + as Map; + map['venues'] = {'not': 'an array'}; + + final result = decodeArchive(jsonEncode(map)); + expect(result.hasErrors, isTrue); + expect(result.errors.single.entityType, 'venue'); + expect(result.archive.venues, isEmpty); + // Other collections are unaffected. + expect(result.archive.programs, hasLength(1)); + }); + + test('a venues entry that is not an object is skipped', () { + final map = jsonDecode(encodeArchive(archiveWithVenues())) + as Map; + (map['venues'] as List).add('i am not an object'); + + final result = decodeArchive(jsonEncode(map)); + expect(result.hasErrors, isTrue); + expect(result.errors.single.entityType, 'venue'); + // The two well-formed venues survived. + expect(result.archive.venues.map((v) => v.id), containsAll(['v1', 'v2'])); + }); + + test('a venue with a blank name is skipped without aborting the import', () { + final map = jsonDecode(encodeArchive(archiveWithVenues())) + as Map; + final venues = (map['venues'] as List).cast>(); + venues.firstWhere((v) => v['id'] == 'v2')['name'] = ' '; + + final result = decodeArchive(jsonEncode(map)); + expect(result.hasErrors, isTrue); + expect(result.errors.single.entityType, 'venue'); + expect(result.errors.single.entityId, 'v2'); + // The valid venue and the program still load. + expect(result.archive.venues.map((v) => v.id), ['v1']); + expect(result.archive.programs, hasLength(1)); + }); + + test('a venue field of the wrong type is rejected per-entity', () { + final map = jsonDecode(encodeArchive(archiveWithVenues())) + as Map; + final venues = (map['venues'] as List).cast>(); + // city must be a string; an attacker-supplied number is rejected. + venues.firstWhere((v) => v['id'] == 'v1')['city'] = 42; + + final result = decodeArchive(jsonEncode(map)); + expect(result.hasErrors, isTrue); + expect(result.errors.single.entityType, 'venue'); + expect(result.errors.single.entityId, 'v1'); + // The other venue is unaffected. + expect(result.archive.venues.map((v) => v.id), ['v2']); + }); + + test('a missing required venue id is rejected per-entity', () { + final map = jsonDecode(encodeArchive(archiveWithVenues())) + as Map; + final venues = (map['venues'] as List).cast>(); + venues.firstWhere((v) => v['id'] == 'v1').remove('id'); + + final result = decodeArchive(jsonEncode(map)); + expect(result.hasErrors, isTrue); + expect(result.errors.single.entityType, 'venue'); + expect(result.archive.venues.map((v) => v.id), ['v2']); + }); + + test('unknown/extra venue keys are ignored', () { + final map = jsonDecode(encodeArchive(archiveWithVenues())) + as Map; + final venues = (map['venues'] as List).cast>(); + venues.first['futureField'] = {'anything': true}; + + final result = decodeArchive(jsonEncode(map)); + expect(result.hasErrors, isFalse); + // Known fields still reconstruct the original venue. + expect( + result.archive.venues.firstWhere((v) => v.id == 'v1'), + equals(archiveWithVenues().venues.first), + ); + }); + + test('a non-string program.venueId is rejected per-entity', () { + final map = jsonDecode(encodeArchive(archiveWithVenues())) + as Map; + final programs = (map['programs'] as List).cast>(); + programs.single['venueId'] = 7; + + final result = decodeArchive(jsonEncode(map)); + expect(result.hasErrors, isTrue); + expect(result.errors.single.entityType, 'program'); + // Venues are still fully loaded. + expect(result.archive.venues, hasLength(2)); + }); + }); } diff --git a/packages/compendium_core/test/serialization/archive_service_test.dart b/packages/compendium_core/test/serialization/archive_service_test.dart index 0a594476..69d0f107 100644 --- a/packages/compendium_core/test/serialization/archive_service_test.dart +++ b/packages/compendium_core/test/serialization/archive_service_test.dart @@ -260,4 +260,113 @@ void main() { expect(tagIds, containsAll(['keep', 't1'])); }); }); + + group('venue restore', () { + Program programWithVenue(String? venueId) => Program( + id: 'p1', + title: 'Spring Fling', + venueId: venueId, + slots: const [], + createdAt: DateTime.utc(2026, 4, 1), + updatedAt: DateTime.utc(2026, 4, 20), + ); + + test('replace materializes venues and resolves a program.venueId', () async { + final db = openTestDatabase(); + addTearDown(db.close); + final repos = CompendiumRepositories(db, contraTaxonomy); + + final archive = CompendiumArchive( + exportedAt: DateTime.utc(2026, 7, 15), + programs: [programWithVenue('v1')], + venues: [ + Venue(id: 'v1', name: 'Guiding Star Grange', city: 'Greenfield'), + ], + ); + + final result = await ArchiveRestorer(repos).restore(archive); + expect(result.hasErrors, isFalse, reason: result.errors.join('\n')); + + // The venue landed and the program's link resolves (venues load first). + final venue = await repos.venues.getById('v1'); + expect(venue, isNotNull); + expect(venue!.city, 'Greenfield'); + final program = await repos.programs.getById('p1'); + expect(program!.venueId, 'v1'); + }); + + test('export -> restore round-trips venues and the venueId link', () async { + final sourceDb = openTestDatabase(); + addTearDown(sourceDb.close); + final sourceRepos = CompendiumRepositories(sourceDb, contraTaxonomy); + await sourceRepos.venues.upsert( + Venue(id: 'v1', name: 'Guiding Star Grange', contact1Email: 'p@x.com'), + ); + await sourceRepos.programs.create(programWithVenue('v1')); + + final archive = await ArchiveExporter( + sourceRepos, + ).export(exportedAt: DateTime.utc(2026, 7, 15)); + final json = encodeArchive(archive); + + final targetDb = openTestDatabase(); + addTearDown(targetDb.close); + final targetRepos = CompendiumRepositories(targetDb, contraTaxonomy); + final decoded = decodeArchive(json); + expect(decoded.hasErrors, isFalse, reason: decoded.errors.join('\n')); + await ArchiveRestorer(targetRepos).restore(decoded.archive); + + final reexport = await ArchiveExporter( + targetRepos, + ).export(exportedAt: DateTime.utc(2026, 7, 15)); + expect(encodeArchive(reexport), json); + + expect((await targetRepos.venues.getById('v1'))!.contact1Email, 'p@x.com'); + expect((await targetRepos.programs.getById('p1'))!.venueId, 'v1'); + }); + + test('a dangling venueId (venue absent everywhere) is nulled, not persisted', + () async { + final db = openTestDatabase(); + addTearDown(db.close); + final repos = CompendiumRepositories(db, contraTaxonomy); + + // The program references 'ghost', which is in neither the archive nor db. + final archive = CompendiumArchive( + exportedAt: DateTime.utc(2026, 7, 15), + programs: [programWithVenue('ghost')], + ); + + final result = await ArchiveRestorer(repos).restore(archive); + expect(result.hasErrors, isFalse, reason: result.errors.join('\n')); + + final program = await repos.programs.getById('p1'); + expect(program, isNotNull); + // The dangling reference is cleared rather than left silently orphaned. + expect(program!.venueId, isNull); + }); + + test('a venueId resolvable only in the target db is preserved on merge', + () async { + final db = openTestDatabase(); + addTearDown(db.close); + final repos = CompendiumRepositories(db, contraTaxonomy); + + // The venue exists in the target database but not in the incoming bundle. + await repos.venues.upsert(Venue(id: 'v1', name: 'Existing Hall')); + + final archive = CompendiumArchive( + exportedAt: DateTime.utc(2026, 7, 15), + programs: [programWithVenue('v1')], + ); + + final result = await ArchiveRestorer( + repos, + ).restore(archive, mode: RestoreMode.merge); + expect(result.hasErrors, isFalse, reason: result.errors.join('\n')); + + // The link survives because the referenced venue resolves against the db. + expect((await repos.programs.getById('p1'))!.venueId, 'v1'); + }); + }); } diff --git a/packages/compendium_core/test/storage/fixtures/generate_v12_fixture.dart b/packages/compendium_core/test/storage/fixtures/generate_v12_fixture.dart new file mode 100644 index 00000000..a2f99a5c --- /dev/null +++ b/packages/compendium_core/test/storage/fixtures/generate_v12_fixture.dart @@ -0,0 +1,84 @@ +// Regenerates `test/storage/fixtures/v12.sqlite` — the schema-v12 database that +// `migration_test.dart` opens through the real `onUpgrade` (v12 -> v13) path, +// which adds the `venues` table and the `programs.venue_id` column. +// +// Run from the package root: +// +// dart run test/storage/fixtures/generate_v12_fixture.dart +// +// Ordering trap: the current code is already at schema v13, so opening a fresh +// `CompendiumDatabase` creates the v13 shape (with `venues` + `programs.venue_id` +// already present). Seeding at v13 would make the v12 -> v13 migration a no-op +// (or make `createTable(venues)` fail with "table venues already exists"). So we +// seed realistic data at the current schema and then *strip back to the v12 +// shape* with raw SQL before stamping `user_version = 12`: +// * DROP TABLE venues — remove the v13-only table; +// * ALTER TABLE programs DROP COLUMN venue_id — remove the v13-only column +// (SQLite >= 3.35; the bundled sqlite3 is 3.53+); +// * PRAGMA user_version = 12. +// v11 and v12 are structurally identical (v12 only rewrote `figures_json` +// content), so the resulting file is a valid v12 fixture: NO `venues` table, NO +// `programs.venue_id`, and a pre-existing program whose `venue_id` must come +// back null after the upgrade. +import 'dart:io'; + +import 'package:compendium_core/compendium_core.dart'; +import 'package:drift/native.dart'; +import 'package:path/path.dart' as p; +import 'package:sqlite3/sqlite3.dart' as sqlite3; + +Future main() async { + final fixturePath = p.join( + Directory.current.path, + 'test', + 'storage', + 'fixtures', + 'v12.sqlite', + ); + final file = File(fixturePath); + if (file.existsSync()) file.deleteSync(); + + final db = CompendiumDatabase(NativeDatabase(file)); + final repos = CompendiumRepositories(db, contraTaxonomy); + + final now = DateTime.utc(2026, 1, 1); + await repos.choreographers.upsert( + Choreographer(id: 'chor-1', name: 'Cary Ravitz'), + ); + await repos.dances.create( + Dance( + id: 'dance-1', + title: 'Ocean Motion', + authorIds: const ['chor-1'], + figures: [ + Figure(move: 'swing', params: const {'who': 'partners', 'beats': 16}), + ], + createdAt: now, + updatedAt: now, + ), + ); + // A program captured before the venue entity existed: its reference to a + // venue must materialise as a null `venueId` after the v12 -> v13 upgrade. + await repos.programs.create( + Program( + id: 'prog-1', + title: 'Second Saturday Contra', + eventDate: DateTime.utc(2026, 3, 14), + venue: 'Guiding Star Grange', + slots: [ProgramSlot(id: 'slot-1', position: 0, danceId: 'dance-1')], + createdAt: now, + updatedAt: now, + ), + ); + + await db.close(); + + // Strip the v13-only additions and stamp the file back to v12. + final raw = sqlite3.sqlite3.open(fixturePath); + raw.execute('DROP TABLE IF EXISTS venues'); + raw.execute('ALTER TABLE programs DROP COLUMN venue_id'); + raw.execute('PRAGMA user_version = 12'); + raw.close(); + + stdout.writeln('Wrote $fixturePath at schema v12.'); +} diff --git a/packages/compendium_core/test/storage/fixtures/v12.sqlite b/packages/compendium_core/test/storage/fixtures/v12.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..aceefc5a8b6d70c0937ab823c044b5ce5f70b5bc GIT binary patch literal 208896 zcmeI*&2!u4od0x~0EPXbaEt@ByCB@4*9*cpiK6tE;BRlwI4Y>z=YC9hYQT`ii1Rk~B-NC3@xQ zH56`-(4VbeGW{^s+UWD=tn}hv|9q4(hf=@uixg7-m-^k*_r||JIY056mt@Jb%Iv25UX4Pa=}pfLwl$;adUjpgHCe5! z?di29bG1T`#HSAJR5HD=Ab&9J={q$h6e+V^w=3azX+te;smfOI(yFRty7Dv1T*fSC zlr8nGEoE(;UfZjyc_nj$-HIhD+iNRd-Bu~Drth#?ESHkKTMgEoYE*60pys^m+Ey!< z@4~Ix`2UM_C0ZYk%K((7vJDjjG14a(fPyi&;JXx}c= z9i!@#98puDQn^|HF5u9ehHB`oAB zb7ncGtglggR#oa)rQ&9(xa@a}hV7c3=|?#pOUf+kmcg{n9;gdMYY(!!>fTh_{n2AL zsgv+t%Da#0YI^O#I!>o(C)Ak=on)S7=(QSi#F`s5-LhC&tD9ESV{W89e9sN$_@gJ4 z(4+egGJEu(^T!hDYuSE1sD&SdQY#3Xsk`q?CetTR%HQUvdn*R5Kc{*In+~}5IqjLA ze}2SIb+*SWPb=$Q^xWYsrJQE_9g!q4kQCk>-D(dayj(BXAj*zbqdm6A4_?}`18CvU z+9N!0DC?lq}tLJ>-@nq?YEYaVkfYC$wu;b7LTrZbTAcu%Bb7!ISFV!`cz)x z*wATs6fZih7PhV{+1q#ger4#EZJE?twdfGjRXFH^%;4i&WEc{I+E%5CeV$zI{KQcw zzYrF!AZ$(^UQPtDzIQbeYr1Es+D;hja3k3()?wbK6l=PQJIuf4G^)&roc%4QNVgG+ z9?^Y{x?J>E6>9engs%Sl#w6OQ{l3(?8c__!?jM7YOIzeI2sg*iCm;N+VfezgjvbyJ zPNs7?`R*Nls}>b>g=V-TVgSX=extdi*W;&I=N4_B?a;-zo!?`Slro3Wv|W*d4} zH_w!r!E~3=ARoWD_c$-3g*zvu7*s!Wxr?KT^m?w}_$NBhos~eCxH$3L(0#4qpSfss)7+}w>t?xApv=6k$Oyw-{5sgE zIuswx^_-^R(d8hv_jZ(mi)nbp5N^s_r*eCIeES`L(5u?^jU(&wFZ8BW(LVVlyvO}O z-MmSc*f8S(dR(l0r_*H|>daOp(rtOi_nKDhLrI_Z8+M(B5;~ap#}|j~nZ45gfVU54 zhZ5=6X8N5zyyJ#f75Xs!xeWdG^s#CBT~7U_ME~O#1Rwwb2tWV=5P$##AOHafKmY=t zP~hOC{LJk0Gg)b7`ryp;^o%qnosguF5h?gQK3`a;FVZaKn(cqbX4sbJ=;dak##ZX| z^$tB*a_QTO8hiV8hQ1@DZ|A<|r_fgq7Yg}I@WuLtjJxlDp^?w<@3=D;ZfEwZcIJY= z?O9ZuviO(n7YeW3x$}-rUs~_6x8E_he32K*|`Y(z8$1ey#00Izz00bZa0SG_< z0uX=z1O`c9Vt95u{QiMI|Nn)Q`o$nM5N&|~1Rwwb2tWV=5P$##AOHafJb?l;^4QE7 zzuja0x|jJvNq2538~UEf^e)%Li zpv@3~00bZa0SG_<0uX=z1Rwx`0TehPkIc@Dg)9I0=YKx`|5sA#R|D8yGzkI_fB*y_ z009U<00Izz00bcLL<*ds&;PBz`7iqU|6?ij@e>JxMneDs5P$##AOHafKmY;|fB*yr zR$y{ucC7U+0H6Q=Qz`Y+fo(1t1_1~_00Izz00bZa0SG_<0ucC97AVQ%vtwy_>`LxL zIHlj+H?7L?+nN2Uow<-{=#FPG$Iaw3J52Z7%!R@$cUp-`P_|g$^Z)Vu|4+Fi;MgGm z0SG_<0uX=z1Rwwb2tWV=y#%_S|Nl@*{jgU_q(J}z5P$##AOHafKmY;|fB*y_@E8Qv zU#KmY;|fB*y_009U<00IzryaN97fBt2F|NLJ%{&tZs}*`AK6Ut|&m_}JOY*%_p1xCKJ&N>5`fO=KEpDmGR`JrRs$_bU z$S8A};NLgU%yLHAQs3HA*4F8@y}GJwsF&3Zb*-dsDnSufnKR2dWqnOqR##Q3wp83K z6_?e#lHtdHWEH~B%WU_E+5!j7V>i9lA<^N`UU<6ItY_%himSm<=9M=#R<0E{t}9p7 z>(RzUk1Cfdo=Bv(7ak}I{;_F`U5ERb;_-*8LJXr{>xn}b#1Ga%Y)%o z?S0L(w3_Ksm{!)d)GO*nr}HeUmy6r0Tgo}5^txKQO2-+0gEDt6uM~1Q+PBMe$Ef=K z`iPneotlK=oqEKcKrXr5`D2OnwQRq*`~SX&qt`Y6FZiVMPS{M{JwKgHXS4FR3PG@h zOkv}g7$hODUw~SLx`G!y>%u}uoGA_4H9gZ0O*{ak8b7Ze=$zhE`PuLHh^`aRbTz&9 zVA1Xr?ZhWjq2bNb482xkj@X+THQlmUS*x2?(__@H+wI}Kt-+jK+o@9tJ-YuOvq#t$ zrV{DW$@_%86LEK%hU;h2Cr`@X=4WOofA`8{(og-C9_<2dD=t$#1K;tbqXy@mxrkrN`9Xx4Ax7q_WPwB-Ogx=9=RCoJS=cO$>;1v#n#&dqMX0!gu z=;>aQ8X**+^r~5=D_6~9jzz~B4N+@|X;srX=X<;-(j5$kQBARshLzC{n++eOZ+4m0 zSXXw?$Q~Wy?u+C6WS$Ko$xn@4v(j{!D{M@NF%|MYrHiFmz8UG?o%Yu4y>_rWsXJtJ zBsNI}9g?|j&yk=V-A-6yv*7vSPVokSPRoe+;9d0Ch#X8LUlwwWS zPlx#znMRd4N8e)!ML*$~FZTSXs!+RsAavd3w*;}9ruHR;Vla097=&EfBHvlKIetF* z;BO7X7ru4u@bqvpoy*C0?*!o!4%`*DM#KP$nf)%kmR^saW}yUizJ0bsSJZZXk1>-c zvAS-?M%J2b=w01BQ)UL!T}ESe`-&DnM>^+av~cI76oVSv)?6G-q}Ox(u5Y3P-OENh zp_{lk@(^z>h;JVK;F6q7&&#wsUbm^8 z0%hiPMMfCz;+M5X)uH%kuIDrjk1hwXy|+it;My2oF@)RUcsR3fzvB;jRolLCWL^Gs z+q5d$C%+>1xV+cRn{>qtGajJF#maX&UB)4Bs}kw9yyJUKEB0}qPx}qKPD2SDO#Fj` z!}iQx>3_hxfwM!2^lLNyP9NTJ!>furOrPWZe-Ti^{QvM94g3KC2tWV=5P$##AOHaf zKmY;|7+?X+{~zGsqG=F-00bZa0SG_<0uX=z1Rwx`P{4ow|J2AiDe_6uTN$tUY{5p``fYIv9rm49Qw}C+wza(*QK9He?Io=L2^Er z`hD=_&b%3Imu4Lsw&l?TP(FPslCU7mrpb2YXK6BidrnbgicnrLXkN8Zpw}Y3mgw~o zy_BMVU1uk>@nXLNpuFsy%PM9$uh4AJdR}Q%EL)g}AI;9? zls8wlUSHqdQa0A#Tv>kiY%sm+AQjs`P4?6~2jFkb_d5bVvw!<{XeQPT<^^CzQbo=@l^i%Sph7=6CYw898Fu&%VnAp>lRv5m-wuoFm+K(HB7I) z%z&5k=MFQC=3DK>O4?1!b7F;QdXPucM-98&o^-`)Y1EqTOJW5*=jFK#+j8yLOmaS* zIy%WOoVa9mrv34h3bUAF8X8S1WaVaOYIb-KlodNJVWt)@<)6K};T5#*9b(}RUpv&b zsHOihA}svzmx1{Ud$90lwLSCl6D|C?oe5TM9IONbzso#-Hly46^LcTgY$f|cW%tr4 z8WnlRj4px-XFUp6z3|;Mar*TAXFrF7e{14&xcS_9<-y+?PMi+kdgf3+6!i|jBdND6L9b8-k5?z`Uyyu8X>U>W}Pk3)McWCh#jlEiUT>S@zhF*z}#m)Lo z*CL`LRzpSZkfJT5*me%}0j9(kpFL_3U{{N1OTePCCYpQS4iOq2DzW#}-!PNAnFC@}ePWPKz>)#qMOScRbEVm1P zK6Q9?Hkm$sTE0g&cC-qxQ>ydRvoVEsMSk;n7pDFHzCAWp0d)_$ar0L^)gpbFU;0g& z-|TcPKx&T*8CtSdH^VhKk%cdr8r@e|Zmc^y`o7lCZ`EwQ-3Gpwuy^h;hp+C5)Fk4! z339oYKc7gioaq+=UXZ4q-=KTS$i~UT7iN;_GiT&`(KS**xk#xmh+&B2^y`Ma$nO=K z8?;!uJ2GAU)6<;_^Ow^3-K(=hg1rCG6PbNQk|bZ-^ z=ksgV7X9C6vQOW)Ag#QuxaotDr;_QXpOz191cQU0=D(g1rTnCRT`+oc-fD7tJ+xuh z{Lc{W#S;A@j_3dQDhL7)fB*y_009U<00Izz00bZ~_ySn}Klm|53n2gj2tWV=5P$## zAOHafKmY=G{*OKY0SG_<0uX=z1Rwwb2tWV=5Ey&`JpUj37^8&{fB*y_009U<00Izz z00bZa0X+XlAAkS^AOHafKmY;|fB*y_009ULz5t&84}Of%LI^+r0uX=z1Rwwb2tWV= z5P$%l|Dz8;00Izz00bZa0SG_<0uX=z1O{IK&;JKM#%Lh~AOHafKmY;|fB*y_009U< z0MGx?2Ot0e2tWV=5P$##AOHafKmY=RFM#L&gCAqG5CRZ@00bZa0SG_<0uX=z1R#Lt z|L6k{fB*y_009U<00Izz00bZafx#ER=l{WvFnx(|g~46P0uKO{?N(43A7sPo<`( zF!!F)TgjH$#?X|0VnD|K-&GO7uT|K>z{}fB*y_009U<00Izz00bZ~ zZ~~(v<5TjG|NLK0{Y;|&@e2YFfB*y_009U<00Izz00bZafj@GASLjLp?DJ=)r*qTO zW!*B^d|}<6F`!%vCJ~fqR)Mk+%oAu$9#Ddr0{rv;Z>7|4|HvDN!-D_>AOHafKmY;| zfB*y_009U<;9&$NX+^*nS_=ZEC;ma2N-jyMe@zV^`?u-x^r?x&_}`3we(bNto=yH! za>@ViVJb&i2tWV=5P-md3fw-IOc%5A!K`VO+0Ed~c5T1mRt*S~ko}Hb$p}euNa;>;=UAd}W&ntU5<;|6?*VnhVl#TT_SC$(uCesTG@z8r|$$7rZFUNLC4fL4h2~F@5 z7W(Znd_(_T8t3wgQJ~i%y_V?p61`rg*DLgTHTR8tGM%L`UyL1yS#HIg*lFX%eg{B# z**TY0%yM4wm{ZRyjf!RGqwS7n=VJEno=v86xgPeqr*{;}v^C%F2>i_c?cb@{#*I+@ zxfhb@Q>VrbXT-*~_Y>~nYbzUD+r?Fd_osHQvc0*oc179s+?VGjl(7F&q_@|C?yfH9 zDb+K*8g*p7=~ZpV%_~*gzL8ff+herRI)6NN()CZ}Pp>uoOxJEY26HEJw1m}p zZAO-Y6VH9GW_nDc`s`p^+hZ0L*9!d4JQY^cGc)pcw4hBqmH&QL0L$>ij53!o%Nb=$ zeQQfuTc_9d>S|ueSbCjxr|RW0o$qd;mBY)1sf%K&VS2a36xY+~&>N1uC#D;A)AF2H z;f77cYjlQ}+sDE8)~Gezm&6M8*^WypVxrryE!TF$L`JRlv}ogarJmVoE>Ed2T5D_? znrl>9xmk-<-k_{lQV>&dZ~n=s8(yKu4%=Ccs%^z;YUi=KZq|BMx!AwTMXi68i&}S; zk)e?Hg1^SgFrINf9k3gy3<}bG{2Zk7Yg#dJ3&wEF43Km6MJZP z0l&AlQoDMsvY}p9H`KL~x~YVPT!n_-oPTv$R##QJ5S5CXrQ)(m9h{$DE!6+TkX#bEE zgV9d+W6%$;RY;>Tm|EPr=0%k1x@GP%*VEp0J5U|{`yh)1;Zfvr3uhAP(#gKfXP!rY zJAmK%@TV{G_5UABsgDQrZVk v13 upgrade (venue entity)', () { + late Directory dir; + late String dbPath; + + setUp(() async { + dir = await Directory.systemTemp.createTemp('compendium_core_mig_v13_'); + dbPath = p.join(dir.path, 'test.sqlite'); + // Copy the checked-in v12 fixture to a temp path (opening mutates it). + final fixture = File( + p.join( + Directory.current.path, + 'test', + 'storage', + 'fixtures', + 'v12.sqlite', + ), + ); + await fixture.copy(dbPath); + }); + + tearDown(() => dir.delete(recursive: true)); + + test('drift schema version is current after upgrade', () async { + final db = CompendiumDatabase(NativeDatabase(File(dbPath))); + final repos = CompendiumRepositories(db, contraTaxonomy); + await repos.ensureMigrated(); + + final rows = await db.customSelect('PRAGMA user_version').get(); + expect(rows.single.data.values.first, db.schemaVersion); + expect(db.schemaVersion, 13); + + await db.close(); + }); + + test('creates the venues table', () async { + final db = CompendiumDatabase(NativeDatabase(File(dbPath))); + final repos = CompendiumRepositories(db, contraTaxonomy); + await repos.ensureMigrated(); + + final rows = await db + .customSelect( + "SELECT name FROM sqlite_master WHERE type='table' AND name='venues'", + ) + .get(); + expect(rows, hasLength(1)); + + // The new table is usable end-to-end through its repository. + await repos.venues.upsert(Venue(id: 'v1', name: 'Guiding Star Grange')); + expect((await repos.venues.getById('v1'))!.name, 'Guiding Star Grange'); + + await db.close(); + }); + + test('adds the programs.venue_id column, defaulting existing rows to null', + () async { + final db = CompendiumDatabase(NativeDatabase(File(dbPath))); + final repos = CompendiumRepositories(db, contraTaxonomy); + await repos.ensureMigrated(); + + final cols = await db.customSelect('PRAGMA table_info(programs)').get(); + final names = cols.map((r) => r.read('name')).toList(); + expect(names, contains('venue_id')); + + // The pre-existing program carries a null venueId (no silent dangling ref). + final program = await repos.programs.getById('prog-1'); + expect(program, isNotNull); + expect(program!.venueId, isNull); + + await db.close(); + }); + + test('a program can be linked to a venue after the upgrade', () async { + final db = CompendiumDatabase(NativeDatabase(File(dbPath))); + final repos = CompendiumRepositories(db, contraTaxonomy); + await repos.ensureMigrated(); + + await repos.venues.upsert(Venue(id: 'v1', name: 'Guiding Star Grange')); + final program = await repos.programs.getById('prog-1'); + await repos.programs.update(program!.copyWith(venueId: 'v1')); + + final reloaded = await repos.programs.getById('prog-1'); + expect(reloaded!.venueId, 'v1'); + + await db.close(); + }); + }); + test( 'beforeOpen recreates dance_fts if missing from an existing database', () async { diff --git a/packages/compendium_core/test/storage/venue_repository_test.dart b/packages/compendium_core/test/storage/venue_repository_test.dart new file mode 100644 index 00000000..9256cbd3 --- /dev/null +++ b/packages/compendium_core/test/storage/venue_repository_test.dart @@ -0,0 +1,132 @@ +import 'package:compendium_core/compendium_core.dart'; +import 'package:test/test.dart'; + +import 'test_database.dart'; + +void main() { + late CompendiumDatabase db; + late VenueRepository repo; + late ProgramRepository programs; + + setUp(() { + db = openTestDatabase(); + repo = VenueRepository(db); + programs = ProgramRepository(db); + }); + + tearDown(() => db.close()); + + Program buildProgram({required String id, String? venueId}) => Program( + id: id, + title: 'Spring Contra', + venueId: venueId, + createdAt: DateTime.utc(2026), + updatedAt: DateTime.utc(2026), + slots: [ProgramSlot(id: '$id-s1', position: 0, text: 'Welcome')], + ); + + test('round-trips a fully-populated venue', () async { + final v = Venue( + id: 'v1', + name: 'Guiding Star Grange', + address1: '401 Chapman St', + address2: 'Hall B', + city: 'Greenfield', + stateProv: 'MA', + country: 'USA', + postalCode: '01301', + plus4: '1234', + website: 'https://example.com', + sponsor: 'Greenfield Dance', + eventName: 'Second Saturday Contra', + time: '8pm', + genericSchedule: '2nd Saturdays', + price: '\$10', + notes: 'wooden floor', + contact1Name: 'Pat', + contact1Phone: '555-0001', + contact1Email: 'pat@example.com', + contact2Name: 'Sam', + contact2Phone: '555-0002', + contact2Email: 'sam@example.com', + ); + await repo.upsert(v); + expect(await repo.getById('v1'), v); + }); + + test('optional fields default to null', () async { + await repo.upsert(Venue(id: 'v1', name: 'Minimal Hall')); + final read = await repo.getById('v1'); + expect(read!.address1, isNull); + expect(read.city, isNull); + expect(read.contact1Email, isNull); + expect(read.contact2Phone, isNull); + expect(read.genericSchedule, isNull); + }); + + test('upsert updates in place (same id)', () async { + await repo.upsert(Venue(id: 'v1', name: 'Old Name')); + await repo.upsert(Venue(id: 'v1', name: 'New Name', city: 'Amherst')); + final all = await repo.listAll(); + expect(all, hasLength(1)); + expect(all.single.name, 'New Name'); + expect(all.single.city, 'Amherst'); + }); + + test('listAll orders by name, case-insensitively', () async { + await repo.upsert(Venue(id: 'v1', name: 'zephyr Hall')); + await repo.upsert(Venue(id: 'v2', name: 'Apple Barn')); + await repo.upsert(Venue(id: 'v3', name: 'Birch Grange')); + expect((await repo.listAll()).map((v) => v.name), [ + 'Apple Barn', + 'Birch Grange', + 'zephyr Hall', + ]); + }); + + test('getById returns null for an unknown id', () async { + expect(await repo.getById('nope'), isNull); + }); + + test('delete removes an unreferenced venue', () async { + await repo.upsert(Venue(id: 'v1', name: 'Solo Hall')); + await repo.delete('v1'); + expect(await repo.getById('v1'), isNull); + }); + + test('delete throws while a program still references the venue', () async { + await repo.upsert(Venue(id: 'v1', name: 'Linked Hall')); + await programs.create(buildProgram(id: 'p1', venueId: 'v1')); + + await expectLater(repo.delete('v1'), throwsA(isA())); + expect(await repo.getById('v1'), isNotNull); + }); + + test('delete succeeds once the referencing program is unlinked', () async { + await repo.upsert(Venue(id: 'v1', name: 'Linked Hall')); + await programs.create(buildProgram(id: 'p1', venueId: 'v1')); + + final p = await programs.getById('p1'); + await programs.update(p!.copyWith(clearVenueId: true)); + + await repo.delete('v1'); + expect(await repo.getById('v1'), isNull); + }); + + test('the delete guard counts every referencing program', () async { + await repo.upsert(Venue(id: 'v1', name: 'Popular Hall')); + await programs.create(buildProgram(id: 'p1', venueId: 'v1')); + await programs.create(buildProgram(id: 'p2', venueId: 'v1')); + + await expectLater( + repo.delete('v1'), + throwsA( + isA().having( + (e) => e.message, + 'message', + contains('2 program(s)'), + ), + ), + ); + }); +} From 2aa096c67fa1f5b6248f3636966379a5269950e6 Mon Sep 17 00:00:00 2001 From: ibanner56 Date: Tue, 21 Jul 2026 22:04:51 -0700 Subject: [PATCH 02/15] =?UTF-8?q?fix(core):=20address=20Venue=20PR=20revie?= =?UTF-8?q?w=20=E2=80=94=20archive=20v2,=20importer=20venues,=20write-time?= =?UTF-8?q?=20integrity?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses the three Copilot review comments on #452: 1. Archive schema version (archive_codec.dart): introduce archiveSchemaVersionVenues (v2) and stamp venue-bearing archives at v2 (content-derived via requiredSchemaVersion), keeping venue-less archives at v1 so pre-venue readers still accept them. An old reader now emits the "newer than supported" warning instead of silently dropping venues/venueId. 2. Community-intake importer (CompendiumArchiveImporter): upsert archive.venues under freshly-minted ids (never clobbering an existing venue) BEFORE programs, remap program.venueId to the inserted venue, null a dangling reference (OWASP-safe, surfaced as an ImportIssue), and record inserted venue ids for undo/rollback. Wire the venue repo through ArchiveIntakeService. 3. Soft-ref integrity (program_repository.dart / venue_repository.dart): ProgramRepository rejects a write whose non-null venueId references no venue, checked inside the write transaction; VenueRepository.delete is now atomic (guard check + delete in one transaction). Both import paths resolve-or-null a dangling venueId before persisting so they never trip the write-time check. Adds importer venue-wiring tests, program venueId write-time tests, and archive schema-version compatibility tests. Regenerates database.g.dart (propagated venueId doc comment). Leaves a tracked TODO that per-program share-bundle venue gathering is deferred to PR C. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- app/lib/src/data/archive_intake_service.dart | 1 + app/lib/src/export/program_share_bundle.dart | 13 ++ .../imports/compendium_archive_import.dart | 144 +++++++++++++++--- .../lib/src/serialization/archive_codec.dart | 7 +- .../src/serialization/compendium_archive.dart | 40 ++++- .../lib/src/storage/database.g.dart | 11 +- .../repositories/program_repository.dart | 22 +++ .../repositories/venue_repository.dart | 30 +++- .../lib/src/storage/tables.dart | 11 +- .../compendium_archive_import_test.dart | 129 +++++++++++++++- .../serialization/archive_codec_test.dart | 42 +++++ .../test/storage/program_repository_test.dart | 53 +++++++ 12 files changed, 464 insertions(+), 39 deletions(-) diff --git a/app/lib/src/data/archive_intake_service.dart b/app/lib/src/data/archive_intake_service.dart index 10c1799a..d0bc1922 100644 --- a/app/lib/src/data/archive_intake_service.dart +++ b/app/lib/src/data/archive_intake_service.dart @@ -184,6 +184,7 @@ class ArchiveIntakeService { final importer = CompendiumArchiveImporter( pipeline, repositories.programs, + repositories.venues, ); final result = await importer.import( json, diff --git a/app/lib/src/export/program_share_bundle.dart b/app/lib/src/export/program_share_bundle.dart index 5876d13b..3da9e7f9 100644 --- a/app/lib/src/export/program_share_bundle.dart +++ b/app/lib/src/export/program_share_bundle.dart @@ -42,6 +42,19 @@ import 'share_sanitization.dart'; /// /// [now] stamps the archive's `exportedAt`; it defaults to the current time and /// is injectable for deterministic tests. +/// +/// Venue gathering is deliberately **not** done here yet: a program's +/// `venueId` (schema v13) rides along inside the embedded [program], but the +/// referenced [Venue] record is not gathered into `CompendiumArchive.venues`. +/// The core receive path handles this safely — `CompendiumArchiveImporter` +/// nulls a `venueId` that resolves to no bundled venue — so a shared program +/// simply arrives without its venue link for now. Populating `venueId` in the +/// editor UI (PR B) and gathering the referenced venue here (mirroring the +/// dance/choreographer gathering above, minding the same privacy sanitization +/// for venue contact fields) is deferred to the display/export PR (C). +// TODO(PR C, issue #298): gather the program's referenced Venue into +// CompendiumArchive.venues so a shared program carries its venue record, once +// venueId is UI-populated (PR B) and a venue resolver is wired here. String buildProgramShareBundle( Program program, { required Dance? Function(String danceId) danceFor, diff --git a/packages/compendium_core/lib/src/imports/compendium_archive_import.dart b/packages/compendium_core/lib/src/imports/compendium_archive_import.dart index ee95edd0..d0f29d83 100644 --- a/packages/compendium_core/lib/src/imports/compendium_archive_import.dart +++ b/packages/compendium_core/lib/src/imports/compendium_archive_import.dart @@ -3,8 +3,10 @@ import 'package:meta/meta.dart'; import '../model/program.dart'; import '../model/provenance.dart'; import '../model/enums.dart'; +import '../model/venue.dart'; import '../serialization/compendium_archive.dart'; import '../storage/repositories/program_repository.dart'; +import '../storage/repositories/venue_repository.dart'; import '../util/uuid.dart'; import 'dedupe.dart'; import 'generic_json_adapter.dart'; @@ -48,6 +50,7 @@ class ArchiveProgramsResult { ArchiveProgramsResult buildArchivePrograms( CompendiumArchive archive, { required Map danceIdByOriginalId, + Map venueIdByOriginalId = const {}, String Function()? newId, String Function()? newSlotId, DateTime? now, @@ -124,6 +127,7 @@ ArchiveProgramsResult buildArchivePrograms( title: program.title, eventDate: program.eventDate, venue: program.venue, + venueId: _resolveVenueId(program, venueIdByOriginalId, issues), band: program.band, caller: program.caller, dancerLevel: program.dancerLevel, @@ -150,6 +154,40 @@ ArchiveProgramsResult buildArchivePrograms( return ArchiveProgramsResult(programs: programs, issues: issues); } +/// Resolves [program]'s *original* archive `venueId` to the **newly-inserted** +/// venue id via [venueIdByOriginalId], mirroring the dance-slot resolution. +/// +/// **OWASP dangling-reference handling:** a `venueId` that resolves to no +/// venue in the bundle (the referenced venue record was omitted, malformed and +/// skipped on decode, or the id is simply spurious in an untrusted bundle) is +/// **nulled** — never persisted as a dangling soft reference and never a throw +/// — and the drop is surfaced as a non-fatal [ImportIssue]. A `null` (or +/// already-resolved) `venueId` passes through unchanged. This is the same +/// resolve-or-null contract [ArchiveRestorer] applies on the backup/restore +/// path, and it runs *before* the program reaches [ProgramRepository], whose +/// write-time check would otherwise reject a non-existent `venueId`. +String? _resolveVenueId( + Program program, + Map venueIdByOriginalId, + List issues, +) { + final originalVenueId = program.venueId; + if (originalVenueId == null) return null; + final resolved = venueIdByOriginalId[originalVenueId]; + if (resolved == null) { + issues.add( + ImportIssue( + severity: ImportIssueSeverity.warning, + code: 'archive_program_unresolved_venue', + message: + 'Program "${program.title}" references a venue that was not ' + 'imported; kept the program without a venue link.', + ), + ); + } + return resolved; +} + /// The outcome of committing a [CompendiumArchive] import: the dance /// [ImportSession] (dances + author choreographers) produced by the shared /// [ImportPipeline], plus the [Program]s rebuilt from the archive and persisted @@ -167,10 +205,12 @@ class CompendiumArchiveImportResult { required List programIssues, List insertedProgramIds = const [], List updatedProgramPriorStates = const [], + List insertedVenueIds = const [], }) : programs = List.unmodifiable(programs), programIssues = List.unmodifiable(programIssues), insertedProgramIds = List.unmodifiable(insertedProgramIds), - updatedProgramPriorStates = List.unmodifiable(updatedProgramPriorStates); + updatedProgramPriorStates = List.unmodifiable(updatedProgramPriorStates), + insertedVenueIds = List.unmodifiable(insertedVenueIds); /// The dance-side session (inserted dance ids, updated-dance prior states, /// created choreographer ids) — reverted via [ImportPipeline.undo]. @@ -189,6 +229,11 @@ class CompendiumArchiveImportResult { /// verbatim on [undo]. final List updatedProgramPriorStates; + /// Ids of the venues this import **inserted** (one freshly-minted id per + /// bundled venue). Hard-deleted on [undo] once the referencing programs have + /// been reverted, so an undone import leaves no orphaned venue behind. + final List insertedVenueIds; + /// Non-fatal issues raised while rebuilding the programs (unresolved dance /// references, skipped empty slots) — never fatal. final List programIssues; @@ -202,6 +247,7 @@ class CompendiumArchiveImportResult { int get insertedProgramCount => insertedProgramIds.length; int get updatedProgramCount => updatedProgramPriorStates.length; + int get insertedVenueCount => insertedVenueIds.length; /// True once [CompendiumArchiveImporter.undo] has reverted this import. bool get isUndone => _undone; @@ -224,10 +270,11 @@ class CompendiumArchiveImportResult { /// repositories) so it lives in the core and is trivially unit-testable; the /// app supplies the archive JSON. class CompendiumArchiveImporter { - CompendiumArchiveImporter(this._pipeline, this._programs); + CompendiumArchiveImporter(this._pipeline, this._programs, this._venues); final ImportPipeline _pipeline; final ProgramRepository _programs; + final VenueRepository _venues; final GenericJsonAdapter _adapter = GenericJsonAdapter(); @@ -266,13 +313,6 @@ class CompendiumArchiveImporter { ); final danceIdByOriginalId = _danceIdByOriginalId(danceSession, archive); - final built = buildArchivePrograms( - archive, - danceIdByOriginalId: danceIdByOriginalId, - newId: mintId, - newSlotId: newSlotId ?? uuidV4, - now: now, - ); final existingByExternalId = await _programs.externalIdToProgramId( ProvenanceSource.json, @@ -285,10 +325,35 @@ class CompendiumArchiveImporter { final insertedIdSet = {}; final priorCapturedFor = {}; final priorStates = []; + final insertedVenueIds = []; // Keyed by final program id so repeated externalIds collapse to one entry // carrying the final persisted state, preserving first-seen archive order. final persisted = {}; try { + // Venues first — a program's `venueId` soft-references a venue, so the + // record must exist before the program is written (the repository rejects + // a non-existent `venueId`). Each bundled venue is inserted under a + // **freshly-minted** id, never the untrusted bundle id, so an import can + // never overwrite an existing venue; the original→new remap is what the + // rebuilt programs resolve their `venueId` against (a reference to a venue + // absent from the bundle is nulled — see [buildArchivePrograms]). + final venueIdByOriginalId = {}; + for (final venue in archive.venues) { + final mintedVenueId = mintId(); + await _venues.upsert(_venueWithId(venue, mintedVenueId)); + venueIdByOriginalId[venue.id] = mintedVenueId; + insertedVenueIds.add(mintedVenueId); + } + + final built = buildArchivePrograms( + archive, + danceIdByOriginalId: danceIdByOriginalId, + venueIdByOriginalId: venueIdByOriginalId, + newId: mintId, + newSlotId: newSlotId ?? uuidV4, + now: now, + ); + for (final program in built.programs) { final externalId = program.provenance?.externalId; final hasExternalId = externalId != null && externalId.isNotEmpty; @@ -322,22 +387,27 @@ class CompendiumArchiveImporter { persisted[mappedId] = target; } } + + return CompendiumArchiveImportResult( + danceSession: danceSession, + programs: persisted.values.toList(growable: false), + programIssues: built.issues, + insertedProgramIds: insertedIds, + updatedProgramPriorStates: priorStates, + insertedVenueIds: insertedVenueIds, + ); } catch (_) { + // Compensate in reverse-dependency order: remove inserted programs and + // restore updated ones first so no program still references a venue, then + // remove the venues this import inserted, then undo the dances. await _programs.hardDelete(insertedIds); for (final prior in priorStates) { await _programs.update(prior); } + await _venues.hardDelete(insertedVenueIds); await _pipeline.undo(danceSession); rethrow; } - - return CompendiumArchiveImportResult( - danceSession: danceSession, - programs: persisted.values.toList(growable: false), - programIssues: built.issues, - insertedProgramIds: insertedIds, - updatedProgramPriorStates: priorStates, - ); } /// Convenience end-to-end import of an [archiveJson] payload: [plan]s the @@ -386,15 +456,17 @@ class CompendiumArchiveImporter { /// Reverts a committed [result]: hard-deletes the **inserted** programs (slots /// cascade) and restores every **updated** (re-imported) program to its - /// captured prior state, **before** delegating to [ImportPipeline.undo] for - /// the dances, authors and updated-dance rollbacks. Idempotent — a second - /// call is a no-op. + /// captured prior state, then removes the **inserted** venues (now + /// unreferenced, since the programs that linked them are gone), **before** + /// delegating to [ImportPipeline.undo] for the dances, authors and + /// updated-dance rollbacks. Idempotent — a second call is a no-op. Future undo(CompendiumArchiveImportResult result) async { if (result.isUndone) return; await _programs.hardDelete(result.insertedProgramIds); for (final prior in result.updatedProgramPriorStates) { await _programs.update(prior); } + await _venues.hardDelete(result.insertedVenueIds); await _pipeline.undo(result.danceSession); result._undone = true; } @@ -441,6 +513,9 @@ class CompendiumArchiveImporter { title: src.title, eventDate: src.eventDate, venue: src.venue, + // [src] is the freshly-built program, so its `venueId` is already the + // remapped (or nulled) reference — carry it through the re-import verbatim. + venueId: src.venueId, band: src.band, caller: src.caller, dancerLevel: src.dancerLevel, @@ -452,4 +527,33 @@ class CompendiumArchiveImporter { updatedAt: src.updatedAt, provenance: src.provenance, ); + + /// Rebuilds [src] under a freshly-minted [id] so an imported venue is a new + /// record that never overwrites one the receiver already holds. [Venue.copyWith] + /// intentionally cannot change the identity, so every field is copied here — + /// mirroring [_rebuildProgramWithId]. Keep in sync with the [Venue] fields. + Venue _venueWithId(Venue src, String id) => Venue( + id: id, + name: src.name, + address1: src.address1, + address2: src.address2, + city: src.city, + stateProv: src.stateProv, + country: src.country, + postalCode: src.postalCode, + plus4: src.plus4, + website: src.website, + sponsor: src.sponsor, + eventName: src.eventName, + time: src.time, + genericSchedule: src.genericSchedule, + price: src.price, + notes: src.notes, + contact1Name: src.contact1Name, + contact1Phone: src.contact1Phone, + contact1Email: src.contact1Email, + contact2Name: src.contact2Name, + contact2Phone: src.contact2Phone, + contact2Email: src.contact2Email, + ); } diff --git a/packages/compendium_core/lib/src/serialization/archive_codec.dart b/packages/compendium_core/lib/src/serialization/archive_codec.dart index 8d96998a..c2da86e3 100644 --- a/packages/compendium_core/lib/src/serialization/archive_codec.dart +++ b/packages/compendium_core/lib/src/serialization/archive_codec.dart @@ -42,7 +42,12 @@ String encodeArchive(CompendiumArchive archive) => /// The canonical JSON object for [archive] (entities sorted by id). Map archiveToJson(CompendiumArchive archive) => { - 'schemaVersion': archive.schemaVersion, + // Stamp at least the version the content requires (v2 when venue data is + // present) so an older reader warns rather than silently dropping venues, + // while honoring an explicitly higher requested version. + 'schemaVersion': archive.schemaVersion > requiredSchemaVersion(archive) + ? archive.schemaVersion + : requiredSchemaVersion(archive), 'exportedAt': _iso(archive.exportedAt), 'choreographers': [ for (final c in _sortedById(archive.choreographers, (c) => c.id)) diff --git a/packages/compendium_core/lib/src/serialization/compendium_archive.dart b/packages/compendium_core/lib/src/serialization/compendium_archive.dart index f37468b5..428304ea 100644 --- a/packages/compendium_core/lib/src/serialization/compendium_archive.dart +++ b/packages/compendium_core/lib/src/serialization/compendium_archive.dart @@ -18,7 +18,38 @@ const ListEquality _listEq = ListEquality(); /// tolerates unknown fields and reads an archive written by a newer version on /// a best-effort basis (known fields only), surfacing a warning rather than /// failing. -const int archiveSchemaVersion = 1; +/// +/// Version history: +/// * **v1** — the original envelope: dances, programs, choreographers, +/// published sources, custom fields, tags. +/// * **v2** — adds the schema-v13 venue entity: an optional top-level `venues` +/// array and a `program.venueId` soft link. A **v1** reader silently ignores +/// both, so an archive that actually carries venue data is stamped v2 (see +/// [requiredSchemaVersion]) to trip the "newer than supported" warning +/// instead of dropping the venue records. Venue-*less* archives keep being +/// stamped v1 so pre-venue readers still accept them byte-compatibly. +const int archiveSchemaVersion = archiveSchemaVersionVenues; + +/// The original, pre-venue archive envelope version. +const int archiveSchemaVersionBase = 1; + +/// The envelope version introduced with the schema-v13 venue entity (see +/// [archiveSchemaVersion]). +const int archiveSchemaVersionVenues = 2; + +/// The minimum envelope version required to represent [archive] without silent +/// data loss on an older reader: [archiveSchemaVersionVenues] when it carries +/// any venue data (a non-empty `venues` list, or any program with a non-null +/// `venueId`), otherwise [archiveSchemaVersionBase]. +/// +/// The encoder stamps the wire version at `max(archive.schemaVersion, this)` so +/// venue-bearing archives always advertise v2 (old readers warn instead of +/// dropping venues) while venue-less archives stay backward-compatible at v1 — +/// and an explicitly higher requested version is still honored. +int requiredSchemaVersion(CompendiumArchive archive) => + archive.venues.isNotEmpty || archive.programs.any((p) => p.venueId != null) + ? archiveSchemaVersionVenues + : archiveSchemaVersionBase; /// How a [CompendiumArchive] is applied to a live dataset on restore. enum RestoreMode { @@ -48,7 +79,7 @@ enum RestoreMode { @immutable class CompendiumArchive { const CompendiumArchive({ - this.schemaVersion = archiveSchemaVersion, + this.schemaVersion = archiveSchemaVersionBase, required this.exportedAt, this.dances = const [], this.programs = const [], @@ -59,7 +90,10 @@ class CompendiumArchive { this.venues = const [], }); - /// The [archiveSchemaVersion] this archive was written under. + /// The [archiveSchemaVersion] this archive is stamped as. Defaults to + /// [archiveSchemaVersionBase]; the encoder raises the version it actually + /// writes to at least [requiredSchemaVersion] so a venue-bearing archive is + /// always advertised as v2 even when constructed with the default. final int schemaVersion; /// When the archive was produced (UTC). diff --git a/packages/compendium_core/lib/src/storage/database.g.dart b/packages/compendium_core/lib/src/storage/database.g.dart index 9565df95..fb79659b 100644 --- a/packages/compendium_core/lib/src/storage/database.g.dart +++ b/packages/compendium_core/lib/src/storage/database.g.dart @@ -2793,10 +2793,13 @@ class ProgramRow extends DataClass implements Insertable { /// Optional reference to a first-class [Venues] row (`venues.id`), added in /// schema v13. A deliberately un-constrained soft reference (no drift /// `.references()`/FK): the free-text [venue] label and this entity link - /// coexist non-destructively, and referential integrity is enforced at the - /// app layer by `VenueRepository.delete`'s guard rather than a DB constraint - /// (so an import can carry a program whose venue record is absent without - /// tripping a foreign key). + /// coexist non-destructively. Referential integrity is enforced at the app + /// layer instead of by a DB constraint — `ProgramRepository` rejects a write + /// whose non-null `venueId` has no matching venue (checked inside the write + /// transaction), and `VenueRepository.delete` atomically refuses to remove a + /// venue any program still references. Import paths resolve-or-null a dangling + /// `venueId` before persisting, so a bundle can carry a program whose venue + /// record is absent without tripping the write-time check. final String? venueId; final String? band; final String? caller; diff --git a/packages/compendium_core/lib/src/storage/repositories/program_repository.dart b/packages/compendium_core/lib/src/storage/repositories/program_repository.dart index bfc3c266..ba9206a4 100644 --- a/packages/compendium_core/lib/src/storage/repositories/program_repository.dart +++ b/packages/compendium_core/lib/src/storage/repositories/program_repository.dart @@ -147,6 +147,28 @@ class ProgramRepository { for (final slot in program.slots) { assertUtcOrNull(slot.performedAt, 'slot.performedAt'); } + // `venueId` is a soft reference (no DB foreign key — see [Programs.venueId]), + // so referential integrity is enforced here at the app layer instead: a + // non-null `venueId` must point at an existing venue, checked *inside* this + // write transaction so the reference cannot become dangling between a + // check and the write. Import paths (ArchiveRestorer, CompendiumArchive + // importer) resolve-or-null a dangling `venueId` *before* calling the repo, + // so a bundle referencing an absent venue never reaches this throw. + final venueId = program.venueId; + if (venueId != null) { + final venueExists = + await (_db.select(_db.venues) + ..where((t) => t.id.equals(venueId)) + ..limit(1)) + .getSingleOrNull() != + null; + if (!venueExists) { + throw StateError( + 'cannot save program "${program.id}": venueId "$venueId" ' + 'references a venue that does not exist', + ); + } + } // Auto-stamp performed slots on a status transition to `performed` // (issue #356): a program's *status* being performed and its per-slot // calling history should agree. We only stamp on the transition — reading diff --git a/packages/compendium_core/lib/src/storage/repositories/venue_repository.dart b/packages/compendium_core/lib/src/storage/repositories/venue_repository.dart index 6f30cc9f..1e65e552 100644 --- a/packages/compendium_core/lib/src/storage/repositories/venue_repository.dart +++ b/packages/compendium_core/lib/src/storage/repositories/venue_repository.dart @@ -57,12 +57,17 @@ class VenueRepository { return rows.map(_toModel).toList(); } - /// Throws if [id] is still referenced by any `programs.venue_id` — callers - /// must unlink (or delete) the referencing programs first, since deleting a - /// venue out from under a linked program would orphan its reference. Mirrors - /// the `PublishedSourceRepository` delete guard (adapted from the - /// `dance_sources` join to the `programs.venue_id` column). - Future delete(String id) async { + /// Deletes the venue [id], guarding — **atomically** — against deleting a + /// venue any program still links to. The "is any program referencing this + /// venue?" check and the delete run inside a single transaction so no program + /// can acquire a reference between the check and the delete (no check-then-act + /// race). Throws a [StateError] if still referenced: callers must unlink (or + /// delete) the referencing programs first, since deleting a venue out from + /// under a linked program would orphan its reference. Mirrors the + /// `PublishedSourceRepository` delete guard (adapted from the `dance_sources` + /// join to the `programs.venue_id` column), tightened to be transactional + /// because `venueId` is an app-layer-enforced soft reference, not a DB FK. + Future delete(String id) => _db.transaction(() async { final stillUsed = await (_db.select( _db.programs, )..where((t) => t.venueId.equals(id))).get(); @@ -73,6 +78,19 @@ class VenueRepository { ); } await (_db.delete(_db.venues)..where((t) => t.id.equals(id))).go(); + }); + + /// Unconditionally removes the venues [ids] in a single transaction, skipping + /// the reference guard. Intended solely for reverting a just-committed import + /// batch (see `CompendiumArchiveImporter.undo`), where the caller has already + /// removed the programs that referenced these venues; an empty [ids] is a + /// no-op. Ordinary deletes must go through [delete]. + Future hardDelete(Iterable ids) { + final list = ids.toList(); + if (list.isEmpty) return Future.value(); + return _db.transaction( + () => (_db.delete(_db.venues)..where((t) => t.id.isIn(list))).go(), + ); } Venue _toModel(VenueRow row) => Venue( diff --git a/packages/compendium_core/lib/src/storage/tables.dart b/packages/compendium_core/lib/src/storage/tables.dart index b340e3c8..ff98f28f 100644 --- a/packages/compendium_core/lib/src/storage/tables.dart +++ b/packages/compendium_core/lib/src/storage/tables.dart @@ -149,10 +149,13 @@ class Programs extends Table { /// Optional reference to a first-class [Venues] row (`venues.id`), added in /// schema v13. A deliberately un-constrained soft reference (no drift /// `.references()`/FK): the free-text [venue] label and this entity link - /// coexist non-destructively, and referential integrity is enforced at the - /// app layer by `VenueRepository.delete`'s guard rather than a DB constraint - /// (so an import can carry a program whose venue record is absent without - /// tripping a foreign key). + /// coexist non-destructively. Referential integrity is enforced at the app + /// layer instead of by a DB constraint — `ProgramRepository` rejects a write + /// whose non-null `venueId` has no matching venue (checked inside the write + /// transaction), and `VenueRepository.delete` atomically refuses to remove a + /// venue any program still references. Import paths resolve-or-null a dangling + /// `venueId` before persisting, so a bundle can carry a program whose venue + /// record is absent without tripping the write-time check. TextColumn get venueId => text().nullable()(); TextColumn get band => text().nullable()(); TextColumn get caller => text().nullable()(); diff --git a/packages/compendium_core/test/imports/compendium_archive_import_test.dart b/packages/compendium_core/test/imports/compendium_archive_import_test.dart index c339826d..5ad78503 100644 --- a/packages/compendium_core/test/imports/compendium_archive_import_test.dart +++ b/packages/compendium_core/test/imports/compendium_archive_import_test.dart @@ -89,6 +89,7 @@ void main() { late DanceRepository dances; late ChoreographerRepository choreographers; late ProgramRepository programs; + late VenueRepository venues; late ImportPipeline pipeline; late CompendiumArchiveImporter importer; @@ -97,8 +98,9 @@ void main() { dances = DanceRepository(db, contraTaxonomy); choreographers = ChoreographerRepository(db); programs = ProgramRepository(db); + venues = VenueRepository(db); pipeline = ImportPipeline(dances, choreographers); - importer = CompendiumArchiveImporter(pipeline, programs); + importer = CompendiumArchiveImporter(pipeline, programs, venues); }); tearDown(() => db.close()); @@ -690,4 +692,129 @@ void main() { ); }); }); + + group('venue wiring (community import path)', () { + CompendiumArchive bundleWithVenue({ + String? programVenueId, + List venues = const [], + }) { + final d1 = _dance('orig-d1', 'Simplicity Swing'); + final program = Program( + id: 'orig-p1', + title: 'Spring Fling', + venueId: programVenueId, + status: ProgramStatus.draft, + slots: [ProgramSlot(id: 'orig-sl1', position: 0, danceId: 'orig-d1')], + createdAt: DateTime.utc(2026, 4, 1), + updatedAt: DateTime.utc(2026, 4, 1), + ); + return CompendiumArchive( + exportedAt: DateTime.utc(2026, 7, 15), + dances: [d1], + programs: [program], + venues: venues, + ); + } + + Future run(CompendiumArchive archive) => + importer.import( + encodeArchive(archive), + archive, + now: now, + newId: sequentialIds('new'), + newSlotId: sequentialIds('slot'), + ); + + test('persists bundled venues and remaps the program venueId', () async { + final archive = bundleWithVenue( + programVenueId: 'orig-v1', + venues: [ + Venue(id: 'orig-v1', name: 'Guiding Star Grange', city: 'Greenfield'), + Venue(id: 'orig-v2', name: 'Town Hall'), + ], + ); + final result = await run(archive); + + final allVenues = await venues.listAll(); + expect( + allVenues.map((v) => v.name), + containsAll(['Guiding Star Grange', 'Town Hall']), + ); + expect(result.insertedVenueCount, 2); + + final program = (await programs.listAll()).single; + // The link is remapped to the newly-inserted venue, never the untrusted + // bundle id (which could otherwise clobber an existing venue). + expect(program.venueId, isNotNull); + expect(program.venueId, isNot('orig-v1')); + final linked = await venues.getById(program.venueId!); + expect(linked, isNotNull); + expect(linked!.name, 'Guiding Star Grange'); + expect(linked.city, 'Greenfield'); + }); + + test('does not overwrite an existing venue that shares the bundle id', () async { + // A venue the receiver already holds under the same id the (untrusted) + // bundle reuses must survive untouched — the import inserts a fresh copy. + await venues.upsert( + Venue(id: 'orig-v1', name: 'Receiver Hall', city: 'Local'), + ); + final archive = bundleWithVenue( + programVenueId: 'orig-v1', + venues: [Venue(id: 'orig-v1', name: 'Bundle Grange')], + ); + await run(archive); + + final existing = await venues.getById('orig-v1'); + expect(existing?.name, 'Receiver Hall'); + // A distinct new venue was inserted for the bundle's record. + expect( + (await venues.listAll()).map((v) => v.name), + containsAll(['Receiver Hall', 'Bundle Grange']), + ); + }); + + test('nulls a program venueId absent from the bundle (dangling ref)', () async { + final archive = bundleWithVenue( + programVenueId: 'orig-missing', + venues: [Venue(id: 'orig-v2', name: 'Town Hall')], + ); + final result = await run(archive); + + final program = (await programs.listAll()).single; + // OWASP: an unresolvable reference is nulled, never persisted dangling. + expect(program.venueId, isNull); + // The drop is surfaced as a non-fatal issue, not silently swallowed. + expect( + result.programIssues.map((i) => i.code), + contains('archive_program_unresolved_venue'), + ); + // The unrelated bundled venue still landed. + expect((await venues.listAll()).map((v) => v.name), ['Town Hall']); + }); + + test('a legacy bundle with no venues imports cleanly', () async { + final result = await run(bundleWithVenue()); + + expect(await venues.listAll(), isEmpty); + expect(result.insertedVenueCount, 0); + expect((await programs.listAll()).single.venueId, isNull); + }); + + test('undo removes the venues the import inserted', () async { + final archive = bundleWithVenue( + programVenueId: 'orig-v1', + venues: [Venue(id: 'orig-v1', name: 'Guiding Star Grange')], + ); + final result = await run(archive); + expect(await venues.listAll(), hasLength(1)); + + await importer.undo(result); + expect(await venues.listAll(), isEmpty); + expect(await programs.listAll(), isEmpty); + // Idempotent — a second undo is a no-op. + await importer.undo(result); + expect(await venues.listAll(), isEmpty); + }); + }); } diff --git a/packages/compendium_core/test/serialization/archive_codec_test.dart b/packages/compendium_core/test/serialization/archive_codec_test.dart index d9b93d22..89604a85 100644 --- a/packages/compendium_core/test/serialization/archive_codec_test.dart +++ b/packages/compendium_core/test/serialization/archive_codec_test.dart @@ -464,6 +464,48 @@ void main() { expect(program.venueId, 'v1'); }); + test('stamps a venue-bearing archive at the venue schema version', () { + final map = + jsonDecode(encodeArchive(archiveWithVenues())) + as Map; + expect(map['schemaVersion'], archiveSchemaVersionVenues); + }); + + test('a program.venueId alone (no venues array) still raises the stamp', () { + // A dangling venueId with an omitted venues array must still advertise v2 + // so an older reader warns instead of silently dropping the link. + final archive = CompendiumArchive( + exportedAt: DateTime.utc(2026), + programs: [ + Program( + id: 'p1', + title: 'Linked', + venueId: 'v-missing', + createdAt: DateTime.utc(2026), + updatedAt: DateTime.utc(2026), + ), + ], + ); + final map = jsonDecode(encodeArchive(archive)) as Map; + expect(map.containsKey('venues'), isFalse); + expect(map['schemaVersion'], archiveSchemaVersionVenues); + }); + + test('keeps a venue-less archive at the base version (back-compat)', () { + final map = + jsonDecode(encodeArchive(_sampleArchive())) as Map; + expect(map['schemaVersion'], archiveSchemaVersionBase); + }); + + test('honors an explicitly higher requested schema version', () { + final archive = CompendiumArchive( + schemaVersion: archiveSchemaVersion + 5, + exportedAt: DateTime.utc(2026), + ); + final map = jsonDecode(encodeArchive(archive)) as Map; + expect(map['schemaVersion'], archiveSchemaVersion + 5); + }); + test('omits the venues array entirely when there are no venues', () { final archive = CompendiumArchive( exportedAt: DateTime.utc(2026), diff --git a/packages/compendium_core/test/storage/program_repository_test.dart b/packages/compendium_core/test/storage/program_repository_test.dart index 73401b3c..78bffed9 100644 --- a/packages/compendium_core/test/storage/program_repository_test.dart +++ b/packages/compendium_core/test/storage/program_repository_test.dart @@ -1286,4 +1286,57 @@ void main() { expect(stats.firstHalfCount, 1); }); }); + + group('venueId write-time integrity', () { + late VenueRepository venues; + + setUp(() => venues = VenueRepository(db)); + + test('accepts a program whose venueId references an existing venue', () async { + await venues.upsert(Venue(id: 'v1', name: 'Guiding Star Grange')); + final program = sampleProgram().copyWith(venueId: 'v1'); + + await repo.create(program); + expect((await repo.getById('p1'))!.venueId, 'v1'); + }); + + test('rejects a program whose venueId references no venue', () async { + final program = sampleProgram().copyWith(venueId: 'ghost'); + + await expectLater( + repo.create(program), + throwsA( + isA().having( + (e) => e.message, + 'message', + contains('ghost'), + ), + ), + ); + // The rejected write left nothing behind (the transaction rolled back). + expect(await repo.getById('p1'), isNull); + }); + + test('rejects an update that repoints venueId at a missing venue', () async { + await venues.upsert(Venue(id: 'v1', name: 'Guiding Star Grange')); + await repo.create(sampleProgram().copyWith(venueId: 'v1')); + + final stored = await repo.getById('p1'); + await expectLater( + repo.update(stored!.copyWith(venueId: 'gone')), + throwsA(isA()), + ); + // The original link is intact — the failed update rolled back. + expect((await repo.getById('p1'))!.venueId, 'v1'); + }); + + test('allows clearing venueId back to null', () async { + await venues.upsert(Venue(id: 'v1', name: 'Guiding Star Grange')); + await repo.create(sampleProgram().copyWith(venueId: 'v1')); + + final stored = await repo.getById('p1'); + await repo.update(stored!.copyWith(clearVenueId: true)); + expect((await repo.getById('p1'))!.venueId, isNull); + }); + }); } From e3491b32c0f4c956b8004e6db1cd61b1248872af Mon Sep 17 00:00:00 2001 From: ibanner56 Date: Tue, 21 Jul 2026 22:09:51 -0700 Subject: [PATCH 03/15] docs(core): track venue re-import dedupe limitation as a follow-up Venues carry no provenance/dedupe key, so re-importing the same bundle inserts duplicate venue records rather than matching previously-imported ones. This is accepted for PR A (consistent with the additive-import model) and deferred to a later PR. Records the limitation as a TODO in CompendiumArchiveImporter.commit (where the behavior lives) and alongside the existing deferred-PR-C venue TODO in program_share_bundle.dart so it stays on the radar. Comment-only; no behavior change. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- app/lib/src/export/program_share_bundle.dart | 5 +++++ .../lib/src/imports/compendium_archive_import.dart | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/app/lib/src/export/program_share_bundle.dart b/app/lib/src/export/program_share_bundle.dart index 3da9e7f9..8e8c496b 100644 --- a/app/lib/src/export/program_share_bundle.dart +++ b/app/lib/src/export/program_share_bundle.dart @@ -55,6 +55,11 @@ import 'share_sanitization.dart'; // TODO(PR C, issue #298): gather the program's referenced Venue into // CompendiumArchive.venues so a shared program carries its venue record, once // venueId is UI-populated (PR B) and a venue resolver is wired here. +// TODO(follow-up, issue #298): venues have no provenance/dedupe key, so +// re-importing the same bundle duplicates venue records (see +// CompendiumArchiveImporter.commit). Accepted for PR A (additive-import model); +// add a dedupe/provenance primitive in a later PR so shared/re-imported +// bundles match existing venues instead of inserting duplicates. String buildProgramShareBundle( Program program, { required Dance? Function(String danceId) danceFor, diff --git a/packages/compendium_core/lib/src/imports/compendium_archive_import.dart b/packages/compendium_core/lib/src/imports/compendium_archive_import.dart index d0f29d83..69f90d1a 100644 --- a/packages/compendium_core/lib/src/imports/compendium_archive_import.dart +++ b/packages/compendium_core/lib/src/imports/compendium_archive_import.dart @@ -337,6 +337,14 @@ class CompendiumArchiveImporter { // never overwrite an existing venue; the original→new remap is what the // rebuilt programs resolve their `venueId` against (a reference to a venue // absent from the bundle is nulled — see [buildArchivePrograms]). + // + // Known limitation (tracked, PR A-accepted): venues carry no provenance / + // dedupe key, so re-importing the same bundle inserts duplicate venue + // records rather than matching the previously-imported ones. This is + // consistent with the additive-import model used elsewhere; a + // dedupe/provenance primitive is deferred to a later PR. + // TODO(follow-up, issue #298): add a venue dedupe/provenance key so a + // re-imported bundle matches existing venues instead of duplicating them. final venueIdByOriginalId = {}; for (final venue in archive.venues) { final mintedVenueId = mintId(); From 660ab1bb8ec8e91c61734b588b09d41d8e5b751d Mon Sep 17 00:00:00 2001 From: ibanner56 Date: Tue, 21 Jul 2026 22:27:27 -0700 Subject: [PATCH 04/15] fix(core): guard venue undo, collapse in-bundle dup venue ids, retrack follow-ups MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses the second Copilot review pass on #452: - Undo dangling-ref (importer): CompendiumArchiveImporter.undo previously hard-deleted inserted venues, bypassing the delete-guard. After a successful import a surviving user program can link to an imported venue, so an unconditional delete would orphan that program's venueId. Undo now mirrors ImportPipeline.undo's created-choreographer handling: guarded per-id delete (retaining any venue a surviving program still references), inserted programs removed first. The failed-commit compensation path keeps hardDelete (safe — the freshly-minted venues can only be referenced by this commit's own rolled-back programs). - In-bundle duplicate venue ids (OWASP untrusted-input hardening): a crafted bundle repeating an original venue id previously orphaned an extra minted row via last-wins remap. It now collapses to a single minted venue (last-seen content wins, mirroring duplicate-program-id handling) and is counted once. - Follow-up tracking: the deferred cross-import venue dedupe/provenance-key limitation and the PR C share-bundle venue-gathering TODOs now reference the dedicated open issue #456 instead of the closed, unrelated #298 (whose historical share-feature references are left intact as origin context). Cross-import venue dedupe/provenance stays deferred (tracked in #456), per the additive-import model. Adds importer tests for guarded-undo retention and in-bundle dup-id collapse. Comment/logic changes only in the importer; no schema change. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- app/lib/src/export/program_share_bundle.dart | 4 +- .../imports/compendium_archive_import.dart | 44 +++++++++++---- .../compendium_archive_import_test.dart | 53 +++++++++++++++++++ 3 files changed, 88 insertions(+), 13 deletions(-) diff --git a/app/lib/src/export/program_share_bundle.dart b/app/lib/src/export/program_share_bundle.dart index 8e8c496b..55b40eb4 100644 --- a/app/lib/src/export/program_share_bundle.dart +++ b/app/lib/src/export/program_share_bundle.dart @@ -52,10 +52,10 @@ import 'share_sanitization.dart'; /// editor UI (PR B) and gathering the referenced venue here (mirroring the /// dance/choreographer gathering above, minding the same privacy sanitization /// for venue contact fields) is deferred to the display/export PR (C). -// TODO(PR C, issue #298): gather the program's referenced Venue into +// TODO(PR C, issue #456): gather the program's referenced Venue into // CompendiumArchive.venues so a shared program carries its venue record, once // venueId is UI-populated (PR B) and a venue resolver is wired here. -// TODO(follow-up, issue #298): venues have no provenance/dedupe key, so +// TODO(follow-up, issue #456): venues have no provenance/dedupe key, so // re-importing the same bundle duplicates venue records (see // CompendiumArchiveImporter.commit). Accepted for PR A (additive-import model); // add a dedupe/provenance primitive in a later PR so shared/re-imported diff --git a/packages/compendium_core/lib/src/imports/compendium_archive_import.dart b/packages/compendium_core/lib/src/imports/compendium_archive_import.dart index 69f90d1a..c0b778a8 100644 --- a/packages/compendium_core/lib/src/imports/compendium_archive_import.dart +++ b/packages/compendium_core/lib/src/imports/compendium_archive_import.dart @@ -339,18 +339,26 @@ class CompendiumArchiveImporter { // absent from the bundle is nulled — see [buildArchivePrograms]). // // Known limitation (tracked, PR A-accepted): venues carry no provenance / - // dedupe key, so re-importing the same bundle inserts duplicate venue - // records rather than matching the previously-imported ones. This is - // consistent with the additive-import model used elsewhere; a - // dedupe/provenance primitive is deferred to a later PR. - // TODO(follow-up, issue #298): add a venue dedupe/provenance key so a + // dedupe key *across imports*, so re-importing the same bundle inserts + // duplicate venue records rather than matching the previously-imported + // ones. This is consistent with the additive-import model used elsewhere; + // a cross-import dedupe/provenance primitive is deferred to a later PR. + // TODO(follow-up, issue #456): add a venue dedupe/provenance key so a // re-imported bundle matches existing venues instead of duplicating them. + // + // *Within* a single (untrusted) bundle, a repeated original id must NOT + // leave an orphaned extra row: it collapses to one minted venue whose + // content is the last-seen occurrence (mirroring the duplicate-program-id + // handling below), and it is counted/tracked once. final venueIdByOriginalId = {}; for (final venue in archive.venues) { - final mintedVenueId = mintId(); + final existingMinted = venueIdByOriginalId[venue.id]; + final mintedVenueId = existingMinted ?? mintId(); await _venues.upsert(_venueWithId(venue, mintedVenueId)); - venueIdByOriginalId[venue.id] = mintedVenueId; - insertedVenueIds.add(mintedVenueId); + if (existingMinted == null) { + venueIdByOriginalId[venue.id] = mintedVenueId; + insertedVenueIds.add(mintedVenueId); + } } final built = buildArchivePrograms( @@ -464,17 +472,31 @@ class CompendiumArchiveImporter { /// Reverts a committed [result]: hard-deletes the **inserted** programs (slots /// cascade) and restores every **updated** (re-imported) program to its - /// captured prior state, then removes the **inserted** venues (now - /// unreferenced, since the programs that linked them are gone), **before** + /// captured prior state, then removes the **inserted** venues, **before** /// delegating to [ImportPipeline.undo] for the dances, authors and /// updated-dance rollbacks. Idempotent — a second call is a no-op. + /// + /// Venue removal is **guarded**, mirroring [ImportPipeline.undo]'s + /// created-choreographer handling: after a successful import a surviving user + /// program may have linked to an imported venue, so an unconditional delete + /// would orphan that program's `venueId`. Each imported venue is deleted only + /// when no program still references it (the repository guard throws + /// otherwise); a still-referenced venue is retained. Inserted programs are + /// removed first, so a venue referenced solely by this import is reclaimed. Future undo(CompendiumArchiveImportResult result) async { if (result.isUndone) return; await _programs.hardDelete(result.insertedProgramIds); for (final prior in result.updatedProgramPriorStates) { await _programs.update(prior); } - await _venues.hardDelete(result.insertedVenueIds); + for (final id in result.insertedVenueIds) { + try { + await _venues.delete(id); + } on StateError { + // Still referenced by a surviving program — leave it in place rather + // than orphan that program's venueId. + } + } await _pipeline.undo(result.danceSession); result._undone = true; } diff --git a/packages/compendium_core/test/imports/compendium_archive_import_test.dart b/packages/compendium_core/test/imports/compendium_archive_import_test.dart index 5ad78503..3db1f2f1 100644 --- a/packages/compendium_core/test/imports/compendium_archive_import_test.dart +++ b/packages/compendium_core/test/imports/compendium_archive_import_test.dart @@ -816,5 +816,58 @@ void main() { await importer.undo(result); expect(await venues.listAll(), isEmpty); }); + + test('undo retains an imported venue a surviving program references', () async { + // After a successful import a user program can link to an imported venue. + // Undo must NOT hard-delete that venue out from under the survivor (which + // would orphan its venueId); the guarded delete retains it. + final archive = bundleWithVenue( + programVenueId: 'orig-v1', + venues: [Venue(id: 'orig-v1', name: 'Guiding Star Grange')], + ); + final result = await run(archive); + final importedVenueId = (await venues.listAll()).single.id; + + await programs.create( + Program( + id: 'user-p1', + title: 'Local Dance', + venueId: importedVenueId, + status: ProgramStatus.draft, + slots: const [], + createdAt: DateTime.utc(2026, 5, 1), + updatedAt: DateTime.utc(2026, 5, 1), + ), + ); + + await importer.undo(result); + + // The imported program is reverted, but the venue survives because the + // user program still references it — no dangling venueId. + final survivor = await programs.getById('user-p1'); + expect(survivor, isNotNull); + expect(survivor!.venueId, importedVenueId); + expect(await venues.getById(importedVenueId), isNotNull); + }); + + test('collapses duplicate venue ids within one bundle (no orphan)', () async { + // Untrusted input: two venue entries sharing the same original id must + // collapse to a single minted row (last-seen content wins), never leaving + // an orphaned extra venue. + final archive = bundleWithVenue( + programVenueId: 'orig-v1', + venues: [ + Venue(id: 'orig-v1', name: 'First Name'), + Venue(id: 'orig-v1', name: 'Second Name'), + ], + ); + final result = await run(archive); + + final all = await venues.listAll(); + expect(all, hasLength(1)); + expect(all.single.name, 'Second Name'); + expect(result.insertedVenueCount, 1); + expect((await programs.listAll()).single.venueId, all.single.id); + }); }); } From 6856bb713daed443241fad57f05042267b5b732a Mon Sep 17 00:00:00 2001 From: ibanner56 Date: Tue, 21 Jul 2026 22:28:53 -0700 Subject: [PATCH 05/15] test(core): pin accepted re-import venue-accumulation behavior (#456) Extends the importer venue-wiring tests (per the Copilot review ask to assert venue counts on re-import): re-importing a venue-bearing bundle dedupes the program by provenance but accumulates venue rows, since cross-import venue dedupe/provenance is deliberately deferred (tracked in #456). Pins the accepted PR A additive behavior so a future dedupe change is a conscious update. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../compendium_archive_import_test.dart | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/packages/compendium_core/test/imports/compendium_archive_import_test.dart b/packages/compendium_core/test/imports/compendium_archive_import_test.dart index 3db1f2f1..ef1a9d1a 100644 --- a/packages/compendium_core/test/imports/compendium_archive_import_test.dart +++ b/packages/compendium_core/test/imports/compendium_archive_import_test.dart @@ -869,5 +869,46 @@ void main() { expect(result.insertedVenueCount, 1); expect((await programs.listAll()).single.venueId, all.single.id); }); + + test('re-import currently duplicates venues (accepted, tracked #456)', () async { + // Cross-import venue dedupe is deliberately deferred (issue #456): venues + // carry no provenance key, so a fresh venue is minted on each import while + // the program dedupes by provenance and is repointed to the newest venue. + // This pins the accepted PR A additive behavior; it will change when #456 + // adds a dedupe/provenance key. + final archive = bundleWithVenue( + programVenueId: 'orig-v1', + venues: [Venue(id: 'orig-v1', name: 'Guiding Star Grange')], + ); + await importer.import( + encodeArchive(archive), + archive, + now: now, + newId: sequentialIds('first'), + newSlotId: sequentialIds('firstslot'), + ); + final result2 = await importer.import( + encodeArchive(archive), + archive, + now: now.add(const Duration(days: 1)), + newId: sequentialIds('second'), + newSlotId: sequentialIds('secondslot'), + ); + + // The program deduped by provenance (updated in place, not re-inserted)... + final programsAfter = await programs.listAll(); + expect(programsAfter, hasLength(1)); + expect(result2.insertedProgramCount, 0); + expect(result2.updatedProgramCount, 1); + // ...but venues accumulate — the known cross-import limitation (#456). + final venuesAfter = await venues.listAll(); + expect(venuesAfter, hasLength(2)); + // The surviving program links to one of the (most-recently minted) venues. + expect(programsAfter.single.venueId, isNotNull); + expect( + venuesAfter.map((v) => v.id), + contains(programsAfter.single.venueId), + ); + }); }); } From 9e2928f35e46f76ae5a9fb5a7854add762802b52 Mon Sep 17 00:00:00 2001 From: ibanner56 Date: Tue, 21 Jul 2026 22:50:21 -0700 Subject: [PATCH 06/15] style(core): format venue code to dart tall-style (fix CI format gate) Earlier PR A commits added venue model/tests that were not run through `dart format`, so the CI `dart format --set-exit-if-changed` gate was red. Reformat the affected venue files to the tall style the pinned Flutter 3.44.6 toolchain enforces. No logic changes. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../compendium_core/lib/src/model/venue.dart | 12 ++-- .../test/model/venue_test.dart | 41 +++++------ .../serialization/archive_codec_test.dart | 71 +++++++++++-------- .../test/storage/migration_test.dart | 30 ++++---- .../test/storage/program_repository_test.dart | 40 ++++++----- 5 files changed, 107 insertions(+), 87 deletions(-) diff --git a/packages/compendium_core/lib/src/model/venue.dart b/packages/compendium_core/lib/src/model/venue.dart index 5821ca06..19d78943 100644 --- a/packages/compendium_core/lib/src/model/venue.dart +++ b/packages/compendium_core/lib/src/model/venue.dart @@ -135,9 +135,7 @@ class Venue { /// [stateProv] and [country] (in that order), skipping any that are null, /// joined by ", ". Since [name] is always present, this is never empty. String get displayName => - [name, address1, city, stateProv, country] - .whereType() - .join(', '); + [name, address1, city, stateProv, country].whereType().join(', '); /// Normalizes a freeform optional string: trims and treats empty/whitespace /// as `null`, so "unset" is a single canonical value (mirrors the @@ -212,14 +210,18 @@ class Venue { : (genericSchedule ?? this.genericSchedule), price: clearPrice ? null : (price ?? this.price), notes: clearNotes ? null : (notes ?? this.notes), - contact1Name: clearContact1Name ? null : (contact1Name ?? this.contact1Name), + contact1Name: clearContact1Name + ? null + : (contact1Name ?? this.contact1Name), contact1Phone: clearContact1Phone ? null : (contact1Phone ?? this.contact1Phone), contact1Email: clearContact1Email ? null : (contact1Email ?? this.contact1Email), - contact2Name: clearContact2Name ? null : (contact2Name ?? this.contact2Name), + contact2Name: clearContact2Name + ? null + : (contact2Name ?? this.contact2Name), contact2Phone: clearContact2Phone ? null : (contact2Phone ?? this.contact2Phone), diff --git a/packages/compendium_core/test/model/venue_test.dart b/packages/compendium_core/test/model/venue_test.dart index 65f52c8e..71b1117c 100644 --- a/packages/compendium_core/test/model/venue_test.dart +++ b/packages/compendium_core/test/model/venue_test.dart @@ -4,14 +4,8 @@ import 'package:test/test.dart'; void main() { group('validation', () { test('requires a non-empty name', () { - expect( - () => Venue(id: 'v1', name: ''), - throwsA(isA()), - ); - expect( - () => Venue(id: 'v1', name: ' '), - throwsA(isA()), - ); + expect(() => Venue(id: 'v1', name: ''), throwsA(isA())); + expect(() => Venue(id: 'v1', name: ' '), throwsA(isA())); }); test('accepts a minimal venue with just id + name', () { @@ -90,20 +84,23 @@ void main() { }); group('displayName', () { - test('joins name + address1 + city + stateProv + country, skipping nulls', () { - final v = Venue( - id: 'v1', - name: 'Guiding Star Grange', - address1: '401 Chapman St', - city: 'Greenfield', - stateProv: 'MA', - country: 'USA', - ); - expect( - v.displayName, - 'Guiding Star Grange, 401 Chapman St, Greenfield, MA, USA', - ); - }); + test( + 'joins name + address1 + city + stateProv + country, skipping nulls', + () { + final v = Venue( + id: 'v1', + name: 'Guiding Star Grange', + address1: '401 Chapman St', + city: 'Greenfield', + stateProv: 'MA', + country: 'USA', + ); + expect( + v.displayName, + 'Guiding Star Grange, 401 Chapman St, Greenfield, MA, USA', + ); + }, + ); test('omits missing components', () { final v = Venue(id: 'v1', name: 'Hall', city: 'Greenfield'); diff --git a/packages/compendium_core/test/serialization/archive_codec_test.dart b/packages/compendium_core/test/serialization/archive_codec_test.dart index 89604a85..5c37b176 100644 --- a/packages/compendium_core/test/serialization/archive_codec_test.dart +++ b/packages/compendium_core/test/serialization/archive_codec_test.dart @@ -521,13 +521,16 @@ void main() { final map = jsonDecode(encodeArchive(archive)) as Map; expect(map.containsKey('venues'), isFalse); // A program without a venue omits the venueId key too. - final program = (map['programs'] as List).cast>().single; + final program = (map['programs'] as List) + .cast>() + .single; expect(program.containsKey('venueId'), isFalse); }); test('a legacy bundle with no venues array imports cleanly', () { - final map = jsonDecode(encodeArchive(archiveWithVenues())) - as Map; + final map = + jsonDecode(encodeArchive(archiveWithVenues())) + as Map; // Simulate a bundle produced before the venue entity existed. map.remove('venues'); @@ -540,8 +543,9 @@ void main() { }); test('a non-array venues field is reported and skipped', () { - final map = jsonDecode(encodeArchive(archiveWithVenues())) - as Map; + final map = + jsonDecode(encodeArchive(archiveWithVenues())) + as Map; map['venues'] = {'not': 'an array'}; final result = decodeArchive(jsonEncode(map)); @@ -553,8 +557,9 @@ void main() { }); test('a venues entry that is not an object is skipped', () { - final map = jsonDecode(encodeArchive(archiveWithVenues())) - as Map; + final map = + jsonDecode(encodeArchive(archiveWithVenues())) + as Map; (map['venues'] as List).add('i am not an object'); final result = decodeArchive(jsonEncode(map)); @@ -564,24 +569,29 @@ void main() { expect(result.archive.venues.map((v) => v.id), containsAll(['v1', 'v2'])); }); - test('a venue with a blank name is skipped without aborting the import', () { - final map = jsonDecode(encodeArchive(archiveWithVenues())) - as Map; - final venues = (map['venues'] as List).cast>(); - venues.firstWhere((v) => v['id'] == 'v2')['name'] = ' '; - - final result = decodeArchive(jsonEncode(map)); - expect(result.hasErrors, isTrue); - expect(result.errors.single.entityType, 'venue'); - expect(result.errors.single.entityId, 'v2'); - // The valid venue and the program still load. - expect(result.archive.venues.map((v) => v.id), ['v1']); - expect(result.archive.programs, hasLength(1)); - }); + test( + 'a venue with a blank name is skipped without aborting the import', + () { + final map = + jsonDecode(encodeArchive(archiveWithVenues())) + as Map; + final venues = (map['venues'] as List).cast>(); + venues.firstWhere((v) => v['id'] == 'v2')['name'] = ' '; + + final result = decodeArchive(jsonEncode(map)); + expect(result.hasErrors, isTrue); + expect(result.errors.single.entityType, 'venue'); + expect(result.errors.single.entityId, 'v2'); + // The valid venue and the program still load. + expect(result.archive.venues.map((v) => v.id), ['v1']); + expect(result.archive.programs, hasLength(1)); + }, + ); test('a venue field of the wrong type is rejected per-entity', () { - final map = jsonDecode(encodeArchive(archiveWithVenues())) - as Map; + final map = + jsonDecode(encodeArchive(archiveWithVenues())) + as Map; final venues = (map['venues'] as List).cast>(); // city must be a string; an attacker-supplied number is rejected. venues.firstWhere((v) => v['id'] == 'v1')['city'] = 42; @@ -595,8 +605,9 @@ void main() { }); test('a missing required venue id is rejected per-entity', () { - final map = jsonDecode(encodeArchive(archiveWithVenues())) - as Map; + final map = + jsonDecode(encodeArchive(archiveWithVenues())) + as Map; final venues = (map['venues'] as List).cast>(); venues.firstWhere((v) => v['id'] == 'v1').remove('id'); @@ -607,8 +618,9 @@ void main() { }); test('unknown/extra venue keys are ignored', () { - final map = jsonDecode(encodeArchive(archiveWithVenues())) - as Map; + final map = + jsonDecode(encodeArchive(archiveWithVenues())) + as Map; final venues = (map['venues'] as List).cast>(); venues.first['futureField'] = {'anything': true}; @@ -622,8 +634,9 @@ void main() { }); test('a non-string program.venueId is rejected per-entity', () { - final map = jsonDecode(encodeArchive(archiveWithVenues())) - as Map; + final map = + jsonDecode(encodeArchive(archiveWithVenues())) + as Map; final programs = (map['programs'] as List).cast>(); programs.single['venueId'] = 7; diff --git a/packages/compendium_core/test/storage/migration_test.dart b/packages/compendium_core/test/storage/migration_test.dart index 9190f3d5..80582acf 100644 --- a/packages/compendium_core/test/storage/migration_test.dart +++ b/packages/compendium_core/test/storage/migration_test.dart @@ -1586,23 +1586,25 @@ void main() { await db.close(); }); - test('adds the programs.venue_id column, defaulting existing rows to null', - () async { - final db = CompendiumDatabase(NativeDatabase(File(dbPath))); - final repos = CompendiumRepositories(db, contraTaxonomy); - await repos.ensureMigrated(); + test( + 'adds the programs.venue_id column, defaulting existing rows to null', + () async { + final db = CompendiumDatabase(NativeDatabase(File(dbPath))); + final repos = CompendiumRepositories(db, contraTaxonomy); + await repos.ensureMigrated(); - final cols = await db.customSelect('PRAGMA table_info(programs)').get(); - final names = cols.map((r) => r.read('name')).toList(); - expect(names, contains('venue_id')); + final cols = await db.customSelect('PRAGMA table_info(programs)').get(); + final names = cols.map((r) => r.read('name')).toList(); + expect(names, contains('venue_id')); - // The pre-existing program carries a null venueId (no silent dangling ref). - final program = await repos.programs.getById('prog-1'); - expect(program, isNotNull); - expect(program!.venueId, isNull); + // The pre-existing program carries a null venueId (no silent dangling ref). + final program = await repos.programs.getById('prog-1'); + expect(program, isNotNull); + expect(program!.venueId, isNull); - await db.close(); - }); + await db.close(); + }, + ); test('a program can be linked to a venue after the upgrade', () async { final db = CompendiumDatabase(NativeDatabase(File(dbPath))); diff --git a/packages/compendium_core/test/storage/program_repository_test.dart b/packages/compendium_core/test/storage/program_repository_test.dart index 78bffed9..57f15d9c 100644 --- a/packages/compendium_core/test/storage/program_repository_test.dart +++ b/packages/compendium_core/test/storage/program_repository_test.dart @@ -1292,13 +1292,16 @@ void main() { setUp(() => venues = VenueRepository(db)); - test('accepts a program whose venueId references an existing venue', () async { - await venues.upsert(Venue(id: 'v1', name: 'Guiding Star Grange')); - final program = sampleProgram().copyWith(venueId: 'v1'); + test( + 'accepts a program whose venueId references an existing venue', + () async { + await venues.upsert(Venue(id: 'v1', name: 'Guiding Star Grange')); + final program = sampleProgram().copyWith(venueId: 'v1'); - await repo.create(program); - expect((await repo.getById('p1'))!.venueId, 'v1'); - }); + await repo.create(program); + expect((await repo.getById('p1'))!.venueId, 'v1'); + }, + ); test('rejects a program whose venueId references no venue', () async { final program = sampleProgram().copyWith(venueId: 'ghost'); @@ -1317,18 +1320,21 @@ void main() { expect(await repo.getById('p1'), isNull); }); - test('rejects an update that repoints venueId at a missing venue', () async { - await venues.upsert(Venue(id: 'v1', name: 'Guiding Star Grange')); - await repo.create(sampleProgram().copyWith(venueId: 'v1')); + test( + 'rejects an update that repoints venueId at a missing venue', + () async { + await venues.upsert(Venue(id: 'v1', name: 'Guiding Star Grange')); + await repo.create(sampleProgram().copyWith(venueId: 'v1')); - final stored = await repo.getById('p1'); - await expectLater( - repo.update(stored!.copyWith(venueId: 'gone')), - throwsA(isA()), - ); - // The original link is intact — the failed update rolled back. - expect((await repo.getById('p1'))!.venueId, 'v1'); - }); + final stored = await repo.getById('p1'); + await expectLater( + repo.update(stored!.copyWith(venueId: 'gone')), + throwsA(isA()), + ); + // The original link is intact — the failed update rolled back. + expect((await repo.getById('p1'))!.venueId, 'v1'); + }, + ); test('allows clearing venueId back to null', () async { await venues.upsert(Venue(id: 'v1', name: 'Guiding Star Grange')); From 5511e6bf85fd1a9b6e83223e5852feecf9cf5b14 Mon Sep 17 00:00:00 2001 From: ibanner56 Date: Tue, 21 Jul 2026 22:50:34 -0700 Subject: [PATCH 07/15] perf(core): validate venueId against a preloaded set on bulk import/restore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Copilot review flagged an N+1 on the archive restore path: each venue-linked program did a `getById` to resolve-or-null its venueId AND then the repository ran a second venue-existence SELECT inside the write, so restoring N linked programs issued 2N venue queries. The community importer had the analogous per-program write-time SELECT (N queries). Fix, preserving the approved soft-ref + app-layer integrity design: - VenueRepository.listAllIds(): one lean SELECT of the id set. - ProgramRepository.create/update: optional `knownVenueIds` — when the bulk callers supply a preloaded set, the write-time venueId guard validates in-memory instead of a per-row SELECT. The single-write path (null set) keeps the strict in-transaction SELECT so a normal save still cannot race a concurrent venue delete. The integrity guarantee is identical either way: an unknown venueId throws. - ArchiveRestorer: preload the venue-id set once for the whole programs phase; resolve-or-null and the write guard share that snapshot (2N -> 1). - CompendiumArchiveImporter: pass the freshly-minted venue-id set to create/update (N -> 0 extra); built programs only ever reference minted venues, so the in-memory check is exact. Sound because both bulk paths only insert venues (never delete one) mid-batch. Adds VenueSelectCounter + query-count invariant tests pinning one venue SELECT on restore and zero on import, mirroring the existing slot-loader N+1 guard. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../imports/compendium_archive_import.dart | 11 +- .../src/serialization/archive_service.dart | 33 ++-- .../repositories/program_repository.dart | 47 +++-- .../repositories/venue_repository.dart | 11 ++ .../callers_companion_usr_import_test.dart | 2 +- .../compendium_archive_import_test.dart | 133 ++++++++++---- .../serialization/archive_service_test.dart | 172 ++++++++++++------ .../test/storage/test_database.dart | 11 ++ 8 files changed, 298 insertions(+), 122 deletions(-) diff --git a/packages/compendium_core/lib/src/imports/compendium_archive_import.dart b/packages/compendium_core/lib/src/imports/compendium_archive_import.dart index c0b778a8..c18531f3 100644 --- a/packages/compendium_core/lib/src/imports/compendium_archive_import.dart +++ b/packages/compendium_core/lib/src/imports/compendium_archive_import.dart @@ -370,6 +370,13 @@ class CompendiumArchiveImporter { now: now, ); + // Every non-null `venueId` on a built program is one of the venues just + // minted above (buildArchivePrograms remaps against `venueIdByOriginalId` + // and nulls anything else), so this preloaded set lets the repository + // validate each write against memory instead of an N+1 of per-program + // venue SELECTs. Safe: this commit only inserts venues, never deletes one. + final knownVenueIds = insertedVenueIds.toSet(); + for (final program in built.programs) { final externalId = program.provenance?.externalId; final hasExternalId = externalId != null && externalId.isNotEmpty; @@ -380,7 +387,7 @@ class CompendiumArchiveImporter { ? null : await _programs.getById(mappedId, includeDeleted: true); if (mappedId == null || existing == null) { - await _programs.create(program); + await _programs.create(program, knownVenueIds: knownVenueIds); insertedIds.add(program.id); insertedIdSet.add(program.id); if (hasExternalId) resolvedByExternalId[externalId] = program.id; @@ -399,7 +406,7 @@ class CompendiumArchiveImporter { priorCapturedFor.add(mappedId)) { priorStates.add(existing); } - await _programs.update(target); + await _programs.update(target, knownVenueIds: knownVenueIds); persisted[mappedId] = target; } } diff --git a/packages/compendium_core/lib/src/serialization/archive_service.dart b/packages/compendium_core/lib/src/serialization/archive_service.dart index 06990869..48d93e6a 100644 --- a/packages/compendium_core/lib/src/serialization/archive_service.dart +++ b/packages/compendium_core/lib/src/serialization/archive_service.dart @@ -129,26 +129,37 @@ class ArchiveRestorer { await _repos.venues.upsert(v); }); } + // Load the set of known venue ids **once** for the whole programs phase: + // both the dangling-ref resolve-or-null below and the repository's + // write-time integrity guard validate against this single snapshot, so + // restoring N venue-linked programs issues one venue query instead of 2·N + // (a per-program existence read here plus another inside each write). + // Sound because restore only inserts venues (above) and never deletes one + // mid-batch, so the snapshot cannot go stale under us. + final knownVenueIds = await _repos.venues.listAllIds(); for (final p in archive.programs) { await _guard('program', p.id, errors, () async { - await _repos.programs.create(await _withResolvedVenue(p)); + await _repos.programs.create( + _withResolvedVenue(p, knownVenueIds), + knownVenueIds: knownVenueIds, + ); }); } } /// Guards against a **dangling** `venueId` from an untrusted bundle: if the - /// program references a venue that resolves in neither the just-loaded - /// archive nor the existing dataset, the link is cleared before the program - /// is written. `venueId` is a soft reference (no DB foreign key), so a - /// dangling value would not fail at commit — but leaving one silently in - /// place is exactly what the OWASP-aligned import contract forbids, so it is - /// nulled rather than persisted as an unresolvable reference. A resolvable - /// (or already-null) `venueId` is left untouched. - Future _withResolvedVenue(Program p) async { + /// program references a venue absent from [knownVenueIds] (the venues present + /// after the archive's own venues were loaded, plus any pre-existing ones), + /// the link is cleared before the program is written. `venueId` is a soft + /// reference (no DB foreign key), so a dangling value would not fail at + /// commit — but leaving one silently in place is exactly what the + /// OWASP-aligned import contract forbids, so it is nulled rather than + /// persisted as an unresolvable reference. A resolvable (or already-null) + /// `venueId` is left untouched. + Program _withResolvedVenue(Program p, Set knownVenueIds) { final venueId = p.venueId; if (venueId == null) return p; - final exists = await _repos.venues.getById(venueId) != null; - return exists ? p : p.copyWith(clearVenueId: true); + return knownVenueIds.contains(venueId) ? p : p.copyWith(clearVenueId: true); } /// Removes every user-content row (and its derived indexes) so a diff --git a/packages/compendium_core/lib/src/storage/repositories/program_repository.dart b/packages/compendium_core/lib/src/storage/repositories/program_repository.dart index ba9206a4..445f5b69 100644 --- a/packages/compendium_core/lib/src/storage/repositories/program_repository.dart +++ b/packages/compendium_core/lib/src/storage/repositories/program_repository.dart @@ -135,11 +135,21 @@ class ProgramRepository { final CompendiumDatabase _db; - Future create(Program program) => _upsert(program); - - Future update(Program program) => _upsert(program); - - Future _upsert(Program program) => _db.transaction(() async { + /// Persists a new program. Pass [knownVenueIds] on the bulk restore/import + /// paths to validate a non-null `venueId` against a preloaded set instead of + /// a per-row SELECT (keeps persisting N programs O(1) in venue queries); see + /// [_upsert]. + Future create(Program program, {Set? knownVenueIds}) => + _upsert(program, knownVenueIds: knownVenueIds); + + /// Updates an existing program. See [create] for [knownVenueIds]. + Future update(Program program, {Set? knownVenueIds}) => + _upsert(program, knownVenueIds: knownVenueIds); + + Future _upsert( + Program program, { + Set? knownVenueIds, + }) => _db.transaction(() async { assertUtc(program.createdAt, 'program.createdAt'); assertUtc(program.updatedAt, 'program.updatedAt'); assertUtcOrNull(program.deletedAt, 'program.deletedAt'); @@ -149,19 +159,24 @@ class ProgramRepository { } // `venueId` is a soft reference (no DB foreign key — see [Programs.venueId]), // so referential integrity is enforced here at the app layer instead: a - // non-null `venueId` must point at an existing venue, checked *inside* this - // write transaction so the reference cannot become dangling between a - // check and the write. Import paths (ArchiveRestorer, CompendiumArchive - // importer) resolve-or-null a dangling `venueId` *before* calling the repo, - // so a bundle referencing an absent venue never reaches this throw. + // non-null `venueId` must point at an existing venue. For a single write + // (the [knownVenueIds] set is null) this is checked with a SELECT *inside* + // this transaction, so the reference cannot become dangling between the + // check and the write. Bulk callers (ArchiveRestorer, CompendiumArchive + // importer) instead pass a set of venue ids preloaded once and always + // resolve-or-null a dangling `venueId` *before* calling the repo — so a + // bundle referencing an absent venue never reaches the throw below, and + // persisting N programs stays O(1) in venue queries. Either way the + // integrity guarantee is identical: an unknown `venueId` throws. final venueId = program.venueId; if (venueId != null) { - final venueExists = - await (_db.select(_db.venues) - ..where((t) => t.id.equals(venueId)) - ..limit(1)) - .getSingleOrNull() != - null; + final venueExists = knownVenueIds != null + ? knownVenueIds.contains(venueId) + : await (_db.select(_db.venues) + ..where((t) => t.id.equals(venueId)) + ..limit(1)) + .getSingleOrNull() != + null; if (!venueExists) { throw StateError( 'cannot save program "${program.id}": venueId "$venueId" ' diff --git a/packages/compendium_core/lib/src/storage/repositories/venue_repository.dart b/packages/compendium_core/lib/src/storage/repositories/venue_repository.dart index 1e65e552..f7d35552 100644 --- a/packages/compendium_core/lib/src/storage/repositories/venue_repository.dart +++ b/packages/compendium_core/lib/src/storage/repositories/venue_repository.dart @@ -57,6 +57,17 @@ class VenueRepository { return rows.map(_toModel).toList(); } + /// Loads just the set of existing venue ids in a **single** query (only the + /// `id` column is read — no full-model mapping). This is the batch-safe input + /// for bulk writers (archive restore/import) that must validate many + /// programs' `venueId` against existing venues without an N+1 of per-program + /// existence SELECTs — see [ProgramRepository.create]'s `knownVenueIds`. + Future> listAllIds() async { + final query = _db.selectOnly(_db.venues)..addColumns([_db.venues.id]); + final rows = await query.get(); + return {for (final r in rows) r.read(_db.venues.id)!}; + } + /// Deletes the venue [id], guarding — **atomically** — against deleting a /// venue any program still links to. The "is any program referencing this /// venue?" check and the delete run inside a single transaction so no program diff --git a/packages/compendium_core/test/imports/callers_companion_usr_import_test.dart b/packages/compendium_core/test/imports/callers_companion_usr_import_test.dart index d155c6ca..7f851c97 100644 --- a/packages/compendium_core/test/imports/callers_companion_usr_import_test.dart +++ b/packages/compendium_core/test/imports/callers_companion_usr_import_test.dart @@ -415,6 +415,6 @@ class _FailingProgramRepository extends ProgramRepository { _FailingProgramRepository(super.db); @override - Future create(Program program) async => + Future create(Program program, {Set? knownVenueIds}) async => throw StateError('simulated program persist failure'); } diff --git a/packages/compendium_core/test/imports/compendium_archive_import_test.dart b/packages/compendium_core/test/imports/compendium_archive_import_test.dart index ef1a9d1a..64d88b9b 100644 --- a/packages/compendium_core/test/imports/compendium_archive_import_test.dart +++ b/packages/compendium_core/test/imports/compendium_archive_import_test.dart @@ -753,45 +753,51 @@ void main() { expect(linked.city, 'Greenfield'); }); - test('does not overwrite an existing venue that shares the bundle id', () async { - // A venue the receiver already holds under the same id the (untrusted) - // bundle reuses must survive untouched — the import inserts a fresh copy. - await venues.upsert( - Venue(id: 'orig-v1', name: 'Receiver Hall', city: 'Local'), - ); - final archive = bundleWithVenue( - programVenueId: 'orig-v1', - venues: [Venue(id: 'orig-v1', name: 'Bundle Grange')], - ); - await run(archive); + test( + 'does not overwrite an existing venue that shares the bundle id', + () async { + // A venue the receiver already holds under the same id the (untrusted) + // bundle reuses must survive untouched — the import inserts a fresh copy. + await venues.upsert( + Venue(id: 'orig-v1', name: 'Receiver Hall', city: 'Local'), + ); + final archive = bundleWithVenue( + programVenueId: 'orig-v1', + venues: [Venue(id: 'orig-v1', name: 'Bundle Grange')], + ); + await run(archive); - final existing = await venues.getById('orig-v1'); - expect(existing?.name, 'Receiver Hall'); - // A distinct new venue was inserted for the bundle's record. - expect( - (await venues.listAll()).map((v) => v.name), - containsAll(['Receiver Hall', 'Bundle Grange']), - ); - }); + final existing = await venues.getById('orig-v1'); + expect(existing?.name, 'Receiver Hall'); + // A distinct new venue was inserted for the bundle's record. + expect( + (await venues.listAll()).map((v) => v.name), + containsAll(['Receiver Hall', 'Bundle Grange']), + ); + }, + ); - test('nulls a program venueId absent from the bundle (dangling ref)', () async { - final archive = bundleWithVenue( - programVenueId: 'orig-missing', - venues: [Venue(id: 'orig-v2', name: 'Town Hall')], - ); - final result = await run(archive); + test( + 'nulls a program venueId absent from the bundle (dangling ref)', + () async { + final archive = bundleWithVenue( + programVenueId: 'orig-missing', + venues: [Venue(id: 'orig-v2', name: 'Town Hall')], + ); + final result = await run(archive); - final program = (await programs.listAll()).single; - // OWASP: an unresolvable reference is nulled, never persisted dangling. - expect(program.venueId, isNull); - // The drop is surfaced as a non-fatal issue, not silently swallowed. - expect( - result.programIssues.map((i) => i.code), - contains('archive_program_unresolved_venue'), - ); - // The unrelated bundled venue still landed. - expect((await venues.listAll()).map((v) => v.name), ['Town Hall']); - }); + final program = (await programs.listAll()).single; + // OWASP: an unresolvable reference is nulled, never persisted dangling. + expect(program.venueId, isNull); + // The drop is surfaced as a non-fatal issue, not silently swallowed. + expect( + result.programIssues.map((i) => i.code), + contains('archive_program_unresolved_venue'), + ); + // The unrelated bundled venue still landed. + expect((await venues.listAll()).map((v) => v.name), ['Town Hall']); + }, + ); test('a legacy bundle with no venues imports cleanly', () async { final result = await run(bundleWithVenue()); @@ -910,5 +916,60 @@ void main() { contains(programsAfter.single.venueId), ); }); + + test('validates venueIds against the minted set (no per-program venue ' + 'SELECT)', () async { + final counter = VenueSelectCounter(); + final countingDb = openCountingTestDatabase(counter); + addTearDown(countingDb.close); + final countingPrograms = ProgramRepository(countingDb); + final countingVenues = VenueRepository(countingDb); + final countingImporter = CompendiumArchiveImporter( + ImportPipeline( + DanceRepository(countingDb, contraTaxonomy), + ChoreographerRepository(countingDb), + ), + countingPrograms, + countingVenues, + ); + + Program p(String id, String venueId) => Program( + id: id, + title: 'P $id', + venueId: venueId, + status: ProgramStatus.draft, + slots: [ProgramSlot(id: '$id-s0', position: 0, danceId: 'orig-d1')], + createdAt: DateTime.utc(2026, 4, 1), + updatedAt: DateTime.utc(2026, 4, 1), + ); + final archive = CompendiumArchive( + exportedAt: DateTime.utc(2026, 7, 15), + dances: [_dance('orig-d1', 'Simplicity Swing')], + programs: [ + p('orig-p1', 'orig-v1'), + p('orig-p2', 'orig-v2'), + p('orig-p3', 'orig-v1'), + ], + venues: [ + Venue(id: 'orig-v1', name: 'Grange A'), + Venue(id: 'orig-v2', name: 'Grange B'), + ], + ); + + counter.reset(); + await countingImporter.import( + encodeArchive(archive), + archive, + now: now, + newId: sequentialIds('new'), + newSlotId: sequentialIds('slot'), + ); + + // Built programs only reference freshly-minted venues, so the write phase + // validates each `venueId` against the in-memory minted set — issuing no + // per-program venue existence SELECT. + expect(counter.count, 0); + expect(await countingPrograms.listAll(), hasLength(3)); + }); }); } diff --git a/packages/compendium_core/test/serialization/archive_service_test.dart b/packages/compendium_core/test/serialization/archive_service_test.dart index 69d0f107..f43fb756 100644 --- a/packages/compendium_core/test/serialization/archive_service_test.dart +++ b/packages/compendium_core/test/serialization/archive_service_test.dart @@ -271,29 +271,32 @@ void main() { updatedAt: DateTime.utc(2026, 4, 20), ); - test('replace materializes venues and resolves a program.venueId', () async { - final db = openTestDatabase(); - addTearDown(db.close); - final repos = CompendiumRepositories(db, contraTaxonomy); + test( + 'replace materializes venues and resolves a program.venueId', + () async { + final db = openTestDatabase(); + addTearDown(db.close); + final repos = CompendiumRepositories(db, contraTaxonomy); - final archive = CompendiumArchive( - exportedAt: DateTime.utc(2026, 7, 15), - programs: [programWithVenue('v1')], - venues: [ - Venue(id: 'v1', name: 'Guiding Star Grange', city: 'Greenfield'), - ], - ); + final archive = CompendiumArchive( + exportedAt: DateTime.utc(2026, 7, 15), + programs: [programWithVenue('v1')], + venues: [ + Venue(id: 'v1', name: 'Guiding Star Grange', city: 'Greenfield'), + ], + ); - final result = await ArchiveRestorer(repos).restore(archive); - expect(result.hasErrors, isFalse, reason: result.errors.join('\n')); + final result = await ArchiveRestorer(repos).restore(archive); + expect(result.hasErrors, isFalse, reason: result.errors.join('\n')); - // The venue landed and the program's link resolves (venues load first). - final venue = await repos.venues.getById('v1'); - expect(venue, isNotNull); - expect(venue!.city, 'Greenfield'); - final program = await repos.programs.getById('p1'); - expect(program!.venueId, 'v1'); - }); + // The venue landed and the program's link resolves (venues load first). + final venue = await repos.venues.getById('v1'); + expect(venue, isNotNull); + expect(venue!.city, 'Greenfield'); + final program = await repos.programs.getById('p1'); + expect(program!.venueId, 'v1'); + }, + ); test('export -> restore round-trips venues and the venueId link', () async { final sourceDb = openTestDatabase(); @@ -321,52 +324,109 @@ void main() { ).export(exportedAt: DateTime.utc(2026, 7, 15)); expect(encodeArchive(reexport), json); - expect((await targetRepos.venues.getById('v1'))!.contact1Email, 'p@x.com'); + expect( + (await targetRepos.venues.getById('v1'))!.contact1Email, + 'p@x.com', + ); expect((await targetRepos.programs.getById('p1'))!.venueId, 'v1'); }); - test('a dangling venueId (venue absent everywhere) is nulled, not persisted', - () async { - final db = openTestDatabase(); - addTearDown(db.close); - final repos = CompendiumRepositories(db, contraTaxonomy); + test( + 'a dangling venueId (venue absent everywhere) is nulled, not persisted', + () async { + final db = openTestDatabase(); + addTearDown(db.close); + final repos = CompendiumRepositories(db, contraTaxonomy); - // The program references 'ghost', which is in neither the archive nor db. - final archive = CompendiumArchive( - exportedAt: DateTime.utc(2026, 7, 15), - programs: [programWithVenue('ghost')], - ); + // The program references 'ghost', which is in neither the archive nor db. + final archive = CompendiumArchive( + exportedAt: DateTime.utc(2026, 7, 15), + programs: [programWithVenue('ghost')], + ); - final result = await ArchiveRestorer(repos).restore(archive); - expect(result.hasErrors, isFalse, reason: result.errors.join('\n')); + final result = await ArchiveRestorer(repos).restore(archive); + expect(result.hasErrors, isFalse, reason: result.errors.join('\n')); - final program = await repos.programs.getById('p1'); - expect(program, isNotNull); - // The dangling reference is cleared rather than left silently orphaned. - expect(program!.venueId, isNull); - }); + final program = await repos.programs.getById('p1'); + expect(program, isNotNull); + // The dangling reference is cleared rather than left silently orphaned. + expect(program!.venueId, isNull); + }, + ); - test('a venueId resolvable only in the target db is preserved on merge', - () async { - final db = openTestDatabase(); - addTearDown(db.close); - final repos = CompendiumRepositories(db, contraTaxonomy); + test( + 'a venueId resolvable only in the target db is preserved on merge', + () async { + final db = openTestDatabase(); + addTearDown(db.close); + final repos = CompendiumRepositories(db, contraTaxonomy); - // The venue exists in the target database but not in the incoming bundle. - await repos.venues.upsert(Venue(id: 'v1', name: 'Existing Hall')); + // The venue exists in the target database but not in the incoming bundle. + await repos.venues.upsert(Venue(id: 'v1', name: 'Existing Hall')); - final archive = CompendiumArchive( - exportedAt: DateTime.utc(2026, 7, 15), - programs: [programWithVenue('v1')], - ); + final archive = CompendiumArchive( + exportedAt: DateTime.utc(2026, 7, 15), + programs: [programWithVenue('v1')], + ); - final result = await ArchiveRestorer( - repos, - ).restore(archive, mode: RestoreMode.merge); - expect(result.hasErrors, isFalse, reason: result.errors.join('\n')); + final result = await ArchiveRestorer( + repos, + ).restore(archive, mode: RestoreMode.merge); + expect(result.hasErrors, isFalse, reason: result.errors.join('\n')); - // The link survives because the referenced venue resolves against the db. - expect((await repos.programs.getById('p1'))!.venueId, 'v1'); - }); + // The link survives because the referenced venue resolves against the db. + expect((await repos.programs.getById('p1'))!.venueId, 'v1'); + }, + ); + + test( + 'resolves every venueId from one preloaded set (no N+1 on restore)', + () async { + final counter = VenueSelectCounter(); + final db = openCountingTestDatabase(counter); + addTearDown(db.close); + final repos = CompendiumRepositories(db, contraTaxonomy); + + Program p(String id, String? venueId) => Program( + id: id, + title: 'P $id', + venueId: venueId, + slots: const [], + createdAt: DateTime.utc(2026, 4, 1), + updatedAt: DateTime.utc(2026, 4, 20), + ); + final archive = CompendiumArchive( + exportedAt: DateTime.utc(2026, 7, 15), + venues: [ + Venue(id: 'v1', name: 'Grange A'), + Venue(id: 'v2', name: 'Grange B'), + ], + // Two venues shared across several programs, one venue-less program and + // one dangling ref — the whole phase must resolve from one snapshot. + programs: [ + p('p1', 'v1'), + p('p2', 'v2'), + p('p3', 'v1'), + p('p4', null), + p('p5', 'ghost'), + ], + ); + + counter.reset(); + final result = await ArchiveRestorer(repos).restore(archive); + expect(result.hasErrors, isFalse, reason: result.errors.join('\n')); + + // Exactly one venue SELECT (the preload) for the whole programs phase — + // not two per venue-linked program (a resolve-or-null read here plus a + // write-time guard read inside each program insert). + expect(counter.count, 1); + + // The single snapshot still resolves / nulls links correctly. + expect((await repos.programs.getById('p1'))!.venueId, 'v1'); + expect((await repos.programs.getById('p2'))!.venueId, 'v2'); + expect((await repos.programs.getById('p4'))!.venueId, isNull); + expect((await repos.programs.getById('p5'))!.venueId, isNull); + }, + ); }); } diff --git a/packages/compendium_core/test/storage/test_database.dart b/packages/compendium_core/test/storage/test_database.dart index bd903477..deaea656 100644 --- a/packages/compendium_core/test/storage/test_database.dart +++ b/packages/compendium_core/test/storage/test_database.dart @@ -49,6 +49,17 @@ class SlotSelectCounter extends QueryCounter { } } +/// A [QueryCounter] that only counts SELECTs touching `venues` — used to assert +/// bulk restore/import validate `venueId`s against a preloaded set (O(1) venue +/// queries) rather than an N+1 of per-program existence reads. +class VenueSelectCounter extends QueryCounter { + @override + bool matches(String statement) { + final s = statement.toLowerCase(); + return s.startsWith('select') && s.contains('venues'); + } +} + /// An in-memory [CompendiumDatabase] whose executor is wrapped with [counter], /// letting a test observe how many (matching) statements a repository issues. CompendiumDatabase openCountingTestDatabase(QueryInterceptor counter) => From 5a9b29121e5b00460ad0b9b66e2307f3f2b9b1d0 Mon Sep 17 00:00:00 2001 From: ibanner56 Date: Tue, 21 Jul 2026 23:09:22 -0700 Subject: [PATCH 08/15] perf(core): count referencing programs in venue delete guard Read a scalar COUNT(id) inside the delete transaction instead of materializing every referencing ProgramRow just to check emptiness. A venue is reusable across many programs, so the guard cost now stays flat regardless of how large a popular venue's referencing history grows. Integrity is unchanged: a still-referenced venue still throws a StateError inside the same transaction (no check-then-act race). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../repositories/venue_repository.dart | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/compendium_core/lib/src/storage/repositories/venue_repository.dart b/packages/compendium_core/lib/src/storage/repositories/venue_repository.dart index f7d35552..90367eb1 100644 --- a/packages/compendium_core/lib/src/storage/repositories/venue_repository.dart +++ b/packages/compendium_core/lib/src/storage/repositories/venue_repository.dart @@ -79,13 +79,20 @@ class VenueRepository { /// join to the `programs.venue_id` column), tightened to be transactional /// because `venueId` is an app-layer-enforced soft reference, not a DB FK. Future delete(String id) => _db.transaction(() async { - final stillUsed = await (_db.select( - _db.programs, - )..where((t) => t.venueId.equals(id))).get(); - if (stillUsed.isNotEmpty) { + // A venue is explicitly reusable across many programs, so read only a + // scalar `COUNT(id)` for the guard rather than materializing every + // referencing `ProgramRow` (all columns) just to count it — the cost stays + // flat regardless of how large a popular venue's referencing history grows. + final referencingCount = _db.programs.id.count(); + final count = + await (_db.selectOnly(_db.programs) + ..addColumns([referencingCount]) + ..where(_db.programs.venueId.equals(id))) + .map((row) => row.read(referencingCount) ?? 0) + .getSingle(); + if (count > 0) { throw StateError( - 'cannot delete venue "$id": still referenced by ' - '${stillUsed.length} program(s)', + 'cannot delete venue "$id": still referenced by $count program(s)', ); } await (_db.delete(_db.venues)..where((t) => t.id.equals(id))).go(); From 5e161e255b3bd0c1e892f2f546e9343488ab3641 Mon Sep 17 00:00:00 2001 From: ibanner56 Date: Tue, 21 Jul 2026 23:19:37 -0700 Subject: [PATCH 09/15] perf(core): index programs.venue_id for the venue delete guard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Without an index, VenueRepository.delete's COUNT(id) reference guard full-scans the whole programs table (O(total programs)) on every guarded delete, since a venue is reusable across many programs. Add a plain `programs_venue_id` lookup index so SQLite restricts the count to matching references. Created via a raw CREATE INDEX IF NOT EXISTS (mirroring the existing dance_figures search index) in both onCreate (fresh databases) and the from < 13 upgrade step (migrated databases), so both paths match. Same schema version (13) — additive, no version bump. Migration tests assert the index exists on both fresh and upgraded databases. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../lib/src/storage/database.dart | 31 ++++++++++++-- .../repositories/venue_repository.dart | 6 ++- .../test/storage/migration_test.dart | 41 +++++++++++++++++++ 3 files changed, 73 insertions(+), 5 deletions(-) diff --git a/packages/compendium_core/lib/src/storage/database.dart b/packages/compendium_core/lib/src/storage/database.dart index 5266e7a6..8f9f733c 100644 --- a/packages/compendium_core/lib/src/storage/database.dart +++ b/packages/compendium_core/lib/src/storage/database.dart @@ -37,6 +37,20 @@ const List searchIndexSql = [ 'ON dance_figures(move, section)', ]; +/// The v13 lookup index over `programs.venue_id`. +/// +/// `VenueRepository.delete`'s guard counts the programs still referencing a +/// venue (`SELECT COUNT(id) FROM programs WHERE venue_id = ?`). Because a +/// venue is explicitly reusable across many programs, without this index that +/// COUNT would full-scan the whole `programs` table on every guarded delete +/// (O(total programs)); the index lets SQLite restrict the scan to just the +/// matching references. Declared raw (like [searchIndexSql]) rather than as a +/// drift-managed index, and applied in both `onCreate` and the `from < 13` +/// upgrade step so fresh and migrated databases get it identically. +const List venueLookupIndexSql = [ + 'CREATE INDEX IF NOT EXISTS programs_venue_id ON programs(venue_id)', +]; + /// Settings key marking that a schema migration touched the derived figure /// index and the `dance_figures` rows must be rebuilt from `figures_json`. /// @@ -157,8 +171,10 @@ const int kCompendiumSchemaVersion = 13; /// non-destructively. `venue_id` is a deliberately un-constrained soft /// reference (no FK) — referential integrity is enforced at the app layer by /// `VenueRepository.delete`'s guard — so this migration adds NO FK and no -/// rebuild marker. Venues do NOT feed the derived `dance_fts`/`dance_figures` -/// indexes, so NO derived rebuild is required. +/// rebuild marker. It DOES add one plain lookup index, `programs_venue_id` +/// (see [venueLookupIndexSql]), so that guard's reference-count query stays +/// cheap instead of full-scanning `programs`. Venues do NOT feed the derived +/// `dance_fts`/`dance_figures` indexes, so NO derived rebuild is required. /// /// Every future migration must (a) bump [schemaVersion], (b) add a /// `MigrationStrategy` step for the new version, and (c) ship a test that @@ -206,6 +222,9 @@ class CompendiumDatabase extends _$CompendiumDatabase { for (final sql in searchIndexSql) { await customStatement(sql); } + for (final sql in venueLookupIndexSql) { + await customStatement(sql); + } }, onUpgrade: (m, from, to) async { // Belt-and-suspenders downgrade guard. drift is forward-only and has no @@ -368,9 +387,15 @@ class CompendiumDatabase extends _$CompendiumDatabase { // free-text `venue` label (the two coexist non-destructively). `venues` // does NOT feed the derived `dance_fts`/`dance_figures` indexes, and no // data is back-filled, so — unlike the v9 step — NO derived rebuild is - // required and no rebuild marker is written. + // required and no rebuild marker is written. The `programs_venue_id` + // lookup index backs `VenueRepository.delete`'s reference-count guard + // (see [venueLookupIndexSql]); it is created here for upgraders and in + // `onCreate` for fresh databases. await m.createTable(venues); await m.addColumn(programs, programs.venueId); + for (final sql in venueLookupIndexSql) { + await customStatement(sql); + } } }, beforeOpen: (details) async { diff --git a/packages/compendium_core/lib/src/storage/repositories/venue_repository.dart b/packages/compendium_core/lib/src/storage/repositories/venue_repository.dart index 90367eb1..30c53ba6 100644 --- a/packages/compendium_core/lib/src/storage/repositories/venue_repository.dart +++ b/packages/compendium_core/lib/src/storage/repositories/venue_repository.dart @@ -81,8 +81,10 @@ class VenueRepository { Future delete(String id) => _db.transaction(() async { // A venue is explicitly reusable across many programs, so read only a // scalar `COUNT(id)` for the guard rather than materializing every - // referencing `ProgramRow` (all columns) just to count it — the cost stays - // flat regardless of how large a popular venue's referencing history grows. + // referencing `ProgramRow` (all columns) just to count it. The + // `programs_venue_id` index (see `venueLookupIndexSql`) backs this WHERE so + // the count restricts to matching references instead of scanning every + // program row, keeping the guard cheap as a popular venue's history grows. final referencingCount = _db.programs.id.count(); final count = await (_db.selectOnly(_db.programs) diff --git a/packages/compendium_core/test/storage/migration_test.dart b/packages/compendium_core/test/storage/migration_test.dart index 80582acf..56a63153 100644 --- a/packages/compendium_core/test/storage/migration_test.dart +++ b/packages/compendium_core/test/storage/migration_test.dart @@ -1620,6 +1620,47 @@ void main() { await db.close(); }); + + test('creates the programs.venue_id lookup index', () async { + final db = CompendiumDatabase(NativeDatabase(File(dbPath))); + final repos = CompendiumRepositories(db, contraTaxonomy); + await repos.ensureMigrated(); + + final indexes = await db + .customSelect( + "SELECT name FROM sqlite_master WHERE type='index' " + "AND tbl_name='programs'", + ) + .get(); + final names = indexes.map((r) => r.read('name')).toSet(); + expect(names, contains('programs_venue_id')); + + await db.close(); + }); + }); + + test('a fresh database has the programs.venue_id lookup index', () async { + final dir = await Directory.systemTemp.createTemp( + 'compendium_core_venidx_', + ); + addTearDown(() => dir.delete(recursive: true)); + final dbPath = p.join(dir.path, 'test.sqlite'); + + // onCreate builds every table; assert the raw venue lookup index is among + // them so fresh installs match a migrated database. + final db = CompendiumDatabase(NativeDatabase(File(dbPath))); + await db.quickCheck(); + + final indexes = await db + .customSelect( + "SELECT name FROM sqlite_master WHERE type='index' " + "AND tbl_name='programs'", + ) + .get(); + final names = indexes.map((r) => r.read('name')).toSet(); + expect(names, contains('programs_venue_id')); + + await db.close(); }); test( From e1dad49a81b124a3da6aa6176a32e6a0c05214ea Mon Sep 17 00:00:00 2001 From: ibanner56 Date: Tue, 21 Jul 2026 23:27:43 -0700 Subject: [PATCH 10/15] test(core): drop venue_id index before column in v12 fixture generator Adding the programs_venue_id index (previous commit) means SQLite now refuses `ALTER TABLE programs DROP COLUMN venue_id` while that index still references the column, breaking the documented fixture regeneration command. Drop the index before the column in the strip-to- v12 step and document the ordering. Regenerated v12.sqlite with the fixed generator; the v12 -> v13 migration group still passes (the fixture is still a valid v12 shape: no venues table, no venue_id, no index, user_version = 12). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../fixtures/generate_v12_fixture.dart | 6 ++++++ .../test/storage/fixtures/v12.sqlite | Bin 208896 -> 212992 bytes 2 files changed, 6 insertions(+) diff --git a/packages/compendium_core/test/storage/fixtures/generate_v12_fixture.dart b/packages/compendium_core/test/storage/fixtures/generate_v12_fixture.dart index a2f99a5c..f770b711 100644 --- a/packages/compendium_core/test/storage/fixtures/generate_v12_fixture.dart +++ b/packages/compendium_core/test/storage/fixtures/generate_v12_fixture.dart @@ -13,6 +13,9 @@ // seed realistic data at the current schema and then *strip back to the v12 // shape* with raw SQL before stamping `user_version = 12`: // * DROP TABLE venues — remove the v13-only table; +// * DROP INDEX programs_venue_id — remove the v13-only lookup index, which +// must go before the DROP COLUMN below (SQLite refuses to drop a column an +// index still references); // * ALTER TABLE programs DROP COLUMN venue_id — remove the v13-only column // (SQLite >= 3.35; the bundled sqlite3 is 3.53+); // * PRAGMA user_version = 12. @@ -76,6 +79,9 @@ Future main() async { // Strip the v13-only additions and stamp the file back to v12. final raw = sqlite3.sqlite3.open(fixturePath); raw.execute('DROP TABLE IF EXISTS venues'); + // Drop the v13-only lookup index first: SQLite refuses to DROP COLUMN while + // an index still references it. + raw.execute('DROP INDEX IF EXISTS programs_venue_id'); raw.execute('ALTER TABLE programs DROP COLUMN venue_id'); raw.execute('PRAGMA user_version = 12'); raw.close(); diff --git a/packages/compendium_core/test/storage/fixtures/v12.sqlite b/packages/compendium_core/test/storage/fixtures/v12.sqlite index aceefc5a8b6d70c0937ab823c044b5ce5f70b5bc..5172c889190b60ea79da3b082f8425f6b372e288 100644 GIT binary patch delta 194 zcmZp8z|+vcJ3(4dmVtr61c-Hjm>Gy=C+Zk8$~GpnCNOSIU|PPOlL;uO4a6qf1s5=V z;NNzDNx^}Q?FI;L78KaT79DBGCay2bSelual3Gzvl%HOdm|GlQmYP?Z8lRa06EJZO za&-)GRq*t4ag9)biNcjB`1`>HHDG!*w;QuFpVi>v0$R_=|A&G956BIl_*s~l88`uv C0XcsF delta 74 zcmZo@;B9!oGeKHVnt_4A7>IR%mW@kRD0RU9#5Y7Mq From 48ca8affa0a7302ab854330881467d0b7194446d Mon Sep 17 00:00:00 2001 From: ibanner56 Date: Tue, 21 Jul 2026 23:38:23 -0700 Subject: [PATCH 11/15] fix(core): preserve venueId on Caller's Companion .USR re-import MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CallersCompanionUsrImporter._rebuildProgramWithId reconstructs a provenance-matched program from fresh .USR data on re-import, keeping only the prior program's id and createdAt. venueId is an app-local entity link a .USR archive can never supply, so the rebuild was implicitly nulling it — silently dropping a venue link the user established after the original import. Carry the prior program's venueId forward (like id/createdAt) so re-import no longer destroys app-local state the source cannot reconstruct. Mirrors the venueId preservation already wired into the archive importer. +regression test. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../imports/callers_companion_usr_import.dart | 10 ++++++ .../callers_companion_usr_import_test.dart | 35 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/packages/compendium_core/lib/src/imports/callers_companion_usr_import.dart b/packages/compendium_core/lib/src/imports/callers_companion_usr_import.dart index c7c39fb2..e722a254 100644 --- a/packages/compendium_core/lib/src/imports/callers_companion_usr_import.dart +++ b/packages/compendium_core/lib/src/imports/callers_companion_usr_import.dart @@ -171,6 +171,7 @@ class CallersCompanionUsrImporter { program, id: existingId, createdAt: prior.createdAt, + priorVenueId: prior.venueId, ); priorStates.add(prior); await _programs.update(target); @@ -238,15 +239,24 @@ class CallersCompanionUsrImporter { /// the matched program's identity/creation stamp on a re-import) while keeping /// every other field — title, slots, event metadata, provenance, updatedAt — /// from the freshly built program. + /// + /// [priorVenueId] carries the matched program's existing `venueId` forward. + /// A `.USR` archive has no concept of this app-local venue entity link, so a + /// freshly built program never supplies one; overwriting with null would + /// silently drop a link the user established after the original import. + /// Preserving it (like [id]/[createdAt]) keeps the re-import from destroying + /// app-local state the source cannot reconstruct. Program _rebuildProgramWithId( Program src, { required String id, required DateTime createdAt, + required String? priorVenueId, }) => Program( id: id, title: src.title, eventDate: src.eventDate, venue: src.venue, + venueId: priorVenueId, band: src.band, caller: src.caller, dancerLevel: src.dancerLevel, diff --git a/packages/compendium_core/test/imports/callers_companion_usr_import_test.dart b/packages/compendium_core/test/imports/callers_companion_usr_import_test.dart index 7f851c97..27154efb 100644 --- a/packages/compendium_core/test/imports/callers_companion_usr_import_test.dart +++ b/packages/compendium_core/test/imports/callers_companion_usr_import_test.dart @@ -345,6 +345,41 @@ void main() { expect(await dances.listAll(), hasLength(2)); }); + test( + 're-import preserves a venueId linked after the first import', + () async { + final venues = VenueRepository(db); + + final first = await importer.import( + _ccUsrBytes(), + now: now, + newId: sequentialIds(), + newSlotId: sequentialIds(), + ); + final programId = first.programs.single.id; + + // Simulate a user linking the imported program to a venue entity (the + // work PR B wires into the UI). `.USR` data can never supply this id. + await venues.upsert(Venue(id: 'v1', name: 'Guiding Star Grange')); + final imported = await programs.getById(programId); + await programs.update(imported!.copyWith(venueId: 'v1')); + + // Re-import the identical archive: the provenance-matched rebuild must + // carry the app-local venueId forward rather than overwriting it with + // null (a silent link loss). + final second = await importer.import( + _ccUsrBytes(), + now: DateTime.utc(2026, 8, 1), + newId: sequentialIds(), + newSlotId: sequentialIds(), + ); + expect(second.updatedProgramCount, 1); + + final reloaded = await programs.getById(programId); + expect(reloaded!.venueId, 'v1', reason: 'venueId survives re-import'); + }, + ); + test('undo after a re-import restores the prior program state', () async { await importer.import( _ccUsrBytes(), From 1aa96026e65d3e3faf6f4444d666baf5c102ef76 Mon Sep 17 00:00:00 2001 From: ibanner56 Date: Wed, 22 Jul 2026 00:24:35 -0700 Subject: [PATCH 12/15] docs(core): correct venue schema references v13 -> v14 after #455 rebase Main's #455 landed its own schema v13 (the dance_links dance_id index) before this PR merged, so the venue entity rebased from v13 to v14. The implementation, migration ladder, and tests already use v14 correctly, but several venue-related API doc comments still said "schema v13". Update them (and the regenerated database.g.dart mirror comment) so the documented introduction version matches the shipped database format. Comment-only; no runtime behavior change. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- packages/compendium_core/lib/src/model/program.dart | 2 +- .../lib/src/serialization/archive_codec.dart | 2 +- .../lib/src/serialization/compendium_archive.dart | 6 +++--- packages/compendium_core/lib/src/storage/database.g.dart | 2 +- packages/compendium_core/lib/src/storage/tables.dart | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/compendium_core/lib/src/model/program.dart b/packages/compendium_core/lib/src/model/program.dart index 0b124297..5468cfc6 100644 --- a/packages/compendium_core/lib/src/model/program.dart +++ b/packages/compendium_core/lib/src/model/program.dart @@ -195,7 +195,7 @@ class Program { /// the free-text [venue] label so the two coexist non-destructively: the /// display layer prefers a resolvable [venueId], falling back to [venue] /// (`docs/design/domain-model.md`). `null` when the program has no linked - /// venue entity (the default, and every program before schema v13). + /// venue entity (the default, and every program before schema v14). final String? venueId; /// The band playing the event. diff --git a/packages/compendium_core/lib/src/serialization/archive_codec.dart b/packages/compendium_core/lib/src/serialization/archive_codec.dart index c2da86e3..4b7d4c09 100644 --- a/packages/compendium_core/lib/src/serialization/archive_codec.dart +++ b/packages/compendium_core/lib/src/serialization/archive_codec.dart @@ -73,7 +73,7 @@ Map archiveToJson(CompendiumArchive archive) => { ], // Omit the `venues` array entirely when empty so archives produced before // the venue entity (and any that simply have no venues) stay byte-identical - // to the pre-v13 format and older readers are unaffected. + // to the pre-v14 format and older readers are unaffected. if (archive.venues.isNotEmpty) 'venues': [ for (final v in _sortedById(archive.venues, (v) => v.id)) _venueToJson(v), diff --git a/packages/compendium_core/lib/src/serialization/compendium_archive.dart b/packages/compendium_core/lib/src/serialization/compendium_archive.dart index 428304ea..0f49ecb1 100644 --- a/packages/compendium_core/lib/src/serialization/compendium_archive.dart +++ b/packages/compendium_core/lib/src/serialization/compendium_archive.dart @@ -22,7 +22,7 @@ const ListEquality _listEq = ListEquality(); /// Version history: /// * **v1** — the original envelope: dances, programs, choreographers, /// published sources, custom fields, tags. -/// * **v2** — adds the schema-v13 venue entity: an optional top-level `venues` +/// * **v2** — adds the schema-v14 venue entity: an optional top-level `venues` /// array and a `program.venueId` soft link. A **v1** reader silently ignores /// both, so an archive that actually carries venue data is stamped v2 (see /// [requiredSchemaVersion]) to trip the "newer than supported" warning @@ -33,7 +33,7 @@ const int archiveSchemaVersion = archiveSchemaVersionVenues; /// The original, pre-venue archive envelope version. const int archiveSchemaVersionBase = 1; -/// The envelope version introduced with the schema-v13 venue entity (see +/// The envelope version introduced with the schema-v14 venue entity (see /// [archiveSchemaVersion]). const int archiveSchemaVersionVenues = 2; @@ -107,7 +107,7 @@ class CompendiumArchive { final List tags; /// Reusable venue entities referenced by programs' `venueId`. Added - /// alongside the schema-v13 venue entity; older archives simply omit the + /// alongside the schema-v14 venue entity; older archives simply omit the /// `venues` array and decode to an empty list. final List venues; diff --git a/packages/compendium_core/lib/src/storage/database.g.dart b/packages/compendium_core/lib/src/storage/database.g.dart index fb79659b..77d8bcd3 100644 --- a/packages/compendium_core/lib/src/storage/database.g.dart +++ b/packages/compendium_core/lib/src/storage/database.g.dart @@ -2791,7 +2791,7 @@ class ProgramRow extends DataClass implements Insertable { final String? venue; /// Optional reference to a first-class [Venues] row (`venues.id`), added in - /// schema v13. A deliberately un-constrained soft reference (no drift + /// schema v14. A deliberately un-constrained soft reference (no drift /// `.references()`/FK): the free-text [venue] label and this entity link /// coexist non-destructively. Referential integrity is enforced at the app /// layer instead of by a DB constraint — `ProgramRepository` rejects a write diff --git a/packages/compendium_core/lib/src/storage/tables.dart b/packages/compendium_core/lib/src/storage/tables.dart index ff98f28f..ed54c6d1 100644 --- a/packages/compendium_core/lib/src/storage/tables.dart +++ b/packages/compendium_core/lib/src/storage/tables.dart @@ -147,7 +147,7 @@ class Programs extends Table { TextColumn get venue => text().nullable()(); /// Optional reference to a first-class [Venues] row (`venues.id`), added in - /// schema v13. A deliberately un-constrained soft reference (no drift + /// schema v14. A deliberately un-constrained soft reference (no drift /// `.references()`/FK): the free-text [venue] label and this entity link /// coexist non-destructively. Referential integrity is enforced at the app /// layer instead of by a DB constraint — `ProgramRepository` rejects a write @@ -310,7 +310,7 @@ class DanceSources extends Table { /// A reusable venue (hall, church, grange, festival site) that programs are /// held at. A first-class entity (like [PublishedSources]/[Choreographers]); /// a program links to it by [Programs.venueId] while the free-text -/// [Programs.venue] label persists independently. Added in schema v13. +/// [Programs.venue] label persists independently. Added in schema v14. /// /// Faithful to Caller's Companion's `Venue` table minus its FileMaker plumbing /// (`VenueDisplay_c`, `zc_*`/`zi_*`, `zk_Constant`, `SiteID`): CC's stored From d7e720f120707288f0c264069c82355a9ca174cd Mon Sep 17 00:00:00 2001 From: ibanner56 Date: Wed, 22 Jul 2026 00:44:44 -0700 Subject: [PATCH 13/15] test(core): make v12 fixture generator reproduce a faithful v12 db MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The v12 fixture generator seeds a fresh database at the current schema (v14) and then strips back to the v12 shape. It only removed v13's `dance_links_dance_id` index, so re-running it against the v14 schema left v14's venue additions behind — the regenerated `v12.sqlite` kept the `venues` table, the `programs.venue_id` column, and the `programs_venue_id` index. That broken fixture would fail the `v12 -> v13` migration test (`createTable(venues)` throws "table venues already exists" during the `from < 14` step). The committed fixture was only correct because it predated the venue entity; the generator could no longer reproduce it. Strip the v14 venue additions too, mirroring `generate_v13_fixture.dart`: DROP TABLE venues, then DROP INDEX programs_venue_id BEFORE ALTER TABLE programs DROP COLUMN venue_id (SQLite refuses to drop a column an index still references), plus the v13 dance_links index, then stamp user_version = 12. Regenerated `v12.sqlite` accordingly — schema is identical to the prior fixture (byte layout differs only by the freelist pages the DROP TABLE/COLUMN leave behind, matching how v13.sqlite is built). Verified: v12 -> v13 + v13 -> v14 migration groups pass against the regenerated fixture, full core suite green, analyze clean, format gate clean, build_runner no drift, schema gate 13 -> 14. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../fixtures/generate_v12_fixture.dart | 33 +++++++++++++----- .../test/storage/fixtures/v12.sqlite | Bin 200704 -> 217088 bytes 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/packages/compendium_core/test/storage/fixtures/generate_v12_fixture.dart b/packages/compendium_core/test/storage/fixtures/generate_v12_fixture.dart index 39150e5c..8bcf1e0a 100644 --- a/packages/compendium_core/test/storage/fixtures/generate_v12_fixture.dart +++ b/packages/compendium_core/test/storage/fixtures/generate_v12_fixture.dart @@ -5,13 +5,23 @@ // // dart run test/storage/fixtures/generate_v12_fixture.dart // -// Strategy (mirrors `generate_v11_fixture.dart`): seed a fresh database at the -// *current* schema through the repositories (so the choreographer/dance/link -// rows are realistic), then raw-SQL strip the one structural difference the -// v12 -> v13 migration introduces — the `dance_links_dance_id` index — and reset -// `user_version` to 12. v13 adds no columns/tables and rewrites no data (it only -// creates that index), so dropping the index and rewinding `user_version` yields -// a structurally-faithful v12 database. +// Strategy (mirrors `generate_v13_fixture.dart`): the current code is already at +// schema v14, so opening a fresh `CompendiumDatabase` creates the v14 shape (with +// the `venues` table, the `programs.venue_id` column, and both the +// `programs_venue_id` and `dance_links_dance_id` indexes). Seeding at v14 and only +// rewinding `user_version` would leave those v13/v14 additions behind, so we seed +// realistic data at the current schema and then *strip back to the v12 shape* with +// raw SQL before stamping `user_version = 12`: +// * DROP TABLE venues — remove the v14-only table; +// * DROP INDEX programs_venue_id — remove the v14-only lookup index, which must +// go before the DROP COLUMN below (SQLite refuses to drop a column an index +// still references); +// * ALTER TABLE programs DROP COLUMN venue_id — remove the v14-only column +// (SQLite >= 3.35; the bundled sqlite3 is 3.53+); +// * DROP INDEX dance_links_dance_id — remove the v13-only index (#455); +// * PRAGMA user_version = 12. +// The result is a faithful v12 database: NO `venues` table, NO `programs.venue_id`, +// and neither the `programs_venue_id` nor the `dance_links_dance_id` index. // // The seeded dance carries a video `DanceLink`, so the fixture exercises the // exact access path the new index accelerates: a `dance_links` row whose @@ -80,9 +90,14 @@ Future main() async { await db.close(); - // Strip the v13 index and rewind user_version so the fixture is a faithful - // v12 database (structurally identical to v12: v13's only change is the index). + // Strip the v13 + v14 additions and stamp the file back to v12 so the fixture + // is a faithful v12 database (none of the later structural changes present). final raw = sqlite3.sqlite3.open(fixturePath); + raw.execute('DROP TABLE IF EXISTS venues'); + // Drop the v14-only lookup index first: SQLite refuses to DROP COLUMN while an + // index still references it. + raw.execute('DROP INDEX IF EXISTS programs_venue_id'); + raw.execute('ALTER TABLE programs DROP COLUMN venue_id'); raw.execute('DROP INDEX IF EXISTS dance_links_dance_id'); raw.execute('PRAGMA user_version = 12'); raw.close(); diff --git a/packages/compendium_core/test/storage/fixtures/v12.sqlite b/packages/compendium_core/test/storage/fixtures/v12.sqlite index 061554be017360da648b572ed2457d558e259051..d0420e6fd4954f70a80df1192be4100bda08e3c6 100644 GIT binary patch delta 1734 zcmeHIZ)h837{BK(mrE{x-j?ZV|JfK}>zbrVnyy8ZE^WN6j;t%ALPbZoCAT$_Ue3Eq znk=)KI@p9dR>F9}Po2m>sWTY6;D?In7e^fv1iuXx|A0(X92<%heUr3l6N(^y^^WH` z?)UuO=l#R)cXxKldUnZnsk60*qNx2O+$0PndKTS*Ko8Y_d5tA+G`deRm znS&reX@Ps*#FLH>IZ1lZ{&LIp769K6dz-Q|E0oQM)+{sD8x2$4WtW*>nH4%jQ?N?S zQ^V-@%9_Z9Kg_@(d?ZLxI19VVKL>$jca!q&+6r{>L_$*3~+JO!H2SF6798z>~`xn*0(LsS@!bdJZrjQI%#ro*XRrMv+zEQQ=d{Jrs0=3 z5B}gZ^y7>IU6{$i2)OZB4)zczo`Y#{;g56B3m$wY2O;Rg-ZStf?b=tkiMmFr2cbp$ zwWs^sSTEPs-VPTc)m7HeT6Tqw38PbjV`_9PEI6E1u<)+Mje{B(^0AmIX`0{Zm=dO^ z91~B6!)}LDtf2#qXf&>88xc(xbtyuQB;ANdlPOtOo5)I%&=ZkpGA3=Y^Ofn8L`oan z!Ya_5bV7^k+lUoVQH zYc3KMcMXZxd4T3A;$i>EoSTCjpoPu%3W%0 z88;q(X296y?S@obj!BsfDQl6cB#5atf&Ckbd1~TGVcM~Y)@hET6Lqk6bL_s8ek^9e z1%vptEIbZAd?O112;lWB9HJ9m99F;$130U|0b1$D2Z`_ri72}rUpx(cMCJe53*-Ys ztA$&rquC7v7yfs{c1QmQH{}1x4Rxa^GfBD0f%Td+E5;LzuHC2&>|n5ZX`^Mw_I=cg z)t-e>b7vvQu=v0{2<0!%Kmzb&o`~+;JbXrbA1z$uy6~3@?7I3j?cggv3PATLbdT8Q T4zlu0r#U9dQOV=yt2X-^$CV6y delta 591 zcmZ9IOK1~u5XS$rlYQo~Nu_N}W3ARlZ8vF_wTkr61P!efA9xT2p@>ndgc7h|NNQSC zw1+)d(l8efRYdS2p@FU!ON<98sV{O9L=bxr4^^vBTST`$E*|C^X86s=$Ba$6$EI92 zn|uMrnEtoG?tux-Faj)GsPgs%>Z+~Gudcf0T&8^A8B)H8kK`e~BAQs`Z$J&lF%Bk} zd7pQMc1NMFGz*JpeT~B$luYr0q+G-`3&!f}u6Sp>0Fh30nbomL<`&edbMQaoCBEVi zu*#j_8lc7|!Bm$gVjCzIg=AQhyfFfSJQL7{*Pyum%e zJM05D&K*>*vWK2)>JeAX)8o>dWoJ~GQTDNZ`KdhcClq7J5KW7y(PIgNv?AgbdZD6j z-A+RSxILTlDS0y;PQy{^%fMSM)|}UEt~CQ&t&>?e1e_5hZw`VK&w}52Hv$?6T>+tS ze=F%}Xr|{Qu#WcT;5~VAu!}OIa9!BmAT)N@=U=IQijTrhiVQ=q!_HHo>@XbT&UVr> z0Xsma?*ev1n7TwXAVTLw?B!A#wMZDIPbpYW=Oi2JpjZmR5Teg1@Y8DvW6(}P8MlG9 zwmJ?w=$4FaHuoENBilD^BrAB=O1Lozw9$=mLKWxfr3Vdqa0xC?mmLwyQG_3h7L>W4 dJ@>rWqWt@q`mN+EepH Date: Wed, 22 Jul 2026 01:06:23 -0700 Subject: [PATCH 14/15] Preserve user-linked venueId on pre-venue archive re-import MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Copilot review (07:51Z) flagged two items on the community archive re-import path: 1. compendium_archive_import.dart — data-loss defect: on a provenance-matched re-import, _rebuildProgramWithId carried `venueId: src.venueId` verbatim. A pre-venue (venue-unaware) archive cannot express venueId, so its rebuilt program is necessarily null; overwriting with it silently dropped a venue link the user had established locally after the original import. Fix: condition the overwrite on whether the archive is venue-aware, keyed on requiredSchemaVersion(archive) (the archive's actual venue content, matching what the encoder stamps the wire version from). A venue-aware archive keeps its explicit semantics (remapped-or-nulled venueId overwrites, so an explicit null still clears); a pre-venue archive preserves the matched program's prior venueId, mirroring the .USR re-import precedent. Admit a preserved prior venueId into the per-write knownVenueIds set so the bulk-import in-memory validation accepts it (the venue delete-guard keeps a referenced venue alive and this commit only inserts venues, so the reference is sound). +2 tests: pre-venue re-import preserves a user-linked venueId; a venue-aware re-import honors an explicit cleared venueId. 2. program_share_bundle.dart — comment-only: stale "schema v13" venueId reference corrected to v14 (post-#455-rebase version). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- app/lib/src/export/program_share_bundle.dart | 2 +- .../imports/compendium_archive_import.dart | 43 +++++++++++-- .../compendium_archive_import_test.dart | 63 +++++++++++++++++++ 3 files changed, 103 insertions(+), 5 deletions(-) diff --git a/app/lib/src/export/program_share_bundle.dart b/app/lib/src/export/program_share_bundle.dart index 55b40eb4..859fe5fa 100644 --- a/app/lib/src/export/program_share_bundle.dart +++ b/app/lib/src/export/program_share_bundle.dart @@ -44,7 +44,7 @@ import 'share_sanitization.dart'; /// is injectable for deterministic tests. /// /// Venue gathering is deliberately **not** done here yet: a program's -/// `venueId` (schema v13) rides along inside the embedded [program], but the +/// `venueId` (schema v14) rides along inside the embedded [program], but the /// referenced [Venue] record is not gathered into `CompendiumArchive.venues`. /// The core receive path handles this safely — `CompendiumArchiveImporter` /// nulls a `venueId` that resolves to no bundled venue — so a shared program diff --git a/packages/compendium_core/lib/src/imports/compendium_archive_import.dart b/packages/compendium_core/lib/src/imports/compendium_archive_import.dart index c18531f3..56e5a23d 100644 --- a/packages/compendium_core/lib/src/imports/compendium_archive_import.dart +++ b/packages/compendium_core/lib/src/imports/compendium_archive_import.dart @@ -377,6 +377,18 @@ class CompendiumArchiveImporter { // venue SELECTs. Safe: this commit only inserts venues, never deletes one. final knownVenueIds = insertedVenueIds.toSet(); + // A pre-venue archive cannot express `venueId` at all, so on a + // provenance-matched re-import its programs carry a null one; honoring that + // would silently drop a link the user established after the original + // import. Only a venue-aware archive has *explicit* venue semantics whose + // (remapped-or-nulled) value should overwrite the matched program — see + // [_rebuildProgramWithId]. Keyed on [requiredSchemaVersion] (the archive's + // actual venue content, exactly what the encoder stamps the wire version + // from) rather than the passed object's `schemaVersion`, so the decision is + // correct regardless of how that field was set. + final archiveCarriesVenueLinks = + requiredSchemaVersion(archive) >= archiveSchemaVersionVenues; + for (final program in built.programs) { final externalId = program.provenance?.externalId; final hasExternalId = externalId != null && externalId.isNotEmpty; @@ -397,6 +409,8 @@ class CompendiumArchiveImporter { program, id: mappedId, createdAt: existing.createdAt, + priorVenueId: existing.venueId, + archiveCarriesVenueLinks: archiveCarriesVenueLinks, ); // Capture the true pre-import state exactly once per existing id, and // never for a row this commit inserted (its prior state is "absent", @@ -406,7 +420,17 @@ class CompendiumArchiveImporter { priorCapturedFor.add(mappedId)) { priorStates.add(existing); } - await _programs.update(target, knownVenueIds: knownVenueIds); + // A preserved prior `venueId` (pre-venue re-import) references a venue + // already in the DB, not one this import inserted, so it is absent from + // [knownVenueIds]. Admit it for this write: the venue delete-guard keeps + // a referenced venue alive and this commit only inserts venues, so the + // reference is sound and needs no extra per-write SELECT. + final venueId = target.venueId; + final knownForWrite = + venueId != null && !knownVenueIds.contains(venueId) + ? {...knownVenueIds, venueId} + : knownVenueIds; + await _programs.update(target, knownVenueIds: knownForWrite); persisted[mappedId] = target; } } @@ -541,18 +565,29 @@ class CompendiumArchiveImporter { /// Rebuilds [src] under an existing program [id] and [createdAt] (preserving /// the matched program's identity/creation stamp on a re-import) while keeping /// every other field from the freshly built program. + /// + /// [priorVenueId] is the matched program's current `venueId`, and + /// [archiveCarriesVenueLinks] is whether the incoming archive is venue-aware + /// (its [requiredSchemaVersion] reaches [archiveSchemaVersionVenues]). A + /// venue-aware archive has *explicit* venue semantics, so [src]'s + /// already-remapped-or-nulled `venueId` overwrites the match (an explicit null + /// clears the link). A pre-venue archive cannot express `venueId` at all, so + /// [src]'s is necessarily null; overwriting with it would silently drop a link + /// the user established after the original import, so [priorVenueId] is + /// preserved instead (like [id]/[createdAt]) — mirroring the `.USR` re-import's + /// venue-link preservation for a source that likewise cannot reconstruct it. Program _rebuildProgramWithId( Program src, { required String id, required DateTime createdAt, + required String? priorVenueId, + required bool archiveCarriesVenueLinks, }) => Program( id: id, title: src.title, eventDate: src.eventDate, venue: src.venue, - // [src] is the freshly-built program, so its `venueId` is already the - // remapped (or nulled) reference — carry it through the re-import verbatim. - venueId: src.venueId, + venueId: archiveCarriesVenueLinks ? src.venueId : priorVenueId, band: src.band, caller: src.caller, dancerLevel: src.dancerLevel, diff --git a/packages/compendium_core/test/imports/compendium_archive_import_test.dart b/packages/compendium_core/test/imports/compendium_archive_import_test.dart index 64d88b9b..f842b0b2 100644 --- a/packages/compendium_core/test/imports/compendium_archive_import_test.dart +++ b/packages/compendium_core/test/imports/compendium_archive_import_test.dart @@ -971,5 +971,68 @@ void main() { expect(counter.count, 0); expect(await countingPrograms.listAll(), hasLength(3)); }); + + test( + 'preserves a user-linked venueId when re-importing a pre-venue archive', + () async { + // A program first imported from a pre-venue (venue-less) bundle: its + // requiredSchemaVersion is the base version, so the importer treats it as + // unable to express `venueId`. + final preVenue = bundleWithVenue(); + await run(preVenue); + final imported = (await programs.listAll()).single; + expect(imported.venueId, isNull); + + // The user later links that program to a venue locally. + await venues.upsert(Venue(id: 'user-v1', name: 'User Hall')); + await programs.update(imported.copyWith(venueId: 'user-v1')); + + // Re-importing the SAME pre-venue bundle must NOT clobber that link: the + // source cannot express `venueId`, so the rebuilt program's null is + // "unknown", not "explicitly cleared" — mirroring the `.USR` re-import. + await importer.import( + encodeArchive(preVenue), + preVenue, + now: now.add(const Duration(days: 1)), + newId: sequentialIds('second'), + newSlotId: sequentialIds('secondslot'), + ); + + final after = (await programs.listAll()).single; + expect(after.id, imported.id, reason: 'deduped in place, not inserted'); + expect(after.venueId, 'user-v1', reason: 'app-local link preserved'); + expect(await venues.getById('user-v1'), isNotNull); + }, + ); + + test('a venue-aware re-import honors an explicit cleared venueId', () async { + // A program imported from a venue-aware bundle, linked to a venue. + final withVenue = bundleWithVenue( + programVenueId: 'orig-v1', + venues: [Venue(id: 'orig-v1', name: 'Guiding Star Grange')], + ); + await run(withVenue); + final imported = (await programs.listAll()).single; + expect(imported.venueId, isNotNull); + + // Re-import a bundle that is still venue-aware (it carries venue records) + // but whose SAME program now has no venue link. Because the source *can* + // express venue semantics, the explicit absence overwrites the match — + // the link is cleared, unlike the pre-venue case above. + final cleared = bundleWithVenue( + venues: [Venue(id: 'orig-v2', name: 'Town Hall')], + ); + await importer.import( + encodeArchive(cleared), + cleared, + now: now.add(const Duration(days: 1)), + newId: sequentialIds('second'), + newSlotId: sequentialIds('secondslot'), + ); + + final after = (await programs.listAll()).single; + expect(after.id, imported.id, reason: 'deduped in place, not inserted'); + expect(after.venueId, isNull, reason: 'v2 explicit clear honored'); + }); }); } From db0db549d6fccb5c8fc70fbaa78db4ce503b4c1b Mon Sep 17 00:00:00 2001 From: ibanner56 Date: Wed, 22 Jul 2026 01:36:09 -0700 Subject: [PATCH 15/15] test(core): lock in venueId carry-through for duplicate() + stamp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Comprehensive venueId-preservation audit (every Program construct/ rewrite/copy/duplicate/persist/read/serialize site) found the production paths already correct, but two model invariants lacked an explicit regression guard: - Program.duplicate() carries venueId to the clone (same event, same venue) — extend the existing "carries the new fields through" test. - Program.stampDanceSlotsPerformed() preserves venueId (it rebuilds via copyWith) — new test guarding a future refactor to a direct Program(...) construction that could forget the field. Test-only; no production change (the audit found no gaps to fix). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../test/model/program_test.dart | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/packages/compendium_core/test/model/program_test.dart b/packages/compendium_core/test/model/program_test.dart index b9a62642..4f23c7d3 100644 --- a/packages/compendium_core/test/model/program_test.dart +++ b/packages/compendium_core/test/model/program_test.dart @@ -276,6 +276,7 @@ void main() { band: 'The Fiddleheads', caller: 'Alice', dancerLevel: 'beginner', + venueId: 'grange-hall', slots: [ ProgramSlot( id: 's1', @@ -297,6 +298,9 @@ void main() { expect(copy.band, 'The Fiddleheads'); expect(copy.caller, 'Alice'); expect(copy.dancerLevel, 'beginner'); + // The app-local venue link rides through to the duplicate (the copy is a + // clone of the same event, so it keeps the same venue). + expect(copy.venueId, 'grange-hall'); expect(copy.slots.single.guestCaller, 'Bob'); expect(copy.slots.single.plannedMinutes, 12); // performedAt still resets per existing behavior. @@ -557,6 +561,27 @@ void main() { expect(stamped.slots.map((s) => s.performedAt), [eventDate, eventDate]); }); + test('preserves venueId on the stamped copy', () { + final eventDate = DateTime.utc(2026, 3, 15); + final p = Program( + id: 'p1', + title: 'Spring Dance', + eventDate: eventDate, + venueId: 'grange-hall', + slots: [ProgramSlot(id: 's1', position: 0, danceId: 'd1')], + createdAt: now, + updatedAt: now, + ); + final stamped = p.stampDanceSlotsPerformed( + fallback: DateTime.utc(2026, 7, 20), + ); + // Stamping rebuilds via copyWith, so the app-local venue link must ride + // through unchanged — guards a future refactor to a direct Program(...) + // construction that could forget venueId. + expect(stamped.venueId, 'grange-hall'); + expect(stamped.slots.single.performedAt, eventDate); + }); + test('uses fallback when the program has no eventDate', () { final fallback = DateTime.utc(2026, 7, 20); final p = program(