From 9ebc9a22e9e5381426cbb86af8c169d23c899dc4 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 12 Feb 2019 14:22:31 -0500 Subject: [PATCH] perf: use Object instead of Array for lookup, cache on osmEntity.key --- modules/core/validator.js | 39 +++++++++++++++++-------------------- modules/ui/entity_issues.js | 2 +- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/modules/core/validator.js b/modules/core/validator.js index c38dd0170..5935733ce 100644 --- a/modules/core/validator.js +++ b/modules/core/validator.js @@ -64,36 +64,35 @@ export function coreValidator(context) { self.getIssuesForEntityWithID = function(entityID) { if (!context.hasEntity(entityID)) return []; + var entity = context.entity(entityID); + var key = osmEntity.key(entity); - // if (!_issuesByEntityID[entityID]) { - var entity = context.entity(entityID); - _issuesByEntityID[entityID] = validateEntity(entity); - // } - return _issuesByEntityID[entityID]; + if (!_issuesByEntityID[key]) { + _issuesByEntityID[key] = validateEntity(entity); + } + return _issuesByEntityID[key]; }; function validateEntity(entity) { var _issues = []; - var ranValidations = []; + var ran = {}; // runs validation and appends resulting issues, returning true if validation passed - function runValidation(type) { - // only run each validation once - if (ranValidations.indexOf(type) === -1) { - var fn = validations[type]; - var typeIssues = fn(entity, context); - _issues = _issues.concat(typeIssues); - ranValidations.push(type); // mark this validation as having run - return typeIssues.length === 0; - } - return true; + function runValidation(which) { + if (ran[which]) return true; + + var fn = validations[which]; + var typeIssues = fn(entity, context); + _issues = _issues.concat(typeIssues); + ran[which] = true; // mark this validation as having run + return !typeIssues.length; } if (entity.type === 'relation') { if (!runValidation('old_multipolygon')) { // don't flag missing tags if they are on the outer way - ranValidations.push('missing_tag'); + ran.missing_tag = true; } } @@ -107,16 +106,14 @@ export function coreValidator(context) { if (runValidation('almost_junction')) { runValidation('disconnected_way'); } else { - ranValidations.push('disconnected_way'); + ran.disconnected_way = true; } runValidation('tag_suggests_area'); } // run all validations not yet run manually - entityValidationIDs.forEach(function(id) { - runValidation(id); - }); + entityValidationIDs.forEach(runValidation); return _issues; } diff --git a/modules/ui/entity_issues.js b/modules/ui/entity_issues.js index 023f72614..2006acb48 100644 --- a/modules/ui/entity_issues.js +++ b/modules/ui/entity_issues.js @@ -5,7 +5,7 @@ import { t } from '../util/locale'; import { tooltip } from '../util/tooltip'; import { uiDisclosure } from './disclosure'; import { uiTooltipHtml } from './tooltipHtml'; -import { utilRebind, utilHighlightEntities } from '../util'; +import { utilHighlightEntities } from '../util'; export function uiEntityIssues(context) {