shared: sqlitesearch: Allow filtering by tags
This commit is contained in:
parent
abd1b94235
commit
94fbdb5a92
@ -143,6 +143,11 @@ QPair<QString, QVector<QString>> SqliteSearch::createSql(const Token &token)
|
|||||||
{
|
{
|
||||||
return {" fts MATCH ? ", {escapeFtsArgument(value)}};
|
return {" fts MATCH ? ", {escapeFtsArgument(value)}};
|
||||||
}
|
}
|
||||||
|
if(token.type == FILTER_TAG_ASSIGNED)
|
||||||
|
{
|
||||||
|
return {" file.id IN (SELECT fileid FROM filetag WHERE tagid = (SELECT id FROM tag WHERE name = ?)) ",
|
||||||
|
{value.toLower()}};
|
||||||
|
}
|
||||||
throw LooqsGeneralException("Unknown token passed (should not happen)");
|
throw LooqsGeneralException("Unknown token passed (should not happen)");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -179,18 +184,18 @@ QSqlQuery SqliteSearch::makeSqlQuery(const LooqsQuery &query)
|
|||||||
}
|
}
|
||||||
QString whereSqlTrigram = whereSql;
|
QString whereSqlTrigram = whereSql;
|
||||||
whereSqlTrigram.replace("fts MATCH", "fts_trigram MATCH"); // A bit dirty...
|
whereSqlTrigram.replace("fts MATCH", "fts_trigram MATCH"); // A bit dirty...
|
||||||
prepSql =
|
prepSql = "SELECT DISTINCT path, page, mtime, size, filetype FROM ("
|
||||||
"SELECT DISTINCT path, page, mtime, size, filetype FROM ("
|
|
||||||
"SELECT file.path AS path, content.page AS page, file.mtime AS mtime, file.size AS size, "
|
"SELECT file.path AS path, content.page AS page, file.mtime AS mtime, file.size AS size, "
|
||||||
"file.filetype AS filetype, 0 AS prio, fts.rank AS rank FROM file INNER JOIN content ON file.id = "
|
"file.filetype AS filetype, 0 AS prio, fts.rank AS rank FROM file INNER JOIN content ON file.id = "
|
||||||
"content.fileid "
|
"content.fileid "
|
||||||
"INNER JOIN fts ON content.ftsid = fts.ROWID WHERE 1=1 AND " +
|
"INNER JOIN fts ON content.ftsid = fts.ROWID WHERE 1=1 AND " +
|
||||||
whereSql +
|
whereSql +
|
||||||
"UNION ALL SELECT file.path AS path, content.page AS page, file.mtime AS mtime, file.size AS size, "
|
"UNION ALL SELECT file.path AS path, content.page AS page, file.mtime AS mtime, file.size AS size, "
|
||||||
"file.filetype AS filetype, 1 as prio, fts_trigram.rank AS rank FROM file INNER JOIN content ON file.id = "
|
"file.filetype AS filetype, 1 as prio, fts_trigram.rank AS rank FROM file INNER JOIN content ON "
|
||||||
|
"file.id = "
|
||||||
"content.fileid " +
|
"content.fileid " +
|
||||||
"INNER JOIN fts_trigram ON content.fts_trigramid = fts_trigram.ROWID WHERE 1=1 AND " + whereSqlTrigram +
|
"INNER JOIN fts_trigram ON content.fts_trigramid = fts_trigram.ROWID WHERE 1=1 AND " +
|
||||||
" ) " + sortSql;
|
whereSqlTrigram + " ) " + sortSql;
|
||||||
++bindIterations;
|
++bindIterations;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -22,6 +22,7 @@ enum TokenType
|
|||||||
FILTER_CONTENT = 512,
|
FILTER_CONTENT = 512,
|
||||||
FILTER_CONTENT_CONTAINS,
|
FILTER_CONTENT_CONTAINS,
|
||||||
FILTER_CONTENT_PAGE,
|
FILTER_CONTENT_PAGE,
|
||||||
|
FILTER_TAG_ASSIGNED,
|
||||||
LIMIT = 1024
|
LIMIT = 1024
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user