diff --git a/oml/fulltext.py b/oml/fulltext.py index 67ca6bf..4ebe255 100644 --- a/oml/fulltext.py +++ b/oml/fulltext.py @@ -2,6 +2,7 @@ import logging import os import subprocess import sys +from urllib.parse import quote, unquote from sqlalchemy.sql import operators @@ -14,6 +15,8 @@ def get_prefix(): def get_ids(books): from item.models import File + if not books: + return [] ids = [b[0] for b in File.query.filter(operators.in_op(File.path, books)).values('sha1')] return ids @@ -34,23 +37,29 @@ def find_fulltext_windows(query): def find_fulltext_linux(query): prefix = get_prefix() + prefix_url = quote(prefix) cmd = [ 'tracker', 'sparql', '-q', - "SELECT nie:url(?f) WHERE { ?f fts:match '%s' FILTER (tracker:uri-is-descendant ('file://%s', nie:url (?u))) }" % (query, prefix) + "SELECT nie:url(?f) WHERE { ?f fts:match '%s' FILTER (tracker:uri-is-descendant ('file://%s', nie:url (?f))) }" % (query, prefix_url) ] books = subprocess.check_output(cmd).decode().strip().split('\n') - books = [b.split(':')[0] for b in books] - return get_ids(books, prefix) + books = [ + unquote(r.strip()).replace('file://', '')[len(prefix):] + for r in books if r.strip().startswith('file://') + ] + return get_ids(books) def find_fulltext(query): ids = [] if sys.platform == 'darwin': ids = find_fulltext_macos(query) + elif sys.platform == 'linux': + ids = find_fulltext_linux(query) else: logger.debug('missing fulltext search implementation for %s', sys.platform) return ids def platform_supported(): - return sys.platform == 'darwin' + return sys.platform in ('darwin', 'linux')