More work on FTS

This commit is contained in:
Kovid Goyal 2022-01-31 20:05:06 +05:30
parent ba1707169a
commit e3d6c9f192
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
4 changed files with 36 additions and 18 deletions

View File

@ -1,3 +1,9 @@
CREATE TABLE fts_db.dirtied_formats ( id INTEGER PRIMARY KEY,
book INTEGER NOT NULL,
format TEXT NOT NULL COLLATE NOCASE,
UNIQUE(book, format)
);
CREATE TABLE fts_db.books_text ( id INTEGER PRIMARY KEY, CREATE TABLE fts_db.books_text ( id INTEGER PRIMARY KEY,
book INTEGER NOT NULL, book INTEGER NOT NULL,
format TEXT NOT NULL COLLATE NOCASE, format TEXT NOT NULL COLLATE NOCASE,
@ -15,22 +21,22 @@ CREATE VIRTUAL TABLE fts_db.books_fts_stemmed USING fts5(searchable_text, conten
CREATE TRIGGER fts_db.books_fts_insert_trg AFTER INSERT ON fts_db.books_text CREATE TRIGGER fts_db.books_fts_insert_trg AFTER INSERT ON fts_db.books_text
BEGIN BEGIN
INSERT INTO fts_db.books_fts(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text); INSERT INTO books_fts(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text);
INSERT INTO fts_db.books_fts_stemmed(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text); INSERT INTO books_fts_stemmed(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text);
END; END;
CREATE TRIGGER fts_db.books_fts_delete_trg AFTER DELETE ON fts_db.books_text CREATE TRIGGER fts_db.books_fts_delete_trg AFTER DELETE ON fts_db.books_text
BEGIN BEGIN
INSERT INTO fts_db.books_fts(fts_db.books_fts, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text); INSERT INTO books_fts(books_fts, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text);
INSERT INTO fts_db.books_fts_stemmed(fts_db.books_fts_stemmed, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text); INSERT INTO books_fts_stemmed(books_fts_stemmed, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text);
END; END;
CREATE TRIGGER fts_db.books_fts_update_trg AFTER UPDATE ON fts_db.books_text CREATE TRIGGER fts_db.books_fts_update_trg AFTER UPDATE ON fts_db.books_text
BEGIN BEGIN
INSERT INTO fts_db.books_fts(fts_db.books_fts, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text); INSERT INTO books_fts(books_fts, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text);
INSERT INTO fts_db.books_fts(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text); INSERT INTO books_fts(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text);
INSERT INTO fts_db.books_fts_stemmed(fts_db.books_fts_stemmed, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text); INSERT INTO books_fts_stemmed(books_fts_stemmed, rowid, searchable_text) VALUES('delete', OLD.id, OLD.searchable_text);
INSERT INTO fts_db.books_fts_stemmed(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text); INSERT INTO books_fts_stemmed(rowid, searchable_text) VALUES (NEW.id, NEW.searchable_text);
END; END;
PRAGMA fts_db.user_version=1; PRAGMA fts_db.user_version=1;

View File

@ -0,0 +1,17 @@
CREATE TEMP TRIGGER fts_db_book_deleted_trg AFTER DELETE ON main.books BEGIN
DELETE FROM books_text WHERE book=OLD.id;
DELETE FROM dirtied_formats WHERE book=OLD.id;
END;
CREATE TEMP TRIGGER fts_db_format_deleted_trg AFTER DELETE ON main.data BEGIN
DELETE FROM books_text WHERE book=OLD.id AND format=OLD.format;
DELETE FROM dirtied_formats WHERE book=OLD.id AND format=OLD.format;
END;
CREATE TEMP TRIGGER fts_db_format_added_trg AFTER INSERT ON main.data BEGIN
INSERT INTO dirtied_formats(book, format) VALUES (NEW.book, NEW.format);
END;
CREATE TEMP TRIGGER fts_db_format_updated_trg AFTER UPDATE ON main.data BEGIN
INSERT INTO dirtied_formats(book, format) VALUES (NEW.book, NEW.format);
END;

View File

@ -20,14 +20,4 @@ class FTS:
main_db_path = os.path.abspath(conn.db_filename('main')) main_db_path = os.path.abspath(conn.db_filename('main'))
self.dbpath = os.path.join(os.path.dirname(main_db_path), 'full-text-search.db') self.dbpath = os.path.join(os.path.dirname(main_db_path), 'full-text-search.db')
conn.execute(f'ATTACH DATABASE "{self.dbpath}" AS fts_db') conn.execute(f'ATTACH DATABASE "{self.dbpath}" AS fts_db')
fts_sqlite = P('fts_sqlite.sql', data=True, allow_user_override=False).decode('utf-8')
cur = self.conn.cursor()
cur.execute('BEGIN EXCLUSIVE TRANSACTION')
try:
cur.execute(fts_sqlite)
except (Exception, BaseException):
cur.execute('ROLLBACK')
raise
else:
cur.execute('COMMIT')
SchemaUpgrade(conn) SchemaUpgrade(conn)

View File

@ -9,6 +9,9 @@ class SchemaUpgrade:
self.conn = conn self.conn = conn
conn.execute('BEGIN EXCLUSIVE TRANSACTION') conn.execute('BEGIN EXCLUSIVE TRANSACTION')
try: try:
if self.user_version == 0:
fts_sqlite = P('fts_sqlite.sql', data=True, allow_user_override=False).decode('utf-8')
conn.execute(fts_sqlite)
while True: while True:
uv = self.user_version uv = self.user_version
meth = getattr(self, f'upgrade_version_{uv}', None) meth = getattr(self, f'upgrade_version_{uv}', None)
@ -17,6 +20,8 @@ class SchemaUpgrade:
print(f'Upgrading FTS database to version {uv+1}...') print(f'Upgrading FTS database to version {uv+1}...')
meth() meth()
self.user_version = uv + 1 self.user_version = uv + 1
fts_triggers = P('fts_triggers.sql', data=True, allow_user_override=False).decode('utf-8')
conn.execute(fts_triggers)
except (Exception, BaseException): except (Exception, BaseException):
conn.execute('ROLLBACK') conn.execute('ROLLBACK')
raise raise