LT-92: Grouping non-conformities to make it faster to read on measurementTableRow view

This commit is contained in:
Leonardo Campos 2017-01-16 23:54:30 -02:00 committed by Bruno Alves de Faria
parent 1efe611497
commit 65b867d1b0
2 changed files with 49 additions and 13 deletions

View File

@ -25,20 +25,14 @@ const keys = {
Template.measurementTableRow.helpers({
hasWarnings() {
const toolsGroupsMap = this.measurementApi.toolsGroupsMap;
const nonConformities = this.conformanceCriteria.nonConformities.get();
const foundNonConformity = _.find(nonConformities, nonConformity => {
const measurement = _.find(nonConformity.measurements, measurement => {
if(toolsGroupsMap[measurement.toolType] !== this.rowItem.measurementTypeId) {
return false;
}
const measurementTypeId = this.rowItem.measurementTypeId;
const measurementNumber = this.rowItem.measurementNumber;
const groupedNonConformities = this.conformanceCriteria.groupedNonConformities.get() || {};
const nonConformitiesByMeasurementTypeId = groupedNonConformities[measurementTypeId] || {};
const nonConformitiesByMeasurementNumbers = nonConformitiesByMeasurementTypeId.measurementNumbers || {};
const nonConformitiesByMeasurementNumber = nonConformitiesByMeasurementNumbers[measurementNumber] || {};
return measurement.measurementNumber === parseInt(this.rowItem.measurementNumber, 10);
});
return !!measurement;
});
return !!foundNonConformity;
return nonConformitiesByMeasurementNumber.messages && nonConformitiesByMeasurementNumber.messages.length;
}
});

View File

@ -9,6 +9,7 @@ class ConformanceCriteria {
this.measurementApi = measurementApi;
this.timepointApi = timepointApi;
this.nonConformities = new ReactiveVar();
this.groupedNonConformities = new ReactiveVar();
const validate = _.debounce(trialCriteriaType => {
this.validate(trialCriteriaType);
@ -33,12 +34,53 @@ class ConformanceCriteria {
const resultBaseline = this.validateTimepoint('baseline', trialCriteriaType, baselineData);
const resultFollowup = this.validateTimepoint('followup', trialCriteriaType, followupData);
const nonConformities = resultBaseline.concat(resultFollowup).concat(resultBoth);
const groupedNonConformities = this.groupNonConformities(nonConformities);
// Keep both? Group the data only on viewer/measurementTable views?
// Work with not grouped data (worse lookup performance on measurementTableRow)?
this.nonConformities.set(nonConformities);
this.groupedNonConformities.set(groupedNonConformities);
return nonConformities;
}
groupNonConformities(nonConformities) {
const groups = {};
const toolsGroupsMap = this.measurementApi.toolsGroupsMap;
nonConformities.forEach(nonConformity => {
if(nonConformity.isGlobal) {
groups.globals = groups.globals || { messages: [] };
groups.globals.messages.push(nonConformity.message);
return;
}
nonConformity.measurements.forEach(measurement => {
const groupName = toolsGroupsMap[measurement.toolType];
groups[groupName] = groups[groupName] || { measurementNumbers: {} };
const group = groups[groupName];
const measureNumber = measurement.measurementNumber;
let measurementNumbers = group.measurementNumbers[measureNumber];
if(!measurementNumbers) {
measurementNumbers = group.measurementNumbers[measureNumber] = {
messages: [],
measurements: []
}
}
measurementNumbers.messages.push(nonConformity.message);
measurementNumbers.measurements.push(measurement);
});
});
console.log('>>>>> groups: ', groups);
return groups;
}
validateTimepoint(timepointId, trialCriteriaType, data) {
const evaluators = this.getEvaluators(timepointId, trialCriteriaType);
let nonConformities = [];