in backend/new.js [499:547]
function copyColumns(outCols, inCols, count) {
if (count === 0) return
let inIndex = 0, lastGroup = -1, lastCardinality = 0, valueColumn = -1, valueBytes = 0
for (let outCol of outCols) {
while (inIndex < inCols.length && inCols[inIndex].columnId < outCol.columnId) inIndex++
let inCol = null
if (inIndex < inCols.length && inCols[inIndex].columnId === outCol.columnId &&
inCols[inIndex].decoder.buf.byteLength > 0) {
inCol = inCols[inIndex].decoder
}
const colCount = (outCol.columnId >> 4 === lastGroup) ? lastCardinality : count
if (outCol.columnId % 8 === COLUMN_TYPE.GROUP_CARD) {
lastGroup = outCol.columnId >> 4
if (inCol) {
lastCardinality = outCol.encoder.copyFrom(inCol, {count, sumValues: true}).sum
} else {
outCol.encoder.appendValue(0, count)
lastCardinality = 0
}
} else if (outCol.columnId % 8 === COLUMN_TYPE.VALUE_LEN) {
if (inCol) {
if (inIndex + 1 === inCols.length || inCols[inIndex + 1].columnId !== outCol.columnId + 1) {
throw new RangeError('VALUE_LEN column without accompanying VALUE_RAW column')
}
valueColumn = outCol.columnId + 1
valueBytes = outCol.encoder.copyFrom(inCol, {count: colCount, sumValues: true, sumShift: 4}).sum
} else {
outCol.encoder.appendValue(null, colCount)
valueColumn = outCol.columnId + 1
valueBytes = 0
}
} else if (outCol.columnId % 8 === COLUMN_TYPE.VALUE_RAW) {
if (outCol.columnId !== valueColumn) {
throw new RangeError('VALUE_RAW column without accompanying VALUE_LEN column')
}
if (valueBytes > 0) {
outCol.encoder.appendRawBytes(inCol.readRawBytes(valueBytes))
}
} else { // ACTOR_ID, INT_RLE, INT_DELTA, BOOLEAN, or STRING_RLE
if (inCol) {
outCol.encoder.copyFrom(inCol, {count: colCount})
} else {
const blankValue = (outCol.columnId % 8 === COLUMN_TYPE.BOOLEAN) ? false : null
outCol.encoder.appendValue(blankValue, colCount)
}
}
}
}