52 lines
1.6 KiB
Python
52 lines
1.6 KiB
Python
from lbry.wallet.database import constraints_to_sql
|
|
|
|
CREATE_FULL_TEXT_SEARCH = """
|
|
create virtual table if not exists search using fts5(
|
|
claim_name, channel_name, title, description, author, tags,
|
|
content=claim, tokenize=porter
|
|
);
|
|
"""
|
|
|
|
FTS_ORDER_BY = "bm25(search, 4.0, 8.0, 1.0, 0.5, 1.0, 0.5)"
|
|
|
|
|
|
def fts_action_sql(claims=None, action='insert'):
|
|
select = {
|
|
'rowid': "claim.rowid",
|
|
'claim_name': "claim.normalized",
|
|
'channel_name': "channel.normalized",
|
|
'title': "claim.title",
|
|
'description': "claim.description",
|
|
'author': "claim.author",
|
|
'tags': "(select group_concat(tag, ' ') from tag where tag.claim_hash=claim.claim_hash)"
|
|
}
|
|
if action == 'delete':
|
|
select['search'] = '"delete"'
|
|
|
|
where, values = "", {}
|
|
if claims:
|
|
where, values = constraints_to_sql({'claim.claim_hash__in': claims})
|
|
where = 'WHERE '+where
|
|
|
|
return f"""
|
|
INSERT INTO search ({','.join(select.keys())})
|
|
SELECT {','.join(select.values())} FROM claim
|
|
LEFT JOIN claim as channel ON (claim.channel_hash=channel.claim_hash) {where}
|
|
""", values
|
|
|
|
|
|
def update_full_text_search(action, outputs, db, is_first_sync):
|
|
if is_first_sync:
|
|
return
|
|
if not outputs:
|
|
return
|
|
if action in ("before-delete", "before-update"):
|
|
db.execute(*fts_action_sql(outputs, 'delete'))
|
|
elif action in ("after-insert", "after-update"):
|
|
db.execute(*fts_action_sql(outputs, 'insert'))
|
|
else:
|
|
raise ValueError(f"Invalid action for updating full text search: '{action}'")
|
|
|
|
|
|
def first_sync_finished(db):
|
|
db.execute(*fts_action_sql())
|