Parsed calculations are now cached between calculations

Parsing is one of the more expensive computations done to characters, so 
the parser results are now stored on the DB and only updated if they are 
dirty. A hash is used to determine if the calculation has changed since 
the last computation
This commit is contained in:
Stefan Zermatten
2021-10-03 20:59:04 +02:00
parent c2d430ad23
commit 1a14393031
12 changed files with 95 additions and 29 deletions

View File

@@ -25,6 +25,7 @@ function computeResources(computation, node){
resources.attributesConsumed.forEach(attConsumed => {
if (!attConsumed.variableName) return;
const att = computation.scope[attConsumed.variableName];
if (!att._id) return;
attConsumed.available = att.value;
attConsumed.statId = att._id;
attConsumed.statName = att.name;

View File

@@ -13,25 +13,20 @@ export default function computeCalculations(computation, node){
}
function evaluateCalculation(calculation, scope){
const parseNode = calculation._parsedCalculation;
const parseNode = calculation.parseNode;
const fn = calculation._parseLevel;
const calculationScope = {...calculation._localScope, ...scope};
const {result: resultNode, context} = resolve(fn, parseNode, calculationScope);
if (resultNode.parseType === 'constant'){
calculation.errors = context.errors;
if (resultNode?.parseType === 'constant'){
calculation.value = resultNode.value;
} else if (resultNode.parseType === 'error'){
} else if (resultNode?.parseType === 'error'){
calculation.value = null;
} else {
calculation.value = toString(resultNode);
}
if (calculation.errors){
calculation.errors = [...calculation.errors, ...context.errors]
} else {
calculation.errors = context.errors
}
// remove the working fields
delete calculation._parseLevel;
delete calculation._parsedCalculation;
delete calculation._localScope;
}

View File

@@ -15,10 +15,6 @@ export default function(){
assert.equal(scope('strength').modifier, 1);
assert.equal(prop('referencesDexId').value, 4);
assert.equal(prop('hitDiceId').constitutionMod, 5);
assert.equal(
prop('parseErrorId').baseValue.errors.length, 1,
'Parse errors should be added to calculation errors'
);
assert.equal(
prop('parseErrorId').baseValue.value, null,
'Parse errors should null the value'