Files
Projekt-Visualisierung/node_modules/@maplibre/mlt/dist/decoding/propertyDecoder.js
2026-04-15 17:08:39 +02:00

132 lines
8.2 KiB
JavaScript

import { ScalarType } from "../metadata/tileset/tilesetMetadata";
import BitVector from "../vector/flat/bitVector";
import { decodeStreamMetadata } from "../metadata/tile/streamMetadataDecoder";
import { VectorType } from "../vector/vectorType";
import { BooleanFlatVector } from "../vector/flat/booleanFlatVector";
import { DoubleFlatVector } from "../vector/flat/doubleFlatVector";
import { FloatFlatVector } from "../vector/flat/floatFlatVector";
import { Int64ConstVector } from "../vector/constant/int64ConstVector";
import { Int64FlatVector } from "../vector/flat/int64FlatVector";
import { Int32FlatVector } from "../vector/flat/int32FlatVector";
import { Int32ConstVector } from "../vector/constant/int32ConstVector";
import { decodeBooleanRle, decodeDoublesLE, decodeFloatsLE, skipColumn } from "./decodingUtils";
import { decodeSignedConstInt32Stream, decodeSignedConstInt64Stream, decodeSignedInt32Stream, decodeSignedInt64Stream, decodeUnsignedInt32Stream, decodeUnsignedConstInt32Stream, decodeUnsignedConstInt64Stream, decodeUnsignedInt64Stream, decodeSequenceInt32Stream, decodeSequenceInt64Stream, getVectorType, } from "./integerStreamDecoder";
import { Int32SequenceVector } from "../vector/sequence/int32SequenceVector";
import { Int64SequenceVector } from "../vector/sequence/int64SequenceVector";
import { decodeSharedDictionary, decodeString } from "./stringDecoder";
export function decodePropertyColumn(data, offset, columnMetadata, numStreams, numFeatures, propertyColumnNames) {
if (columnMetadata.type === "scalarType") {
if (propertyColumnNames && !propertyColumnNames.has(columnMetadata.name)) {
skipColumn(numStreams, data, offset);
return null;
}
return decodeScalarPropertyColumn(numStreams, data, offset, numFeatures, columnMetadata.scalarType, columnMetadata);
}
if (numStreams === 0) {
return null;
}
return decodeSharedDictionary(data, offset, columnMetadata, numFeatures, propertyColumnNames);
}
function decodeScalarPropertyColumn(numStreams, data, offset, numFeatures, column, columnMetadata) {
let nullabilityBuffer = null;
if (numStreams === 0) {
return null;
}
if (columnMetadata.nullable) {
const presentStreamMetadata = decodeStreamMetadata(data, offset);
const numValues = presentStreamMetadata.numValues;
const streamDataStart = offset.get();
const presentVector = decodeBooleanRle(data, numValues, presentStreamMetadata.byteLength, offset);
offset.set(streamDataStart + presentStreamMetadata.byteLength);
nullabilityBuffer = new BitVector(presentVector, presentStreamMetadata.numValues);
}
const sizeOrNullabilityBuffer = nullabilityBuffer ?? numFeatures;
const scalarType = column.physicalType;
switch (scalarType) {
case ScalarType.UINT_32:
case ScalarType.INT_32:
return decodeInt32Column(data, offset, columnMetadata, column, sizeOrNullabilityBuffer);
case ScalarType.STRING: {
// In embedded format: numStreams includes nullability stream if column is nullable
const stringDataStreams = columnMetadata.nullable ? numStreams - 1 : numStreams;
return decodeString(columnMetadata.name, data, offset, stringDataStreams, nullabilityBuffer);
}
case ScalarType.BOOLEAN:
return decodeBooleanColumn(data, offset, columnMetadata, numFeatures, sizeOrNullabilityBuffer);
case ScalarType.UINT_64:
case ScalarType.INT_64:
return decodeInt64Column(data, offset, columnMetadata, sizeOrNullabilityBuffer, column);
case ScalarType.FLOAT:
return decodeFloatColumn(data, offset, columnMetadata, sizeOrNullabilityBuffer);
case ScalarType.DOUBLE:
return decodeDoubleColumn(data, offset, columnMetadata, sizeOrNullabilityBuffer);
default:
throw new Error(`The specified data type for the field is currently not supported: ${column}`);
}
}
function decodeBooleanColumn(data, offset, column, _numFeatures, sizeOrNullabilityBuffer) {
const dataStreamMetadata = decodeStreamMetadata(data, offset);
const numValues = dataStreamMetadata.numValues;
const streamDataStart = offset.get();
const nullabilityBuffer = isNullabilityBuffer(sizeOrNullabilityBuffer) ? sizeOrNullabilityBuffer : undefined;
const dataStream = decodeBooleanRle(data, numValues, dataStreamMetadata.byteLength, offset, nullabilityBuffer);
offset.set(streamDataStart + dataStreamMetadata.byteLength);
const dataVector = new BitVector(dataStream, numValues);
return new BooleanFlatVector(column.name, dataVector, sizeOrNullabilityBuffer);
}
function decodeFloatColumn(data, offset, column, sizeOrNullabilityBuffer) {
const dataStreamMetadata = decodeStreamMetadata(data, offset);
const nullabilityBuffer = isNullabilityBuffer(sizeOrNullabilityBuffer) ? sizeOrNullabilityBuffer : undefined;
const dataStream = decodeFloatsLE(data, offset, dataStreamMetadata.numValues, nullabilityBuffer);
return new FloatFlatVector(column.name, dataStream, sizeOrNullabilityBuffer);
}
function decodeDoubleColumn(data, offset, column, sizeOrNullabilityBuffer) {
const dataStreamMetadata = decodeStreamMetadata(data, offset);
const nullabilityBuffer = isNullabilityBuffer(sizeOrNullabilityBuffer) ? sizeOrNullabilityBuffer : undefined;
const dataStream = decodeDoublesLE(data, offset, dataStreamMetadata.numValues, nullabilityBuffer);
return new DoubleFlatVector(column.name, dataStream, sizeOrNullabilityBuffer);
}
function decodeInt64Column(data, offset, column, sizeOrNullabilityBuffer, scalarColumn) {
const dataStreamMetadata = decodeStreamMetadata(data, offset);
const vectorType = getVectorType(dataStreamMetadata, sizeOrNullabilityBuffer, data, offset, "int64");
const isSigned = scalarColumn.physicalType === ScalarType.INT_64;
if (vectorType === VectorType.FLAT) {
const nullabilityBuffer = isNullabilityBuffer(sizeOrNullabilityBuffer) ? sizeOrNullabilityBuffer : undefined;
const dataStream = isSigned
? decodeSignedInt64Stream(data, offset, dataStreamMetadata, nullabilityBuffer)
: decodeUnsignedInt64Stream(data, offset, dataStreamMetadata, nullabilityBuffer);
return new Int64FlatVector(column.name, dataStream, sizeOrNullabilityBuffer);
}
if (vectorType === VectorType.SEQUENCE) {
const id = decodeSequenceInt64Stream(data, offset, dataStreamMetadata);
return new Int64SequenceVector(column.name, id[0], id[1], dataStreamMetadata.numRleValues);
}
const constValue = isSigned
? decodeSignedConstInt64Stream(data, offset, dataStreamMetadata)
: decodeUnsignedConstInt64Stream(data, offset, dataStreamMetadata);
return new Int64ConstVector(column.name, constValue, sizeOrNullabilityBuffer, isSigned);
}
function decodeInt32Column(data, offset, column, scalarColumn, sizeOrNullabilityBuffer) {
const dataStreamMetadata = decodeStreamMetadata(data, offset);
const vectorType = getVectorType(dataStreamMetadata, sizeOrNullabilityBuffer, data, offset);
const isSigned = scalarColumn.physicalType === ScalarType.INT_32;
if (vectorType === VectorType.FLAT) {
const nullabilityBuffer = isNullabilityBuffer(sizeOrNullabilityBuffer) ? sizeOrNullabilityBuffer : undefined;
const dataStream = isSigned
? decodeSignedInt32Stream(data, offset, dataStreamMetadata, undefined, nullabilityBuffer)
: decodeUnsignedInt32Stream(data, offset, dataStreamMetadata, undefined, nullabilityBuffer);
return new Int32FlatVector(column.name, dataStream, sizeOrNullabilityBuffer);
}
if (vectorType === VectorType.SEQUENCE) {
const id = decodeSequenceInt32Stream(data, offset, dataStreamMetadata);
return new Int32SequenceVector(column.name, id[0], id[1], dataStreamMetadata.numRleValues);
}
const constValue = isSigned
? decodeSignedConstInt32Stream(data, offset, dataStreamMetadata)
: decodeUnsignedConstInt32Stream(data, offset, dataStreamMetadata);
return new Int32ConstVector(column.name, constValue, sizeOrNullabilityBuffer, isSigned);
}
function isNullabilityBuffer(sizeOrNullabilityBuffer) {
return sizeOrNullabilityBuffer instanceof BitVector;
}
//# sourceMappingURL=propertyDecoder.js.map