[pgAdmin][RM4570] Tree improvement to improve speed of finding a node

Aditya Toshniwal <[email protected]>
Newsgroups gmane.comp.db.postgresql.pgadmin.devel
Message-ID <CAM9w-_=AwgSMsfYjP0ZAe1oRb3eg=d1WhrWHq_2L=qjhWni3rg@mail.gmail.com>
Hi Hackers,

Attached is a tiny but very effective patch to improve the speed of finding
a node using path (used internally).
If you right click or just click on a node, internally the node is
traversed using its path. But currently, it compares with the path of all
the open nodes to find a match.
So if you 1000+ tables and the tables node is open and if you click on a
view, the view path is compared with all the 1000+ tables (and with any
other open nodes above) before arriving to path. You're at bad luck if you
have more open servers above.

Code is changed to check if the path of node to be found starts with the
current node path. If it doesn't match, why bother the children's of
current node.
This change will not show much effect for small data, but it does matter
for large servers.

One more change is to remove unnecessary calls to find node and use the
data available with Main Menu -> Object to enable/disable node context menu
items.

Kindly review.

-- 
Thanks and Regards,
Aditya Toshniwal
Software Engineer | EnterpriseDB India | Pune
"Don't Complain about Heat, Plant a TREE"
RM4570.patch (application/octet-stream, 1.4 KB)
diff --git a/web/pgadmin/browser/static/js/menu.js b/web/pgadmin/browser/static/js/menu.js
index e76c9ed2..3bcba022 100644
--- a/web/pgadmin/browser/static/js/menu.js
+++ b/web/pgadmin/browser/static/js/menu.js
@@ -78,7 +78,12 @@ define([
           data: this.data,
         }).addClass('dropdown-item');
 
-        this.is_disabled = this.disabled(node, item);
+        if(this.context !== undefined) {
+          this.is_disabled = this.context.disabled;
+        } else {
+          this.is_disabled = this.disabled(node, item);
+        }
+
         if (this.icon) {
           url.append($('<i></i>', {
             'class': this.icon,
diff --git a/web/pgadmin/static/js/tree/tree.js b/web/pgadmin/static/js/tree/tree.js
index 2e616be7..c1cec082 100644
--- a/web/pgadmin/static/js/tree/tree.js
+++ b/web/pgadmin/static/js/tree/tree.js
@@ -300,6 +300,15 @@ function findInTree(rootNode, path) {
   }
 
   return (function findInNode(currentNode) {
+
+    /* No point in checking the childrens if
+     * the path for currentNode itself is not matching
+     */
+    if(currentNode.path !== undefined && path !== undefined
+      && !path.startsWith(currentNode.path)) {
+      return null;
+    }
+
     for (let i = 0, length = currentNode.children.length; i < length; i++) {
       const calculatedNode = findInNode(currentNode.children[i]);
       if (calculatedNode !== null) {
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.