From 1330bb615e7f42a130b578f0ab79be7c0fa1765e Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Wed, 9 Apr 2014 11:39:20 +0200 Subject: [PATCH 1/3] [IMP] massive optimization of the graph view code: more efficient access to values and smarter code to avoid reading uselessly many cells (graph view in web_graph) bzr revid: ged@openerp.com-20140409093920-xqls2o6j6tocgf6l --- addons/web_graph/static/src/js/graph_widget.js | 17 +++++++++++++++-- addons/web_graph/static/src/js/pivot_table.js | 13 +++++++++---- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/addons/web_graph/static/src/js/graph_widget.js b/addons/web_graph/static/src/js/graph_widget.js index 3d8d8fa2d98..317ea6cbfb9 100644 --- a/addons/web_graph/static/src/js/graph_widget.js +++ b/addons/web_graph/static/src/js/graph_widget.js @@ -453,12 +453,25 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({ build_rows: function (raw) { var self = this, pivot = this.pivot, - m, cell; + m, i, cell; return _.map(pivot.rows.headers, function (row) { var cells = []; + var pivot_cells = []; + for (i = 0; i < pivot.cells.length; i++) { + if (pivot.cells[i].x == row.id || pivot.cells[i].y == row.id) { + pivot_cells.push(pivot.cells[i]); + } + } _.each(pivot.get_cols_leaves(), function (col) { - var values = pivot.get_values(row.id,col.id); + var values; + for (i = 0; i < pivot_cells.length; i++) { + if (pivot_cells[i].x == col.id || pivot_cells[i].y == col.id) { + values = pivot_cells[i].values; + break; + } + } + if (!values) { values = new Array(pivot.measures.length);} for (m = 0; m < pivot.measures.length; m++) { cells.push(self.make_cell(row,col,values[m], m, raw)); } diff --git a/addons/web_graph/static/src/js/pivot_table.js b/addons/web_graph/static/src/js/pivot_table.js index d0867ca6d1a..d53c972a742 100644 --- a/addons/web_graph/static/src/js/pivot_table.js +++ b/addons/web_graph/static/src/js/pivot_table.js @@ -81,10 +81,15 @@ openerp.web_graph.PivotTable = openerp.web.Class.extend({ }, get_values: function (id1, id2, default_values) { - var cell = _.findWhere(this.cells, {x: Math.min(id1, id2), y: Math.max(id1, id2)}); - return (cell !== undefined) ? - cell.values : - (default_values || new Array(this.measures.length)); + var cells = this.cells, + x = Math.min(id1, id2), + y = Math.max(id1, id2); + for (var i = 0; i < cells.length; i++) { + if (cells[i].x == x && cells[i].y == y) { + return cells[i].values; + } + } + return (default_values || new Array(this.measures.length)); }, // ---------------------------------------------------------------------- From 281c19a751be815f353cbda10c09ac055e5d9594 Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Wed, 9 Apr 2014 14:36:28 +0200 Subject: [PATCH 2/3] [FIX] correctly determines when there is no data to read in graph view (instead of the good old crash) (addon web_graph) bzr revid: ged@openerp.com-20140409123628-erw8dpb2l36l7hu6 --- addons/web_graph/static/src/js/pivot_table.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web_graph/static/src/js/pivot_table.js b/addons/web_graph/static/src/js/pivot_table.js index d53c972a742..6fc9cf2b12b 100644 --- a/addons/web_graph/static/src/js/pivot_table.js +++ b/addons/web_graph/static/src/js/pivot_table.js @@ -253,7 +253,7 @@ openerp.web_graph.PivotTable = openerp.web.Class.extend({ var self = this; return this.perform_requests().then (function () { var data = Array.prototype.slice.call(arguments); - self.no_data = !data[0][0].attributes.length; + self.no_data = !data[0].length; if (self.no_data) { return; } From f966931b879a1ed3cdc54b644c2e73456244c201 Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Wed, 9 Apr 2014 16:57:35 +0200 Subject: [PATCH 3/3] [IMP] performance improvement: write a custom isEqual function to use instead of _.isEqual to make the code faster in graph view (isEqual was determined guilty of being slow by profiling on a large view) (addon web_graph) bzr revid: ged@openerp.com-20140409145735-m21t2fzmaepr1hsa --- addons/web_graph/static/src/js/pivot_table.js | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/addons/web_graph/static/src/js/pivot_table.js b/addons/web_graph/static/src/js/pivot_table.js index 6fc9cf2b12b..6b12829982e 100644 --- a/addons/web_graph/static/src/js/pivot_table.js +++ b/addons/web_graph/static/src/js/pivot_table.js @@ -281,7 +281,7 @@ openerp.web_graph.PivotTable = openerp.web.Class.extend({ var row_value = (prefix || []).concat(data_pt.attributes.value.slice(0,index)); var col_value = data_pt.attributes.value.slice(index); - if (expand && !_.find(col_headers, function (hdr) {return _.isEqual(col_value, hdr.path);})) { + if (expand && !_.find(col_headers, function (hdr) {return self.isEqual(col_value, hdr.path);})) { return; } var row = self.find_or_create_header(row_headers, row_value, data_pt); @@ -311,8 +311,9 @@ openerp.web_graph.PivotTable = openerp.web.Class.extend({ }, find_or_create_header: function (headers, path, data_pt) { + var self = this; var hdr = _.find(headers, function (header) { - return _.isEqual(path, header.path); + return self.isEqual(path, header.path); }); if (hdr) { return hdr; @@ -328,7 +329,7 @@ openerp.web_graph.PivotTable = openerp.web.Class.extend({ title: _t(_.last(path)) }); var parent = _.find(headers, function (header) { - return _.isEqual(header.path, _.initial(path, 1)); + return self.isEqual(header.path, _.initial(path, 1)); }); var previous = parent.children.length ? _.last(parent.children) : parent; @@ -360,10 +361,11 @@ openerp.web_graph.PivotTable = openerp.web.Class.extend({ // set the 'expanded' status of new_headers more or less like root.headers, with root as root set_headers: function(new_headers, root) { + var self = this; if (root.headers) { _.each(root.headers, function (header) { var corresponding_header = _.find(new_headers, function (h) { - return _.isEqual(h.path, header.path); + return self.isEqual(h.path, header.path); }); if (corresponding_header && header.expanded) { corresponding_header.expanded = true; @@ -431,6 +433,16 @@ openerp.web_graph.PivotTable = openerp.web.Class.extend({ return field.split(':')[0]; }, + isEqual: function (path1, path2) { + if (path1.length !== path2.length) { return false; } + for (var i = 0; i < path1.length; i++) { + if (path1[i] !== path2[i]) { + return false; + } + } + return true; + }, + }); })();