From 95b8e0ed76761733bf96631aa4550c7f160aa270 Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Mon, 29 Sep 2025 13:00:02 +0200 Subject: [PATCH] create migration --- app/drift_schemas/bangs/drift_schema_v2.json | 1 + .../bangs/data/database/database.dart | 8 +- .../bangs/data/database/database.steps.dart | 431 +++++ app/test/drift/bangs/generated/schema.dart | 23 + app/test/drift/bangs/generated/schema_v1.dart | 1557 ++++++++++++++++ app/test/drift/bangs/generated/schema_v2.dart | 1642 +++++++++++++++++ app/test/drift/bangs/migration_test.dart | 97 + 7 files changed, 3758 insertions(+), 1 deletion(-) create mode 100644 app/drift_schemas/bangs/drift_schema_v2.json create mode 100644 app/lib/features/bangs/data/database/database.steps.dart create mode 100644 app/test/drift/bangs/generated/schema.dart create mode 100644 app/test/drift/bangs/generated/schema_v1.dart create mode 100644 app/test/drift/bangs/generated/schema_v2.dart create mode 100644 app/test/drift/bangs/migration_test.dart diff --git a/app/drift_schemas/bangs/drift_schema_v2.json b/app/drift_schemas/bangs/drift_schema_v2.json new file mode 100644 index 00000000..d086de33 --- /dev/null +++ b/app/drift_schemas/bangs/drift_schema_v2.json @@ -0,0 +1 @@ +{"_meta":{"description":"This file contains a serialized version of schema entities for drift.","version":"1.2.0"},"options":{"store_date_time_values_as_text":false},"entities":[{"id":0,"references":[],"type":"table","data":{"name":"bang","was_declared_in_moor":true,"columns":[{"name":"trigger","getter_name":"trigger","moor_type":"string","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"group","getter_name":"group","moor_type":"int","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(BangGroup.values)","dart_type_name":"BangGroup"}},{"name":"website_name","getter_name":"websiteName","moor_type":"string","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"domain","getter_name":"domain","moor_type":"string","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"url_template","getter_name":"urlTemplate","moor_type":"string","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"category","getter_name":"category","moor_type":"string","nullable":true,"customConstraints":"","default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"sub_category","getter_name":"subCategory","moor_type":"string","nullable":true,"customConstraints":"","default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"format","getter_name":"format","moor_type":"string","nullable":true,"customConstraints":"","default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const BangFormatConverter()","dart_type_name":"Set?"}}],"is_virtual":false,"without_rowid":false,"constraints":["PRIMARY KEY(\"trigger\", \"group\")"],"explicit_pk":["trigger","group"]}},{"id":1,"references":[],"type":"table","data":{"name":"bang_sync","was_declared_in_moor":true,"columns":[{"name":"group","getter_name":"group","moor_type":"int","nullable":false,"customConstraints":"PRIMARY KEY NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":["primary-key"],"type_converter":{"dart_expr":"const EnumIndexConverter(BangGroup.values)","dart_type_name":"BangGroup"}},{"name":"last_sync","getter_name":"lastSync","moor_type":"dateTime","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":2,"references":[0],"type":"table","data":{"name":"bang_frequency","was_declared_in_moor":true,"columns":[{"name":"trigger","getter_name":"trigger","moor_type":"string","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"group","getter_name":"group","moor_type":"int","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(BangGroup.values)","dart_type_name":"BangGroup"}},{"name":"frequency","getter_name":"frequency","moor_type":"int","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_used","getter_name":"lastUsed","moor_type":"dateTime","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":["PRIMARY KEY(\"trigger\", \"group\")","FOREIGN KEY(\"trigger\", \"group\")REFERENCES bang(\"trigger\", \"group\")ON DELETE CASCADE"],"explicit_pk":["trigger","group"]}},{"id":3,"references":[0],"type":"table","data":{"name":"bang_history","was_declared_in_moor":true,"columns":[{"name":"search_query","getter_name":"searchQuery","moor_type":"string","nullable":false,"customConstraints":"UNIQUE NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":["unique"]},{"name":"trigger","getter_name":"trigger","moor_type":"string","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"group","getter_name":"group","moor_type":"int","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(BangGroup.values)","dart_type_name":"BangGroup"}},{"name":"search_date","getter_name":"searchDate","moor_type":"dateTime","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":["FOREIGN KEY(\"trigger\", \"group\")REFERENCES bang(\"trigger\", \"group\")"]}},{"id":4,"references":[0],"type":"table","data":{"name":"bang_fts","was_declared_in_moor":true,"columns":[{"name":"trigger","getter_name":"trigger","moor_type":"string","nullable":false,"customConstraints":"","default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"website_name","getter_name":"websiteName","moor_type":"string","nullable":false,"customConstraints":"","default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":true,"create_virtual_stmt":"CREATE VIRTUAL TABLE \"bang_fts\" USING fts5(trigger, website_name, content=bang, prefix='2 3')","without_rowid":false,"constraints":[]}},{"id":5,"references":[0,2],"type":"view","data":{"name":"bang_data_view","sql":"CREATE VIEW bang_data_view AS SELECT b.*, bf.frequency, bf.last_used FROM bang AS b LEFT JOIN bang_frequency AS bf ON b.\"trigger\" = bf.\"trigger\" AND b.\"group\" = bf.\"group\";","dart_info_name":"BangDataView","columns":[{"name":"trigger","getter_name":"trigger","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"group","getter_name":"group","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(BangGroup.values)","dart_type_name":"BangGroup"}},{"name":"website_name","getter_name":"websiteName","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"domain","getter_name":"domain","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"url_template","getter_name":"urlTemplate","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"category","getter_name":"category","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"sub_category","getter_name":"subCategory","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"format","getter_name":"format","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const BangFormatConverter()","dart_type_name":"Set?"}},{"name":"frequency","getter_name":"frequency","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_used","getter_name":"lastUsed","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}]}},{"id":6,"references":[0,4],"type":"trigger","data":{"on":0,"references_in_body":[0,4],"name":"bang_after_insert","sql":"CREATE TRIGGER bang_after_insert AFTER INSERT ON bang BEGIN\n INSERT INTO \n bang_fts(rowid, \"trigger\", website_name) \n VALUES (new.rowid, new.\"trigger\", new.website_name);\nEND;"}},{"id":7,"references":[0,4],"type":"trigger","data":{"on":0,"references_in_body":[0,4],"name":"bang_after_delete","sql":"CREATE TRIGGER bang_after_delete AFTER DELETE ON bang BEGIN\n INSERT INTO \n bang_fts(bang_fts, rowid, \"trigger\", website_name) \n VALUES('delete', old.rowid, old.\"trigger\", old.website_name);\nEND;"}},{"id":8,"references":[0,4],"type":"trigger","data":{"on":0,"references_in_body":[0,4],"name":"bang_after_update","sql":"CREATE TRIGGER bang_after_update AFTER UPDATE ON bang BEGIN\n INSERT INTO \n bang_fts(bang_fts, rowid, \"trigger\", website_name) \n VALUES('delete', old.rowid, old.\"trigger\", old.website_name);\n INSERT INTO \n bang_fts(rowid, \"trigger\", website_name) \n VALUES (new.rowid, new.\"trigger\", new.website_name);\nEND;"}}]} \ No newline at end of file diff --git a/app/lib/features/bangs/data/database/database.dart b/app/lib/features/bangs/data/database/database.dart index 3f0b1dbb..27723c51 100644 --- a/app/lib/features/bangs/data/database/database.dart +++ b/app/lib/features/bangs/data/database/database.dart @@ -21,12 +21,13 @@ import 'package:drift/drift.dart'; import 'package:weblibre/features/bangs/data/database/daos/bang.dart'; import 'package:weblibre/features/bangs/data/database/daos/sync.dart'; import 'package:weblibre/features/bangs/data/database/database.drift.dart'; +import 'package:weblibre/features/bangs/data/database/database.steps.dart'; import 'package:weblibre/features/search/domain/fts_tokenizer.dart'; @DriftDatabase(include: {'definitions.drift'}, daos: [BangDao, SyncDao]) class BangDatabase extends $BangDatabase with PrefixQueryBuilderMixin { @override - final int schemaVersion = 1; + final int schemaVersion = 2; @override final int ftsTokenLimit = 6; @@ -38,6 +39,11 @@ class BangDatabase extends $BangDatabase with PrefixQueryBuilderMixin { beforeOpen: (details) async { await customStatement('PRAGMA foreign_keys = ON;'); }, + onUpgrade: stepByStep( + from1To2: (m, schema) async { + //Too many changes, we switch to a new database + }, + ), ); BangDatabase(super.e); diff --git a/app/lib/features/bangs/data/database/database.steps.dart b/app/lib/features/bangs/data/database/database.steps.dart new file mode 100644 index 00000000..7e897515 --- /dev/null +++ b/app/lib/features/bangs/data/database/database.steps.dart @@ -0,0 +1,431 @@ +// dart format width=80 +import 'package:drift/internal/versioned_schema.dart' as i0; +import 'package:drift/drift.dart' as i1; +import 'package:drift/drift.dart'; // ignore_for_file: type=lint,unused_import + +// GENERATED BY drift_dev, DO NOT MODIFY. +final class Schema2 extends i0.VersionedSchema { + Schema2({required super.database}) : super(version: 2); + @override + late final List entities = [ + bang, + bangSync, + bangFrequency, + bangHistory, + bangFts, + bangDataView, + bangAfterInsert, + bangAfterDelete, + bangAfterUpdate, + ]; + late final Shape0 bang = Shape0( + source: i0.VersionedTable( + entityName: 'bang', + withoutRowId: false, + isStrict: false, + tableConstraints: ['PRIMARY KEY("trigger", "group")'], + columns: [ + _column_0, + _column_1, + _column_2, + _column_3, + _column_4, + _column_5, + _column_6, + _column_7, + ], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape1 bangSync = Shape1( + source: i0.VersionedTable( + entityName: 'bang_sync', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [_column_8, _column_9], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape2 bangFrequency = Shape2( + source: i0.VersionedTable( + entityName: 'bang_frequency', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY("trigger", "group")', + 'FOREIGN KEY("trigger", "group")REFERENCES bang("trigger", "group")ON DELETE CASCADE', + ], + columns: [_column_0, _column_1, _column_10, _column_11], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape3 bangHistory = Shape3( + source: i0.VersionedTable( + entityName: 'bang_history', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'FOREIGN KEY("trigger", "group")REFERENCES bang("trigger", "group")', + ], + columns: [_column_12, _column_0, _column_1, _column_13], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape4 bangFts = Shape4( + source: i0.VersionedVirtualTable( + entityName: 'bang_fts', + moduleAndArgs: + 'fts5(trigger, website_name, content=bang, prefix=\'2 3\')', + columns: [_column_14, _column_15], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape5 bangDataView = Shape5( + source: i0.VersionedView( + entityName: 'bang_data_view', + createViewStmt: + 'CREATE VIEW bang_data_view AS SELECT b.*, bf.frequency, bf.last_used FROM bang AS b LEFT JOIN bang_frequency AS bf ON b."trigger" = bf."trigger" AND b."group" = bf."group";', + columns: [ + _column_16, + _column_17, + _column_18, + _column_19, + _column_20, + _column_21, + _column_22, + _column_23, + _column_24, + _column_25, + ], + attachedDatabase: database, + ), + alias: null, + ); + final i1.Trigger bangAfterInsert = i1.Trigger( + 'CREATE TRIGGER bang_after_insert AFTER INSERT ON bang BEGIN INSERT INTO bang_fts ("rowid", "trigger", website_name) VALUES (new."rowid", new."trigger", new.website_name);END', + 'bang_after_insert', + ); + final i1.Trigger bangAfterDelete = i1.Trigger( + 'CREATE TRIGGER bang_after_delete AFTER DELETE ON bang BEGIN INSERT INTO bang_fts (bang_fts, "rowid", "trigger", website_name) VALUES (\'delete\', old."rowid", old."trigger", old.website_name);END', + 'bang_after_delete', + ); + final i1.Trigger bangAfterUpdate = i1.Trigger( + 'CREATE TRIGGER bang_after_update AFTER UPDATE ON bang BEGIN INSERT INTO bang_fts (bang_fts, "rowid", "trigger", website_name) VALUES (\'delete\', old."rowid", old."trigger", old.website_name);INSERT INTO bang_fts ("rowid", "trigger", website_name) VALUES (new."rowid", new."trigger", new.website_name);END', + 'bang_after_update', + ); +} + +class Shape0 extends i0.VersionedTable { + Shape0({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get trigger => + columnsByName['trigger']! as i1.GeneratedColumn; + i1.GeneratedColumn get group => + columnsByName['group']! as i1.GeneratedColumn; + i1.GeneratedColumn get websiteName => + columnsByName['website_name']! as i1.GeneratedColumn; + i1.GeneratedColumn get domain => + columnsByName['domain']! as i1.GeneratedColumn; + i1.GeneratedColumn get urlTemplate => + columnsByName['url_template']! as i1.GeneratedColumn; + i1.GeneratedColumn get category => + columnsByName['category']! as i1.GeneratedColumn; + i1.GeneratedColumn get subCategory => + columnsByName['sub_category']! as i1.GeneratedColumn; + i1.GeneratedColumn get format => + columnsByName['format']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_0(String aliasedName) => + i1.GeneratedColumn( + 'trigger', + aliasedName, + false, + type: i1.DriftSqlType.string, + $customConstraints: 'NOT NULL', + ); +i1.GeneratedColumn _column_1(String aliasedName) => + i1.GeneratedColumn( + 'group', + aliasedName, + false, + type: i1.DriftSqlType.int, + $customConstraints: 'NOT NULL', + ); +i1.GeneratedColumn _column_2(String aliasedName) => + i1.GeneratedColumn( + 'website_name', + aliasedName, + false, + type: i1.DriftSqlType.string, + $customConstraints: 'NOT NULL', + ); +i1.GeneratedColumn _column_3(String aliasedName) => + i1.GeneratedColumn( + 'domain', + aliasedName, + false, + type: i1.DriftSqlType.string, + $customConstraints: 'NOT NULL', + ); +i1.GeneratedColumn _column_4(String aliasedName) => + i1.GeneratedColumn( + 'url_template', + aliasedName, + false, + type: i1.DriftSqlType.string, + $customConstraints: 'NOT NULL', + ); +i1.GeneratedColumn _column_5(String aliasedName) => + i1.GeneratedColumn( + 'category', + aliasedName, + true, + type: i1.DriftSqlType.string, + $customConstraints: '', + ); +i1.GeneratedColumn _column_6(String aliasedName) => + i1.GeneratedColumn( + 'sub_category', + aliasedName, + true, + type: i1.DriftSqlType.string, + $customConstraints: '', + ); +i1.GeneratedColumn _column_7(String aliasedName) => + i1.GeneratedColumn( + 'format', + aliasedName, + true, + type: i1.DriftSqlType.string, + $customConstraints: '', + ); + +class Shape1 extends i0.VersionedTable { + Shape1({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get group => + columnsByName['group']! as i1.GeneratedColumn; + i1.GeneratedColumn get lastSync => + columnsByName['last_sync']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_8(String aliasedName) => + i1.GeneratedColumn( + 'group', + aliasedName, + false, + type: i1.DriftSqlType.int, + $customConstraints: 'PRIMARY KEY NOT NULL', + ); +i1.GeneratedColumn _column_9(String aliasedName) => + i1.GeneratedColumn( + 'last_sync', + aliasedName, + false, + type: i1.DriftSqlType.dateTime, + $customConstraints: 'NOT NULL', + ); + +class Shape2 extends i0.VersionedTable { + Shape2({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get trigger => + columnsByName['trigger']! as i1.GeneratedColumn; + i1.GeneratedColumn get group => + columnsByName['group']! as i1.GeneratedColumn; + i1.GeneratedColumn get frequency => + columnsByName['frequency']! as i1.GeneratedColumn; + i1.GeneratedColumn get lastUsed => + columnsByName['last_used']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_10(String aliasedName) => + i1.GeneratedColumn( + 'frequency', + aliasedName, + false, + type: i1.DriftSqlType.int, + $customConstraints: 'NOT NULL', + ); +i1.GeneratedColumn _column_11(String aliasedName) => + i1.GeneratedColumn( + 'last_used', + aliasedName, + false, + type: i1.DriftSqlType.dateTime, + $customConstraints: 'NOT NULL', + ); + +class Shape3 extends i0.VersionedTable { + Shape3({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get searchQuery => + columnsByName['search_query']! as i1.GeneratedColumn; + i1.GeneratedColumn get trigger => + columnsByName['trigger']! as i1.GeneratedColumn; + i1.GeneratedColumn get group => + columnsByName['group']! as i1.GeneratedColumn; + i1.GeneratedColumn get searchDate => + columnsByName['search_date']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_12(String aliasedName) => + i1.GeneratedColumn( + 'search_query', + aliasedName, + false, + type: i1.DriftSqlType.string, + $customConstraints: 'UNIQUE NOT NULL', + ); +i1.GeneratedColumn _column_13(String aliasedName) => + i1.GeneratedColumn( + 'search_date', + aliasedName, + false, + type: i1.DriftSqlType.dateTime, + $customConstraints: 'NOT NULL', + ); + +class Shape4 extends i0.VersionedVirtualTable { + Shape4({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get trigger => + columnsByName['trigger']! as i1.GeneratedColumn; + i1.GeneratedColumn get websiteName => + columnsByName['website_name']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_14(String aliasedName) => + i1.GeneratedColumn( + 'trigger', + aliasedName, + false, + type: i1.DriftSqlType.string, + $customConstraints: '', + ); +i1.GeneratedColumn _column_15(String aliasedName) => + i1.GeneratedColumn( + 'website_name', + aliasedName, + false, + type: i1.DriftSqlType.string, + $customConstraints: '', + ); + +class Shape5 extends i0.VersionedView { + Shape5({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get trigger => + columnsByName['trigger']! as i1.GeneratedColumn; + i1.GeneratedColumn get group => + columnsByName['group']! as i1.GeneratedColumn; + i1.GeneratedColumn get websiteName => + columnsByName['website_name']! as i1.GeneratedColumn; + i1.GeneratedColumn get domain => + columnsByName['domain']! as i1.GeneratedColumn; + i1.GeneratedColumn get urlTemplate => + columnsByName['url_template']! as i1.GeneratedColumn; + i1.GeneratedColumn get category => + columnsByName['category']! as i1.GeneratedColumn; + i1.GeneratedColumn get subCategory => + columnsByName['sub_category']! as i1.GeneratedColumn; + i1.GeneratedColumn get format => + columnsByName['format']! as i1.GeneratedColumn; + i1.GeneratedColumn get frequency => + columnsByName['frequency']! as i1.GeneratedColumn; + i1.GeneratedColumn get lastUsed => + columnsByName['last_used']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_16(String aliasedName) => + i1.GeneratedColumn( + 'trigger', + aliasedName, + false, + type: i1.DriftSqlType.string, + ); +i1.GeneratedColumn _column_17(String aliasedName) => + i1.GeneratedColumn( + 'group', + aliasedName, + false, + type: i1.DriftSqlType.int, + ); +i1.GeneratedColumn _column_18(String aliasedName) => + i1.GeneratedColumn( + 'website_name', + aliasedName, + false, + type: i1.DriftSqlType.string, + ); +i1.GeneratedColumn _column_19(String aliasedName) => + i1.GeneratedColumn( + 'domain', + aliasedName, + false, + type: i1.DriftSqlType.string, + ); +i1.GeneratedColumn _column_20(String aliasedName) => + i1.GeneratedColumn( + 'url_template', + aliasedName, + false, + type: i1.DriftSqlType.string, + ); +i1.GeneratedColumn _column_21(String aliasedName) => + i1.GeneratedColumn( + 'category', + aliasedName, + true, + type: i1.DriftSqlType.string, + ); +i1.GeneratedColumn _column_22(String aliasedName) => + i1.GeneratedColumn( + 'sub_category', + aliasedName, + true, + type: i1.DriftSqlType.string, + ); +i1.GeneratedColumn _column_23(String aliasedName) => + i1.GeneratedColumn( + 'format', + aliasedName, + true, + type: i1.DriftSqlType.string, + ); +i1.GeneratedColumn _column_24(String aliasedName) => + i1.GeneratedColumn( + 'frequency', + aliasedName, + true, + type: i1.DriftSqlType.int, + ); +i1.GeneratedColumn _column_25(String aliasedName) => + i1.GeneratedColumn( + 'last_used', + aliasedName, + true, + type: i1.DriftSqlType.dateTime, + ); +i0.MigrationStepWithVersion migrationSteps({ + required Future Function(i1.Migrator m, Schema2 schema) from1To2, +}) { + return (currentVersion, database) async { + switch (currentVersion) { + case 1: + final schema = Schema2(database: database); + final migrator = i1.Migrator(database, schema); + await from1To2(migrator, schema); + return 2; + default: + throw ArgumentError.value('Unknown migration from $currentVersion'); + } + }; +} + +i1.OnUpgrade stepByStep({ + required Future Function(i1.Migrator m, Schema2 schema) from1To2, +}) => i0.VersionedSchema.stepByStepHelper( + step: migrationSteps(from1To2: from1To2), +); diff --git a/app/test/drift/bangs/generated/schema.dart b/app/test/drift/bangs/generated/schema.dart new file mode 100644 index 00000000..b2b7404b --- /dev/null +++ b/app/test/drift/bangs/generated/schema.dart @@ -0,0 +1,23 @@ +// dart format width=80 +// GENERATED CODE, DO NOT EDIT BY HAND. +// ignore_for_file: type=lint +import 'package:drift/drift.dart'; +import 'package:drift/internal/migrations.dart'; +import 'schema_v1.dart' as v1; +import 'schema_v2.dart' as v2; + +class GeneratedHelper implements SchemaInstantiationHelper { + @override + GeneratedDatabase databaseForVersion(QueryExecutor db, int version) { + switch (version) { + case 1: + return v1.DatabaseAtV1(db); + case 2: + return v2.DatabaseAtV2(db); + default: + throw MissingSchemaException(version, versions); + } + } + + static const versions = const [1, 2]; +} diff --git a/app/test/drift/bangs/generated/schema_v1.dart b/app/test/drift/bangs/generated/schema_v1.dart new file mode 100644 index 00000000..878b9379 --- /dev/null +++ b/app/test/drift/bangs/generated/schema_v1.dart @@ -0,0 +1,1557 @@ +// dart format width=80 +// GENERATED CODE, DO NOT EDIT BY HAND. +// ignore_for_file: type=lint +import 'package:drift/drift.dart'; + +class Bang extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Bang(this.attachedDatabase, [this._alias]); + late final GeneratedColumn trigger = GeneratedColumn( + 'trigger', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'PRIMARY KEY NOT NULL', + ); + late final GeneratedColumn group = GeneratedColumn( + 'group', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn websiteName = GeneratedColumn( + 'website_name', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn domain = GeneratedColumn( + 'domain', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn urlTemplate = GeneratedColumn( + 'url_template', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn category = GeneratedColumn( + 'category', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + $customConstraints: '', + ); + late final GeneratedColumn subCategory = GeneratedColumn( + 'sub_category', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + $customConstraints: '', + ); + late final GeneratedColumn format = GeneratedColumn( + 'format', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + $customConstraints: '', + ); + @override + List get $columns => [ + trigger, + group, + websiteName, + domain, + urlTemplate, + category, + subCategory, + format, + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'bang'; + @override + Set get $primaryKey => {trigger}; + @override + BangData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangData( + trigger: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}trigger'], + )!, + group: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}group'], + )!, + websiteName: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}website_name'], + )!, + domain: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}domain'], + )!, + urlTemplate: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}url_template'], + )!, + category: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}category'], + ), + subCategory: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}sub_category'], + ), + format: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}format'], + ), + ); + } + + @override + Bang createAlias(String alias) { + return Bang(attachedDatabase, alias); + } + + @override + bool get dontWriteConstraints => true; +} + +class BangData extends DataClass implements Insertable { + final String trigger; + final int group; + final String websiteName; + final String domain; + final String urlTemplate; + final String? category; + final String? subCategory; + final String? format; + const BangData({ + required this.trigger, + required this.group, + required this.websiteName, + required this.domain, + required this.urlTemplate, + this.category, + this.subCategory, + this.format, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['trigger'] = Variable(trigger); + map['group'] = Variable(group); + map['website_name'] = Variable(websiteName); + map['domain'] = Variable(domain); + map['url_template'] = Variable(urlTemplate); + if (!nullToAbsent || category != null) { + map['category'] = Variable(category); + } + if (!nullToAbsent || subCategory != null) { + map['sub_category'] = Variable(subCategory); + } + if (!nullToAbsent || format != null) { + map['format'] = Variable(format); + } + return map; + } + + factory BangData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangData( + trigger: serializer.fromJson(json['trigger']), + group: serializer.fromJson(json['group']), + websiteName: serializer.fromJson(json['websiteName']), + domain: serializer.fromJson(json['domain']), + urlTemplate: serializer.fromJson(json['urlTemplate']), + category: serializer.fromJson(json['category']), + subCategory: serializer.fromJson(json['subCategory']), + format: serializer.fromJson(json['format']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'trigger': serializer.toJson(trigger), + 'group': serializer.toJson(group), + 'websiteName': serializer.toJson(websiteName), + 'domain': serializer.toJson(domain), + 'urlTemplate': serializer.toJson(urlTemplate), + 'category': serializer.toJson(category), + 'subCategory': serializer.toJson(subCategory), + 'format': serializer.toJson(format), + }; + } + + BangData copyWith({ + String? trigger, + int? group, + String? websiteName, + String? domain, + String? urlTemplate, + Value category = const Value.absent(), + Value subCategory = const Value.absent(), + Value format = const Value.absent(), + }) => BangData( + trigger: trigger ?? this.trigger, + group: group ?? this.group, + websiteName: websiteName ?? this.websiteName, + domain: domain ?? this.domain, + urlTemplate: urlTemplate ?? this.urlTemplate, + category: category.present ? category.value : this.category, + subCategory: subCategory.present ? subCategory.value : this.subCategory, + format: format.present ? format.value : this.format, + ); + BangData copyWithCompanion(BangCompanion data) { + return BangData( + trigger: data.trigger.present ? data.trigger.value : this.trigger, + group: data.group.present ? data.group.value : this.group, + websiteName: data.websiteName.present + ? data.websiteName.value + : this.websiteName, + domain: data.domain.present ? data.domain.value : this.domain, + urlTemplate: data.urlTemplate.present + ? data.urlTemplate.value + : this.urlTemplate, + category: data.category.present ? data.category.value : this.category, + subCategory: data.subCategory.present + ? data.subCategory.value + : this.subCategory, + format: data.format.present ? data.format.value : this.format, + ); + } + + @override + String toString() { + return (StringBuffer('BangData(') + ..write('trigger: $trigger, ') + ..write('group: $group, ') + ..write('websiteName: $websiteName, ') + ..write('domain: $domain, ') + ..write('urlTemplate: $urlTemplate, ') + ..write('category: $category, ') + ..write('subCategory: $subCategory, ') + ..write('format: $format') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + trigger, + group, + websiteName, + domain, + urlTemplate, + category, + subCategory, + format, + ); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangData && + other.trigger == this.trigger && + other.group == this.group && + other.websiteName == this.websiteName && + other.domain == this.domain && + other.urlTemplate == this.urlTemplate && + other.category == this.category && + other.subCategory == this.subCategory && + other.format == this.format); +} + +class BangCompanion extends UpdateCompanion { + final Value trigger; + final Value group; + final Value websiteName; + final Value domain; + final Value urlTemplate; + final Value category; + final Value subCategory; + final Value format; + final Value rowid; + const BangCompanion({ + this.trigger = const Value.absent(), + this.group = const Value.absent(), + this.websiteName = const Value.absent(), + this.domain = const Value.absent(), + this.urlTemplate = const Value.absent(), + this.category = const Value.absent(), + this.subCategory = const Value.absent(), + this.format = const Value.absent(), + this.rowid = const Value.absent(), + }); + BangCompanion.insert({ + required String trigger, + required int group, + required String websiteName, + required String domain, + required String urlTemplate, + this.category = const Value.absent(), + this.subCategory = const Value.absent(), + this.format = const Value.absent(), + this.rowid = const Value.absent(), + }) : trigger = Value(trigger), + group = Value(group), + websiteName = Value(websiteName), + domain = Value(domain), + urlTemplate = Value(urlTemplate); + static Insertable custom({ + Expression? trigger, + Expression? group, + Expression? websiteName, + Expression? domain, + Expression? urlTemplate, + Expression? category, + Expression? subCategory, + Expression? format, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (trigger != null) 'trigger': trigger, + if (group != null) 'group': group, + if (websiteName != null) 'website_name': websiteName, + if (domain != null) 'domain': domain, + if (urlTemplate != null) 'url_template': urlTemplate, + if (category != null) 'category': category, + if (subCategory != null) 'sub_category': subCategory, + if (format != null) 'format': format, + if (rowid != null) 'rowid': rowid, + }); + } + + BangCompanion copyWith({ + Value? trigger, + Value? group, + Value? websiteName, + Value? domain, + Value? urlTemplate, + Value? category, + Value? subCategory, + Value? format, + Value? rowid, + }) { + return BangCompanion( + trigger: trigger ?? this.trigger, + group: group ?? this.group, + websiteName: websiteName ?? this.websiteName, + domain: domain ?? this.domain, + urlTemplate: urlTemplate ?? this.urlTemplate, + category: category ?? this.category, + subCategory: subCategory ?? this.subCategory, + format: format ?? this.format, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (trigger.present) { + map['trigger'] = Variable(trigger.value); + } + if (group.present) { + map['group'] = Variable(group.value); + } + if (websiteName.present) { + map['website_name'] = Variable(websiteName.value); + } + if (domain.present) { + map['domain'] = Variable(domain.value); + } + if (urlTemplate.present) { + map['url_template'] = Variable(urlTemplate.value); + } + if (category.present) { + map['category'] = Variable(category.value); + } + if (subCategory.present) { + map['sub_category'] = Variable(subCategory.value); + } + if (format.present) { + map['format'] = Variable(format.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BangCompanion(') + ..write('trigger: $trigger, ') + ..write('group: $group, ') + ..write('websiteName: $websiteName, ') + ..write('domain: $domain, ') + ..write('urlTemplate: $urlTemplate, ') + ..write('category: $category, ') + ..write('subCategory: $subCategory, ') + ..write('format: $format, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class BangSync extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + BangSync(this.attachedDatabase, [this._alias]); + late final GeneratedColumn group = GeneratedColumn( + 'group', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + $customConstraints: 'PRIMARY KEY NOT NULL', + ); + late final GeneratedColumn lastSync = GeneratedColumn( + 'last_sync', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + @override + List get $columns => [group, lastSync]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'bang_sync'; + @override + Set get $primaryKey => {group}; + @override + BangSyncData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangSyncData( + group: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}group'], + )!, + lastSync: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_sync'], + )!, + ); + } + + @override + BangSync createAlias(String alias) { + return BangSync(attachedDatabase, alias); + } + + @override + bool get dontWriteConstraints => true; +} + +class BangSyncData extends DataClass implements Insertable { + final int group; + final DateTime lastSync; + const BangSyncData({required this.group, required this.lastSync}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['group'] = Variable(group); + map['last_sync'] = Variable(lastSync); + return map; + } + + factory BangSyncData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangSyncData( + group: serializer.fromJson(json['group']), + lastSync: serializer.fromJson(json['lastSync']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'group': serializer.toJson(group), + 'lastSync': serializer.toJson(lastSync), + }; + } + + BangSyncData copyWith({int? group, DateTime? lastSync}) => BangSyncData( + group: group ?? this.group, + lastSync: lastSync ?? this.lastSync, + ); + BangSyncData copyWithCompanion(BangSyncCompanion data) { + return BangSyncData( + group: data.group.present ? data.group.value : this.group, + lastSync: data.lastSync.present ? data.lastSync.value : this.lastSync, + ); + } + + @override + String toString() { + return (StringBuffer('BangSyncData(') + ..write('group: $group, ') + ..write('lastSync: $lastSync') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(group, lastSync); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangSyncData && + other.group == this.group && + other.lastSync == this.lastSync); +} + +class BangSyncCompanion extends UpdateCompanion { + final Value group; + final Value lastSync; + const BangSyncCompanion({ + this.group = const Value.absent(), + this.lastSync = const Value.absent(), + }); + BangSyncCompanion.insert({ + this.group = const Value.absent(), + required DateTime lastSync, + }) : lastSync = Value(lastSync); + static Insertable custom({ + Expression? group, + Expression? lastSync, + }) { + return RawValuesInsertable({ + if (group != null) 'group': group, + if (lastSync != null) 'last_sync': lastSync, + }); + } + + BangSyncCompanion copyWith({Value? group, Value? lastSync}) { + return BangSyncCompanion( + group: group ?? this.group, + lastSync: lastSync ?? this.lastSync, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (group.present) { + map['group'] = Variable(group.value); + } + if (lastSync.present) { + map['last_sync'] = Variable(lastSync.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BangSyncCompanion(') + ..write('group: $group, ') + ..write('lastSync: $lastSync') + ..write(')')) + .toString(); + } +} + +class BangFrequency extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + BangFrequency(this.attachedDatabase, [this._alias]); + late final GeneratedColumn trigger = GeneratedColumn( + 'trigger', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: + 'PRIMARY KEY NOT NULL REFERENCES bang("trigger")ON DELETE CASCADE', + ); + late final GeneratedColumn frequency = GeneratedColumn( + 'frequency', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn lastUsed = GeneratedColumn( + 'last_used', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + @override + List get $columns => [trigger, frequency, lastUsed]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'bang_frequency'; + @override + Set get $primaryKey => {trigger}; + @override + BangFrequencyData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangFrequencyData( + trigger: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}trigger'], + )!, + frequency: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}frequency'], + )!, + lastUsed: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_used'], + )!, + ); + } + + @override + BangFrequency createAlias(String alias) { + return BangFrequency(attachedDatabase, alias); + } + + @override + bool get dontWriteConstraints => true; +} + +class BangFrequencyData extends DataClass + implements Insertable { + final String trigger; + final int frequency; + final DateTime lastUsed; + const BangFrequencyData({ + required this.trigger, + required this.frequency, + required this.lastUsed, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['trigger'] = Variable(trigger); + map['frequency'] = Variable(frequency); + map['last_used'] = Variable(lastUsed); + return map; + } + + factory BangFrequencyData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangFrequencyData( + trigger: serializer.fromJson(json['trigger']), + frequency: serializer.fromJson(json['frequency']), + lastUsed: serializer.fromJson(json['lastUsed']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'trigger': serializer.toJson(trigger), + 'frequency': serializer.toJson(frequency), + 'lastUsed': serializer.toJson(lastUsed), + }; + } + + BangFrequencyData copyWith({ + String? trigger, + int? frequency, + DateTime? lastUsed, + }) => BangFrequencyData( + trigger: trigger ?? this.trigger, + frequency: frequency ?? this.frequency, + lastUsed: lastUsed ?? this.lastUsed, + ); + BangFrequencyData copyWithCompanion(BangFrequencyCompanion data) { + return BangFrequencyData( + trigger: data.trigger.present ? data.trigger.value : this.trigger, + frequency: data.frequency.present ? data.frequency.value : this.frequency, + lastUsed: data.lastUsed.present ? data.lastUsed.value : this.lastUsed, + ); + } + + @override + String toString() { + return (StringBuffer('BangFrequencyData(') + ..write('trigger: $trigger, ') + ..write('frequency: $frequency, ') + ..write('lastUsed: $lastUsed') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(trigger, frequency, lastUsed); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangFrequencyData && + other.trigger == this.trigger && + other.frequency == this.frequency && + other.lastUsed == this.lastUsed); +} + +class BangFrequencyCompanion extends UpdateCompanion { + final Value trigger; + final Value frequency; + final Value lastUsed; + final Value rowid; + const BangFrequencyCompanion({ + this.trigger = const Value.absent(), + this.frequency = const Value.absent(), + this.lastUsed = const Value.absent(), + this.rowid = const Value.absent(), + }); + BangFrequencyCompanion.insert({ + required String trigger, + required int frequency, + required DateTime lastUsed, + this.rowid = const Value.absent(), + }) : trigger = Value(trigger), + frequency = Value(frequency), + lastUsed = Value(lastUsed); + static Insertable custom({ + Expression? trigger, + Expression? frequency, + Expression? lastUsed, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (trigger != null) 'trigger': trigger, + if (frequency != null) 'frequency': frequency, + if (lastUsed != null) 'last_used': lastUsed, + if (rowid != null) 'rowid': rowid, + }); + } + + BangFrequencyCompanion copyWith({ + Value? trigger, + Value? frequency, + Value? lastUsed, + Value? rowid, + }) { + return BangFrequencyCompanion( + trigger: trigger ?? this.trigger, + frequency: frequency ?? this.frequency, + lastUsed: lastUsed ?? this.lastUsed, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (trigger.present) { + map['trigger'] = Variable(trigger.value); + } + if (frequency.present) { + map['frequency'] = Variable(frequency.value); + } + if (lastUsed.present) { + map['last_used'] = Variable(lastUsed.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BangFrequencyCompanion(') + ..write('trigger: $trigger, ') + ..write('frequency: $frequency, ') + ..write('lastUsed: $lastUsed, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class BangHistory extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + BangHistory(this.attachedDatabase, [this._alias]); + late final GeneratedColumn searchQuery = GeneratedColumn( + 'search_query', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'UNIQUE NOT NULL', + ); + late final GeneratedColumn trigger = GeneratedColumn( + 'trigger', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL REFERENCES bang("trigger")', + ); + late final GeneratedColumn searchDate = GeneratedColumn( + 'search_date', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + @override + List get $columns => [searchQuery, trigger, searchDate]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'bang_history'; + @override + Set get $primaryKey => const {}; + @override + BangHistoryData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangHistoryData( + searchQuery: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}search_query'], + )!, + trigger: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}trigger'], + )!, + searchDate: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}search_date'], + )!, + ); + } + + @override + BangHistory createAlias(String alias) { + return BangHistory(attachedDatabase, alias); + } + + @override + bool get dontWriteConstraints => true; +} + +class BangHistoryData extends DataClass implements Insertable { + final String searchQuery; + final String trigger; + final DateTime searchDate; + const BangHistoryData({ + required this.searchQuery, + required this.trigger, + required this.searchDate, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['search_query'] = Variable(searchQuery); + map['trigger'] = Variable(trigger); + map['search_date'] = Variable(searchDate); + return map; + } + + factory BangHistoryData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangHistoryData( + searchQuery: serializer.fromJson(json['searchQuery']), + trigger: serializer.fromJson(json['trigger']), + searchDate: serializer.fromJson(json['searchDate']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'searchQuery': serializer.toJson(searchQuery), + 'trigger': serializer.toJson(trigger), + 'searchDate': serializer.toJson(searchDate), + }; + } + + BangHistoryData copyWith({ + String? searchQuery, + String? trigger, + DateTime? searchDate, + }) => BangHistoryData( + searchQuery: searchQuery ?? this.searchQuery, + trigger: trigger ?? this.trigger, + searchDate: searchDate ?? this.searchDate, + ); + BangHistoryData copyWithCompanion(BangHistoryCompanion data) { + return BangHistoryData( + searchQuery: data.searchQuery.present + ? data.searchQuery.value + : this.searchQuery, + trigger: data.trigger.present ? data.trigger.value : this.trigger, + searchDate: data.searchDate.present + ? data.searchDate.value + : this.searchDate, + ); + } + + @override + String toString() { + return (StringBuffer('BangHistoryData(') + ..write('searchQuery: $searchQuery, ') + ..write('trigger: $trigger, ') + ..write('searchDate: $searchDate') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(searchQuery, trigger, searchDate); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangHistoryData && + other.searchQuery == this.searchQuery && + other.trigger == this.trigger && + other.searchDate == this.searchDate); +} + +class BangHistoryCompanion extends UpdateCompanion { + final Value searchQuery; + final Value trigger; + final Value searchDate; + final Value rowid; + const BangHistoryCompanion({ + this.searchQuery = const Value.absent(), + this.trigger = const Value.absent(), + this.searchDate = const Value.absent(), + this.rowid = const Value.absent(), + }); + BangHistoryCompanion.insert({ + required String searchQuery, + required String trigger, + required DateTime searchDate, + this.rowid = const Value.absent(), + }) : searchQuery = Value(searchQuery), + trigger = Value(trigger), + searchDate = Value(searchDate); + static Insertable custom({ + Expression? searchQuery, + Expression? trigger, + Expression? searchDate, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (searchQuery != null) 'search_query': searchQuery, + if (trigger != null) 'trigger': trigger, + if (searchDate != null) 'search_date': searchDate, + if (rowid != null) 'rowid': rowid, + }); + } + + BangHistoryCompanion copyWith({ + Value? searchQuery, + Value? trigger, + Value? searchDate, + Value? rowid, + }) { + return BangHistoryCompanion( + searchQuery: searchQuery ?? this.searchQuery, + trigger: trigger ?? this.trigger, + searchDate: searchDate ?? this.searchDate, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (searchQuery.present) { + map['search_query'] = Variable(searchQuery.value); + } + if (trigger.present) { + map['trigger'] = Variable(trigger.value); + } + if (searchDate.present) { + map['search_date'] = Variable(searchDate.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BangHistoryCompanion(') + ..write('searchQuery: $searchQuery, ') + ..write('trigger: $trigger, ') + ..write('searchDate: $searchDate, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class BangFts extends Table + with + TableInfo, + VirtualTableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + BangFts(this.attachedDatabase, [this._alias]); + late final GeneratedColumn trigger = GeneratedColumn( + 'trigger', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: '', + ); + late final GeneratedColumn websiteName = GeneratedColumn( + 'website_name', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: '', + ); + @override + List get $columns => [trigger, websiteName]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'bang_fts'; + @override + Set get $primaryKey => const {}; + @override + BangFtsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangFtsData( + trigger: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}trigger'], + )!, + websiteName: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}website_name'], + )!, + ); + } + + @override + BangFts createAlias(String alias) { + return BangFts(attachedDatabase, alias); + } + + @override + String get moduleAndArgs => + 'fts5(trigger, website_name, content=bang, prefix=\'2 3\')'; +} + +class BangFtsData extends DataClass implements Insertable { + final String trigger; + final String websiteName; + const BangFtsData({required this.trigger, required this.websiteName}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['trigger'] = Variable(trigger); + map['website_name'] = Variable(websiteName); + return map; + } + + factory BangFtsData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangFtsData( + trigger: serializer.fromJson(json['trigger']), + websiteName: serializer.fromJson(json['websiteName']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'trigger': serializer.toJson(trigger), + 'websiteName': serializer.toJson(websiteName), + }; + } + + BangFtsData copyWith({String? trigger, String? websiteName}) => BangFtsData( + trigger: trigger ?? this.trigger, + websiteName: websiteName ?? this.websiteName, + ); + BangFtsData copyWithCompanion(BangFtsCompanion data) { + return BangFtsData( + trigger: data.trigger.present ? data.trigger.value : this.trigger, + websiteName: data.websiteName.present + ? data.websiteName.value + : this.websiteName, + ); + } + + @override + String toString() { + return (StringBuffer('BangFtsData(') + ..write('trigger: $trigger, ') + ..write('websiteName: $websiteName') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(trigger, websiteName); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangFtsData && + other.trigger == this.trigger && + other.websiteName == this.websiteName); +} + +class BangFtsCompanion extends UpdateCompanion { + final Value trigger; + final Value websiteName; + final Value rowid; + const BangFtsCompanion({ + this.trigger = const Value.absent(), + this.websiteName = const Value.absent(), + this.rowid = const Value.absent(), + }); + BangFtsCompanion.insert({ + required String trigger, + required String websiteName, + this.rowid = const Value.absent(), + }) : trigger = Value(trigger), + websiteName = Value(websiteName); + static Insertable custom({ + Expression? trigger, + Expression? websiteName, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (trigger != null) 'trigger': trigger, + if (websiteName != null) 'website_name': websiteName, + if (rowid != null) 'rowid': rowid, + }); + } + + BangFtsCompanion copyWith({ + Value? trigger, + Value? websiteName, + Value? rowid, + }) { + return BangFtsCompanion( + trigger: trigger ?? this.trigger, + websiteName: websiteName ?? this.websiteName, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (trigger.present) { + map['trigger'] = Variable(trigger.value); + } + if (websiteName.present) { + map['website_name'] = Variable(websiteName.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BangFtsCompanion(') + ..write('trigger: $trigger, ') + ..write('websiteName: $websiteName, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class BangDataViewData extends DataClass { + final String trigger; + final int group; + final String websiteName; + final String domain; + final String urlTemplate; + final String? category; + final String? subCategory; + final String? format; + final int? frequency; + final DateTime? lastUsed; + const BangDataViewData({ + required this.trigger, + required this.group, + required this.websiteName, + required this.domain, + required this.urlTemplate, + this.category, + this.subCategory, + this.format, + this.frequency, + this.lastUsed, + }); + factory BangDataViewData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangDataViewData( + trigger: serializer.fromJson(json['trigger']), + group: serializer.fromJson(json['group']), + websiteName: serializer.fromJson(json['websiteName']), + domain: serializer.fromJson(json['domain']), + urlTemplate: serializer.fromJson(json['urlTemplate']), + category: serializer.fromJson(json['category']), + subCategory: serializer.fromJson(json['subCategory']), + format: serializer.fromJson(json['format']), + frequency: serializer.fromJson(json['frequency']), + lastUsed: serializer.fromJson(json['lastUsed']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'trigger': serializer.toJson(trigger), + 'group': serializer.toJson(group), + 'websiteName': serializer.toJson(websiteName), + 'domain': serializer.toJson(domain), + 'urlTemplate': serializer.toJson(urlTemplate), + 'category': serializer.toJson(category), + 'subCategory': serializer.toJson(subCategory), + 'format': serializer.toJson(format), + 'frequency': serializer.toJson(frequency), + 'lastUsed': serializer.toJson(lastUsed), + }; + } + + BangDataViewData copyWith({ + String? trigger, + int? group, + String? websiteName, + String? domain, + String? urlTemplate, + Value category = const Value.absent(), + Value subCategory = const Value.absent(), + Value format = const Value.absent(), + Value frequency = const Value.absent(), + Value lastUsed = const Value.absent(), + }) => BangDataViewData( + trigger: trigger ?? this.trigger, + group: group ?? this.group, + websiteName: websiteName ?? this.websiteName, + domain: domain ?? this.domain, + urlTemplate: urlTemplate ?? this.urlTemplate, + category: category.present ? category.value : this.category, + subCategory: subCategory.present ? subCategory.value : this.subCategory, + format: format.present ? format.value : this.format, + frequency: frequency.present ? frequency.value : this.frequency, + lastUsed: lastUsed.present ? lastUsed.value : this.lastUsed, + ); + @override + String toString() { + return (StringBuffer('BangDataViewData(') + ..write('trigger: $trigger, ') + ..write('group: $group, ') + ..write('websiteName: $websiteName, ') + ..write('domain: $domain, ') + ..write('urlTemplate: $urlTemplate, ') + ..write('category: $category, ') + ..write('subCategory: $subCategory, ') + ..write('format: $format, ') + ..write('frequency: $frequency, ') + ..write('lastUsed: $lastUsed') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + trigger, + group, + websiteName, + domain, + urlTemplate, + category, + subCategory, + format, + frequency, + lastUsed, + ); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangDataViewData && + other.trigger == this.trigger && + other.group == this.group && + other.websiteName == this.websiteName && + other.domain == this.domain && + other.urlTemplate == this.urlTemplate && + other.category == this.category && + other.subCategory == this.subCategory && + other.format == this.format && + other.frequency == this.frequency && + other.lastUsed == this.lastUsed); +} + +class BangDataView extends ViewInfo + implements HasResultSet { + final String? _alias; + @override + final DatabaseAtV1 attachedDatabase; + BangDataView(this.attachedDatabase, [this._alias]); + @override + List get $columns => [ + trigger, + group, + websiteName, + domain, + urlTemplate, + category, + subCategory, + format, + frequency, + lastUsed, + ]; + @override + String get aliasedName => _alias ?? entityName; + @override + String get entityName => 'bang_data_view'; + @override + Map get createViewStatements => { + SqlDialect.sqlite: + 'CREATE VIEW bang_data_view AS SELECT b.*, bf.frequency, bf.last_used FROM bang AS b LEFT JOIN bang_frequency AS bf ON b."trigger" = bf."trigger";', + }; + @override + BangDataView get asDslTable => this; + @override + BangDataViewData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangDataViewData( + trigger: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}trigger'], + )!, + group: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}group'], + )!, + websiteName: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}website_name'], + )!, + domain: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}domain'], + )!, + urlTemplate: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}url_template'], + )!, + category: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}category'], + ), + subCategory: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}sub_category'], + ), + format: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}format'], + ), + frequency: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}frequency'], + ), + lastUsed: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_used'], + ), + ); + } + + late final GeneratedColumn trigger = GeneratedColumn( + 'trigger', + aliasedName, + false, + type: DriftSqlType.string, + ); + late final GeneratedColumn group = GeneratedColumn( + 'group', + aliasedName, + false, + type: DriftSqlType.int, + ); + late final GeneratedColumn websiteName = GeneratedColumn( + 'website_name', + aliasedName, + false, + type: DriftSqlType.string, + ); + late final GeneratedColumn domain = GeneratedColumn( + 'domain', + aliasedName, + false, + type: DriftSqlType.string, + ); + late final GeneratedColumn urlTemplate = GeneratedColumn( + 'url_template', + aliasedName, + false, + type: DriftSqlType.string, + ); + late final GeneratedColumn category = GeneratedColumn( + 'category', + aliasedName, + true, + type: DriftSqlType.string, + ); + late final GeneratedColumn subCategory = GeneratedColumn( + 'sub_category', + aliasedName, + true, + type: DriftSqlType.string, + ); + late final GeneratedColumn format = GeneratedColumn( + 'format', + aliasedName, + true, + type: DriftSqlType.string, + ); + late final GeneratedColumn frequency = GeneratedColumn( + 'frequency', + aliasedName, + true, + type: DriftSqlType.int, + ); + late final GeneratedColumn lastUsed = GeneratedColumn( + 'last_used', + aliasedName, + true, + type: DriftSqlType.dateTime, + ); + @override + BangDataView createAlias(String alias) { + return BangDataView(attachedDatabase, alias); + } + + @override + Query? get query => null; + @override + Set get readTables => const {}; +} + +class DatabaseAtV1 extends GeneratedDatabase { + DatabaseAtV1(QueryExecutor e) : super(e); + late final Bang bang = Bang(this); + late final BangSync bangSync = BangSync(this); + late final BangFrequency bangFrequency = BangFrequency(this); + late final BangHistory bangHistory = BangHistory(this); + late final BangFts bangFts = BangFts(this); + late final BangDataView bangDataView = BangDataView(this); + late final Trigger bangAfterInsert = Trigger( + 'CREATE TRIGGER bang_after_insert AFTER INSERT ON bang BEGIN INSERT INTO bang_fts ("rowid", "trigger", website_name) VALUES (new."rowid", new."trigger", new.website_name);END', + 'bang_after_insert', + ); + late final Trigger bangAfterDelete = Trigger( + 'CREATE TRIGGER bang_after_delete AFTER DELETE ON bang BEGIN INSERT INTO bang_fts (bang_fts, "rowid", "trigger", website_name) VALUES (\'delete\', old."rowid", old."trigger", old.website_name);END', + 'bang_after_delete', + ); + late final Trigger bangAfterUpdate = Trigger( + 'CREATE TRIGGER bang_after_update AFTER UPDATE ON bang BEGIN INSERT INTO bang_fts (bang_fts, "rowid", "trigger", website_name) VALUES (\'delete\', old."rowid", old."trigger", old.website_name);INSERT INTO bang_fts ("rowid", "trigger", website_name) VALUES (new."rowid", new."trigger", new.website_name);END', + 'bang_after_update', + ); + @override + Iterable> get allTables => + allSchemaEntities.whereType>(); + @override + List get allSchemaEntities => [ + bang, + bangSync, + bangFrequency, + bangHistory, + bangFts, + bangDataView, + bangAfterInsert, + bangAfterDelete, + bangAfterUpdate, + ]; + @override + StreamQueryUpdateRules get streamUpdateRules => const StreamQueryUpdateRules([ + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang', + limitUpdateKind: UpdateKind.delete, + ), + result: [], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang', + limitUpdateKind: UpdateKind.delete, + ), + result: [], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang', + limitUpdateKind: UpdateKind.delete, + ), + result: [], + ), + ]); + @override + int get schemaVersion => 1; +} diff --git a/app/test/drift/bangs/generated/schema_v2.dart b/app/test/drift/bangs/generated/schema_v2.dart new file mode 100644 index 00000000..a260405d --- /dev/null +++ b/app/test/drift/bangs/generated/schema_v2.dart @@ -0,0 +1,1642 @@ +// dart format width=80 +// GENERATED CODE, DO NOT EDIT BY HAND. +// ignore_for_file: type=lint +import 'package:drift/drift.dart'; + +class Bang extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Bang(this.attachedDatabase, [this._alias]); + late final GeneratedColumn trigger = GeneratedColumn( + 'trigger', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn group = GeneratedColumn( + 'group', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn websiteName = GeneratedColumn( + 'website_name', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn domain = GeneratedColumn( + 'domain', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn urlTemplate = GeneratedColumn( + 'url_template', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn category = GeneratedColumn( + 'category', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + $customConstraints: '', + ); + late final GeneratedColumn subCategory = GeneratedColumn( + 'sub_category', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + $customConstraints: '', + ); + late final GeneratedColumn format = GeneratedColumn( + 'format', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + $customConstraints: '', + ); + @override + List get $columns => [ + trigger, + group, + websiteName, + domain, + urlTemplate, + category, + subCategory, + format, + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'bang'; + @override + Set get $primaryKey => {trigger, group}; + @override + BangData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangData( + trigger: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}trigger'], + )!, + group: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}group'], + )!, + websiteName: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}website_name'], + )!, + domain: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}domain'], + )!, + urlTemplate: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}url_template'], + )!, + category: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}category'], + ), + subCategory: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}sub_category'], + ), + format: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}format'], + ), + ); + } + + @override + Bang createAlias(String alias) { + return Bang(attachedDatabase, alias); + } + + @override + List get customConstraints => const [ + 'PRIMARY KEY("trigger", "group")', + ]; + @override + bool get dontWriteConstraints => true; +} + +class BangData extends DataClass implements Insertable { + final String trigger; + final int group; + final String websiteName; + final String domain; + final String urlTemplate; + final String? category; + final String? subCategory; + final String? format; + const BangData({ + required this.trigger, + required this.group, + required this.websiteName, + required this.domain, + required this.urlTemplate, + this.category, + this.subCategory, + this.format, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['trigger'] = Variable(trigger); + map['group'] = Variable(group); + map['website_name'] = Variable(websiteName); + map['domain'] = Variable(domain); + map['url_template'] = Variable(urlTemplate); + if (!nullToAbsent || category != null) { + map['category'] = Variable(category); + } + if (!nullToAbsent || subCategory != null) { + map['sub_category'] = Variable(subCategory); + } + if (!nullToAbsent || format != null) { + map['format'] = Variable(format); + } + return map; + } + + factory BangData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangData( + trigger: serializer.fromJson(json['trigger']), + group: serializer.fromJson(json['group']), + websiteName: serializer.fromJson(json['websiteName']), + domain: serializer.fromJson(json['domain']), + urlTemplate: serializer.fromJson(json['urlTemplate']), + category: serializer.fromJson(json['category']), + subCategory: serializer.fromJson(json['subCategory']), + format: serializer.fromJson(json['format']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'trigger': serializer.toJson(trigger), + 'group': serializer.toJson(group), + 'websiteName': serializer.toJson(websiteName), + 'domain': serializer.toJson(domain), + 'urlTemplate': serializer.toJson(urlTemplate), + 'category': serializer.toJson(category), + 'subCategory': serializer.toJson(subCategory), + 'format': serializer.toJson(format), + }; + } + + BangData copyWith({ + String? trigger, + int? group, + String? websiteName, + String? domain, + String? urlTemplate, + Value category = const Value.absent(), + Value subCategory = const Value.absent(), + Value format = const Value.absent(), + }) => BangData( + trigger: trigger ?? this.trigger, + group: group ?? this.group, + websiteName: websiteName ?? this.websiteName, + domain: domain ?? this.domain, + urlTemplate: urlTemplate ?? this.urlTemplate, + category: category.present ? category.value : this.category, + subCategory: subCategory.present ? subCategory.value : this.subCategory, + format: format.present ? format.value : this.format, + ); + BangData copyWithCompanion(BangCompanion data) { + return BangData( + trigger: data.trigger.present ? data.trigger.value : this.trigger, + group: data.group.present ? data.group.value : this.group, + websiteName: data.websiteName.present + ? data.websiteName.value + : this.websiteName, + domain: data.domain.present ? data.domain.value : this.domain, + urlTemplate: data.urlTemplate.present + ? data.urlTemplate.value + : this.urlTemplate, + category: data.category.present ? data.category.value : this.category, + subCategory: data.subCategory.present + ? data.subCategory.value + : this.subCategory, + format: data.format.present ? data.format.value : this.format, + ); + } + + @override + String toString() { + return (StringBuffer('BangData(') + ..write('trigger: $trigger, ') + ..write('group: $group, ') + ..write('websiteName: $websiteName, ') + ..write('domain: $domain, ') + ..write('urlTemplate: $urlTemplate, ') + ..write('category: $category, ') + ..write('subCategory: $subCategory, ') + ..write('format: $format') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + trigger, + group, + websiteName, + domain, + urlTemplate, + category, + subCategory, + format, + ); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangData && + other.trigger == this.trigger && + other.group == this.group && + other.websiteName == this.websiteName && + other.domain == this.domain && + other.urlTemplate == this.urlTemplate && + other.category == this.category && + other.subCategory == this.subCategory && + other.format == this.format); +} + +class BangCompanion extends UpdateCompanion { + final Value trigger; + final Value group; + final Value websiteName; + final Value domain; + final Value urlTemplate; + final Value category; + final Value subCategory; + final Value format; + final Value rowid; + const BangCompanion({ + this.trigger = const Value.absent(), + this.group = const Value.absent(), + this.websiteName = const Value.absent(), + this.domain = const Value.absent(), + this.urlTemplate = const Value.absent(), + this.category = const Value.absent(), + this.subCategory = const Value.absent(), + this.format = const Value.absent(), + this.rowid = const Value.absent(), + }); + BangCompanion.insert({ + required String trigger, + required int group, + required String websiteName, + required String domain, + required String urlTemplate, + this.category = const Value.absent(), + this.subCategory = const Value.absent(), + this.format = const Value.absent(), + this.rowid = const Value.absent(), + }) : trigger = Value(trigger), + group = Value(group), + websiteName = Value(websiteName), + domain = Value(domain), + urlTemplate = Value(urlTemplate); + static Insertable custom({ + Expression? trigger, + Expression? group, + Expression? websiteName, + Expression? domain, + Expression? urlTemplate, + Expression? category, + Expression? subCategory, + Expression? format, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (trigger != null) 'trigger': trigger, + if (group != null) 'group': group, + if (websiteName != null) 'website_name': websiteName, + if (domain != null) 'domain': domain, + if (urlTemplate != null) 'url_template': urlTemplate, + if (category != null) 'category': category, + if (subCategory != null) 'sub_category': subCategory, + if (format != null) 'format': format, + if (rowid != null) 'rowid': rowid, + }); + } + + BangCompanion copyWith({ + Value? trigger, + Value? group, + Value? websiteName, + Value? domain, + Value? urlTemplate, + Value? category, + Value? subCategory, + Value? format, + Value? rowid, + }) { + return BangCompanion( + trigger: trigger ?? this.trigger, + group: group ?? this.group, + websiteName: websiteName ?? this.websiteName, + domain: domain ?? this.domain, + urlTemplate: urlTemplate ?? this.urlTemplate, + category: category ?? this.category, + subCategory: subCategory ?? this.subCategory, + format: format ?? this.format, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (trigger.present) { + map['trigger'] = Variable(trigger.value); + } + if (group.present) { + map['group'] = Variable(group.value); + } + if (websiteName.present) { + map['website_name'] = Variable(websiteName.value); + } + if (domain.present) { + map['domain'] = Variable(domain.value); + } + if (urlTemplate.present) { + map['url_template'] = Variable(urlTemplate.value); + } + if (category.present) { + map['category'] = Variable(category.value); + } + if (subCategory.present) { + map['sub_category'] = Variable(subCategory.value); + } + if (format.present) { + map['format'] = Variable(format.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BangCompanion(') + ..write('trigger: $trigger, ') + ..write('group: $group, ') + ..write('websiteName: $websiteName, ') + ..write('domain: $domain, ') + ..write('urlTemplate: $urlTemplate, ') + ..write('category: $category, ') + ..write('subCategory: $subCategory, ') + ..write('format: $format, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class BangSync extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + BangSync(this.attachedDatabase, [this._alias]); + late final GeneratedColumn group = GeneratedColumn( + 'group', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + $customConstraints: 'PRIMARY KEY NOT NULL', + ); + late final GeneratedColumn lastSync = GeneratedColumn( + 'last_sync', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + @override + List get $columns => [group, lastSync]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'bang_sync'; + @override + Set get $primaryKey => {group}; + @override + BangSyncData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangSyncData( + group: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}group'], + )!, + lastSync: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_sync'], + )!, + ); + } + + @override + BangSync createAlias(String alias) { + return BangSync(attachedDatabase, alias); + } + + @override + bool get dontWriteConstraints => true; +} + +class BangSyncData extends DataClass implements Insertable { + final int group; + final DateTime lastSync; + const BangSyncData({required this.group, required this.lastSync}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['group'] = Variable(group); + map['last_sync'] = Variable(lastSync); + return map; + } + + factory BangSyncData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangSyncData( + group: serializer.fromJson(json['group']), + lastSync: serializer.fromJson(json['lastSync']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'group': serializer.toJson(group), + 'lastSync': serializer.toJson(lastSync), + }; + } + + BangSyncData copyWith({int? group, DateTime? lastSync}) => BangSyncData( + group: group ?? this.group, + lastSync: lastSync ?? this.lastSync, + ); + BangSyncData copyWithCompanion(BangSyncCompanion data) { + return BangSyncData( + group: data.group.present ? data.group.value : this.group, + lastSync: data.lastSync.present ? data.lastSync.value : this.lastSync, + ); + } + + @override + String toString() { + return (StringBuffer('BangSyncData(') + ..write('group: $group, ') + ..write('lastSync: $lastSync') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(group, lastSync); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangSyncData && + other.group == this.group && + other.lastSync == this.lastSync); +} + +class BangSyncCompanion extends UpdateCompanion { + final Value group; + final Value lastSync; + const BangSyncCompanion({ + this.group = const Value.absent(), + this.lastSync = const Value.absent(), + }); + BangSyncCompanion.insert({ + this.group = const Value.absent(), + required DateTime lastSync, + }) : lastSync = Value(lastSync); + static Insertable custom({ + Expression? group, + Expression? lastSync, + }) { + return RawValuesInsertable({ + if (group != null) 'group': group, + if (lastSync != null) 'last_sync': lastSync, + }); + } + + BangSyncCompanion copyWith({Value? group, Value? lastSync}) { + return BangSyncCompanion( + group: group ?? this.group, + lastSync: lastSync ?? this.lastSync, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (group.present) { + map['group'] = Variable(group.value); + } + if (lastSync.present) { + map['last_sync'] = Variable(lastSync.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BangSyncCompanion(') + ..write('group: $group, ') + ..write('lastSync: $lastSync') + ..write(')')) + .toString(); + } +} + +class BangFrequency extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + BangFrequency(this.attachedDatabase, [this._alias]); + late final GeneratedColumn trigger = GeneratedColumn( + 'trigger', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn group = GeneratedColumn( + 'group', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn frequency = GeneratedColumn( + 'frequency', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn lastUsed = GeneratedColumn( + 'last_used', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + @override + List get $columns => [trigger, group, frequency, lastUsed]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'bang_frequency'; + @override + Set get $primaryKey => {trigger, group}; + @override + BangFrequencyData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangFrequencyData( + trigger: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}trigger'], + )!, + group: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}group'], + )!, + frequency: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}frequency'], + )!, + lastUsed: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_used'], + )!, + ); + } + + @override + BangFrequency createAlias(String alias) { + return BangFrequency(attachedDatabase, alias); + } + + @override + List get customConstraints => const [ + 'PRIMARY KEY("trigger", "group")', + 'FOREIGN KEY("trigger", "group")REFERENCES bang("trigger", "group")ON DELETE CASCADE', + ]; + @override + bool get dontWriteConstraints => true; +} + +class BangFrequencyData extends DataClass + implements Insertable { + final String trigger; + final int group; + final int frequency; + final DateTime lastUsed; + const BangFrequencyData({ + required this.trigger, + required this.group, + required this.frequency, + required this.lastUsed, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['trigger'] = Variable(trigger); + map['group'] = Variable(group); + map['frequency'] = Variable(frequency); + map['last_used'] = Variable(lastUsed); + return map; + } + + factory BangFrequencyData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangFrequencyData( + trigger: serializer.fromJson(json['trigger']), + group: serializer.fromJson(json['group']), + frequency: serializer.fromJson(json['frequency']), + lastUsed: serializer.fromJson(json['lastUsed']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'trigger': serializer.toJson(trigger), + 'group': serializer.toJson(group), + 'frequency': serializer.toJson(frequency), + 'lastUsed': serializer.toJson(lastUsed), + }; + } + + BangFrequencyData copyWith({ + String? trigger, + int? group, + int? frequency, + DateTime? lastUsed, + }) => BangFrequencyData( + trigger: trigger ?? this.trigger, + group: group ?? this.group, + frequency: frequency ?? this.frequency, + lastUsed: lastUsed ?? this.lastUsed, + ); + BangFrequencyData copyWithCompanion(BangFrequencyCompanion data) { + return BangFrequencyData( + trigger: data.trigger.present ? data.trigger.value : this.trigger, + group: data.group.present ? data.group.value : this.group, + frequency: data.frequency.present ? data.frequency.value : this.frequency, + lastUsed: data.lastUsed.present ? data.lastUsed.value : this.lastUsed, + ); + } + + @override + String toString() { + return (StringBuffer('BangFrequencyData(') + ..write('trigger: $trigger, ') + ..write('group: $group, ') + ..write('frequency: $frequency, ') + ..write('lastUsed: $lastUsed') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(trigger, group, frequency, lastUsed); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangFrequencyData && + other.trigger == this.trigger && + other.group == this.group && + other.frequency == this.frequency && + other.lastUsed == this.lastUsed); +} + +class BangFrequencyCompanion extends UpdateCompanion { + final Value trigger; + final Value group; + final Value frequency; + final Value lastUsed; + final Value rowid; + const BangFrequencyCompanion({ + this.trigger = const Value.absent(), + this.group = const Value.absent(), + this.frequency = const Value.absent(), + this.lastUsed = const Value.absent(), + this.rowid = const Value.absent(), + }); + BangFrequencyCompanion.insert({ + required String trigger, + required int group, + required int frequency, + required DateTime lastUsed, + this.rowid = const Value.absent(), + }) : trigger = Value(trigger), + group = Value(group), + frequency = Value(frequency), + lastUsed = Value(lastUsed); + static Insertable custom({ + Expression? trigger, + Expression? group, + Expression? frequency, + Expression? lastUsed, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (trigger != null) 'trigger': trigger, + if (group != null) 'group': group, + if (frequency != null) 'frequency': frequency, + if (lastUsed != null) 'last_used': lastUsed, + if (rowid != null) 'rowid': rowid, + }); + } + + BangFrequencyCompanion copyWith({ + Value? trigger, + Value? group, + Value? frequency, + Value? lastUsed, + Value? rowid, + }) { + return BangFrequencyCompanion( + trigger: trigger ?? this.trigger, + group: group ?? this.group, + frequency: frequency ?? this.frequency, + lastUsed: lastUsed ?? this.lastUsed, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (trigger.present) { + map['trigger'] = Variable(trigger.value); + } + if (group.present) { + map['group'] = Variable(group.value); + } + if (frequency.present) { + map['frequency'] = Variable(frequency.value); + } + if (lastUsed.present) { + map['last_used'] = Variable(lastUsed.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BangFrequencyCompanion(') + ..write('trigger: $trigger, ') + ..write('group: $group, ') + ..write('frequency: $frequency, ') + ..write('lastUsed: $lastUsed, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class BangHistory extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + BangHistory(this.attachedDatabase, [this._alias]); + late final GeneratedColumn searchQuery = GeneratedColumn( + 'search_query', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'UNIQUE NOT NULL', + ); + late final GeneratedColumn trigger = GeneratedColumn( + 'trigger', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn group = GeneratedColumn( + 'group', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn searchDate = GeneratedColumn( + 'search_date', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + @override + List get $columns => [ + searchQuery, + trigger, + group, + searchDate, + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'bang_history'; + @override + Set get $primaryKey => const {}; + @override + BangHistoryData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangHistoryData( + searchQuery: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}search_query'], + )!, + trigger: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}trigger'], + )!, + group: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}group'], + )!, + searchDate: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}search_date'], + )!, + ); + } + + @override + BangHistory createAlias(String alias) { + return BangHistory(attachedDatabase, alias); + } + + @override + List get customConstraints => const [ + 'FOREIGN KEY("trigger", "group")REFERENCES bang("trigger", "group")', + ]; + @override + bool get dontWriteConstraints => true; +} + +class BangHistoryData extends DataClass implements Insertable { + final String searchQuery; + final String trigger; + final int group; + final DateTime searchDate; + const BangHistoryData({ + required this.searchQuery, + required this.trigger, + required this.group, + required this.searchDate, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['search_query'] = Variable(searchQuery); + map['trigger'] = Variable(trigger); + map['group'] = Variable(group); + map['search_date'] = Variable(searchDate); + return map; + } + + factory BangHistoryData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangHistoryData( + searchQuery: serializer.fromJson(json['searchQuery']), + trigger: serializer.fromJson(json['trigger']), + group: serializer.fromJson(json['group']), + searchDate: serializer.fromJson(json['searchDate']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'searchQuery': serializer.toJson(searchQuery), + 'trigger': serializer.toJson(trigger), + 'group': serializer.toJson(group), + 'searchDate': serializer.toJson(searchDate), + }; + } + + BangHistoryData copyWith({ + String? searchQuery, + String? trigger, + int? group, + DateTime? searchDate, + }) => BangHistoryData( + searchQuery: searchQuery ?? this.searchQuery, + trigger: trigger ?? this.trigger, + group: group ?? this.group, + searchDate: searchDate ?? this.searchDate, + ); + BangHistoryData copyWithCompanion(BangHistoryCompanion data) { + return BangHistoryData( + searchQuery: data.searchQuery.present + ? data.searchQuery.value + : this.searchQuery, + trigger: data.trigger.present ? data.trigger.value : this.trigger, + group: data.group.present ? data.group.value : this.group, + searchDate: data.searchDate.present + ? data.searchDate.value + : this.searchDate, + ); + } + + @override + String toString() { + return (StringBuffer('BangHistoryData(') + ..write('searchQuery: $searchQuery, ') + ..write('trigger: $trigger, ') + ..write('group: $group, ') + ..write('searchDate: $searchDate') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(searchQuery, trigger, group, searchDate); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangHistoryData && + other.searchQuery == this.searchQuery && + other.trigger == this.trigger && + other.group == this.group && + other.searchDate == this.searchDate); +} + +class BangHistoryCompanion extends UpdateCompanion { + final Value searchQuery; + final Value trigger; + final Value group; + final Value searchDate; + final Value rowid; + const BangHistoryCompanion({ + this.searchQuery = const Value.absent(), + this.trigger = const Value.absent(), + this.group = const Value.absent(), + this.searchDate = const Value.absent(), + this.rowid = const Value.absent(), + }); + BangHistoryCompanion.insert({ + required String searchQuery, + required String trigger, + required int group, + required DateTime searchDate, + this.rowid = const Value.absent(), + }) : searchQuery = Value(searchQuery), + trigger = Value(trigger), + group = Value(group), + searchDate = Value(searchDate); + static Insertable custom({ + Expression? searchQuery, + Expression? trigger, + Expression? group, + Expression? searchDate, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (searchQuery != null) 'search_query': searchQuery, + if (trigger != null) 'trigger': trigger, + if (group != null) 'group': group, + if (searchDate != null) 'search_date': searchDate, + if (rowid != null) 'rowid': rowid, + }); + } + + BangHistoryCompanion copyWith({ + Value? searchQuery, + Value? trigger, + Value? group, + Value? searchDate, + Value? rowid, + }) { + return BangHistoryCompanion( + searchQuery: searchQuery ?? this.searchQuery, + trigger: trigger ?? this.trigger, + group: group ?? this.group, + searchDate: searchDate ?? this.searchDate, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (searchQuery.present) { + map['search_query'] = Variable(searchQuery.value); + } + if (trigger.present) { + map['trigger'] = Variable(trigger.value); + } + if (group.present) { + map['group'] = Variable(group.value); + } + if (searchDate.present) { + map['search_date'] = Variable(searchDate.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BangHistoryCompanion(') + ..write('searchQuery: $searchQuery, ') + ..write('trigger: $trigger, ') + ..write('group: $group, ') + ..write('searchDate: $searchDate, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class BangFts extends Table + with + TableInfo, + VirtualTableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + BangFts(this.attachedDatabase, [this._alias]); + late final GeneratedColumn trigger = GeneratedColumn( + 'trigger', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: '', + ); + late final GeneratedColumn websiteName = GeneratedColumn( + 'website_name', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: '', + ); + @override + List get $columns => [trigger, websiteName]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'bang_fts'; + @override + Set get $primaryKey => const {}; + @override + BangFtsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangFtsData( + trigger: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}trigger'], + )!, + websiteName: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}website_name'], + )!, + ); + } + + @override + BangFts createAlias(String alias) { + return BangFts(attachedDatabase, alias); + } + + @override + String get moduleAndArgs => + 'fts5(trigger, website_name, content=bang, prefix=\'2 3\')'; +} + +class BangFtsData extends DataClass implements Insertable { + final String trigger; + final String websiteName; + const BangFtsData({required this.trigger, required this.websiteName}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['trigger'] = Variable(trigger); + map['website_name'] = Variable(websiteName); + return map; + } + + factory BangFtsData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangFtsData( + trigger: serializer.fromJson(json['trigger']), + websiteName: serializer.fromJson(json['websiteName']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'trigger': serializer.toJson(trigger), + 'websiteName': serializer.toJson(websiteName), + }; + } + + BangFtsData copyWith({String? trigger, String? websiteName}) => BangFtsData( + trigger: trigger ?? this.trigger, + websiteName: websiteName ?? this.websiteName, + ); + BangFtsData copyWithCompanion(BangFtsCompanion data) { + return BangFtsData( + trigger: data.trigger.present ? data.trigger.value : this.trigger, + websiteName: data.websiteName.present + ? data.websiteName.value + : this.websiteName, + ); + } + + @override + String toString() { + return (StringBuffer('BangFtsData(') + ..write('trigger: $trigger, ') + ..write('websiteName: $websiteName') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(trigger, websiteName); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangFtsData && + other.trigger == this.trigger && + other.websiteName == this.websiteName); +} + +class BangFtsCompanion extends UpdateCompanion { + final Value trigger; + final Value websiteName; + final Value rowid; + const BangFtsCompanion({ + this.trigger = const Value.absent(), + this.websiteName = const Value.absent(), + this.rowid = const Value.absent(), + }); + BangFtsCompanion.insert({ + required String trigger, + required String websiteName, + this.rowid = const Value.absent(), + }) : trigger = Value(trigger), + websiteName = Value(websiteName); + static Insertable custom({ + Expression? trigger, + Expression? websiteName, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (trigger != null) 'trigger': trigger, + if (websiteName != null) 'website_name': websiteName, + if (rowid != null) 'rowid': rowid, + }); + } + + BangFtsCompanion copyWith({ + Value? trigger, + Value? websiteName, + Value? rowid, + }) { + return BangFtsCompanion( + trigger: trigger ?? this.trigger, + websiteName: websiteName ?? this.websiteName, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (trigger.present) { + map['trigger'] = Variable(trigger.value); + } + if (websiteName.present) { + map['website_name'] = Variable(websiteName.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BangFtsCompanion(') + ..write('trigger: $trigger, ') + ..write('websiteName: $websiteName, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class BangDataViewData extends DataClass { + final String trigger; + final int group; + final String websiteName; + final String domain; + final String urlTemplate; + final String? category; + final String? subCategory; + final String? format; + final int? frequency; + final DateTime? lastUsed; + const BangDataViewData({ + required this.trigger, + required this.group, + required this.websiteName, + required this.domain, + required this.urlTemplate, + this.category, + this.subCategory, + this.format, + this.frequency, + this.lastUsed, + }); + factory BangDataViewData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangDataViewData( + trigger: serializer.fromJson(json['trigger']), + group: serializer.fromJson(json['group']), + websiteName: serializer.fromJson(json['websiteName']), + domain: serializer.fromJson(json['domain']), + urlTemplate: serializer.fromJson(json['urlTemplate']), + category: serializer.fromJson(json['category']), + subCategory: serializer.fromJson(json['subCategory']), + format: serializer.fromJson(json['format']), + frequency: serializer.fromJson(json['frequency']), + lastUsed: serializer.fromJson(json['lastUsed']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'trigger': serializer.toJson(trigger), + 'group': serializer.toJson(group), + 'websiteName': serializer.toJson(websiteName), + 'domain': serializer.toJson(domain), + 'urlTemplate': serializer.toJson(urlTemplate), + 'category': serializer.toJson(category), + 'subCategory': serializer.toJson(subCategory), + 'format': serializer.toJson(format), + 'frequency': serializer.toJson(frequency), + 'lastUsed': serializer.toJson(lastUsed), + }; + } + + BangDataViewData copyWith({ + String? trigger, + int? group, + String? websiteName, + String? domain, + String? urlTemplate, + Value category = const Value.absent(), + Value subCategory = const Value.absent(), + Value format = const Value.absent(), + Value frequency = const Value.absent(), + Value lastUsed = const Value.absent(), + }) => BangDataViewData( + trigger: trigger ?? this.trigger, + group: group ?? this.group, + websiteName: websiteName ?? this.websiteName, + domain: domain ?? this.domain, + urlTemplate: urlTemplate ?? this.urlTemplate, + category: category.present ? category.value : this.category, + subCategory: subCategory.present ? subCategory.value : this.subCategory, + format: format.present ? format.value : this.format, + frequency: frequency.present ? frequency.value : this.frequency, + lastUsed: lastUsed.present ? lastUsed.value : this.lastUsed, + ); + @override + String toString() { + return (StringBuffer('BangDataViewData(') + ..write('trigger: $trigger, ') + ..write('group: $group, ') + ..write('websiteName: $websiteName, ') + ..write('domain: $domain, ') + ..write('urlTemplate: $urlTemplate, ') + ..write('category: $category, ') + ..write('subCategory: $subCategory, ') + ..write('format: $format, ') + ..write('frequency: $frequency, ') + ..write('lastUsed: $lastUsed') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + trigger, + group, + websiteName, + domain, + urlTemplate, + category, + subCategory, + format, + frequency, + lastUsed, + ); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangDataViewData && + other.trigger == this.trigger && + other.group == this.group && + other.websiteName == this.websiteName && + other.domain == this.domain && + other.urlTemplate == this.urlTemplate && + other.category == this.category && + other.subCategory == this.subCategory && + other.format == this.format && + other.frequency == this.frequency && + other.lastUsed == this.lastUsed); +} + +class BangDataView extends ViewInfo + implements HasResultSet { + final String? _alias; + @override + final DatabaseAtV2 attachedDatabase; + BangDataView(this.attachedDatabase, [this._alias]); + @override + List get $columns => [ + trigger, + group, + websiteName, + domain, + urlTemplate, + category, + subCategory, + format, + frequency, + lastUsed, + ]; + @override + String get aliasedName => _alias ?? entityName; + @override + String get entityName => 'bang_data_view'; + @override + Map get createViewStatements => { + SqlDialect.sqlite: + 'CREATE VIEW bang_data_view AS SELECT b.*, bf.frequency, bf.last_used FROM bang AS b LEFT JOIN bang_frequency AS bf ON b."trigger" = bf."trigger" AND b."group" = bf."group";', + }; + @override + BangDataView get asDslTable => this; + @override + BangDataViewData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangDataViewData( + trigger: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}trigger'], + )!, + group: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}group'], + )!, + websiteName: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}website_name'], + )!, + domain: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}domain'], + )!, + urlTemplate: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}url_template'], + )!, + category: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}category'], + ), + subCategory: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}sub_category'], + ), + format: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}format'], + ), + frequency: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}frequency'], + ), + lastUsed: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_used'], + ), + ); + } + + late final GeneratedColumn trigger = GeneratedColumn( + 'trigger', + aliasedName, + false, + type: DriftSqlType.string, + ); + late final GeneratedColumn group = GeneratedColumn( + 'group', + aliasedName, + false, + type: DriftSqlType.int, + ); + late final GeneratedColumn websiteName = GeneratedColumn( + 'website_name', + aliasedName, + false, + type: DriftSqlType.string, + ); + late final GeneratedColumn domain = GeneratedColumn( + 'domain', + aliasedName, + false, + type: DriftSqlType.string, + ); + late final GeneratedColumn urlTemplate = GeneratedColumn( + 'url_template', + aliasedName, + false, + type: DriftSqlType.string, + ); + late final GeneratedColumn category = GeneratedColumn( + 'category', + aliasedName, + true, + type: DriftSqlType.string, + ); + late final GeneratedColumn subCategory = GeneratedColumn( + 'sub_category', + aliasedName, + true, + type: DriftSqlType.string, + ); + late final GeneratedColumn format = GeneratedColumn( + 'format', + aliasedName, + true, + type: DriftSqlType.string, + ); + late final GeneratedColumn frequency = GeneratedColumn( + 'frequency', + aliasedName, + true, + type: DriftSqlType.int, + ); + late final GeneratedColumn lastUsed = GeneratedColumn( + 'last_used', + aliasedName, + true, + type: DriftSqlType.dateTime, + ); + @override + BangDataView createAlias(String alias) { + return BangDataView(attachedDatabase, alias); + } + + @override + Query? get query => null; + @override + Set get readTables => const {}; +} + +class DatabaseAtV2 extends GeneratedDatabase { + DatabaseAtV2(QueryExecutor e) : super(e); + late final Bang bang = Bang(this); + late final BangSync bangSync = BangSync(this); + late final BangFrequency bangFrequency = BangFrequency(this); + late final BangHistory bangHistory = BangHistory(this); + late final BangFts bangFts = BangFts(this); + late final BangDataView bangDataView = BangDataView(this); + late final Trigger bangAfterInsert = Trigger( + 'CREATE TRIGGER bang_after_insert AFTER INSERT ON bang BEGIN INSERT INTO bang_fts ("rowid", "trigger", website_name) VALUES (new."rowid", new."trigger", new.website_name);END', + 'bang_after_insert', + ); + late final Trigger bangAfterDelete = Trigger( + 'CREATE TRIGGER bang_after_delete AFTER DELETE ON bang BEGIN INSERT INTO bang_fts (bang_fts, "rowid", "trigger", website_name) VALUES (\'delete\', old."rowid", old."trigger", old.website_name);END', + 'bang_after_delete', + ); + late final Trigger bangAfterUpdate = Trigger( + 'CREATE TRIGGER bang_after_update AFTER UPDATE ON bang BEGIN INSERT INTO bang_fts (bang_fts, "rowid", "trigger", website_name) VALUES (\'delete\', old."rowid", old."trigger", old.website_name);INSERT INTO bang_fts ("rowid", "trigger", website_name) VALUES (new."rowid", new."trigger", new.website_name);END', + 'bang_after_update', + ); + @override + Iterable> get allTables => + allSchemaEntities.whereType>(); + @override + List get allSchemaEntities => [ + bang, + bangSync, + bangFrequency, + bangHistory, + bangFts, + bangDataView, + bangAfterInsert, + bangAfterDelete, + bangAfterUpdate, + ]; + @override + StreamQueryUpdateRules get streamUpdateRules => const StreamQueryUpdateRules([ + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang', + limitUpdateKind: UpdateKind.delete, + ), + result: [], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang', + limitUpdateKind: UpdateKind.delete, + ), + result: [], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang', + limitUpdateKind: UpdateKind.delete, + ), + result: [], + ), + ]); + @override + int get schemaVersion => 2; +} diff --git a/app/test/drift/bangs/migration_test.dart b/app/test/drift/bangs/migration_test.dart new file mode 100644 index 00000000..f8bb101f --- /dev/null +++ b/app/test/drift/bangs/migration_test.dart @@ -0,0 +1,97 @@ +// dart format width=80 +// ignore_for_file: unused_local_variable, unused_import +import 'package:drift/drift.dart'; +import 'package:drift_dev/api/migrations_native.dart'; +import 'package:weblibre/features/bangs/data/database/database.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'generated/schema.dart'; + +import 'generated/schema_v1.dart' as v1; +import 'generated/schema_v2.dart' as v2; + +void main() { + driftRuntimeOptions.dontWarnAboutMultipleDatabases = true; + late SchemaVerifier verifier; + + setUpAll(() { + verifier = SchemaVerifier(GeneratedHelper()); + }); + + group('simple database migrations', () { + // These simple tests verify all possible schema updates with a simple (no + // data) migration. This is a quick way to ensure that written database + // migrations properly alter the schema. + const versions = GeneratedHelper.versions; + for (final (i, fromVersion) in versions.indexed) { + group('from $fromVersion', () { + for (final toVersion in versions.skip(i + 1)) { + test('to $toVersion', () async { + final schema = await verifier.schemaAt(fromVersion); + final db = BangDatabase(schema.newConnection()); + await verifier.migrateAndValidate(db, toVersion); + await db.close(); + }); + } + }); + } + }); + + // The following template shows how to write tests ensuring your migrations + // preserve existing data. + // Testing this can be useful for migrations that change existing columns + // (e.g. by alterating their type or constraints). Migrations that only add + // tables or columns typically don't need these advanced tests. For more + // information, see https://drift.simonbinder.eu/migrations/tests/#verifying-data-integrity + // TODO: This generated template shows how these tests could be written. Adopt + // it to your own needs when testing migrations with data integrity. + test('migration from v1 to v2 does not corrupt data', () async { + // Add data to insert into the old database, and the expected rows after the + // migration. + // TODO: Fill these lists + final oldBangData = []; + final expectedNewBangData = []; + + final oldBangSyncData = []; + final expectedNewBangSyncData = []; + + final oldBangFrequencyData = []; + final expectedNewBangFrequencyData = []; + + final oldBangHistoryData = []; + final expectedNewBangHistoryData = []; + + final oldBangFtsData = []; + final expectedNewBangFtsData = []; + + await verifier.testWithDataIntegrity( + oldVersion: 1, + newVersion: 2, + createOld: v1.DatabaseAtV1.new, + createNew: v2.DatabaseAtV2.new, + openTestedDatabase: BangDatabase.new, + createItems: (batch, oldDb) { + batch.insertAll(oldDb.bang, oldBangData); + batch.insertAll(oldDb.bangSync, oldBangSyncData); + batch.insertAll(oldDb.bangFrequency, oldBangFrequencyData); + batch.insertAll(oldDb.bangHistory, oldBangHistoryData); + batch.insertAll(oldDb.bangFts, oldBangFtsData); + }, + validateItems: (newDb) async { + expect(expectedNewBangData, await newDb.select(newDb.bang).get()); + expect( + expectedNewBangSyncData, + await newDb.select(newDb.bangSync).get(), + ); + expect( + expectedNewBangFrequencyData, + await newDb.select(newDb.bangFrequency).get(), + ); + expect( + expectedNewBangHistoryData, + await newDb.select(newDb.bangHistory).get(), + ); + expect(expectedNewBangFtsData, await newDb.select(newDb.bangFts).get()); + }, + ); + }); +}