Skip to content

Commit d98eb20

Browse files
committed
fts5
1 parent c927944 commit d98eb20

6 files changed

Lines changed: 77 additions & 25 deletions

File tree

flake.nix

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@
3030
src = ./.;
3131
nativeBuildInputs = [ pkgs.go ];
3232
vendorHash = "sha256-tO2z+KZ6Yc/YmRt2UyW2kcwN7A83gYw2YDSTURfHm+E=";
33+
tags= [
34+
"fts5"
35+
];
3336
meta = { platforms = lib.platforms.all; };
3437
};
3538

internal/core/handlers_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,11 @@ func TestBotHandlers(t *testing.T) {
171171
}
172172
}
173173

174+
func TestMediaSearchHandler(t *testing.T) {
175+
is := is.New(t)
176+
is.NoErr(nil)
177+
}
178+
174179
func TestMediaSearchKeyboard(t *testing.T) {
175180
is := is.New(t)
176181

internal/db/media.go

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,20 @@ var (
1010
)
1111

1212
type Media struct {
13-
RowID int64 // NOTE: needed only by callback queries
13+
RowID int64 // NOTE: needed by callback queries
1414
GID int64 `db:"gid"`
1515
Data string `db:"data"`
1616
Kind string `db:"kind"`
1717
Description string `db:"description"`
1818
Score int `db:"score"`
1919
}
2020

21+
type MediaFts struct {
22+
RowID int64
23+
Description string `db:"description"`
24+
GID int64 `db:"gid"`
25+
}
26+
2127
func (m *Media) Clone() *Media {
2228
return &Media{
2329
GID: m.GID,
@@ -175,19 +181,20 @@ func SearchMedia(ctx context.Context, gid int64, term string, offset int) ([]Med
175181
results := []Media{}
176182

177183
q, err := prepareStmt(
178-
`SELECT rowid,gid,kind,data,description,score FROM ` + mediaTable + `
179-
WHERE description LIKE ?
180-
AND gid=?
181-
ORDER BY score DESC
182-
LIMIT 6
183-
OFFSET ?`,
184+
`SELECT media.rowid, media.gid, media.data, media.description, media.created_at
185+
FROM media_fts
186+
JOIN media ON posts.rowid = posts_fts.rowid
187+
WHERE media_fts.text MATCH ?
188+
AND media_fts.gid=?
189+
ORDER BY media.score DESC
190+
LIMIT 6
191+
OFFSET ?`,
184192
)
185193
if err != nil {
186194
return results, err
187195
}
188196

189197
term = strings.TrimSpace(term)
190-
term = `%` + term + `%`
191198
return results, q.Select(&results, term, gid, offset)
192199
}
193200

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
DROP TRIGGER media_ondelete;
2+
3+
DROP TRIGGER media_onupdate;
4+
5+
DROP TRIGGER media_oninsert;
6+
7+
DROP TABLE media_fts;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
CREATE VIRTUAL TABLE media_fts USING
2+
fts5(
3+
, description
4+
, gid UNINDEXED
5+
);
6+
7+
8+
CREATE TRIGGER media_oninsert AFTER INSERT ON media BEGIN
9+
INSERT INTO media_fts(rowid, description, gid)
10+
VALUES (new.rowid, new.description, new.gid);
11+
END;
12+
13+
CREATE TRIGGER media_onupdate AFTER UPDATE ON media BEGIN
14+
UPDATE media_fts
15+
SET description = new.description
16+
WHERE rowid = new.rowid;
17+
END;
18+
19+
CREATE TRIGGER media_ondelete AFTER DELETE ON media BEGIN
20+
DELETE FROM media_fts WHERE rowid = old.rowid;
21+
END;

internal/db/tables_test.go

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,55 +4,64 @@ import (
44
"context"
55
"testing"
66

7-
"gotest.tools/assert"
7+
"github.com/matryer/is"
88
)
99

1010
func TestTables(t *testing.T) {
11+
is := is.New(t)
1112
var err error
1213

1314
err = Open(":memory:")
1415
defer Close()
15-
assert.NilError(t, err)
16+
is.NoErr(err)
1617

1718
err = Migrate()
18-
assert.NilError(t, err)
19+
is.NoErr(err)
1920

2021
var gid int64 = -123456
2122
text := "some text"
2223
data := "123456"
2324
kind := "photo"
2425

2526
err = InsertGroup(context.TODO(), gid, "group name")
26-
assert.NilError(t, err)
27+
is.NoErr(err)
2728

2829
err = InsertAbraxas(context.TODO(), &Abraxas{GID: gid, Abraxas: "something", Kind: "photo"})
29-
assert.NilError(t, err)
30+
is.NoErr(err)
3031

3132
err = InsertMedia(context.TODO(), &Media{GID: gid, Data: data, Kind: kind, Description: text, Score: 0})
32-
assert.NilError(t, err)
33+
is.NoErr(err)
3334

3435
var c int64
3536
row := dbc.QueryRow(`SELECT COUNT(*) FROM media`)
3637
err = row.Scan(&c)
37-
assert.NilError(t, err)
38-
assert.Equal(t, c, int64(1))
38+
is.NoErr(err)
39+
is.Equal(c, int64(1))
3940

4041
n := &Media{}
4142
row = dbc.QueryRow(`SELECT kind,description,data,gid FROM media WHERE data=?`, data)
4243
err = row.Scan(&n.Kind, &n.Description, &n.Data, &n.GID)
43-
assert.NilError(t, err)
44-
assert.Equal(t, n.GID, gid)
45-
assert.Equal(t, n.Data, data)
44+
is.NoErr(err)
45+
is.Equal(n.GID, gid)
4646

4747
m := &Media{GID: gid, Kind: kind}
4848
err = SelectRandomMedia(context.TODO(), m)
49-
assert.NilError(t, err)
49+
is.NoErr(err)
5050

51-
assert.Equal(t, m.GID, gid)
52-
assert.Equal(t, m.Data, data)
53-
assert.Equal(t, m.Kind, kind)
54-
assert.Equal(t, m.Description, text)
51+
is.Equal(m.GID, gid)
52+
is.Equal(m.Data, data)
53+
is.Equal(m.Kind, kind)
54+
is.Equal(m.Description, text)
55+
56+
mf := &MediaFts{}
57+
row = dbc.QueryRow(`SELECT rowid,description,gid FROM media_fts`)
58+
err = row.Scan(&mf.RowID, &mf.Description, &mf.GID)
59+
is.NoErr(err)
60+
61+
is.Equal(mf.RowID, int64(1))
62+
is.Equal(mf.Description, m.Description)
63+
is.Equal(mf.GID, m.GID)
5564

5665
err = MigrateDown()
57-
assert.NilError(t, err)
66+
is.NoErr(err)
5867
}

0 commit comments

Comments
 (0)