From 9c1dfaf0d5b535ddb325fed42770ca0db563f4ec Mon Sep 17 00:00:00 2001 From: Anand Thakker Date: Fri, 15 Jul 2016 07:57:31 -0400 Subject: [PATCH 1/4] Pre-filter sources for queryRenderFeatures --- js/style/style.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/js/style/style.js b/js/style/style.js index 5cfb5d1ed57..0dc65868d5f 100644 --- a/js/style/style.js +++ b/js/style/style.js @@ -638,7 +638,16 @@ Style.prototype = util.inherit(Evented, { } var sourceResults = []; - for (var id in this.sources) { + var sourcesToQuery = {}; + if (params.layers) { + for (var i = 0; i < params.layers.length; i++) { + var sourceId = this._layers[params.layers[i]].source; + sourcesToQuery[sourceId] = true; + } + } else { + sourcesToQuery = this.sources; + } + for (var id in sourcesToQuery) { var source = this.sources[id]; if (source.queryRenderedFeatures) { sourceResults.push(source.queryRenderedFeatures(queryGeometry, params, zoom, bearing)); From 5d83654fd451e2585a18d5d998118e9c824c2654 Mon Sep 17 00:00:00 2001 From: Anand Thakker Date: Fri, 15 Jul 2016 08:16:07 -0400 Subject: [PATCH 2/4] Fix and add Style#queryRenderedFeature tests --- test/js/style/style.test.js | 38 ++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/test/js/style/style.test.js b/test/js/style/style.test.js index 3aab22335b0..b7955aad044 100644 --- a/test/js/style/style.test.js +++ b/test/js/style/style.test.js @@ -906,6 +906,10 @@ test('Style#queryRenderedFeatures', function(t) { "mapbox": { "type": "vector", "tiles": ["local://tiles/{z}-{x}-{y}.vector.pbf"] + }, + "other": { + "type": "vector", + "tiles": ["local://tiles/{z}-{x}-{y}.vector.pbf"] } }, "layers": [{ @@ -928,6 +932,20 @@ test('Style#queryRenderedFeatures', function(t) { "paint": { "line-color": "blue" } + }, { + "id": "land--other", + "type": "line", + "source": "other", + "source-layer": "water", + "layout": { + 'line-cap': 'round' + }, + "paint": { + "line-color": "red" + }, + "metadata": { + "something": "else" + } }] }); @@ -935,6 +953,18 @@ test('Style#queryRenderedFeatures', function(t) { style._applyClasses([]); style._recalculate(0); + style.sources.other.queryRenderedFeatures = function(position, params) { + var features = {'land--other': []}; + if (params.layers) { + for (var l in features) { + if (params.layers.indexOf(l) < 0) { + delete features[l]; + } + } + } + return features; + }; + style.sources.mapbox.queryRenderedFeatures = function(position, params) { var features = { 'land': [{ @@ -977,7 +1007,7 @@ test('Style#queryRenderedFeatures', function(t) { }); t.test('filters by `layers` option', function(t) { - var results = style.queryRenderedFeatures([{column: 1, row: 1, zoom: 1}], {layers: 'land'}, 0, 0); + var results = style.queryRenderedFeatures([{column: 1, row: 1, zoom: 1}], {layers: ['land']}, 0, 0); t.equal(results.length, 2); t.end(); }); @@ -1021,6 +1051,12 @@ test('Style#queryRenderedFeatures', function(t) { t.end(); }); + t.test('does not query sources not implicated by `layers` parameter', function (t) { + style.sources.mapbox.queryRenderedFeatures = function() { t.fail(); }; + style.queryRenderedFeatures([{column: 1, row: 1, zoom: 1}], {layers: ['land--other']}); + t.end(); + }); + t.end(); }); }); From 074ed66d5c884b82e35a0f10814b2339cfe8373a Mon Sep 17 00:00:00 2001 From: Anand Thakker Date: Mon, 18 Jul 2016 15:14:13 -0400 Subject: [PATCH 3/4] Simplify logic --- js/style/style.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/js/style/style.js b/js/style/style.js index 0dc65868d5f..20ad50b84c4 100644 --- a/js/style/style.js +++ b/js/style/style.js @@ -637,17 +637,15 @@ Style.prototype = util.inherit(Evented, { this._handleErrors(validateStyle.filter, 'queryRenderedFeatures.filter', params.filter, true); } - var sourceResults = []; - var sourcesToQuery = {}; + var includedSources; if (params.layers) { - for (var i = 0; i < params.layers.length; i++) { - var sourceId = this._layers[params.layers[i]].source; - sourcesToQuery[sourceId] = true; - } - } else { - sourcesToQuery = this.sources; + var styleLayers = this._layers; + includedSources = params.layers.map(function (layerId) { return styleLayers[layerId].source; }); } - for (var id in sourcesToQuery) { + + var sourceResults = []; + for (var id in this.sources) { + if (includedSources && includedSources.indexOf(id) < 0) continue; var source = this.sources[id]; if (source.queryRenderedFeatures) { sourceResults.push(source.queryRenderedFeatures(queryGeometry, params, zoom, bearing)); From 2620688adb02cd41b2763a610ccbdb771705446e Mon Sep 17 00:00:00 2001 From: Lucas Wojciechowski Date: Mon, 18 Jul 2016 13:57:17 -0700 Subject: [PATCH 4/4] Restore O(# layers) perf --- js/style/style.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/js/style/style.js b/js/style/style.js index 20ad50b84c4..193b265f145 100644 --- a/js/style/style.js +++ b/js/style/style.js @@ -637,15 +637,17 @@ Style.prototype = util.inherit(Evented, { this._handleErrors(validateStyle.filter, 'queryRenderedFeatures.filter', params.filter, true); } - var includedSources; + var includedSources = {}; if (params.layers) { - var styleLayers = this._layers; - includedSources = params.layers.map(function (layerId) { return styleLayers[layerId].source; }); + for (var i = 0; i < params.layers.length; i++) { + var layerId = params.layers[i]; + includedSources[this._layers[layerId].source] = true; + } } var sourceResults = []; for (var id in this.sources) { - if (includedSources && includedSources.indexOf(id) < 0) continue; + if (params.layers && !includedSources[id]) continue; var source = this.sources[id]; if (source.queryRenderedFeatures) { sourceResults.push(source.queryRenderedFeatures(queryGeometry, params, zoom, bearing));