Skip to content

Commit

Permalink
finish adding tests; refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
chinook25 committed May 9, 2019
1 parent 8e8fdfb commit 27edf0d
Show file tree
Hide file tree
Showing 8 changed files with 518 additions and 192 deletions.
2 changes: 1 addition & 1 deletion app/js/models/models.html
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ <h5 class="subheader">Primary model
<i class="fa fa-times" style="color:red;" ng-if="model.runStatus === 'failed'"></i>
</td>
<td class="text-center">
<a ng-click="editModelName(model)"><i class="fa fa-edit"></i></a>
<a ng-click="editModelTitle(model)"><i class="fa fa-edit"></i></a>
</td>
</tr>
</tbody>
Expand Down
3 changes: 3 additions & 0 deletions app/js/models/models.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ define([
'./createNetworkModelController',
'./addComparisonFunnelPlotController',
'./setBaselineDistributionController',
'./editModelTitleController',
'./standaloneModelResource',
'./standaloneModelBaselineResource',
'./standaloneProblemResource',
Expand Down Expand Up @@ -41,6 +42,7 @@ define([
CreateNetworkModelController,
AddComparisonFunnelPlotController,
SetBaselineDistributionController,
EditModelTitleController,
ModelResource,
ModelBaselineResource,
ProblemResource,
Expand Down Expand Up @@ -77,6 +79,7 @@ define([
.controller('CreateNetworkModelController', CreateNetworkModelController)
.controller('AddComparisonFunnelPlotController', AddComparisonFunnelPlotController)
.controller('SetBaselineDistributionController', SetBaselineDistributionController)
.controller('EditModelTitleController', EditModelTitleController)

// resources
.factory('ModelResource', ModelResource)
Expand Down
131 changes: 37 additions & 94 deletions standalone-app/modelHandlers.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,31 +14,25 @@ function find(request, response, next) {

var analysisId = request.params.analysisId;
modelRepository.findByAnalysis(analysisId, function(error, modelsResult) {

if (error) {
return next({
statusCode: httpStatus.INTERNAL_SERVER_ERROR,
message: error
});
}

var modelsWithTasks = _.filter(modelsResult, function(model) {
return model.taskUrl !== null && model.taskUrl !== undefined;
});
var modelsWithoutTasks = _.filter(modelsResult, function(model) {
return model.taskUrl === null || model.taskUrl === undefined;
});
if (modelsWithTasks.length) {
var taskUrls = _.map(modelsWithTasks, 'taskUrl');
var { modelsWithTask, modelsWithoutTask } = modelService.partitionModels(modelsResult);
if (modelsWithTask.length) {
var taskUrls = _.map(modelsWithTask, 'taskUrl');
pataviTaskRepository.getPataviTasksStatus(taskUrls, function(error, pataviResult) {
if (error) {
next({
statusCode: httpStatus.INTERNAL_SERVER_ERROR,
message: error
});
} else {
var decoratedResult = decorateWithRunStatus(modelsWithTasks, pataviResult);
response.json(decoratedResult.concat(modelsWithoutTasks));
var decoratedResult = modelService.decorateWithRunStatus(modelsWithTask, pataviResult);
response.json(decoratedResult.concat(modelsWithoutTask));
}
});
} else {
Expand All @@ -47,15 +41,6 @@ function find(request, response, next) {
});
}

function decorateWithRunStatus(modelsResult, pataviResult) {
var pataviTasks = _.keyBy(pataviResult, 'id');
return _.map(modelsResult, function(model) {
return _.extend(model, {
runStatus: pataviTasks[model.taskUrl].runStatus
});
});
}

function getResult(request, response, next) {
logger.debug('modelHandler.getResult');
logger.debug('request.params.analysisId' + request.params.analysisId);
Expand All @@ -68,7 +53,11 @@ function getResult(request, response, next) {
},
function(model, callback) {
modelCache = model;
callback(model.taskUrl === null || model.taskUrl === undefined);
if (model.taskUrl === null || model.taskUrl === undefined) {
callback('Error, model ' + modelId + ' does not have a task url');
} else {
callback();
}
},
function(callback) {
pataviTaskRepository.getResult(modelCache.taskUrl, callback);
Expand All @@ -77,16 +66,7 @@ function getResult(request, response, next) {
response.status(httpStatus.OK);
response.json(pataviResult);
}
], function(error) {
if (error) {
next({
statusCode: httpStatus.NOT_FOUND,
message: 'no result found for model with id ' + modelId
});
} else {
next();
}
});
], _.partial(asyncCallback, next));
}

function createModel(request, response, next) {
Expand All @@ -104,16 +84,7 @@ function createModel(request, response, next) {
id: createdId
});
}
], function(error) {
if (error) {
next({
statusCode: httpStatus.NOT_FOUND,
message: 'Error creating model for analysis: ' + analysisId
});
} else {
next();
}
});
], _.partial(asyncCallback, next));
}

function extendRunLength(request, response, next) {
Expand Down Expand Up @@ -142,16 +113,7 @@ function extendRunLength(request, response, next) {
function() {
response.sendStatus(httpStatus.OK);
}
], function(error) {
if (error) {
next({
statusCode: httpStatus.NOT_FOUND,
message: 'Error extending run length of model: ' + modelId
});
} else {
next();
}
});
], _.partial(asyncCallback, next));
}

