Skip to content

Commit e0724f0

Browse files
committed
Efficiency improvements to chart old data pruning
1 parent 1e0aed6 commit e0724f0

2 files changed

Lines changed: 22 additions & 5 deletions

File tree

nodes/store/data.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,22 @@ const setters = {
102102
}
103103
data[node.id].push(config.RED.util.cloneMessage(msg))
104104
}
105+
},
106+
/**
107+
* Fast filtering of existing array data (skips cloning and save checks for fast data cleanup)
108+
* @param {*} base - the base node
109+
* @param {*} node - the owner node
110+
* @param {(msg) => Boolean} filterFunction
111+
*/
112+
filter (base, node, filterFunction) {
113+
const currentData = data[node.id]
114+
if (filterFunction && Array.isArray(currentData) && currentData.length) {
115+
const filteredMessages = currentData.filter(filterFunction)
116+
if (filteredMessages.length !== currentData.length) {
117+
// no need for save operation to process messages - just apply them
118+
data[node.id] = filteredMessages
119+
}
120+
}
105121
}
106122
}
107123

@@ -111,5 +127,6 @@ module.exports = {
111127
setConfig: setters.setConfig,
112128
save: setters.save,
113129
append: setters.append,
130+
filter: setters.filter,
114131
clear: setters.clear
115132
}

nodes/widgets/ui_chart.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,16 @@ module.exports = function (RED) {
6161
if (removeOlder > 0) {
6262
const removeOlderUnit = parseFloat(config.removeOlderUnit)
6363
const ago = (removeOlder * removeOlderUnit) * 1000 // milliseconds ago
64-
const cutoff = (new Date()).getTime() - ago
65-
const _msg = datastore.get(node.id).filter((msg) => {
64+
const cutOff = (new Date()).getTime() - ago
65+
const filterFn = (msg) => {
6666
let timestamp = msg._datapoint.x
6767
// is x already a millisecond timestamp?
6868
if (typeof (msg._datapoint.x) === 'string') {
6969
timestamp = (new Date(msg._datapoint.x)).getTime()
7070
}
71-
return timestamp > cutoff
72-
})
73-
datastore.save(base, node, _msg)
71+
return timestamp > cutOff
72+
}
73+
datastore.filter(base, node, filterFn)
7474
}
7575
}
7676

0 commit comments

Comments
 (0)