diff --git a/app/drift_schemas/bangs/drift_schema_v5.json b/app/drift_schemas/bangs/drift_schema_v5.json new file mode 100644 index 00000000..b4f93c98 --- /dev/null +++ b/app/drift_schemas/bangs/drift_schema_v5.json @@ -0,0 +1,912 @@ +{ + "_meta": { + "description": "This file contains a serialized version of schema entities for drift.", + "version": "1.3.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?" + } + }, + { + "name": "additional_triggers", + "getter_name": "additionalTriggers", + "moor_type": "string", + "nullable": true, + "customConstraints": "", + "default_dart": null, + "default_client_dart": null, + "dsl_features": [], + "type_converter": { + "dart_expr": "const TriggerListConverter()", + "dart_type_name": "Set?" + } + }, + { + "name": "searxng_api", + "getter_name": "searxngApi", + "moor_type": "bool", + "nullable": false, + "customConstraints": "NOT NULL DEFAULT FALSE", + "default_dart": "const CustomExpression('FALSE')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "snap_domain", + "getter_name": "snapDomain", + "moor_type": "string", + "nullable": true, + "customConstraints": "", + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [ + "PRIMARY KEY(\"trigger\", \"group\")" + ], + "explicit_pk": [ + "trigger", + "group" + ] + } + }, + { + "id": 1, + "references": [ + 0 + ], + "type": "table", + "data": { + "name": "bang_triggers", + "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": "additional_trigger", + "getter_name": "additionalTrigger", + "moor_type": "string", + "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\", additional_trigger)", + "FOREIGN KEY(\"trigger\", \"group\")REFERENCES bang(\"trigger\", \"group\")ON DELETE CASCADE" + ], + "explicit_pk": [ + "trigger", + "group", + "additional_trigger" + ] + } + }, + { + "id": 2, + "references": [ + 1 + ], + "type": "index", + "data": { + "on": 1, + "name": "idx_bang_triggers_lookup", + "sql": "CREATE INDEX idx_bang_triggers_lookup ON bang_triggers (additional_trigger, \"group\");", + "unique": false, + "columns": [] + } + }, + { + "id": 3, + "references": [ + 0, + 1 + ], + "type": "trigger", + "data": { + "on": 0, + "references_in_body": [ + 0, + 1 + ], + "name": "bang_triggers_after_insert", + "sql": "CREATE TRIGGER bang_triggers_after_insert AFTER INSERT ON bang \nWHEN new.additional_triggers IS NOT NULL\nBEGIN\n INSERT INTO bang_triggers(\"trigger\", \"group\", additional_trigger)\n SELECT \n new.\"trigger\",\n new.\"group\",\n json_each.value\n FROM json_each(new.additional_triggers);\nEND;" + } + }, + { + "id": 4, + "references": [ + 0, + 1 + ], + "type": "trigger", + "data": { + "on": 0, + "references_in_body": [ + 0, + 1 + ], + "name": "bang_triggers_after_update", + "sql": "CREATE TRIGGER bang_triggers_after_update AFTER UPDATE ON bang BEGIN\n -- Delete old additional triggers\n DELETE FROM bang_triggers \n WHERE \"trigger\" = old.\"trigger\" AND \"group\" = old.\"group\";\n\n -- Insert new additional triggers if they exist\n INSERT INTO bang_triggers(\"trigger\", \"group\", additional_trigger)\n SELECT \n new.\"trigger\",\n new.\"group\",\n json_each.value\n FROM json_each(new.additional_triggers)\n WHERE new.additional_triggers IS NOT NULL;\nEND;" + } + }, + { + "id": 5, + "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": 6, + "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": 7, + "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\")ON DELETE CASCADE" + ] + } + }, + { + "id": 8, + "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": 9, + "references": [ + 1 + ], + "type": "table", + "data": { + "name": "bang_triggers_fts", + "was_declared_in_moor": true, + "columns": [ + { + "name": "additional_trigger", + "getter_name": "additionalTrigger", + "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_triggers_fts\" USING fts5(additional_trigger, content=bang_triggers, prefix='2 3')", + "without_rowid": false, + "constraints": [] + } + }, + { + "id": 10, + "references": [ + 0, + 6 + ], + "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": "additional_triggers", + "getter_name": "additionalTriggers", + "moor_type": "string", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [], + "type_converter": { + "dart_expr": "const TriggerListConverter()", + "dart_type_name": "Set?" + } + }, + { + "name": "searxng_api", + "getter_name": "searxngApi", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"searxng_api\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"searxng_api\" IN (0, 1))" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "snap_domain", + "getter_name": "snapDomain", + "moor_type": "string", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "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": 11, + "references": [ + 0, + 8 + ], + "type": "trigger", + "data": { + "on": 0, + "references_in_body": [ + 0, + 8 + ], + "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": 12, + "references": [ + 0, + 8 + ], + "type": "trigger", + "data": { + "on": 0, + "references_in_body": [ + 0, + 8 + ], + "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": 13, + "references": [ + 0, + 8 + ], + "type": "trigger", + "data": { + "on": 0, + "references_in_body": [ + 0, + 8 + ], + "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;" + } + }, + { + "id": 14, + "references": [ + 1, + 9 + ], + "type": "trigger", + "data": { + "on": 1, + "references_in_body": [ + 1, + 9 + ], + "name": "bang_triggers_after_insert_fts", + "sql": "CREATE TRIGGER bang_triggers_after_insert_fts AFTER INSERT ON bang_triggers BEGIN\n INSERT INTO \n bang_triggers_fts(rowid, additional_trigger) \n VALUES (new.rowid, new.additional_trigger);\nEND;" + } + }, + { + "id": 15, + "references": [ + 1, + 9 + ], + "type": "trigger", + "data": { + "on": 1, + "references_in_body": [ + 1, + 9 + ], + "name": "bang_triggers_after_delete_fts", + "sql": "CREATE TRIGGER bang_triggers_after_delete_fts AFTER DELETE ON bang_triggers BEGIN\n INSERT INTO \n bang_triggers_fts(bang_triggers_fts, rowid, additional_trigger) \n VALUES('delete', old.rowid, old.additional_trigger);\nEND;" + } + }, + { + "id": 16, + "references": [ + 1, + 9 + ], + "type": "trigger", + "data": { + "on": 1, + "references_in_body": [ + 1, + 9 + ], + "name": "bang_triggers_after_update_fts", + "sql": "CREATE TRIGGER bang_triggers_after_update_fts AFTER UPDATE ON bang_triggers BEGIN\n INSERT INTO \n bang_triggers_fts(bang_triggers_fts, rowid, additional_trigger) \n VALUES('delete', old.rowid, old.additional_trigger);\n INSERT INTO \n bang_triggers_fts(rowid, additional_trigger) \n VALUES (new.rowid, new.additional_trigger);\nEND;" + } + } + ], + "fixed_sql": [ + { + "name": "bang", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"bang\" (\"trigger\" TEXT NOT NULL, \"group\" INTEGER NOT NULL, \"website_name\" TEXT NOT NULL, \"domain\" TEXT NOT NULL, \"url_template\" TEXT NOT NULL, \"category\" TEXT, \"sub_category\" TEXT, \"format\" TEXT, \"additional_triggers\" TEXT, \"searxng_api\" INTEGER NOT NULL DEFAULT FALSE, \"snap_domain\" TEXT, PRIMARY KEY(\"trigger\", \"group\"));" + } + ] + }, + { + "name": "bang_triggers", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"bang_triggers\" (\"trigger\" TEXT NOT NULL, \"group\" INTEGER NOT NULL, \"additional_trigger\" TEXT NOT NULL, PRIMARY KEY(\"trigger\", \"group\", additional_trigger), FOREIGN KEY(\"trigger\", \"group\")REFERENCES bang(\"trigger\", \"group\")ON DELETE CASCADE);" + } + ] + }, + { + "name": "idx_bang_triggers_lookup", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE INDEX idx_bang_triggers_lookup ON bang_triggers (additional_trigger, \"group\")" + } + ] + }, + { + "name": "bang_triggers_after_insert", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TRIGGER bang_triggers_after_insert AFTER INSERT ON bang WHEN new.additional_triggers IS NOT NULL BEGIN INSERT INTO bang_triggers (\"trigger\", \"group\", additional_trigger) SELECT new.\"trigger\", new.\"group\", json_each.value FROM json_each(new.additional_triggers);END" + } + ] + }, + { + "name": "bang_triggers_after_update", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TRIGGER bang_triggers_after_update AFTER UPDATE ON bang BEGIN DELETE FROM bang_triggers WHERE \"trigger\" = old.\"trigger\" AND \"group\" = old.\"group\";INSERT INTO bang_triggers (\"trigger\", \"group\", additional_trigger) SELECT new.\"trigger\", new.\"group\", json_each.value FROM json_each(new.additional_triggers)WHERE new.additional_triggers IS NOT NULL;END" + } + ] + }, + { + "name": "bang_sync", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"bang_sync\" (\"group\" INTEGER PRIMARY KEY NOT NULL, \"last_sync\" INTEGER NOT NULL);" + } + ] + }, + { + "name": "bang_frequency", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"bang_frequency\" (\"trigger\" TEXT NOT NULL, \"group\" INTEGER NOT NULL, \"frequency\" INTEGER NOT NULL, \"last_used\" INTEGER NOT NULL, PRIMARY KEY(\"trigger\", \"group\"), FOREIGN KEY(\"trigger\", \"group\")REFERENCES bang(\"trigger\", \"group\")ON DELETE CASCADE);" + } + ] + }, + { + "name": "bang_history", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"bang_history\" (\"search_query\" TEXT UNIQUE NOT NULL, \"trigger\" TEXT NOT NULL, \"group\" INTEGER NOT NULL, \"search_date\" INTEGER NOT NULL, FOREIGN KEY(\"trigger\", \"group\")REFERENCES bang(\"trigger\", \"group\")ON DELETE CASCADE);" + } + ] + }, + { + "name": "bang_fts", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE VIRTUAL TABLE IF NOT EXISTS \"bang_fts\" USING fts5(trigger, website_name, content=bang, prefix='2 3');" + } + ] + }, + { + "name": "bang_triggers_fts", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE VIRTUAL TABLE IF NOT EXISTS \"bang_triggers_fts\" USING fts5(additional_trigger, content=bang_triggers, prefix='2 3');" + } + ] + }, + { + "name": "bang_data_view", + "sql": [ + { + "dialect": "sqlite", + "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\"" + } + ] + }, + { + "name": "bang_after_insert", + "sql": [ + { + "dialect": "sqlite", + "sql": "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" + } + ] + }, + { + "name": "bang_after_delete", + "sql": [ + { + "dialect": "sqlite", + "sql": "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" + } + ] + }, + { + "name": "bang_after_update", + "sql": [ + { + "dialect": "sqlite", + "sql": "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" + } + ] + }, + { + "name": "bang_triggers_after_insert_fts", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TRIGGER bang_triggers_after_insert_fts AFTER INSERT ON bang_triggers BEGIN INSERT INTO bang_triggers_fts (\"rowid\", additional_trigger) VALUES (new.\"rowid\", new.additional_trigger);END" + } + ] + }, + { + "name": "bang_triggers_after_delete_fts", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TRIGGER bang_triggers_after_delete_fts AFTER DELETE ON bang_triggers BEGIN INSERT INTO bang_triggers_fts (bang_triggers_fts, \"rowid\", additional_trigger) VALUES ('delete', old.\"rowid\", old.additional_trigger);END" + } + ] + }, + { + "name": "bang_triggers_after_update_fts", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TRIGGER bang_triggers_after_update_fts AFTER UPDATE ON bang_triggers BEGIN INSERT INTO bang_triggers_fts (bang_triggers_fts, \"rowid\", additional_trigger) VALUES ('delete', old.\"rowid\", old.additional_trigger);INSERT INTO bang_triggers_fts (\"rowid\", additional_trigger) VALUES (new.\"rowid\", new.additional_trigger);END" + } + ] + } + ] +} \ 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 b2b4dd1a..d55ab04d 100644 --- a/app/lib/features/bangs/data/database/database.dart +++ b/app/lib/features/bangs/data/database/database.dart @@ -25,12 +25,13 @@ 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/bangs/data/database/definitions.drift.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 = 4; + final int schemaVersion = 5; @override final int ftsTokenLimit = 6; @@ -71,13 +72,55 @@ class BangDatabase extends $BangDatabase with PrefixQueryBuilderMixin { await validateDatabaseSchema(); } - await customStatement('PRAGMA foreign_keys = ON'); - if (details.hadUpgrade && details.versionBefore != null) { if (details.versionBefore! < 3) { await bang.deleteWhere((t) => t.group.equals(3)); + await bangTriggers.deleteWhere((t) => t.group.equals(3)); + await bangSync.deleteWhere((t) => t.group.equals(3)); + await bangFrequency.deleteWhere((t) => t.group.equals(3)); + await bangHistory.deleteWhere((t) => t.group.equals(3)); + } else if (details.versionBefore! < 5) { + await bang.deleteWhere((t) => t.group.equals(1)); + await bangTriggers.deleteWhere((t) => t.group.equals(1)); + await bangSync.deleteWhere((t) => t.group.equals(1)); + await bangFrequency.deleteWhere((t) => t.group.equals(1)); + await bangHistory.deleteWhere((t) => t.group.equals(1)); + + await (bang.update()..where((t) => t.group.isBiggerThanValue(0))) + .write( + BangCompanion.custom(group: bang.group - const Constant(1)), + ); + await (bangTriggers.update() + ..where((t) => t.group.isBiggerThanValue(0))) + .write( + BangTriggersCompanion.custom( + group: bangTriggers.group - const Constant(1), + ), + ); + await (bangSync.update()..where((t) => t.group.isBiggerThanValue(0))) + .write( + BangSyncCompanion.custom( + group: bangSync.group - const Constant(1), + ), + ); + await (bangFrequency.update() + ..where((t) => t.group.isBiggerThanValue(0))) + .write( + BangFrequencyCompanion.custom( + group: bangFrequency.group - const Constant(1), + ), + ); + await (bangHistory.update() + ..where((t) => t.group.isBiggerThanValue(0))) + .write( + BangHistoryCompanion.custom( + group: bangHistory.group - const Constant(1), + ), + ); } } + + await customStatement('PRAGMA foreign_keys = ON'); }, ); @@ -88,11 +131,13 @@ class BangDatabase extends $BangDatabase with PrefixQueryBuilderMixin { //Too many changes, we switch to a new database }, from2To3: (m, schema) async { - final bangAtV3 = schema.bang; - await m.addColumn(bangAtV3, bangAtV3.searxngApi); + await m.addColumn(schema.bang, schema.bang.searxngApi); }, from3To4: (m, schema) async { await m.alterTable(TableMigration(schema.bangHistory)); }, + from4To5: (m, schema) async { + await m.addColumn(schema.bang, schema.bang.snapDomain); + }, ); } diff --git a/app/lib/features/bangs/data/database/database.steps.dart b/app/lib/features/bangs/data/database/database.steps.dart index f213c6be..e463238a 100644 --- a/app/lib/features/bangs/data/database/database.steps.dart +++ b/app/lib/features/bangs/data/database/database.steps.dart @@ -1045,10 +1045,263 @@ i1.GeneratedColumn _column_40(String aliasedName) => true, type: i1.DriftSqlType.int, ); + +final class Schema5 extends i0.VersionedSchema { + Schema5({required super.database}) : super(version: 5); + @override + late final List entities = [ + bang, + bangTriggers, + idxBangTriggersLookup, + bangTriggersAfterInsert, + bangTriggersAfterUpdate, + bangSync, + bangFrequency, + bangHistory, + bangFts, + bangTriggersFts, + bangDataView, + bangAfterInsert, + bangAfterDelete, + bangAfterUpdate, + bangTriggersAfterInsertFts, + bangTriggersAfterDeleteFts, + bangTriggersAfterUpdateFts, + ]; + late final Shape15 bang = Shape15( + 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, + _column_26, + _column_32, + _column_41, + ], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape7 bangTriggers = Shape7( + source: i0.VersionedTable( + entityName: 'bang_triggers', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY("trigger", "group", additional_trigger)', + 'FOREIGN KEY("trigger", "group")REFERENCES bang("trigger", "group")ON DELETE CASCADE', + ], + columns: [_column_0, _column_1, _column_28], + attachedDatabase: database, + ), + alias: null, + ); + final i1.Index idxBangTriggersLookup = i1.Index( + 'idx_bang_triggers_lookup', + 'CREATE INDEX idx_bang_triggers_lookup ON bang_triggers (additional_trigger, "group")', + ); + final i1.Trigger bangTriggersAfterInsert = i1.Trigger( + 'CREATE TRIGGER bang_triggers_after_insert AFTER INSERT ON bang WHEN new.additional_triggers IS NOT NULL BEGIN INSERT INTO bang_triggers ("trigger", "group", additional_trigger) SELECT new."trigger", new."group", json_each.value FROM json_each(new.additional_triggers);END', + 'bang_triggers_after_insert', + ); + final i1.Trigger bangTriggersAfterUpdate = i1.Trigger( + 'CREATE TRIGGER bang_triggers_after_update AFTER UPDATE ON bang BEGIN DELETE FROM bang_triggers WHERE "trigger" = old."trigger" AND "group" = old."group";INSERT INTO bang_triggers ("trigger", "group", additional_trigger) SELECT new."trigger", new."group", json_each.value FROM json_each(new.additional_triggers)WHERE new.additional_triggers IS NOT NULL;END', + 'bang_triggers_after_update', + ); + late final Shape11 bangSync = Shape11( + source: i0.VersionedTable( + entityName: 'bang_sync', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [_column_8, _column_33], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape12 bangFrequency = Shape12( + 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_34], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape13 bangHistory = Shape13( + source: i0.VersionedTable( + entityName: 'bang_history', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'FOREIGN KEY("trigger", "group")REFERENCES bang("trigger", "group")ON DELETE CASCADE', + ], + columns: [_column_12, _column_0, _column_1, _column_35], + 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_36, _column_37], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape8 bangTriggersFts = Shape8( + source: i0.VersionedVirtualTable( + entityName: 'bang_triggers_fts', + moduleAndArgs: + 'fts5(additional_trigger, content=bang_triggers, prefix=\'2 3\')', + columns: [_column_38], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape16 bangDataView = Shape16( + 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_30, + _column_39, + _column_42, + _column_24, + _column_40, + ], + 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', + ); + final i1.Trigger bangTriggersAfterInsertFts = i1.Trigger( + 'CREATE TRIGGER bang_triggers_after_insert_fts AFTER INSERT ON bang_triggers BEGIN INSERT INTO bang_triggers_fts ("rowid", additional_trigger) VALUES (new."rowid", new.additional_trigger);END', + 'bang_triggers_after_insert_fts', + ); + final i1.Trigger bangTriggersAfterDeleteFts = i1.Trigger( + 'CREATE TRIGGER bang_triggers_after_delete_fts AFTER DELETE ON bang_triggers BEGIN INSERT INTO bang_triggers_fts (bang_triggers_fts, "rowid", additional_trigger) VALUES (\'delete\', old."rowid", old.additional_trigger);END', + 'bang_triggers_after_delete_fts', + ); + final i1.Trigger bangTriggersAfterUpdateFts = i1.Trigger( + 'CREATE TRIGGER bang_triggers_after_update_fts AFTER UPDATE ON bang_triggers BEGIN INSERT INTO bang_triggers_fts (bang_triggers_fts, "rowid", additional_trigger) VALUES (\'delete\', old."rowid", old.additional_trigger);INSERT INTO bang_triggers_fts ("rowid", additional_trigger) VALUES (new."rowid", new.additional_trigger);END', + 'bang_triggers_after_update_fts', + ); +} + +class Shape15 extends i0.VersionedTable { + Shape15({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 additionalTriggers => + columnsByName['additional_triggers']! as i1.GeneratedColumn; + i1.GeneratedColumn get searxngApi => + columnsByName['searxng_api']! as i1.GeneratedColumn; + i1.GeneratedColumn get snapDomain => + columnsByName['snap_domain']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_41(String aliasedName) => + i1.GeneratedColumn( + 'snap_domain', + aliasedName, + true, + type: i1.DriftSqlType.string, + $customConstraints: '', + ); + +class Shape16 extends i0.VersionedView { + Shape16({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 additionalTriggers => + columnsByName['additional_triggers']! as i1.GeneratedColumn; + i1.GeneratedColumn get searxngApi => + columnsByName['searxng_api']! as i1.GeneratedColumn; + i1.GeneratedColumn get snapDomain => + columnsByName['snap_domain']! 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_42(String aliasedName) => + i1.GeneratedColumn( + 'snap_domain', + aliasedName, + true, + type: i1.DriftSqlType.string, + ); i0.MigrationStepWithVersion migrationSteps({ required Future Function(i1.Migrator m, Schema2 schema) from1To2, required Future Function(i1.Migrator m, Schema3 schema) from2To3, required Future Function(i1.Migrator m, Schema4 schema) from3To4, + required Future Function(i1.Migrator m, Schema5 schema) from4To5, }) { return (currentVersion, database) async { switch (currentVersion) { @@ -1067,6 +1320,11 @@ i0.MigrationStepWithVersion migrationSteps({ final migrator = i1.Migrator(database, schema); await from3To4(migrator, schema); return 4; + case 4: + final schema = Schema5(database: database); + final migrator = i1.Migrator(database, schema); + await from4To5(migrator, schema); + return 5; default: throw ArgumentError.value('Unknown migration from $currentVersion'); } @@ -1077,10 +1335,12 @@ i1.OnUpgrade stepByStep({ required Future Function(i1.Migrator m, Schema2 schema) from1To2, required Future Function(i1.Migrator m, Schema3 schema) from2To3, required Future Function(i1.Migrator m, Schema4 schema) from3To4, + required Future Function(i1.Migrator m, Schema5 schema) from4To5, }) => i0.VersionedSchema.stepByStepHelper( step: migrationSteps( from1To2: from1To2, from2To3: from2To3, from3To4: from3To4, + from4To5: from4To5, ), ); diff --git a/app/lib/features/bangs/data/database/definitions.drift b/app/lib/features/bangs/data/database/definitions.drift index 7422355d..e573e5f5 100644 --- a/app/lib/features/bangs/data/database/definitions.drift +++ b/app/lib/features/bangs/data/database/definitions.drift @@ -16,6 +16,7 @@ CREATE TABLE bang ( format TEXT MAPPED BY `const BangFormatConverter()`, additional_triggers TEXT MAPPED BY `const TriggerListConverter()`, searxng_api BOOL NOT NULL DEFAULT FALSE, + snap_domain TEXT, PRIMARY KEY ("trigger", "group") ) WITH Bang; diff --git a/app/lib/features/bangs/data/database/definitions.drift.dart b/app/lib/features/bangs/data/database/definitions.drift.dart index 2a429cd2..a92948cd 100644 --- a/app/lib/features/bangs/data/database/definitions.drift.dart +++ b/app/lib/features/bangs/data/database/definitions.drift.dart @@ -26,6 +26,7 @@ typedef $BangTableCreateCompanionBuilder = i0.Value?> format, i0.Value?> additionalTriggers, i0.Value searxngApi, + i0.Value snapDomain, i0.Value rowid, }); typedef $BangTableUpdateCompanionBuilder = @@ -40,6 +41,7 @@ typedef $BangTableUpdateCompanionBuilder = i0.Value?> format, i0.Value?> additionalTriggers, i0.Value searxngApi, + i0.Value snapDomain, i0.Value rowid, }); @@ -108,6 +110,11 @@ class $BangTableFilterComposer column: $table.searxngApi, builder: (column) => i0.ColumnFilters(column), ); + + i0.ColumnFilters get snapDomain => $composableBuilder( + column: $table.snapDomain, + builder: (column) => i0.ColumnFilters(column), + ); } class $BangTableOrderingComposer @@ -168,6 +175,11 @@ class $BangTableOrderingComposer column: $table.searxngApi, builder: (column) => i0.ColumnOrderings(column), ); + + i0.ColumnOrderings get snapDomain => $composableBuilder( + column: $table.snapDomain, + builder: (column) => i0.ColumnOrderings(column), + ); } class $BangTableAnnotationComposer @@ -219,6 +231,11 @@ class $BangTableAnnotationComposer column: $table.searxngApi, builder: (column) => column, ); + + i0.GeneratedColumn get snapDomain => $composableBuilder( + column: $table.snapDomain, + builder: (column) => column, + ); } class $BangTableTableManager @@ -263,6 +280,7 @@ class $BangTableTableManager i0.Value?> additionalTriggers = const i0.Value.absent(), i0.Value searxngApi = const i0.Value.absent(), + i0.Value snapDomain = const i0.Value.absent(), i0.Value rowid = const i0.Value.absent(), }) => i3.BangCompanion( trigger: trigger, @@ -275,6 +293,7 @@ class $BangTableTableManager format: format, additionalTriggers: additionalTriggers, searxngApi: searxngApi, + snapDomain: snapDomain, rowid: rowid, ), createCompanionCallback: @@ -290,6 +309,7 @@ class $BangTableTableManager i0.Value?> additionalTriggers = const i0.Value.absent(), i0.Value searxngApi = const i0.Value.absent(), + i0.Value snapDomain = const i0.Value.absent(), i0.Value rowid = const i0.Value.absent(), }) => i3.BangCompanion.insert( trigger: trigger, @@ -302,6 +322,7 @@ class $BangTableTableManager format: format, additionalTriggers: additionalTriggers, searxngApi: searxngApi, + snapDomain: snapDomain, rowid: rowid, ), withReferenceMapper: (p0) => p0 @@ -1394,6 +1415,14 @@ class BangTable extends i0.Table with i0.TableInfo { $customConstraints: 'NOT NULL DEFAULT FALSE', defaultValue: const i0.CustomExpression('FALSE'), ); + late final i0.GeneratedColumn snapDomain = i0.GeneratedColumn( + 'snap_domain', + aliasedName, + true, + type: i0.DriftSqlType.string, + requiredDuringInsert: false, + $customConstraints: '', + ); @override List get $columns => [ trigger, @@ -1406,6 +1435,7 @@ class BangTable extends i0.Table with i0.TableInfo { format, additionalTriggers, searxngApi, + snapDomain, ]; @override String get aliasedName => _alias ?? actualTableName; @@ -1464,6 +1494,10 @@ class BangTable extends i0.Table with i0.TableInfo { data['${effectivePrefix}additional_triggers'], ), ), + snapDomain: attachedDatabase.typeMapping.read( + i0.DriftSqlType.string, + data['${effectivePrefix}snap_domain'], + ), ); } @@ -1497,6 +1531,7 @@ class BangCompanion extends i0.UpdateCompanion { final i0.Value?> format; final i0.Value?> additionalTriggers; final i0.Value searxngApi; + final i0.Value snapDomain; final i0.Value rowid; const BangCompanion({ this.trigger = const i0.Value.absent(), @@ -1509,6 +1544,7 @@ class BangCompanion extends i0.UpdateCompanion { this.format = const i0.Value.absent(), this.additionalTriggers = const i0.Value.absent(), this.searxngApi = const i0.Value.absent(), + this.snapDomain = const i0.Value.absent(), this.rowid = const i0.Value.absent(), }); BangCompanion.insert({ @@ -1522,6 +1558,7 @@ class BangCompanion extends i0.UpdateCompanion { this.format = const i0.Value.absent(), this.additionalTriggers = const i0.Value.absent(), this.searxngApi = const i0.Value.absent(), + this.snapDomain = const i0.Value.absent(), this.rowid = const i0.Value.absent(), }) : trigger = i0.Value(trigger), group = i0.Value(group), @@ -1539,6 +1576,7 @@ class BangCompanion extends i0.UpdateCompanion { i0.Expression? format, i0.Expression? additionalTriggers, i0.Expression? searxngApi, + i0.Expression? snapDomain, i0.Expression? rowid, }) { return i0.RawValuesInsertable({ @@ -1552,6 +1590,7 @@ class BangCompanion extends i0.UpdateCompanion { if (format != null) 'format': format, if (additionalTriggers != null) 'additional_triggers': additionalTriggers, if (searxngApi != null) 'searxng_api': searxngApi, + if (snapDomain != null) 'snap_domain': snapDomain, if (rowid != null) 'rowid': rowid, }); } @@ -1567,6 +1606,7 @@ class BangCompanion extends i0.UpdateCompanion { i0.Value?>? format, i0.Value?>? additionalTriggers, i0.Value? searxngApi, + i0.Value? snapDomain, i0.Value? rowid, }) { return i3.BangCompanion( @@ -1580,6 +1620,7 @@ class BangCompanion extends i0.UpdateCompanion { format: format ?? this.format, additionalTriggers: additionalTriggers ?? this.additionalTriggers, searxngApi: searxngApi ?? this.searxngApi, + snapDomain: snapDomain ?? this.snapDomain, rowid: rowid ?? this.rowid, ); } @@ -1625,6 +1666,9 @@ class BangCompanion extends i0.UpdateCompanion { if (searxngApi.present) { map['searxng_api'] = i0.Variable(searxngApi.value); } + if (snapDomain.present) { + map['snap_domain'] = i0.Variable(snapDomain.value); + } if (rowid.present) { map['rowid'] = i0.Variable(rowid.value); } @@ -1644,6 +1688,7 @@ class BangCompanion extends i0.UpdateCompanion { ..write('format: $format, ') ..write('additionalTriggers: $additionalTriggers, ') ..write('searxngApi: $searxngApi, ') + ..write('snapDomain: $snapDomain, ') ..write('rowid: $rowid') ..write(')')) .toString(); @@ -3033,6 +3078,7 @@ class BangDataView extends i0.ViewInfo format, additionalTriggers, searxngApi, + snapDomain, frequency, lastUsed, ]; @@ -3097,6 +3143,10 @@ class BangDataView extends i0.ViewInfo data['${effectivePrefix}additional_triggers'], ), ), + snapDomain: attachedDatabase.typeMapping.read( + i0.DriftSqlType.string, + data['${effectivePrefix}snap_domain'], + ), frequency: attachedDatabase.typeMapping.read( i0.DriftSqlType.int, data['${effectivePrefix}frequency'], @@ -3177,6 +3227,12 @@ class BangDataView extends i0.ViewInfo 'CHECK ("searxng_api" IN (0, 1))', ), ); + late final i0.GeneratedColumn snapDomain = i0.GeneratedColumn( + 'snap_domain', + aliasedName, + true, + type: i0.DriftSqlType.string, + ); late final i0.GeneratedColumn frequency = i0.GeneratedColumn( 'frequency', aliasedName, @@ -3265,6 +3321,7 @@ class DefinitionsDrift extends i7.ModularAccessor { additionalTriggers: i3.BangTable.$converteradditionalTriggers.fromSql( row.readNullable('additional_triggers'), ), + snapDomain: row.readNullable('snap_domain'), frequency: row.readNullable('frequency'), lastUsed: row.readNullable('last_used'), ), @@ -3292,6 +3349,7 @@ class DefinitionsDrift extends i7.ModularAccessor { additionalTriggers: i3.BangTable.$converteradditionalTriggers.fromSql( row.readNullable('additional_triggers'), ), + snapDomain: row.readNullable('snap_domain'), frequency: row.readNullable('frequency'), lastUsed: row.readNullable('last_used'), ), diff --git a/app/lib/features/bangs/data/models/bang.dart b/app/lib/features/bangs/data/models/bang.dart index 87f4ec3a..835a69e7 100644 --- a/app/lib/features/bangs/data/models/bang.dart +++ b/app/lib/features/bangs/data/models/bang.dart @@ -21,6 +21,7 @@ import 'package:copy_with_extension/copy_with_extension.dart'; import 'package:drift/drift.dart' show Expression, Insertable, Value; import 'package:fast_equatable/fast_equatable.dart'; import 'package:json_annotation/json_annotation.dart'; +import 'package:nullability/nullability.dart'; import 'package:weblibre/extensions/uri.dart'; import 'package:weblibre/features/bangs/data/database/definitions.drift.dart'; import 'package:weblibre/features/bangs/data/models/bang_group.dart'; @@ -42,6 +43,10 @@ enum BangFormat { ///with one or the other. @JsonValue('url_encode_space_to_plus') urlEncodeSpaceToPlus, + + ///When the bang is invoked with no query, open the snap domain (ad) instead of any path given in the template + @JsonValue('open_snap_domain') + openSnapDomain, } @JsonSerializable() @@ -84,6 +89,10 @@ class Bang with FastEquatable implements Insertable { @JsonKey(name: 'ts') final Set? additionalTriggers; + ///Additional triggers that invoke this bang + @JsonKey(name: 'ad') + final String? snapDomain; + @JsonKey(defaultValue: false) final bool searxngApi; @@ -102,8 +111,16 @@ class Bang with FastEquatable implements Insertable { } Uri getTemplateUrl(String? query) { - final url = (query != null) - ? urlTemplate.replaceAll(_templateQueryPlaceholder, formatQuery(query)) + final queryEmpty = query.isEmpty; + + if (queryEmpty && format?.contains(BangFormat.openSnapDomain) == true) { + if (snapDomain.isNotEmpty) { + return Uri.parse(snapDomain!); + } + } + + final url = (!queryEmpty) + ? urlTemplate.replaceAll(_templateQueryPlaceholder, formatQuery(query!)) : urlTemplate; var template = Uri.parse(url); @@ -113,8 +130,8 @@ class Bang with FastEquatable implements Insertable { ).replace(path: template.path, query: template.query); } - if (format?.contains(BangFormat.openBasePath) == true) { - return template.base; + if (queryEmpty && format?.contains(BangFormat.openBasePath) == true) { + template = template.base; } return template; @@ -139,6 +156,7 @@ class Bang with FastEquatable implements Insertable { this.subCategory, this.format, this.additionalTriggers, + this.snapDomain, }); factory Bang.fromJson(Map json) => _$BangFromJson(json); @@ -156,6 +174,7 @@ class Bang with FastEquatable implements Insertable { subCategory, format, additionalTriggers, + snapDomain, searxngApi, ]; @@ -171,6 +190,7 @@ class Bang with FastEquatable implements Insertable { subCategory: Value.absentIfNull(subCategory), format: Value.absentIfNull(format), additionalTriggers: Value.absentIfNull(additionalTriggers), + snapDomain: Value.absentIfNull(snapDomain), ).toColumns(nullToAbsent); } } diff --git a/app/lib/features/bangs/data/models/bang.g.dart b/app/lib/features/bangs/data/models/bang.g.dart index 83f8eb29..9b831cec 100644 --- a/app/lib/features/bangs/data/models/bang.g.dart +++ b/app/lib/features/bangs/data/models/bang.g.dart @@ -27,6 +27,8 @@ abstract class _$BangCWProxy { Bang additionalTriggers(Set? additionalTriggers); + Bang snapDomain(String? snapDomain); + /// Creates a new instance with the provided field values. /// Passing `null` to a nullable field nullifies it, while `null` for a non-nullable field is ignored. To update a single field use `Bang(...).copyWith.fieldName(value)`. /// @@ -45,6 +47,7 @@ abstract class _$BangCWProxy { String? subCategory, Set? format, Set? additionalTriggers, + String? snapDomain, }); } @@ -86,6 +89,9 @@ class _$BangCWProxyImpl implements _$BangCWProxy { Bang additionalTriggers(Set? additionalTriggers) => call(additionalTriggers: additionalTriggers); + @override + Bang snapDomain(String? snapDomain) => call(snapDomain: snapDomain); + @override /// Creates a new instance with the provided field values. /// Passing `null` to a nullable field nullifies it, while `null` for a non-nullable field is ignored. To update a single field use `Bang(...).copyWith.fieldName(value)`. @@ -105,6 +111,7 @@ class _$BangCWProxyImpl implements _$BangCWProxy { Object? subCategory = const $CopyWithPlaceholder(), Object? format = const $CopyWithPlaceholder(), Object? additionalTriggers = const $CopyWithPlaceholder(), + Object? snapDomain = const $CopyWithPlaceholder(), }) { return Bang( websiteName: @@ -150,6 +157,10 @@ class _$BangCWProxyImpl implements _$BangCWProxy { ? _value.additionalTriggers // ignore: cast_nullable_to_non_nullable : additionalTriggers as Set?, + snapDomain: snapDomain == const $CopyWithPlaceholder() + ? _value.snapDomain + // ignore: cast_nullable_to_non_nullable + : snapDomain as String?, ); } } @@ -179,6 +190,7 @@ Bang _$BangFromJson(Map json) => Bang( additionalTriggers: (json['ts'] as List?) ?.map((e) => e as String) .toSet(), + snapDomain: json['ad'] as String?, ); Map _$BangToJson(Bang instance) => { @@ -190,6 +202,7 @@ Map _$BangToJson(Bang instance) => { 'sc': instance.subCategory, 'fmt': instance.format?.map((e) => _$BangFormatEnumMap[e]!).toList(), 'ts': instance.additionalTriggers?.toList(), + 'ad': instance.snapDomain, 'searxngApi': instance.searxngApi, }; @@ -197,4 +210,5 @@ const _$BangFormatEnumMap = { BangFormat.openBasePath: 'open_base_path', BangFormat.urlEncodePlaceholder: 'url_encode_placeholder', BangFormat.urlEncodeSpaceToPlus: 'url_encode_space_to_plus', + BangFormat.openSnapDomain: 'open_snap_domain', }; diff --git a/app/lib/features/bangs/data/models/bang_data.dart b/app/lib/features/bangs/data/models/bang_data.dart index 85b53def..70b8f591 100644 --- a/app/lib/features/bangs/data/models/bang_data.dart +++ b/app/lib/features/bangs/data/models/bang_data.dart @@ -46,6 +46,7 @@ class BangData extends Bang { super.subCategory, super.format, super.additionalTriggers, + super.snapDomain, int? frequency, this.lastUsed, this.icon, @@ -62,6 +63,7 @@ class BangData extends Bang { super.subCategory, super.format, super.additionalTriggers, + super.snapDomain, int? frequency, this.lastUsed, this.icon, diff --git a/app/lib/features/bangs/data/models/bang_data.g.dart b/app/lib/features/bangs/data/models/bang_data.g.dart index 67a76e05..755023d5 100644 --- a/app/lib/features/bangs/data/models/bang_data.g.dart +++ b/app/lib/features/bangs/data/models/bang_data.g.dart @@ -25,6 +25,8 @@ abstract class _$BangDataCWProxy { BangData additionalTriggers(Set? additionalTriggers); + BangData snapDomain(String? snapDomain); + BangData frequency(int? frequency); BangData lastUsed(DateTime? lastUsed); @@ -48,6 +50,7 @@ abstract class _$BangDataCWProxy { String? subCategory, Set? format, Set? additionalTriggers, + String? snapDomain, int? frequency, DateTime? lastUsed, BrowserIcon? icon, @@ -89,6 +92,9 @@ class _$BangDataCWProxyImpl implements _$BangDataCWProxy { BangData additionalTriggers(Set? additionalTriggers) => call(additionalTriggers: additionalTriggers); + @override + BangData snapDomain(String? snapDomain) => call(snapDomain: snapDomain); + @override BangData frequency(int? frequency) => call(frequency: frequency); @@ -116,6 +122,7 @@ class _$BangDataCWProxyImpl implements _$BangDataCWProxy { Object? subCategory = const $CopyWithPlaceholder(), Object? format = const $CopyWithPlaceholder(), Object? additionalTriggers = const $CopyWithPlaceholder(), + Object? snapDomain = const $CopyWithPlaceholder(), Object? frequency = const $CopyWithPlaceholder(), Object? lastUsed = const $CopyWithPlaceholder(), Object? icon = const $CopyWithPlaceholder(), @@ -160,6 +167,10 @@ class _$BangDataCWProxyImpl implements _$BangDataCWProxy { ? _value.additionalTriggers // ignore: cast_nullable_to_non_nullable : additionalTriggers as Set?, + snapDomain: snapDomain == const $CopyWithPlaceholder() + ? _value.snapDomain + // ignore: cast_nullable_to_non_nullable + : snapDomain as String?, frequency: frequency == const $CopyWithPlaceholder() ? _value.frequency // ignore: cast_nullable_to_non_nullable diff --git a/app/lib/features/bangs/data/models/bang_group.dart b/app/lib/features/bangs/data/models/bang_group.dart index f2268889..81b829f4 100644 --- a/app/lib/features/bangs/data/models/bang_group.dart +++ b/app/lib/features/bangs/data/models/bang_group.dart @@ -23,11 +23,6 @@ enum BangGroup { 'https://raw.githubusercontent.com/FaFre/bangs/main/data/bangs.json', bundled: 'assets/bangs/bangs.json', ), - assistant( - remote: - 'https://raw.githubusercontent.com/FaFre/bangs/main/data/assistant_bangs.json', - bundled: 'assets/bangs/assistant_bangs.json', - ), kagi( remote: 'https://raw.githubusercontent.com/FaFre/bangs/main/data/kagi_bangs.json', diff --git a/app/lib/features/bangs/data/models/bang_key.dart b/app/lib/features/bangs/data/models/bang_key.dart index 24990ff9..f44d205c 100644 --- a/app/lib/features/bangs/data/models/bang_key.dart +++ b/app/lib/features/bangs/data/models/bang_key.dart @@ -46,7 +46,13 @@ class BangKey { static BangKey? tryFromString(String key) { try { - final [group, trigger] = key.split('::'); + var [group, trigger] = key.split('::'); + + //Migrate to schema v5 + if (group == 'assistant') { + group = BangGroup.kagi.name; + } + return BangKey( group: BangGroup.values.firstWhere((g) => g.name == group), trigger: trigger, diff --git a/app/lib/features/bangs/presentation/screens/edit.dart b/app/lib/features/bangs/presentation/screens/edit.dart index aec6d7a6..b4aa0df2 100644 --- a/app/lib/features/bangs/presentation/screens/edit.dart +++ b/app/lib/features/bangs/presentation/screens/edit.dart @@ -107,6 +107,7 @@ class EditBangScreen extends HookConsumerWidget { category: category.value, subCategory: subCategory.value, additionalTriggers: initialBang?.additionalTriggers, + snapDomain: initialBang?.snapDomain, format: formatFlags.value.isNotEmpty ? formatFlags.value : null, diff --git a/app/lib/features/settings/presentation/screens/bang_settings.dart b/app/lib/features/settings/presentation/screens/bang_settings.dart index fef4e8d8..a6025893 100644 --- a/app/lib/features/settings/presentation/screens/bang_settings.dart +++ b/app/lib/features/settings/presentation/screens/bang_settings.dart @@ -59,11 +59,6 @@ class BangSettingsScreen extends HookConsumerWidget { title: 'General Bangs', subtitle: 'Sync on demand from GitHub', ), - const BangGroupListTile( - group: BangGroup.assistant, - title: 'Assistant Bangs', - subtitle: 'Sync on-demand from GitHub', - ), const BangGroupListTile( group: BangGroup.kagi, title: 'Kagi Bangs', diff --git a/app/test/drift/bangs/generated/schema.dart b/app/test/drift/bangs/generated/schema.dart index 0c4b8fa4..9dccfb29 100644 --- a/app/test/drift/bangs/generated/schema.dart +++ b/app/test/drift/bangs/generated/schema.dart @@ -8,6 +8,7 @@ import 'schema_v1.dart' as v1; import 'schema_v2.dart' as v2; import 'schema_v3.dart' as v3; import 'schema_v4.dart' as v4; +import 'schema_v5.dart' as v5; class GeneratedHelper implements SchemaInstantiationHelper { @override @@ -21,10 +22,12 @@ class GeneratedHelper implements SchemaInstantiationHelper { return v3.DatabaseAtV3(db); case 4: return v4.DatabaseAtV4(db); + case 5: + return v5.DatabaseAtV5(db); default: throw MissingSchemaException(version, versions); } } - static const versions = const [1, 2, 3, 4]; + static const versions = const [1, 2, 3, 4, 5]; } diff --git a/app/test/drift/bangs/generated/schema_v5.dart b/app/test/drift/bangs/generated/schema_v5.dart new file mode 100644 index 00000000..4e8b52f7 --- /dev/null +++ b/app/test/drift/bangs/generated/schema_v5.dart @@ -0,0 +1,2326 @@ +// dart format width=80 +// GENERATED BY drift_dev, DO NOT MODIFY. +// ignore_for_file: type=lint,unused_import +// +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: '', + ); + late final GeneratedColumn additionalTriggers = + GeneratedColumn( + 'additional_triggers', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + $customConstraints: '', + ); + late final GeneratedColumn searxngApi = GeneratedColumn( + 'searxng_api', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + $customConstraints: 'NOT NULL DEFAULT FALSE', + defaultValue: const CustomExpression('FALSE'), + ); + late final GeneratedColumn snapDomain = GeneratedColumn( + 'snap_domain', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + $customConstraints: '', + ); + @override + List get $columns => [ + trigger, + group, + websiteName, + domain, + urlTemplate, + category, + subCategory, + format, + additionalTriggers, + searxngApi, + snapDomain, + ]; + @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'], + ), + additionalTriggers: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}additional_triggers'], + ), + searxngApi: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}searxng_api'], + )!, + snapDomain: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}snap_domain'], + ), + ); + } + + @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; + final String? additionalTriggers; + final int searxngApi; + final String? snapDomain; + const BangData({ + required this.trigger, + required this.group, + required this.websiteName, + required this.domain, + required this.urlTemplate, + this.category, + this.subCategory, + this.format, + this.additionalTriggers, + required this.searxngApi, + this.snapDomain, + }); + @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); + } + if (!nullToAbsent || additionalTriggers != null) { + map['additional_triggers'] = Variable(additionalTriggers); + } + map['searxng_api'] = Variable(searxngApi); + if (!nullToAbsent || snapDomain != null) { + map['snap_domain'] = Variable(snapDomain); + } + 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']), + additionalTriggers: serializer.fromJson( + json['additionalTriggers'], + ), + searxngApi: serializer.fromJson(json['searxngApi']), + snapDomain: serializer.fromJson(json['snapDomain']), + ); + } + @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), + 'additionalTriggers': serializer.toJson(additionalTriggers), + 'searxngApi': serializer.toJson(searxngApi), + 'snapDomain': serializer.toJson(snapDomain), + }; + } + + 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(), + Value additionalTriggers = const Value.absent(), + int? searxngApi, + Value snapDomain = 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, + additionalTriggers: additionalTriggers.present + ? additionalTriggers.value + : this.additionalTriggers, + searxngApi: searxngApi ?? this.searxngApi, + snapDomain: snapDomain.present ? snapDomain.value : this.snapDomain, + ); + 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, + additionalTriggers: data.additionalTriggers.present + ? data.additionalTriggers.value + : this.additionalTriggers, + searxngApi: data.searxngApi.present + ? data.searxngApi.value + : this.searxngApi, + snapDomain: data.snapDomain.present + ? data.snapDomain.value + : this.snapDomain, + ); + } + + @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('additionalTriggers: $additionalTriggers, ') + ..write('searxngApi: $searxngApi, ') + ..write('snapDomain: $snapDomain') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + trigger, + group, + websiteName, + domain, + urlTemplate, + category, + subCategory, + format, + additionalTriggers, + searxngApi, + snapDomain, + ); + @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 && + other.additionalTriggers == this.additionalTriggers && + other.searxngApi == this.searxngApi && + other.snapDomain == this.snapDomain); +} + +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 additionalTriggers; + final Value searxngApi; + final Value snapDomain; + 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.additionalTriggers = const Value.absent(), + this.searxngApi = const Value.absent(), + this.snapDomain = 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.additionalTriggers = const Value.absent(), + this.searxngApi = const Value.absent(), + this.snapDomain = 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? additionalTriggers, + Expression? searxngApi, + Expression? snapDomain, + 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 (additionalTriggers != null) 'additional_triggers': additionalTriggers, + if (searxngApi != null) 'searxng_api': searxngApi, + if (snapDomain != null) 'snap_domain': snapDomain, + if (rowid != null) 'rowid': rowid, + }); + } + + BangCompanion copyWith({ + Value? trigger, + Value? group, + Value? websiteName, + Value? domain, + Value? urlTemplate, + Value? category, + Value? subCategory, + Value? format, + Value? additionalTriggers, + Value? searxngApi, + Value? snapDomain, + 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, + additionalTriggers: additionalTriggers ?? this.additionalTriggers, + searxngApi: searxngApi ?? this.searxngApi, + snapDomain: snapDomain ?? this.snapDomain, + 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 (additionalTriggers.present) { + map['additional_triggers'] = Variable(additionalTriggers.value); + } + if (searxngApi.present) { + map['searxng_api'] = Variable(searxngApi.value); + } + if (snapDomain.present) { + map['snap_domain'] = Variable(snapDomain.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('additionalTriggers: $additionalTriggers, ') + ..write('searxngApi: $searxngApi, ') + ..write('snapDomain: $snapDomain, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class BangTriggers extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + BangTriggers(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 additionalTrigger = + GeneratedColumn( + 'additional_trigger', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + @override + List get $columns => [trigger, group, additionalTrigger]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'bang_triggers'; + @override + Set get $primaryKey => {trigger, group, additionalTrigger}; + @override + BangTriggersData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangTriggersData( + trigger: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}trigger'], + )!, + group: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}group'], + )!, + additionalTrigger: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}additional_trigger'], + )!, + ); + } + + @override + BangTriggers createAlias(String alias) { + return BangTriggers(attachedDatabase, alias); + } + + @override + List get customConstraints => const [ + 'PRIMARY KEY("trigger", "group", additional_trigger)', + 'FOREIGN KEY("trigger", "group")REFERENCES bang("trigger", "group")ON DELETE CASCADE', + ]; + @override + bool get dontWriteConstraints => true; +} + +class BangTriggersData extends DataClass + implements Insertable { + final String trigger; + final int group; + final String additionalTrigger; + const BangTriggersData({ + required this.trigger, + required this.group, + required this.additionalTrigger, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['trigger'] = Variable(trigger); + map['group'] = Variable(group); + map['additional_trigger'] = Variable(additionalTrigger); + return map; + } + + factory BangTriggersData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangTriggersData( + trigger: serializer.fromJson(json['trigger']), + group: serializer.fromJson(json['group']), + additionalTrigger: serializer.fromJson(json['additionalTrigger']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'trigger': serializer.toJson(trigger), + 'group': serializer.toJson(group), + 'additionalTrigger': serializer.toJson(additionalTrigger), + }; + } + + BangTriggersData copyWith({ + String? trigger, + int? group, + String? additionalTrigger, + }) => BangTriggersData( + trigger: trigger ?? this.trigger, + group: group ?? this.group, + additionalTrigger: additionalTrigger ?? this.additionalTrigger, + ); + BangTriggersData copyWithCompanion(BangTriggersCompanion data) { + return BangTriggersData( + trigger: data.trigger.present ? data.trigger.value : this.trigger, + group: data.group.present ? data.group.value : this.group, + additionalTrigger: data.additionalTrigger.present + ? data.additionalTrigger.value + : this.additionalTrigger, + ); + } + + @override + String toString() { + return (StringBuffer('BangTriggersData(') + ..write('trigger: $trigger, ') + ..write('group: $group, ') + ..write('additionalTrigger: $additionalTrigger') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(trigger, group, additionalTrigger); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangTriggersData && + other.trigger == this.trigger && + other.group == this.group && + other.additionalTrigger == this.additionalTrigger); +} + +class BangTriggersCompanion extends UpdateCompanion { + final Value trigger; + final Value group; + final Value additionalTrigger; + final Value rowid; + const BangTriggersCompanion({ + this.trigger = const Value.absent(), + this.group = const Value.absent(), + this.additionalTrigger = const Value.absent(), + this.rowid = const Value.absent(), + }); + BangTriggersCompanion.insert({ + required String trigger, + required int group, + required String additionalTrigger, + this.rowid = const Value.absent(), + }) : trigger = Value(trigger), + group = Value(group), + additionalTrigger = Value(additionalTrigger); + static Insertable custom({ + Expression? trigger, + Expression? group, + Expression? additionalTrigger, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (trigger != null) 'trigger': trigger, + if (group != null) 'group': group, + if (additionalTrigger != null) 'additional_trigger': additionalTrigger, + if (rowid != null) 'rowid': rowid, + }); + } + + BangTriggersCompanion copyWith({ + Value? trigger, + Value? group, + Value? additionalTrigger, + Value? rowid, + }) { + return BangTriggersCompanion( + trigger: trigger ?? this.trigger, + group: group ?? this.group, + additionalTrigger: additionalTrigger ?? this.additionalTrigger, + 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 (additionalTrigger.present) { + map['additional_trigger'] = Variable(additionalTrigger.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BangTriggersCompanion(') + ..write('trigger: $trigger, ') + ..write('group: $group, ') + ..write('additionalTrigger: $additionalTrigger, ') + ..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.int, + 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.int, + 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 int 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, int? 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 int 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.int, + 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.int, + 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 int 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, + int? 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 int 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.int, + 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.int, + 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")ON DELETE CASCADE', + ]; + @override + bool get dontWriteConstraints => true; +} + +class BangHistoryData extends DataClass implements Insertable { + final String searchQuery; + final String trigger; + final int group; + final int 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, + int? 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 int 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, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + $customConstraints: '', + ); + late final GeneratedColumn websiteName = GeneratedColumn( + 'website_name', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + $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 + bool get dontWriteConstraints => true; + @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({this.trigger, this.websiteName}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (!nullToAbsent || trigger != null) { + map['trigger'] = Variable(trigger); + } + if (!nullToAbsent || websiteName != null) { + 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({ + Value trigger = const Value.absent(), + Value websiteName = const Value.absent(), + }) => BangFtsData( + trigger: trigger.present ? trigger.value : this.trigger, + websiteName: websiteName.present ? websiteName.value : 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({ + this.trigger = const Value.absent(), + this.websiteName = const Value.absent(), + this.rowid = const Value.absent(), + }); + 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 BangTriggersFts extends Table + with + TableInfo, + VirtualTableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + BangTriggersFts(this.attachedDatabase, [this._alias]); + late final GeneratedColumn additionalTrigger = + GeneratedColumn( + 'additional_trigger', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + $customConstraints: '', + ); + @override + List get $columns => [additionalTrigger]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'bang_triggers_fts'; + @override + Set get $primaryKey => const {}; + @override + BangTriggersFtsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangTriggersFtsData( + additionalTrigger: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}additional_trigger'], + ), + ); + } + + @override + BangTriggersFts createAlias(String alias) { + return BangTriggersFts(attachedDatabase, alias); + } + + @override + bool get dontWriteConstraints => true; + @override + String get moduleAndArgs => + 'fts5(additional_trigger, content=bang_triggers, prefix=\'2 3\')'; +} + +class BangTriggersFtsData extends DataClass + implements Insertable { + final String? additionalTrigger; + const BangTriggersFtsData({this.additionalTrigger}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (!nullToAbsent || additionalTrigger != null) { + map['additional_trigger'] = Variable(additionalTrigger); + } + return map; + } + + factory BangTriggersFtsData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangTriggersFtsData( + additionalTrigger: serializer.fromJson( + json['additionalTrigger'], + ), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'additionalTrigger': serializer.toJson(additionalTrigger), + }; + } + + BangTriggersFtsData copyWith({ + Value additionalTrigger = const Value.absent(), + }) => BangTriggersFtsData( + additionalTrigger: additionalTrigger.present + ? additionalTrigger.value + : this.additionalTrigger, + ); + BangTriggersFtsData copyWithCompanion(BangTriggersFtsCompanion data) { + return BangTriggersFtsData( + additionalTrigger: data.additionalTrigger.present + ? data.additionalTrigger.value + : this.additionalTrigger, + ); + } + + @override + String toString() { + return (StringBuffer('BangTriggersFtsData(') + ..write('additionalTrigger: $additionalTrigger') + ..write(')')) + .toString(); + } + + @override + int get hashCode => additionalTrigger.hashCode; + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangTriggersFtsData && + other.additionalTrigger == this.additionalTrigger); +} + +class BangTriggersFtsCompanion extends UpdateCompanion { + final Value additionalTrigger; + final Value rowid; + const BangTriggersFtsCompanion({ + this.additionalTrigger = const Value.absent(), + this.rowid = const Value.absent(), + }); + BangTriggersFtsCompanion.insert({ + this.additionalTrigger = const Value.absent(), + this.rowid = const Value.absent(), + }); + static Insertable custom({ + Expression? additionalTrigger, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (additionalTrigger != null) 'additional_trigger': additionalTrigger, + if (rowid != null) 'rowid': rowid, + }); + } + + BangTriggersFtsCompanion copyWith({ + Value? additionalTrigger, + Value? rowid, + }) { + return BangTriggersFtsCompanion( + additionalTrigger: additionalTrigger ?? this.additionalTrigger, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (additionalTrigger.present) { + map['additional_trigger'] = Variable(additionalTrigger.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BangTriggersFtsCompanion(') + ..write('additionalTrigger: $additionalTrigger, ') + ..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 String? additionalTriggers; + final int searxngApi; + final String? snapDomain; + final int? frequency; + final int? 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.additionalTriggers, + required this.searxngApi, + this.snapDomain, + 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']), + additionalTriggers: serializer.fromJson( + json['additionalTriggers'], + ), + searxngApi: serializer.fromJson(json['searxngApi']), + snapDomain: serializer.fromJson(json['snapDomain']), + 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), + 'additionalTriggers': serializer.toJson(additionalTriggers), + 'searxngApi': serializer.toJson(searxngApi), + 'snapDomain': serializer.toJson(snapDomain), + '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 additionalTriggers = const Value.absent(), + int? searxngApi, + Value snapDomain = 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, + additionalTriggers: additionalTriggers.present + ? additionalTriggers.value + : this.additionalTriggers, + searxngApi: searxngApi ?? this.searxngApi, + snapDomain: snapDomain.present ? snapDomain.value : this.snapDomain, + 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('additionalTriggers: $additionalTriggers, ') + ..write('searxngApi: $searxngApi, ') + ..write('snapDomain: $snapDomain, ') + ..write('frequency: $frequency, ') + ..write('lastUsed: $lastUsed') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + trigger, + group, + websiteName, + domain, + urlTemplate, + category, + subCategory, + format, + additionalTriggers, + searxngApi, + snapDomain, + 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.additionalTriggers == this.additionalTriggers && + other.searxngApi == this.searxngApi && + other.snapDomain == this.snapDomain && + other.frequency == this.frequency && + other.lastUsed == this.lastUsed); +} + +class BangDataView extends ViewInfo + implements HasResultSet { + final String? _alias; + @override + final DatabaseAtV5 attachedDatabase; + BangDataView(this.attachedDatabase, [this._alias]); + @override + List get $columns => [ + trigger, + group, + websiteName, + domain, + urlTemplate, + category, + subCategory, + format, + additionalTriggers, + searxngApi, + snapDomain, + 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'], + ), + additionalTriggers: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}additional_triggers'], + ), + searxngApi: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}searxng_api'], + )!, + snapDomain: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}snap_domain'], + ), + frequency: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}frequency'], + ), + lastUsed: attachedDatabase.typeMapping.read( + DriftSqlType.int, + 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 additionalTriggers = + GeneratedColumn( + 'additional_triggers', + aliasedName, + true, + type: DriftSqlType.string, + ); + late final GeneratedColumn searxngApi = GeneratedColumn( + 'searxng_api', + aliasedName, + false, + type: DriftSqlType.int, + ); + late final GeneratedColumn snapDomain = GeneratedColumn( + 'snap_domain', + 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.int, + ); + @override + BangDataView createAlias(String alias) { + return BangDataView(attachedDatabase, alias); + } + + @override + Query? get query => null; + @override + Set get readTables => const {'bang', 'bang_frequency'}; +} + +class DatabaseAtV5 extends GeneratedDatabase { + DatabaseAtV5(QueryExecutor e) : super(e); + late final Bang bang = Bang(this); + late final BangTriggers bangTriggers = BangTriggers(this); + late final Index idxBangTriggersLookup = Index( + 'idx_bang_triggers_lookup', + 'CREATE INDEX idx_bang_triggers_lookup ON bang_triggers (additional_trigger, "group")', + ); + late final Trigger bangTriggersAfterInsert = Trigger( + 'CREATE TRIGGER bang_triggers_after_insert AFTER INSERT ON bang WHEN new.additional_triggers IS NOT NULL BEGIN INSERT INTO bang_triggers ("trigger", "group", additional_trigger) SELECT new."trigger", new."group", json_each.value FROM json_each(new.additional_triggers);END', + 'bang_triggers_after_insert', + ); + late final Trigger bangTriggersAfterUpdate = Trigger( + 'CREATE TRIGGER bang_triggers_after_update AFTER UPDATE ON bang BEGIN DELETE FROM bang_triggers WHERE "trigger" = old."trigger" AND "group" = old."group";INSERT INTO bang_triggers ("trigger", "group", additional_trigger) SELECT new."trigger", new."group", json_each.value FROM json_each(new.additional_triggers)WHERE new.additional_triggers IS NOT NULL;END', + 'bang_triggers_after_update', + ); + 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 BangTriggersFts bangTriggersFts = BangTriggersFts(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', + ); + late final Trigger bangTriggersAfterInsertFts = Trigger( + 'CREATE TRIGGER bang_triggers_after_insert_fts AFTER INSERT ON bang_triggers BEGIN INSERT INTO bang_triggers_fts ("rowid", additional_trigger) VALUES (new."rowid", new.additional_trigger);END', + 'bang_triggers_after_insert_fts', + ); + late final Trigger bangTriggersAfterDeleteFts = Trigger( + 'CREATE TRIGGER bang_triggers_after_delete_fts AFTER DELETE ON bang_triggers BEGIN INSERT INTO bang_triggers_fts (bang_triggers_fts, "rowid", additional_trigger) VALUES (\'delete\', old."rowid", old.additional_trigger);END', + 'bang_triggers_after_delete_fts', + ); + late final Trigger bangTriggersAfterUpdateFts = Trigger( + 'CREATE TRIGGER bang_triggers_after_update_fts AFTER UPDATE ON bang_triggers BEGIN INSERT INTO bang_triggers_fts (bang_triggers_fts, "rowid", additional_trigger) VALUES (\'delete\', old."rowid", old.additional_trigger);INSERT INTO bang_triggers_fts ("rowid", additional_trigger) VALUES (new."rowid", new.additional_trigger);END', + 'bang_triggers_after_update_fts', + ); + @override + Iterable> get allTables => + allSchemaEntities.whereType>(); + @override + List get allSchemaEntities => [ + bang, + bangTriggers, + idxBangTriggersLookup, + bangTriggersAfterInsert, + bangTriggersAfterUpdate, + bangSync, + bangFrequency, + bangHistory, + bangFts, + bangTriggersFts, + bangDataView, + bangAfterInsert, + bangAfterDelete, + bangAfterUpdate, + bangTriggersAfterInsertFts, + bangTriggersAfterDeleteFts, + bangTriggersAfterUpdateFts, + ]; + @override + StreamQueryUpdateRules get streamUpdateRules => const StreamQueryUpdateRules([ + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('bang_triggers', kind: UpdateKind.delete)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang', + limitUpdateKind: UpdateKind.insert, + ), + result: [TableUpdate('bang_triggers', kind: UpdateKind.insert)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang', + limitUpdateKind: UpdateKind.update, + ), + result: [ + TableUpdate('bang_triggers', kind: UpdateKind.delete), + TableUpdate('bang_triggers', kind: UpdateKind.insert), + ], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('bang_frequency', kind: UpdateKind.delete)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('bang_history', kind: UpdateKind.delete)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang', + limitUpdateKind: UpdateKind.insert, + ), + result: [TableUpdate('bang_fts', kind: UpdateKind.insert)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('bang_fts', kind: UpdateKind.insert)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang', + limitUpdateKind: UpdateKind.update, + ), + result: [TableUpdate('bang_fts', kind: UpdateKind.insert)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang_triggers', + limitUpdateKind: UpdateKind.insert, + ), + result: [TableUpdate('bang_triggers_fts', kind: UpdateKind.insert)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang_triggers', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('bang_triggers_fts', kind: UpdateKind.insert)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang_triggers', + limitUpdateKind: UpdateKind.update, + ), + result: [TableUpdate('bang_triggers_fts', kind: UpdateKind.insert)], + ), + ]); + @override + int get schemaVersion => 5; +} diff --git a/scripts/update-assets.sh b/scripts/update-assets.sh index ac5e9330..fa761dcb 100755 --- a/scripts/update-assets.sh +++ b/scripts/update-assets.sh @@ -60,8 +60,6 @@ update_bangs() { fetch "https://raw.githubusercontent.com/FaFre/bangs/main/data/bangs.json" \ "$dir/bangs.json" - fetch "https://raw.githubusercontent.com/FaFre/bangs/main/data/assistant_bangs.json" \ - "$dir/assistant_bangs.json" fetch "https://raw.githubusercontent.com/FaFre/bangs/main/data/kagi_bangs.json" \ "$dir/kagi_bangs.json" fetch "https://raw.githubusercontent.com/FaFre/bangs/refs/heads/custom/data/custom.json" \