diffusion
Version:
Diffusion JavaScript client
67 lines (50 loc) • 1.97 kB
JavaScript
var RangeQueryParameters = require('features/time-series/range-query-parameters');
var Long = require('long');
function nonNull(e) {
return !!e;
}
function comparingSequenceNumbers(e1, e2) {
return e1.originalEvent.sequence !== e2.originalEvent.sequence
? e1.originalEvent.sequence - e2.originalEvent.sequence
: e1.sequence - e2.sequence;
}
function replaceWithLatest(allEvents) {
var latestByOriginalSequence = {};
allEvents.forEach(function(e) {
var k = e.originalEvent.sequence;
if (!latestByOriginalSequence[k] || latestByOriginalSequence[k].sequence.toNumber() < e.sequence.toNumber()) {
latestByOriginalSequence[k] = e;
}
});
return function(e) {
var originalSequence = e.originalEvent.sequence;
var latest = latestByOriginalSequence[originalSequence];
if (!latest) {
return null;
}
if (!e.isEditEvent) {
delete latestByOriginalSequence[originalSequence];
return latest;
} else if (e.sequence.equals(latest.sequence)) {
delete latestByOriginalSequence[originalSequence];
return e;
} else {
return null;
}
};
}
function QueryResult(selectedCount, eventCount, streamStructure, events) {
this.events = events;
this.selectedCount = selectedCount.toNumber();
this.isComplete = (selectedCount.equals(eventCount));
this.streamStructure = streamStructure;
this.merge = function(other) {
var merged = events.concat(other.events)
.sort(comparingSequenceNumbers)
.map(replaceWithLatest(events.concat(other.events)))
.filter(nonNull);
var count = Long.fromNumber(merged.length);
return new QueryResult(count, count, RangeQueryParameters.StreamStructure.VALUE_EVENT_STREAM, merged);
};
}
module.exports = QueryResult;