diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml index cd4172576..a9dfc5250 100644 --- a/.idea/dataSources.xml +++ b/.idea/dataSources.xml @@ -5,7 +5,7 @@ sqlite.xerial true org.sqlite.JDBC - jdbc:sqlite:$PROJECT_DIR$/../trilium-data/document.db + jdbc:sqlite:$USER_HOME$/trilium-data/document.db sqlite.xerial diff --git a/src/services/build_search_query.js b/src/services/build_search_query.js index 6060daf6a..a7867aa03 100644 --- a/src/services/build_search_query.js +++ b/src/services/build_search_query.js @@ -12,9 +12,7 @@ const VIRTUAL_ATTRIBUTES = [ "type", "mime", "text", - "parentCount", - "attributeName", - "attributeValue" + "parentCount" ]; module.exports = function(filters, selectedColumns = 'notes.*') { @@ -35,29 +33,11 @@ module.exports = function(filters, selectedColumns = 'notes.*') { // forcing to use particular index since SQLite query planner would often choose something pretty bad joins[alias] = `LEFT JOIN attributes AS ${alias} INDEXED BY IDX_attributes_noteId_index ` - + `ON ${alias}.noteId = notes.noteId AND ${alias}.isDeleted = 0 ` - + `AND ${alias}.name = '${property}' `; + + `ON ${alias}.noteId = notes.noteId ` + + `AND ${alias}.name = '${property}' AND ${alias}.isDeleted = 0`; accessor = `${alias}.value`; } - else if (['attributeType', 'attributeName', 'attributeValue'].includes(property)) { - const alias = "attr_filter"; - - if (!(alias in joins)) { - joins[alias] = `LEFT JOIN attributes AS ${alias} INDEXED BY IDX_attributes_noteId_index ` - + `ON ${alias}.noteId = notes.noteId AND ${alias}.isDeleted = 0`; - } - - if (property === 'attributeType') { - accessor = `${alias}.type` - } else if (property === 'attributeName') { - accessor = `${alias}.name` - } else if (property === 'attributeValue') { - accessor = `${alias}.value` - } else { - throw new Error(`Unrecognized property ${property}`); - } - } else if (property === 'content') { const alias = "note_contents"; @@ -93,40 +73,33 @@ module.exports = function(filters, selectedColumns = 'notes.*') { }); } + let where = '1'; const params = []; - function parseWhereFilters(filters) { - let whereStmt = ''; - for (const filter of filters) { if (['isarchived', 'in', 'orderby', 'limit'].includes(filter.name.toLowerCase())) { continue; // these are not real filters } - if (whereStmt) { - whereStmt += " " + filter.relation + " "; - } - - if (filter.children) { - whereStmt += "(" + parseWhereFilters(filter.children) + ")"; - continue; - } + where += " " + filter.relation + " "; const accessor = getAccessor(filter.name); if (filter.operator === 'exists') { - whereStmt += `${accessor} IS NOT NULL`; - } else if (filter.operator === 'not-exists') { - whereStmt += `${accessor} IS NULL`; - } else if (filter.operator === '=' || filter.operator === '!=') { - whereStmt += `${accessor} ${filter.operator} ?`; + where += `${accessor} IS NOT NULL`; + } + else if (filter.operator === 'not-exists') { + where += `${accessor} IS NULL`; + } + else if (filter.operator === '=' || filter.operator === '!=') { + where += `${accessor} ${filter.operator} ?`; params.push(filter.value); } else if (filter.operator === '*=' || filter.operator === '!*=') { - whereStmt += `${accessor}` + where += `${accessor}` + (filter.operator.includes('!') ? ' NOT' : '') + ` LIKE ` + utils.prepareSqlForLike('%', filter.value, ''); } else if (filter.operator === '=*' || filter.operator === '!=*') { - whereStmt += `${accessor}` + where += `${accessor}` + (filter.operator.includes('!') ? ' NOT' : '') + ` LIKE ` + utils.prepareSqlForLike('', filter.value, '%'); } else if (filter.operator === '*=*' || filter.operator === '!*=*') { @@ -145,8 +118,9 @@ module.exports = function(filters, selectedColumns = 'notes.*') { condition = `(${condition} AND notes.isProtected = 0)`; } - whereStmt += condition; - } else if ([">", ">=", "<", "<="].includes(filter.operator)) { + where += condition; + } + else if ([">", ">=", "<", "<="].includes(filter.operator)) { let floatParam; // from https://stackoverflow.com/questions/12643009/regular-expression-for-floating-point-numbers @@ -156,10 +130,10 @@ module.exports = function(filters, selectedColumns = 'notes.*') { if (floatParam === undefined || isNaN(floatParam)) { // if the value can't be parsed as float then we assume that string comparison should be used instead of numeric - whereStmt += `${accessor} ${filter.operator} ?`; + where += `${accessor} ${filter.operator} ?`; params.push(filter.value); } else { - whereStmt += `CAST(${accessor} AS DECIMAL) ${filter.operator} ?`; + where += `CAST(${accessor} AS DECIMAL) ${filter.operator} ?`; params.push(floatParam); } } else { @@ -167,11 +141,6 @@ module.exports = function(filters, selectedColumns = 'notes.*') { } } - return whereStmt; - } - - const where = parseWhereFilters(filters); - if (orderBy.length === 0) { // if no ordering is given then order at least by note title orderBy.push("notes.title"); diff --git a/src/services/parse_filters.js b/src/services/parse_filters.js index cccec35bb..412c9b527 100644 --- a/src/services/parse_filters.js +++ b/src/services/parse_filters.js @@ -60,20 +60,6 @@ module.exports = function (searchText) { operator: '*=*', value: searchText }); - - filters.push({ - relation: 'or', - name: 'attributeName', - operator: '*=*', - value: searchText - }); - - filters.push({ - relation: 'or', - name: 'attributeValue', - operator: '*=*', - value: searchText - }); } else { const tokens = searchText.split(/\s+/); @@ -81,27 +67,9 @@ module.exports = function (searchText) { for (const token of tokens) { filters.push({ relation: 'and', - name: 'sub', - children: [ - { - relation: 'or', name: 'text', operator: '*=*', value: token - }, - { - relation: 'or', - name: 'attributeName', - operator: '*=*', - value: token - }, - { - relation: 'or', - name: 'attributeValue', - operator: '*=*', - value: token - } - ] }); } }