function addFunnelPlot(request, response, next) {
Expand All @@ -172,44 +134,26 @@ function addFunnelPlot(request, response, next) {
function() {
response.sendStatus(httpStatus.CREATED);
}
], function(error) {
if (error) {
next({
statusCode: httpStatus.NOT_FOUND,
message: 'Error adding funnelplot for model: ' + modelId
});
} else {
next();
}
});
], _.partial(asyncCallback, next));
}

function queryFunnnelPlots(request, response, next) {
function queryFunnelPlots(request, response, next) {
var modelId = Number.parseInt(request.params.modelId);
getFunnelPlotsById(request, response, next, funnelPlotRepository.findByModelId, modelId);
getFromGetterById(response, next, funnelPlotRepository.findByModelId, modelId);
}

function getFunnelPlot(request, response, next) {
var plotId = Number.parseInt(request.params.plotId);
getFunnelPlotsById(request, response, next, funnelPlotRepository.findByPlotId, plotId);
}

function getFunnelPlotsById(request, response, next, getter, id) {
getter(id, function(error, result) {
if (error) {
next({
statusCode: httpStatus.INTERNAL_SERVER_ERROR,
message: error
});
} else {
response.json(result);
}
});
getFromGetterById(response, next, funnelPlotRepository.findByPlotId, plotId);
}

function getBaseline(request, response, next) {
var modelId = Number.parseInt(request.params.modelId);
modelBaselineRepository.get(modelId, function(error, result) {
getFromGetterById(response, next, modelBaselineRepository.get, modelId);
}

function getFromGetterById(response, next, getter, id) {
getter(id, function(error, result) {
if (error) {
next({
statusCode: httpStatus.INTERNAL_SERVER_ERROR,
Expand Down Expand Up @@ -240,25 +184,13 @@ function setBaseline(request, response, next) {
function() {
response.sendStatus(httpStatus.OK);
}
], function(error) {
if (error) {
next(error.hasOwnProperty('message') ? error : {
statusCode: httpStatus.NOT_FOUND,
message: 'Error setting baseline for model: ' + modelId
});
} else {
next();
}
});
], _.partial(asyncCallback, next));
}

function checkCoordinates(analysisId, model, callback) {
logger.debug('check analysisId = ' + analysisId + ' and model.analysisId = ' + model.analysisId);
if (analysisId !== model.analysisId) {
callback({
statusCode: httpStatus.NOT_FOUND,
message: 'Error, could not find analysis/model combination'
});
callback('Error, could not find analysis/model combination');
} else {
callback();
}
Expand All @@ -285,7 +217,7 @@ function setAttributes(request, response, next) {
function() {
response.sendStatus(httpStatus.OK);
}
], next);
], _.partial(asyncCallback, next));
}

function getModel(request, response, next) {
Expand Down Expand Up @@ -318,6 +250,17 @@ function setTitle(request, response, next) {
});
}

function asyncCallback(next, error) {
if (error) {
next({
statusCode: httpStatus.INTERNAL_SERVER_ERROR,
message: error
});
} else {
next();
}
}

module.exports = {
find: find,
createModel: createModel,
Expand All @@ -329,6 +272,6 @@ module.exports = {
setTitle: setTitle,
setAttributes: setAttributes,
addFunnelPlot: addFunnelPlot,
queryFunnnelPlots: queryFunnnelPlots,
queryFunnelPlots: queryFunnelPlots,
getFunnelPlot: getFunnelPlot
};
2 changes: 1 addition & 1 deletion standalone-app/modelRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ module.exports = express.Router({
.put('/:modelId/setTitle', modelHandlers.setTitle)
.post('/:modelId/attributes', modelHandlers.setAttributes)
.post('/:modelId/funnelPlots', modelHandlers.addFunnelPlot)
.get('/:modelId/funnelPlots', modelHandlers.queryFunnnelPlots)
.get('/:modelId/funnelPlots', modelHandlers.queryFunnelPlots)
.get('/:modelId/funnelPlots/:plotId', modelHandlers.getFunnelPlot)
.use('/:modelId/task', pataviTaskRouter)
;
36 changes: 28 additions & 8 deletions standalone-app/modelService.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,38 @@
'use strict';
var modelRepository = require('./modelRepository');

module.exports = {
update: update
};
var _ = require('lodash');

function update(oldModel, newModel, callback) {
if (newModel.burnInIterations < oldModel.burnInIterations ||
newModel.inferenceIterations < oldModel.inferenceIterations) {
callback({
statusCode: 500,
message: 'may not update model with lower number of iterations'
});
var errorMessage = 'Error: may not update model with lower number of iterations';
callback(errorMessage);
} else {
modelRepository.update(newModel, callback);
}
}

function partitionModels(models) {
var partition = _.partition(models, function(model) {
return model.taskUrl !== null && model.taskUrl !== undefined;
});
return {
modelsWithTask: partition[0],
modelsWithoutTask: partition[1]
};
}

function decorateWithRunStatus(models, pataviResult) {
var tasks = _.keyBy(pataviResult, 'id');
return _.map(models, function(model) {
return _.extend(model, {
runStatus: tasks[model.taskUrl].runStatus
});
});
}

module.exports = {
update: update,
partitionModels: partitionModels,
decorateWithRunStatus: decorateWithRunStatus
};
Loading

0 comments on commit 27edf0d

Please sign in to comment.