diff --git a/.air.toml b/.air.toml index 04a210d..8e51803 100644 --- a/.air.toml +++ b/.air.toml @@ -5,7 +5,7 @@ tmp_dir = "tmp" [build] args_bin = [] full_bin = "./tmp/musenalm --dir ./pb_data serve" -cmd = "go build -tags=\"dev,fts5\" -o ./tmp/musenalm ." +cmd = "go build -tags=dev,fts5 -o ./tmp/musenalm ." delay = 400 exclude_dir = [ "views/assets", diff --git a/dbmodels/dbdata.go b/dbmodels/dbdata.go index a4fe777..0f06592 100644 --- a/dbmodels/dbdata.go +++ b/dbmodels/dbdata.go @@ -4,6 +4,84 @@ import "github.com/pocketbase/pocketbase/tools/types" var EDITORSTATE_VALUES = []string{"Unknown", "ToDo", "Seen", "Partially Edited", "Waiting", "Review", "Edited"} +var SERIES_FTS5_FIELDS = []string{ + SERIES_TITLE_FIELD, + SERIES_PSEUDONYMS_FIELD, + ANNOTATION_FIELD, + COMMENT_FIELD, +} + +var AGENTS_FTS5_FIELDS = []string{ + AGENTS_NAME_FIELD, + AGENTS_BIOGRAPHICAL_DATA_FIELD, + AGENTS_PSEUDONYMS_FIELD, + ANNOTATION_FIELD, + COMMENT_FIELD, +} + +var PLACES_FTS5_FIELDS = []string{ + PLACES_NAME_FIELD, + PLACES_PSEUDONYMS_FIELD, + URI_FIELD, + ANNOTATION_FIELD, + COMMENT_FIELD, +} + +var ITEMS_FTS5_FIELDS = []string{ + ITEMS_LOCATION_FIELD, + ITEMS_OWNER_FIELD, + ITEMS_MEDIA_FIELD, + ITEMS_CONDITION_FIELD, + ITEMS_IDENTIFIER_FIELD, + URI_FIELD, + ANNOTATION_FIELD, + COMMENT_FIELD, +} + +var ENTRIES_FTS5_FIELDS = []string{ + PREFERRED_TITLE_FIELD, + VARIANT_TITLE_FIELD, + PARALLEL_TITLE_FIELD, + TITLE_STMT_FIELD, + SUBTITLE_STMT_FIELD, + INCIPIT_STMT_FIELD, + RESPONSIBILITY_STMT_FIELD, + PUBLICATION_STMT_FIELD, + PLACE_STMT_FIELD, + EDITION_FIELD, + YEAR_FIELD, + EXTENT_FIELD, + DIMENSIONS_FIELD, + REFERENCES_FIELD, + PLACES_TABLE, + AGENTS_TABLE, + SERIES_TABLE, + MUSENALMID_FIELD, + ANNOTATION_FIELD, + COMMENT_FIELD, +} + +var CONTENTS_FTS5_FIELDS = []string{ + PREFERRED_TITLE_FIELD, + VARIANT_TITLE_FIELD, + PARALLEL_TITLE_FIELD, + TITLE_STMT_FIELD, + SUBTITLE_STMT_FIELD, + INCIPIT_STMT_FIELD, + RESPONSIBILITY_STMT_FIELD, + PUBLICATION_STMT_FIELD, + PLACE_STMT_FIELD, + YEAR_FIELD, + EXTENT_FIELD, + DIMENSIONS_FIELD, + NUMBERING_FIELD, + ENTRIES_TABLE, + AGENTS_TABLE, + MUSENALMID_FIELD, + ANNOTATION_FIELD, + COMMENT_FIELD, +} + var ITEM_TYPE_VALUES = []string{ "Original", "Reproduktion", @@ -416,6 +494,8 @@ var PUBLIC_VIEW_RULE = types.Pointer("") var PUBLIC_LIST_RULE = types.Pointer("") const ( + FTS5_PREFIX = "fts5_" + PLACES_TABLE = "places" AGENTS_TABLE = "agents" SERIES_TABLE = "series" diff --git a/dbmodels/functions.go b/dbmodels/functions.go index 66e225e..d200cde 100644 --- a/dbmodels/functions.go +++ b/dbmodels/functions.go @@ -97,3 +97,19 @@ func GetFields(records []*core.Record, field string) []any { } return fields } + +func CreateFTS5TableQuery(tablename string, fields ...string) string { + if len(fields) == 0 { + return "" + } + + str := "CREATE VIRTUAL TABLE IF NOT EXISTS " + FTS5_PREFIX + tablename + " USING fts5(id, " + for i, f := range fields { + str += f + if i < len(fields)-1 { + str += ", " + } + } + str += ")" + return str +} diff --git a/migrations/1738936649_fts5.go b/migrations/1738936649_fts5.go new file mode 100644 index 0000000..7780371 --- /dev/null +++ b/migrations/1738936649_fts5.go @@ -0,0 +1,77 @@ +package migrations + +import ( + "github.com/Theodor-Springmann-Stiftung/musenalm/dbmodels" + "github.com/pocketbase/pocketbase/core" + m "github.com/pocketbase/pocketbase/migrations" +) + +func init() { + m.Register(func(app core.App) error { + err := createFTS5(app, dbmodels.AGENTS_TABLE, dbmodels.AGENTS_FTS5_FIELDS) + if err != nil { + app.Logger().Error("Error creating FTS5 table for agents", "error", err) + } + + err = createFTS5(app, dbmodels.PLACES_TABLE, dbmodels.PLACES_FTS5_FIELDS) + if err != nil { + app.Logger().Error("Error creating FTS5 table for places", "error", err) + } + + err = createFTS5(app, dbmodels.SERIES_TABLE, dbmodels.SERIES_FTS5_FIELDS) + if err != nil { + app.Logger().Error("Error creating FTS5 table for series", "error", err) + } + + err = createFTS5(app, dbmodels.ITEMS_TABLE, dbmodels.ITEMS_FTS5_FIELDS) + if err != nil { + app.Logger().Error("Error creating FTS5 table for items", "error", err) + } + + err = createFTS5(app, dbmodels.ENTRIES_TABLE, dbmodels.ENTRIES_FTS5_FIELDS) + if err != nil { + app.Logger().Error("Error creating FTS5 table for entries", "error", err) + } + + err = createFTS5(app, dbmodels.CONTENTS_TABLE, dbmodels.CONTENTS_FTS5_FIELDS) + if err != nil { + app.Logger().Error("Error creating FTS5 table for contents", "error", err) + } + + return nil + }, func(app core.App) error { + deleteTable(app, dbmodels.FTS5_PREFIX+dbmodels.AGENTS_TABLE) + deleteTable(app, dbmodels.FTS5_PREFIX+dbmodels.PLACES_TABLE) + deleteTable(app, dbmodels.FTS5_PREFIX+dbmodels.SERIES_TABLE) + deleteTable(app, dbmodels.FTS5_PREFIX+dbmodels.ITEMS_TABLE) + deleteTable(app, dbmodels.FTS5_PREFIX+dbmodels.ENTRIES_TABLE) + deleteTable(app, dbmodels.FTS5_PREFIX+dbmodels.CONTENTS_TABLE) + return nil + }) +} + +func createFTS5(app core.App, table string, fields []string) error { + query := dbmodels.CreateFTS5TableQuery( + table, + fields..., + ) + + _, err := app.DB().NewQuery(query).Execute() + if err != nil { + return err + } + + return nil + +} + +func deleteTable(app core.App, table string) error { + query := "DROP TABLE IF EXISTS " + table + + _, err := app.DB().NewQuery(query).Execute() + if err != nil { + return err + } + + return nil +}