shared: sqlitesearch: reformat - no functional change
This commit is contained in:
父節點
a6f73d724a
當前提交
344eaa402e
@ -9,198 +9,201 @@
|
||||
|
||||
SqliteSearch::SqliteSearch(QSqlDatabase &db)
|
||||
{
|
||||
this->db = &db;
|
||||
this->db = &db;
|
||||
}
|
||||
|
||||
QString SqliteSearch::fieldToColumn(QueryField field)
|
||||
{
|
||||
if(field == FILE_MTIME)
|
||||
{
|
||||
return "file.mtime";
|
||||
}
|
||||
else if(field == FILE_PATH)
|
||||
{
|
||||
return "file.path";
|
||||
}
|
||||
else if(field == FILE_SIZE)
|
||||
{
|
||||
return "file.size";
|
||||
}
|
||||
else if(field == CONTENT_TEXT_PAGE)
|
||||
{
|
||||
return "content.page";
|
||||
}
|
||||
else if(field == CONTENT_TEXT)
|
||||
{
|
||||
return "content.text";
|
||||
}
|
||||
return "";
|
||||
if(field == FILE_MTIME)
|
||||
{
|
||||
return "file.mtime";
|
||||
}
|
||||
else if(field == FILE_PATH)
|
||||
{
|
||||
return "file.path";
|
||||
}
|
||||
else if(field == FILE_SIZE)
|
||||
{
|
||||
return "file.size";
|
||||
}
|
||||
else if(field == CONTENT_TEXT_PAGE)
|
||||
{
|
||||
return "content.page";
|
||||
}
|
||||
else if(field == CONTENT_TEXT)
|
||||
{
|
||||
return "content.text";
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
QString SqliteSearch::createSortSql(const QVector<SortCondition> sortConditions)
|
||||
{
|
||||
QString sortsql;
|
||||
for(const SortCondition &sc : sortConditions)
|
||||
{
|
||||
QString order;
|
||||
QString field = fieldToColumn(sc.field);
|
||||
if(field == "")
|
||||
{
|
||||
throw QSSGeneralException("Unknown sort field supplied");
|
||||
}
|
||||
if(sc.order == DESC)
|
||||
{
|
||||
order = "DESC";
|
||||
}
|
||||
else
|
||||
{
|
||||
order = "ASC";
|
||||
}
|
||||
sortsql += field + " " + order + ", ";
|
||||
}
|
||||
sortsql.chop(2);
|
||||
if(!sortsql.isEmpty())
|
||||
{
|
||||
return " ORDER BY " + sortsql;
|
||||
}
|
||||
return "";
|
||||
QString sortsql;
|
||||
for(const SortCondition &sc : sortConditions)
|
||||
{
|
||||
QString order;
|
||||
QString field = fieldToColumn(sc.field);
|
||||
if(field == "")
|
||||
{
|
||||
throw QSSGeneralException("Unknown sort field supplied");
|
||||
}
|
||||
if(sc.order == DESC)
|
||||
{
|
||||
order = "DESC";
|
||||
}
|
||||
else
|
||||
{
|
||||
order = "ASC";
|
||||
}
|
||||
sortsql += field + " " + order + ", ";
|
||||
}
|
||||
sortsql.chop(2);
|
||||
if(!sortsql.isEmpty())
|
||||
{
|
||||
return " ORDER BY " + sortsql;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
QPair<QString, QVector<QString>> createNonArgPair(QString key)
|
||||
{
|
||||
return { " " + key + " ", QVector<QString>() };
|
||||
return {" " + key + " ", QVector<QString>()};
|
||||
}
|
||||
|
||||
QPair<QString, QVector<QString>> SqliteSearch::createSql(const Token &token)
|
||||
{
|
||||
QPair<QString, QVector<QString>> result;
|
||||
QString value = token.value;
|
||||
value = value.replace("'", "\\'");
|
||||
QPair<QString, QVector<QString>> result;
|
||||
QString value = token.value;
|
||||
value = value.replace("'", "\\'");
|
||||
|
||||
if(token.type == BOOL_AND)
|
||||
{
|
||||
return createNonArgPair("AND");
|
||||
}
|
||||
if(token.type == BOOL_OR)
|
||||
{
|
||||
return createNonArgPair("OR");
|
||||
}
|
||||
if(token.type == NEGATION)
|
||||
{
|
||||
return createNonArgPair("NOT");
|
||||
}
|
||||
if(token.type == BRACKET_OPEN)
|
||||
{
|
||||
return createNonArgPair("(");
|
||||
}
|
||||
if(token.type == BRACKET_CLOSE)
|
||||
{
|
||||
return createNonArgPair(")");
|
||||
}
|
||||
if(token.type == FILTER_PATH_STARTS)
|
||||
{
|
||||
return { " file.path LIKE ? || '%' ", { value } };
|
||||
}
|
||||
if(token.type == FILTER_PATH_ENDS)
|
||||
{
|
||||
return { " file.path LIKE '%' || ? ", { value } };
|
||||
}
|
||||
if(token.type == FILTER_PATH_CONTAINS)
|
||||
{
|
||||
return { " file.path LIKE '%' || ? || '%' ", { value } } ;
|
||||
}
|
||||
if(token.type == FILTER_CONTENT_PAGE)
|
||||
{
|
||||
return { " content.page = ?", { value } };
|
||||
}
|
||||
if(token.type == FILTER_CONTENT_CONTAINS)
|
||||
{
|
||||
return { " content.id IN (SELECT content_fts.ROWID FROM content_fts WHERE content_fts.content MATCH ?) " , { value } };
|
||||
}
|
||||
throw QSSGeneralException("Unknown token passed (should not happen)");
|
||||
if(token.type == BOOL_AND)
|
||||
{
|
||||
return createNonArgPair("AND");
|
||||
}
|
||||
if(token.type == BOOL_OR)
|
||||
{
|
||||
return createNonArgPair("OR");
|
||||
}
|
||||
if(token.type == NEGATION)
|
||||
{
|
||||
return createNonArgPair("NOT");
|
||||
}
|
||||
if(token.type == BRACKET_OPEN)
|
||||
{
|
||||
return createNonArgPair("(");
|
||||
}
|
||||
if(token.type == BRACKET_CLOSE)
|
||||
{
|
||||
return createNonArgPair(")");
|
||||
}
|
||||
if(token.type == FILTER_PATH_STARTS)
|
||||
{
|
||||
return {" file.path LIKE ? || '%' ", {value}};
|
||||
}
|
||||
if(token.type == FILTER_PATH_ENDS)
|
||||
{
|
||||
return {" file.path LIKE '%' || ? ", {value}};
|
||||
}
|
||||
if(token.type == FILTER_PATH_CONTAINS)
|
||||
{
|
||||
return {" file.path LIKE '%' || ? || '%' ", {value}};
|
||||
}
|
||||
if(token.type == FILTER_CONTENT_PAGE)
|
||||
{
|
||||
return {" content.page = ?", {value}};
|
||||
}
|
||||
if(token.type == FILTER_CONTENT_CONTAINS)
|
||||
{
|
||||
return {" content.id IN (SELECT content_fts.ROWID FROM content_fts WHERE content_fts.content MATCH ?) ",
|
||||
{value}};
|
||||
}
|
||||
throw QSSGeneralException("Unknown token passed (should not happen)");
|
||||
}
|
||||
|
||||
QSqlQuery SqliteSearch::makeSqlQuery(const QSSQuery &query)
|
||||
{
|
||||
QString whereSql;
|
||||
QVector<QString> bindValues;
|
||||
bool isContentSearch = query.getTokensMask() & FILTER_CONTENT == FILTER_CONTENT;
|
||||
if(query.getTokens().isEmpty())
|
||||
{
|
||||
throw QSSGeneralException("Nothing to search for supplied");
|
||||
}
|
||||
QString whereSql;
|
||||
QVector<QString> bindValues;
|
||||
bool isContentSearch = query.getTokensMask() & FILTER_CONTENT == FILTER_CONTENT;
|
||||
if(query.getTokens().isEmpty())
|
||||
{
|
||||
throw QSSGeneralException("Nothing to search for supplied");
|
||||
}
|
||||
|
||||
for(const Token &token : query.getTokens())
|
||||
{
|
||||
auto sql = createSql(token);
|
||||
whereSql += sql.first;
|
||||
bindValues.append(sql.second);
|
||||
}
|
||||
for(const Token &token : query.getTokens())
|
||||
{
|
||||
auto sql = createSql(token);
|
||||
whereSql += sql.first;
|
||||
bindValues.append(sql.second);
|
||||
}
|
||||
|
||||
QString prepSql;
|
||||
QString sortSql = createSortSql(query.getSortConditions());
|
||||
if(isContentSearch)
|
||||
{
|
||||
if(sortSql.isEmpty())
|
||||
{
|
||||
sortSql = "ORDER BY file.mtime DESC, content.page ASC";
|
||||
}
|
||||
prepSql = "SELECT file.path AS path, group_concat(content.page) AS pages, file.mtime AS mtime, file.size AS size, file.filetype AS filetype FROM file INNER JOIN content ON file.id = content.fileid WHERE 1=1 AND " + whereSql + " GROUP BY file.path " + sortSql;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(sortSql.isEmpty())
|
||||
{
|
||||
sortSql = "ORDER BY file.mtime DESC";
|
||||
}
|
||||
prepSql = "SELECT file.path AS path, '0' as pages, file.mtime AS mtime, file.size AS size, file.filetype AS filetype FROM file WHERE 1=1 AND " + whereSql + " " + sortSql;
|
||||
}
|
||||
QString prepSql;
|
||||
QString sortSql = createSortSql(query.getSortConditions());
|
||||
if(isContentSearch)
|
||||
{
|
||||
if(sortSql.isEmpty())
|
||||
{
|
||||
sortSql = "ORDER BY file.mtime DESC, content.page ASC";
|
||||
}
|
||||
prepSql =
|
||||
"SELECT file.path AS path, group_concat(content.page) AS pages, file.mtime AS mtime, file.size AS size, "
|
||||
"file.filetype AS filetype FROM file INNER JOIN content ON file.id = content.fileid WHERE 1=1 AND " +
|
||||
whereSql + " GROUP BY file.path " + sortSql;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(sortSql.isEmpty())
|
||||
{
|
||||
sortSql = "ORDER BY file.mtime DESC";
|
||||
}
|
||||
prepSql = "SELECT file.path AS path, '0' as pages, file.mtime AS mtime, file.size AS size, file.filetype AS "
|
||||
"filetype FROM file WHERE 1=1 AND " +
|
||||
whereSql + " " + sortSql;
|
||||
}
|
||||
|
||||
QSqlQuery dbquery(*db);
|
||||
dbquery.prepare(prepSql);
|
||||
for(const QString &value : bindValues)
|
||||
{
|
||||
if(value != "")
|
||||
{
|
||||
dbquery.addBindValue(value);
|
||||
}
|
||||
}
|
||||
return dbquery;
|
||||
QSqlQuery dbquery(*db);
|
||||
dbquery.prepare(prepSql);
|
||||
for(const QString &value : bindValues)
|
||||
{
|
||||
if(value != "")
|
||||
{
|
||||
dbquery.addBindValue(value);
|
||||
}
|
||||
}
|
||||
return dbquery;
|
||||
}
|
||||
|
||||
|
||||
|
||||
QVector<SearchResult> SqliteSearch::search(const QSSQuery &query)
|
||||
{
|
||||
QVector<SearchResult> results;
|
||||
QSqlQuery dbQuery = makeSqlQuery(query);
|
||||
bool success = dbQuery.exec();
|
||||
if(!success)
|
||||
{
|
||||
QVector<SearchResult> results;
|
||||
QSqlQuery dbQuery = makeSqlQuery(query);
|
||||
bool success = dbQuery.exec();
|
||||
if(!success)
|
||||
{
|
||||
|
||||
qDebug() << dbQuery.lastError();
|
||||
qDebug() << dbQuery.executedQuery();
|
||||
throw QSSGeneralException("SQL Error: " + dbQuery.lastError().text());
|
||||
}
|
||||
qDebug() << dbQuery.lastError();
|
||||
qDebug() << dbQuery.executedQuery();
|
||||
throw QSSGeneralException("SQL Error: " + dbQuery.lastError().text());
|
||||
}
|
||||
|
||||
while(dbQuery.next())
|
||||
{
|
||||
SearchResult result;
|
||||
result.fileData.absPath = dbQuery.value("path").toString();
|
||||
result.fileData.mtime = dbQuery.value("mtime").toUInt();
|
||||
result.fileData.size = dbQuery.value("size").toUInt();
|
||||
result.fileData.filetype = dbQuery.value("filetype").toChar();
|
||||
QString pages = dbQuery.value("pages").toString();
|
||||
QStringList pagesList = pages.split(",");
|
||||
for(QString &page : pagesList)
|
||||
{
|
||||
if(page != "")
|
||||
{
|
||||
result.pages.append(page.toUInt());
|
||||
}
|
||||
}
|
||||
results.append(result);
|
||||
}
|
||||
return results;
|
||||
while(dbQuery.next())
|
||||
{
|
||||
SearchResult result;
|
||||
result.fileData.absPath = dbQuery.value("path").toString();
|
||||
result.fileData.mtime = dbQuery.value("mtime").toUInt();
|
||||
result.fileData.size = dbQuery.value("size").toUInt();
|
||||
result.fileData.filetype = dbQuery.value("filetype").toChar();
|
||||
QString pages = dbQuery.value("pages").toString();
|
||||
QStringList pagesList = pages.split(",");
|
||||
for(QString &page : pagesList)
|
||||
{
|
||||
if(page != "")
|
||||
{
|
||||
result.pages.append(page.toUInt());
|
||||
}
|
||||
}
|
||||
results.append(result);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user