[Add] Cache models on instantiation

...to remove need for Edit to persist these immediately, which in
turn causes #770 and #678
This commit is contained in:
Victor Woeltjen 2016-03-21 10:18:06 -07:00
parent ad4c456ca2
commit 17faf000b0
5 changed files with 86 additions and 12 deletions

View File

@ -27,6 +27,7 @@ define([
"./src/models/StaticModelProvider",
"./src/models/RootModelProvider",
"./src/models/ModelAggregator",
"./src/models/ModelCacheService",
"./src/models/PersistedModelProvider",
"./src/models/CachingModelDecorator",
"./src/models/MissingModelDecorator",
@ -58,6 +59,7 @@ define([
StaticModelProvider,
RootModelProvider,
ModelAggregator,
ModelCacheService,
PersistedModelProvider,
CachingModelDecorator,
MissingModelDecorator,
@ -182,7 +184,10 @@ define([
{
"provides": "modelService",
"type": "decorator",
"implementation": CachingModelDecorator
"implementation": CachingModelDecorator,
"depends": [
"cacheService"
]
},
{
"provides": "modelService",
@ -319,6 +324,7 @@ define([
"key": "persistence",
"implementation": PersistenceCapability,
"depends": [
"cacheService",
"persistenceService",
"identifierService",
"notificationService",
@ -354,6 +360,10 @@ define([
}
],
"services": [
{
"key": "cacheService",
"implementation": ModelCacheService
},
{
"key": "now",
"implementation": Now

View File

@ -46,6 +46,7 @@ define(
* @implements {Capability}
*/
function PersistenceCapability(
cacheService,
persistenceService,
identifierService,
notificationService,
@ -56,6 +57,7 @@ define(
this.modified = domainObject.getModel().modified;
this.domainObject = domainObject;
this.cacheService = cacheService;
this.identifierService = identifierService;
this.persistenceService = persistenceService;
this.notificationService = notificationService;
@ -130,6 +132,7 @@ define(
domainObject = this.domainObject,
model = domainObject.getModel(),
modified = model.modified,
cacheService = this.cacheService,
persistenceService = this.persistenceService,
persistenceFn = model.persisted !== undefined ?
this.persistenceService.updateObject :
@ -146,6 +149,9 @@ define(
getKey(domainObject.getId()),
domainObject.getModel()
]).then(function(result){
if (result) {
cacheService.remove(domainObject.getId());
}
return rejectIfFalsey(result, self.$q);
}).catch(function(error){
return notifyOnError(error, domainObject, self.notificationService, self.$q);

View File

@ -35,9 +35,8 @@ define(
* @param {ModelService} modelService this service to decorate
* @implements {ModelService}
*/
function CachingModelDecorator(modelService) {
this.cache = {};
this.cached = {};
function CachingModelDecorator(cacheService, modelService) {
this.cacheService = cacheService;
this.modelService = modelService;
}
@ -51,10 +50,9 @@ define(
}
CachingModelDecorator.prototype.getModels = function (ids) {
var cache = this.cache,
cached = this.cached,
var cacheService = this.cacheService,
neededIds = ids.filter(function notCached(id) {
return !cached[id];
return !cacheService.has(id);
});
// Update the cached instance of a model to a new value.
@ -71,7 +69,7 @@ define(
// If we'd previously cached an undefined value, or are now
// seeing undefined, replace the item in the cache entirely.
if (oldModel === undefined || model === undefined) {
cache[id] = model;
cacheService.put(id, model);
return model;
}
@ -91,15 +89,15 @@ define(
// Store the provided models in our cache
function cacheAll(models) {
Object.keys(models).forEach(function (id) {
cache[id] = cached[id] ?
var model = cacheService.has(id) ?
updateModel(id, models[id]) : models[id];
cached[id] = true;
cacheService.put(id, model);
});
}
// Expose the cache (for promise chaining)
function giveCache() {
return cache;
return cacheService.all();
}
// Look up if we have unknown IDs

View File

@ -0,0 +1,55 @@
/*****************************************************************************
* Open MCT Web, Copyright (c) 2014-2015, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT Web includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define*/
define([], function () {
'use strict';
function ModelCacheService() {
this.cache = {};
this.cached = {};
}
ModelCacheService.prototype.put = function (id, model) {
this.cached[id] = true;
this.cache[id] = model;
};
ModelCacheService.prototype.get = function (id) {
return this.cache[id];
};
ModelCacheService.prototype.has = function (id) {
return this.cached[id];
};
ModelCacheService.prototype.remove = function (id) {
delete this.cached[id];
delete this.cache[id];
};
ModelCacheService.prototype.all = function () {
return this.cache;
};
return ModelCacheService;
});

View File

@ -44,10 +44,15 @@ define(
* @param {IdentifierService} identifierService service to generate
* new identifiers
*/
function Instantiate(capabilityService, identifierService) {
function Instantiate(
capabilityService,
identifierService,
cacheService
) {
return function (model, id) {
var capabilities = capabilityService.getCapabilities(model);
id = id || identifierService.generate();
cacheService.put(id, model);
return new DomainObjectImpl(id, model, capabilities);
};
}