From ad03bf36da1549e33d0908d132c84cbb411598f5 Mon Sep 17 00:00:00 2001 From: Adam Vartanian Date: Tue, 14 Oct 2014 16:24:42 -0400 Subject: [PATCH] Add a fast-path setSelection() if the points are in the expected place. In most cases, the appropriate index will contain the point that should be selected, so check that and use that point if so. Otherwise, search for a matching point. Also add a test that tests the case where the appropriate index doesn't contain the point we're looking for. --- auto_tests/tests/selection.js | 40 ++++++++++++++++++++++++++++++++++++++++ dygraph.js | 21 +++++++++++++++------ 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/auto_tests/tests/selection.js b/auto_tests/tests/selection.js index 2e68c1f..ff220f6 100644 --- a/auto_tests/tests/selection.js +++ b/auto_tests/tests/selection.js @@ -48,3 +48,43 @@ SelectionTestCase.prototype.testSetGetSelectionDense = function() { g.setSelection(3); assertEquals(3, g.getSelection()); }; + +SelectionTestCase.prototype.testSetGetSelectionMissingPoints = function() { + dataHandler = function() {}; + dataHandler.prototype = new Dygraph.DataHandlers.DefaultHandler(); + dataHandler.prototype.seriesToPoints = function(series, setName, boundaryIdStart) { + var val = null; + if (setName == 'A') { + val = 1; + } else if (setName == 'B') { + val = 2; + } else if (setName == 'C') { + val = 3; + } + return [{ + x: NaN, + y: NaN, + xval: val, + yval: val, + name: setName, + idx: val - 1 + }]; + }; + var graph = document.getElementById("graph"); + var g = new Dygraph(graph, + "X,A,B,C\n" + + "1,1,null,null\n" + + "2,null,2,null\n" + + "3,null,null,3\n", + { + dataHandler: dataHandler + } + ); + + g.setSelection(0); + assertEquals(0, g.getSelection()); + g.setSelection(1); + assertEquals(1, g.getSelection()); + g.setSelection(2); + assertEquals(2, g.getSelection()); +}; diff --git a/dygraph.js b/dygraph.js index 2fc527d..06d899a 100644 --- a/dygraph.js +++ b/dygraph.js @@ -2156,13 +2156,22 @@ Dygraph.prototype.setSelection = function(row, opt_seriesName, opt_locked) { this.lastRow_ = row; for (var setIdx = 0; setIdx < this.layout_.points.length; ++setIdx) { var points = this.layout_.points[setIdx]; - for (var pointIdx = 0; pointIdx < points.length; ++pointIdx) { - var point = points[pointIdx]; - if (point.idx == row) { - if (point.yval !== null) { - this.selPoints_.push(point); + // Check if the point at the appropriate index is the point we're looking + // for. If it is, just use it, otherwise search the array for a point + // in the proper place. + var setRow = row - this.getLeftBoundary_(setIdx); + if (setRow < points.length && points[setRow].idx == row) { + var point = points[setRow]; + if (point.yval !== null) this.selPoints_.push(point); + } else { + for (var pointIdx = 0; pointIdx < points.length; ++pointIdx) { + var point = points[pointIdx]; + if (point.idx == row) { + if (point.yval !== null) { + this.selPoints_.push(point); + } + break; } - break; } } } -- 2.7.4