From 24ae1ecd63b399f10e7c6543d4df35d7c605e455 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Mon, 25 Feb 2013 15:39:00 -0500 Subject: [PATCH] caching and debouncing at the taginfo level --- js/id/services/taginfo.js | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/js/id/services/taginfo.js b/js/id/services/taginfo.js index 850de9efd..461afe708 100644 --- a/js/id/services/taginfo.js +++ b/js/id/services/taginfo.js @@ -14,6 +14,8 @@ iD.taginfo = function() { line: 'ways' }; + var cache = this.cache = {}; + function sets(parameters, n, o) { if (parameters.geometry && o[parameters.geometry]) { parameters[n] = o[parameters.geometry]; @@ -34,9 +36,9 @@ iD.taginfo = function() { } function popularKeys(parameters) { - var pop_field = 'count_all_fraction'; - if (parameters.filter) pop_field = 'count_' + parameters.filter + '_fraction'; - return function(d) { return parseFloat(d[pop_field]) > 0.01; }; + var pop_field = 'count_all'; + if (parameters.filter) pop_field = 'count_' + parameters.filter; + return function(d) { return parseFloat(d[pop_field]) > 10000; }; } function popularValues(parameters) { @@ -52,9 +54,22 @@ iD.taginfo = function() { }; } + var debounced = _.debounce(d3.json, 100, true); + + function request(url, callback) { + if (cache[url]) { + callback(null, cache[url]); + } else { + debounced(url, function(err, data) { + if (!err) cache[url] = data; + callback(err, data); + }); + } + } + taginfo.keys = function(parameters, callback) { parameters = clean(setSort(setFilter(parameters))); - d3.json(endpoint + 'keys/all?' + + request(endpoint + 'keys/all?' + iD.util.qsString(_.extend({ rp: 6, sortname: 'count_all', @@ -68,7 +83,7 @@ iD.taginfo = function() { taginfo.values = function(parameters, callback) { parameters = clean(setSort(setFilter(parameters))); - d3.json(endpoint + 'key/values?' + + request(endpoint + 'key/values?' + iD.util.qsString(_.extend({ rp: 20, sortname: 'count_all', @@ -82,7 +97,7 @@ iD.taginfo = function() { taginfo.docs = function(parameters, callback) { parameters = clean(setSort(parameters)); - d3.json(endpoint + 'tag/wiki_pages?' + + request(endpoint + 'tag/wiki_pages?' + iD.util.qsString(parameters), callback); };