From 749799d869ce7bba357d8d35e9a2e88ee9209b0c Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Thu, 5 Nov 2020 13:35:55 +0200 Subject: [PATCH] Denormalised slot fill total to database --- .../creature/computation/recomputeCreature.js | 2 ++ .../denormalise/recomputeSlotFullness.js | 28 +++++++++++++++++++ app/imports/api/properties/Slots.js | 4 +++ app/imports/ui/creature/slots/Slots.vue | 8 ------ 4 files changed, 34 insertions(+), 8 deletions(-) create mode 100644 app/imports/api/creature/denormalise/recomputeSlotFullness.js diff --git a/app/imports/api/creature/computation/recomputeCreature.js b/app/imports/api/creature/computation/recomputeCreature.js index 6fd272e4..53cc02af 100644 --- a/app/imports/api/creature/computation/recomputeCreature.js +++ b/app/imports/api/creature/computation/recomputeCreature.js @@ -9,6 +9,7 @@ import writeAlteredProperties from '/imports/api/creature/computation/writeAlter import writeCreatureVariables from '/imports/api/creature/computation/writeCreatureVariables.js'; import { recomputeDamageMultipliersById } from '/imports/api/creature/denormalise/recomputeDamageMultipliers.js'; import recomputeInactiveProperties from '/imports/api/creature/denormalise/recomputeInactiveProperties.js'; +import recomputeSlotFullness from '/imports/api/creature/denormalise/recomputeSlotFullness.js'; import Creatures from '/imports/api/creature/Creatures.js'; export const recomputeCreature = new ValidatedMethod({ @@ -117,5 +118,6 @@ export function recomputeCreatureByDoc(creature){ writeAlteredProperties(computationMemo); writeCreatureVariables(computationMemo, creatureId); recomputeDamageMultipliersById(creatureId); + recomputeSlotFullness(creatureId); return computationMemo; } diff --git a/app/imports/api/creature/denormalise/recomputeSlotFullness.js b/app/imports/api/creature/denormalise/recomputeSlotFullness.js new file mode 100644 index 00000000..775e4c97 --- /dev/null +++ b/app/imports/api/creature/denormalise/recomputeSlotFullness.js @@ -0,0 +1,28 @@ +import CreatureProperties from '/imports/api/creature/CreatureProperties.js'; +// n + 1 database queries + n potential updates for n slots. Could be sped up. +export default function recomputeSlotFullness(ancestorId){ + CreatureProperties.find({ + 'ancestors.id': ancestorId, + type: 'propertySlot', + }).forEach(slot => { + let children = CreatureProperties.find({ + 'parent.id': slot._id, + removed: {$ne: true}, + }).fetch(); + let totalFilled = 0; + children.forEach(child => { + if (child.type === 'slotFiller'){ + totalFilled += child.slotQuantityFilled; + } else { + totalFilled++; + } + }); + if (slot.totalFilled !== totalFilled){ + CreatureProperties.update(slot._id, { + $set: {totalFilled}, + }, { + selector: {type: 'propertySlot'} + }); + } + }); +} diff --git a/app/imports/api/properties/Slots.js b/app/imports/api/properties/Slots.js index ded9e443..288ee12c 100644 --- a/app/imports/api/properties/Slots.js +++ b/app/imports/api/properties/Slots.js @@ -50,6 +50,10 @@ const ComputedOnlySlotSchema = new SimpleSchema({ 'slotConditionErrors.$':{ type: ErrorSchema, }, + totalFilled: { + type: SimpleSchema.Integer, + defaultValue: 0, + } }); const ComputedSlotSchema = new SimpleSchema() diff --git a/app/imports/ui/creature/slots/Slots.vue b/app/imports/ui/creature/slots/Slots.vue index 06995ff8..3f3c2833 100644 --- a/app/imports/ui/creature/slots/Slots.vue +++ b/app/imports/ui/creature/slots/Slots.vue @@ -135,14 +135,6 @@ export default { 'parent.id': slot._id, removed: {$ne: true}, }).fetch(); - slot.totalFilled = 0; - slot.children.forEach(child => { - if (child.type === 'slotFiller'){ - slot.totalFilled += child.slotQuantityFilled; - } else { - slot.totalFilled++; - } - }); return slot; }); },