From c57280a01672a85e79720341c8e5773ea8e2ad58 Mon Sep 17 00:00:00 2001 From: David Glasser Date: Fri, 13 Jun 2014 18:21:03 -0700 Subject: [PATCH] refactor catalog.version to do more O(1) stuff --- tools/catalog-base.js | 27 +++++++++++++++++++-------- tools/catalog.js | 21 ++++++++++++--------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/tools/catalog-base.js b/tools/catalog-base.js index b167727685..40112cd4d2 100644 --- a/tools/catalog-base.js +++ b/tools/catalog-base.js @@ -24,9 +24,9 @@ var baseCatalog = exports; baseCatalog.BaseCatalog = function () { var self = this; - // Package server data. Arrays of objects. + // Package server data. Mostly arrays of objects. self.packages = null; - self.versions = null; + self.versions = null; // package name -> version -> object self.builds = null; self.releaseTracks = null; self.releaseVersions = null; @@ -49,7 +49,7 @@ _.extend(baseCatalog.BaseCatalog.prototype, { // Initialize everything to its default version. self.packages = []; - self.versions = []; + self.versions = {}; self.builds = []; self.releaseTracks = []; self.releaseVersions = []; @@ -76,10 +76,18 @@ _.extend(baseCatalog.BaseCatalog.prototype, { return; _.each( - ['packages', 'versions', 'builds', 'releaseTracks', 'releaseVersions'], + ['packages', 'builds', 'releaseTracks', 'releaseVersions'], function (field) { self[field].push.apply(self[field], collections[field]); }); + + // Convert versions from array format to nested object format. + _.each(collections.versions, function (record) { + if (!_.has(self.versions, record.packageName)) { + self.versions[record.packageName] = {}; + } + self.versions[record.packageName][record.version] = record; + }); }, // Accessor methods below. The primary function of both catalogs is to provide @@ -183,8 +191,10 @@ _.extend(baseCatalog.BaseCatalog.prototype, { getSortedVersions: function (name) { var self = this; self._requireInitialized(); - var ret = _.pluck(_.where(self.versions, { packageName: name }), - 'version'); + if (!_.has(self.versions, name)) { + return []; + } + var ret = _.keys(self.versions[name]); ret.sort(semver.compare); return ret; }, @@ -208,8 +218,9 @@ _.extend(baseCatalog.BaseCatalog.prototype, { } return self._recordOrRefresh(function () { - return _.findWhere(self.versions, { packageName: name, - version: version }); + return _.has(self.versions, name) && + _.has(self.versions[name], version) && + self.versions[name][version]; }); }, diff --git a/tools/catalog.js b/tools/catalog.js index dc881a57eb..5144d9a96b 100644 --- a/tools/catalog.js +++ b/tools/catalog.js @@ -374,13 +374,13 @@ _.extend(CompleteCatalog.prototype, { // Remove all packages from the catalog that have the same name as // a local package, along with all of their versions and builds. var removedVersionIds = {}; - self.versions = _.filter(self.versions, function (version) { - if (_.has(self.effectiveLocalPackages, version.packageName)) { - // Remove this one - removedVersionIds[version._id] = true; - return false; - } - return true; + _.each(self.effectiveLocalPackages, function (dir, packageName) { + if (!_.has(self.versions, packageName)) + return; + _.each(self.versions[packageName], function (record) { + removedVersionIds[record._id] = true; + }); + delete self.versions[packageName]; }); self.builds = _.filter(self.builds, function (build) { @@ -465,7 +465,10 @@ _.extend(CompleteCatalog.prototype, { throw new Error("version already has a buildid?"); version = version + "+local"; - self.versions.push({ + if (_.has(self.versions, name)) + throw Error("should have deleted " + name + " above?"); + self.versions[name] = {}; + self.versions[name][version] = { _id: versionId, packageName: name, testName: packageSource.testName, @@ -480,7 +483,7 @@ _.extend(CompleteCatalog.prototype, { published: null, isTest: packageSource.isTest, containsPlugins: packageSource.containsPlugins() - }); + }; // Test packages are not allowed to have tests. Any time we recurse into // this function, it will be with test marked as true, so recursion