From 495b74f52ed6d22d8def7e91a7c5dc23aef40894 Mon Sep 17 00:00:00 2001 From: missinglink Date: Fri, 3 Dec 2021 17:29:01 +0100 Subject: [PATCH] feat(perf): rewrite query for performance --- lib/Queries.js | 8 ++-- .../match_subject_object_geom_intersects.sql | 47 ++++++++++--------- ...ct_object_geom_intersects_autocomplete.sql | 25 ---------- 3 files changed, 29 insertions(+), 51 deletions(-) delete mode 100644 query/match_subject_object_geom_intersects_autocomplete.sql diff --git a/lib/Queries.js b/lib/Queries.js index 5be380fa..9e0e4663 100644 --- a/lib/Queries.js +++ b/lib/Queries.js @@ -152,9 +152,9 @@ module.exports.matchSubjectObjectGeomIntersects = function( subject, object, cb if( '' === object.trim() ){ return cb( null, [] ); } this._queryAll( - this.prepare( query.match_subject_object_geom_intersects_autocomplete ), + this.prepare( query.match_subject_object_geom_intersects ), { - subject: subject, + subject: `"${subject}"`, object: `"${object}" OR "${object}"*`, threshold: RTREE_THRESHOLD, limit: MAX_RESULTS @@ -163,9 +163,9 @@ module.exports.matchSubjectObjectGeomIntersects = function( subject, object, cb ); } else { this._queryAll( - this.prepare( query.match_subject_object_geom_intersects_autocomplete ), + this.prepare( query.match_subject_object_geom_intersects ), { - subject: subject, + subject: `"${subject}"`, object: `"${object}"`, threshold: RTREE_THRESHOLD, limit: MAX_RESULTS diff --git a/query/match_subject_object_geom_intersects.sql b/query/match_subject_object_geom_intersects.sql index 95560335..8dd94c03 100644 --- a/query/match_subject_object_geom_intersects.sql +++ b/query/match_subject_object_geom_intersects.sql @@ -1,24 +1,27 @@ -SELECT t1.id AS subjectId, t2.id as objectId -FROM rtree AS r1, rtree AS r2 - JOIN tokens AS t1 ON t1.id = r1.id - JOIN tokens AS t2 ON t2.id = r2.id -WHERE t1.token = $subject -AND t2.token = $object -AND ( - t1.lang = t2.lang OR - t1.lang IN ( 'eng', 'und' ) OR - t2.lang IN ( 'eng', 'und' ) -) --- https://silentmatt.com/rectangle-intersection/ -AND ( - r1.maxZ < r2.minZ AND - r1.minX - $threshold < r2.maxX AND - r1.maxX + $threshold > r2.minX AND - r1.minY - $threshold < r2.maxY AND - r1.maxY + $threshold > r2.minY -) --- AND t1.tag NOT IN ( 'colloquial' ) --- AND t2.tag NOT IN ( 'colloquial' ) +SELECT + t1.id AS subjectId, + t2.id as objectId +FROM fulltext f1 + JOIN tokens t1 ON f1.rowid = t1.rowid + JOIN rtree AS r1 ON t1.id = r1.id + JOIN rtree AS r2 ON ( + r1.maxZ < r2.minZ AND + (r1.minX - $threshold) < r2.maxX AND + (r1.maxX + $threshold) > r2.minX AND + (r1.minY - $threshold) < r2.maxY AND + (r1.maxY + $threshold) > r2.minY + ) + JOIN fulltext AS f2 ON f2.fulltext MATCH $object + JOIN tokens t2 ON ( + f2.rowid = t2.rowid + AND r2.id = t2.id + AND ( + t1.lang = t2.lang OR + t1.lang IN ('eng', 'und') OR + t2.lang IN ('eng', 'und') + ) + ) +WHERE f1.fulltext MATCH $subject GROUP BY t1.id, t2.id ORDER BY t1.id ASC, t2.id ASC -LIMIT $limit \ No newline at end of file +LIMIT $limit diff --git a/query/match_subject_object_geom_intersects_autocomplete.sql b/query/match_subject_object_geom_intersects_autocomplete.sql deleted file mode 100644 index d167c2b3..00000000 --- a/query/match_subject_object_geom_intersects_autocomplete.sql +++ /dev/null @@ -1,25 +0,0 @@ -SELECT t1.id AS subjectId, t2.id as objectId -FROM rtree AS r1, rtree AS r2 - JOIN tokens AS t1 ON t1.id = r1.id - JOIN tokens AS t2 ON t2.id = r2.id - JOIN fulltext AS f2 ON f2.rowid = t2.rowid -WHERE t1.token = $subject -AND f2.fulltext MATCH $object -AND ( - t1.lang = t2.lang OR - t1.lang IN ( 'eng', 'und' ) OR - t2.lang IN ( 'eng', 'und' ) -) --- https://silentmatt.com/rectangle-intersection/ -AND ( - r1.maxZ < r2.minZ AND - r1.minX - $threshold < r2.maxX AND - r1.maxX + $threshold > r2.minX AND - r1.minY - $threshold < r2.maxY AND - r1.maxY + $threshold > r2.minY -) --- AND t1.tag NOT IN ( 'colloquial' ) --- AND t2.tag NOT IN ( 'colloquial' ) -GROUP BY t1.id, t2.id -ORDER BY t1.id ASC, t2.id ASC -LIMIT $limit