From 225022817fd4b409dfd29efef8a8b0875b230fe8 Mon Sep 17 00:00:00 2001 From: Jason Staten Date: Sun, 27 Nov 2022 21:10:07 -0700 Subject: [PATCH] fts5 powered search --- database.go | 56 +++++----------------------------------------------- upgradedb.go | 28 +++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 52 deletions(-) diff --git a/database.go b/database.go index ad45939..9ee7621 100644 --- a/database.go +++ b/database.go @@ -283,55 +283,7 @@ func gethonksbyconvoy(userid int64, convoy string, wanted int64) []*Honk { return honks } func gethonksbysearch(userid int64, q string, wanted int64) []*Honk { - var queries []string - var params []interface{} - queries = append(queries, "honks.honkid > ?") - params = append(params, wanted) - queries = append(queries, "honks.userid = ?") - params = append(params, userid) - - terms := strings.Split(q, " ") - for _, t := range terms { - if t == "" { - continue - } - negate := " " - if t[0] == '-' { - t = t[1:] - negate = " not " - } - if t == "" { - continue - } - if strings.HasPrefix(t, "site:") { - site := t[5:] - site = "%" + site + "%" - queries = append(queries, "xid"+negate+"like ?") - params = append(params, site) - continue - } - if strings.HasPrefix(t, "honker:") { - honker := t[7:] - xid := fullname(honker, userid) - if xid != "" { - honker = xid - } - queries = append(queries, negate+"(honks.honker = ? or honks.oonker = ?)") - params = append(params, honker) - params = append(params, honker) - continue - } - t = "%" + t + "%" - queries = append(queries, "noise"+negate+"like ?") - params = append(params, t) - } - - selecthonks := "select honks.honkid, honks.userid, username, what, honker, oonker, honks.xid, rid, dt, url, audience, noise, precis, format, convoy, whofore, flags from honks join users on honks.userid = users.userid " - where := "where " + strings.Join(queries, " and ") - butnotthose := " and convoy not in (select name from zonkers where userid = ? and wherefore = 'zonvoy' order by zonkerid desc limit 100)" - limit := " order by honks.honkid desc limit 250" - params = append(params, userid) - rows, err := opendatabase().Query(selecthonks+where+butnotthose+limit, params...) + rows, err := stmtHonksBySearch.Query(q, userid, userid) honks := getsomehonks(rows, err) return honks } @@ -1136,6 +1088,7 @@ var stmtSaveChonk, stmtLoadChonks, stmtGetChatters *sql.Stmt var stmtGetUserCount *sql.Stmt var stmtGetActiveUserCount *sql.Stmt var stmtGetLocalHonkCount *sql.Stmt +var stmtHonksBySearch *sql.Stmt func preparetodie(db *sql.DB, s string) *sql.Stmt { stmt, err := db.Prepare(s) @@ -1155,10 +1108,10 @@ func prepareStatements(db *sql.DB) { stmtDubbers = preparetodie(db, "select honkerid, userid, name, xid, flavor from honkers where userid = ? and flavor = 'dub'") stmtNamedDubbers = preparetodie(db, "select honkerid, userid, name, xid, flavor from honkers where userid = ? and name = ? and flavor = 'dub'") - selecthonks := "select honks.honkid, honks.userid, username, what, honker, oonker, honks.xid, rid, dt, url, audience, noise, precis, format, convoy, whofore, flags from honks join users on honks.userid = users.userid " + selecthonks := "select honks.honkid, honks.userid, username, what, honks.honker, oonker, honks.xid, rid, dt, url, audience, honks.noise, precis, format, honks.convoy, whofore, flags from honks join users on honks.userid = users.userid " limit := " order by honks.honkid desc limit 250" smalllimit := " order by honks.honkid desc limit ?" - butnotthose := " and convoy not in (select name from zonkers where userid = ? and wherefore = 'zonvoy' order by zonkerid desc limit 100)" + butnotthose := " and honks.convoy not in (select name from zonkers where userid = ? and wherefore = 'zonvoy' order by zonkerid desc limit 100)" stmtOneXonk = preparetodie(db, selecthonks+"where honks.userid = ? and xid = ?") stmtAnyXonk = preparetodie(db, selecthonks+"where xid = ? order by honks.honkid asc") stmtOneBonk = preparetodie(db, selecthonks+"where honks.userid = ? and xid = ? and what = 'bonk' and whofore = 2") @@ -1224,4 +1177,5 @@ func prepareStatements(db *sql.DB) { stmtGetUserCount = preparetodie(db, "select count(*) from users where userid > 0") stmtGetActiveUserCount = preparetodie(db, "select count(distinct honker) from honks where whofore = 2 and dt > ?") stmtGetLocalHonkCount = preparetodie(db, "select count(*) from honks where whofore = 2") + stmtHonksBySearch = preparetodie(db, selecthonks+" join altavista on honks.honkid = altavista.rowid where altavista match ? and honks.userid = ? "+butnotthose+limit) } diff --git a/upgradedb.go b/upgradedb.go index 533ff9c..fc44c6b 100644 --- a/upgradedb.go +++ b/upgradedb.go @@ -22,7 +22,7 @@ import ( "time" ) -var myVersion = 41 +var myVersion = 42 type dbexecer interface { Exec(query string, args ...interface{}) (sql.Result, error) @@ -206,6 +206,32 @@ func upgradedb() { doordie(db, "update config set value = 41 where key = 'dbversion'") fallthrough case 41: + doordie(db, "create virtual table altavista using fts5(site, convoy, noise, honker, content='', tokenize='trigram')") + doordie(db, ` + create trigger honks_ai after insert on honks begin + insert into altavista(rowid, site, convoy, noise, honker) + values (new.honkid, new.xid, new.convoy, new.noise, iif(new.oonker = '', new.honker, new.oonker)); + end`) + doordie(db, ` + create trigger honks_ad after delete on honks begin + insert into altavista(altavista, rowid, site, convoy, noise, honker) + values ('delete', old.honkid, old.xid, old.convoy, old.noise, iif(old.oonker = '', old.honker, old.oonker)); + end`) + doordie(db, ` + create trigger honks_au after update on honks begin + insert into altavista(altavista, rowid, site, convoy, noise, honker) + values ('delete', old.honkid, old.xid, old.convoy, old.noise, iif(old.oonker = '', old.honker, old.oonker)); + insert into altavista(rowid, site, convoy, noise, honker) + values (new.honkid, new.xid, new.convoy, new.noise, iif(new.oonker = '', new.honker, new.oonker)); + end`) + doordie(db, ` + insert into altavista(rowid, site, convoy, noise, honker) + select honkid, xid, convoy, noise, iif(oonker = '', honker, oonker) from honks + `) + + doordie(db, "update config set value = 42 where key = 'dbversion'") + fallthrough + case 42: default: elog.Fatalf("can't upgrade unknown version %d", dbversion)