refactor catalog.version to do more O(1) stuff

This commit is contained in:
David Glasser
2014-06-13 18:21:03 -07:00
parent d2aadf4e54
commit c57280a016
2 changed files with 31 additions and 17 deletions

View File

@@ -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];
});
},

View File

@@ -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