@loaders.gl/parquet 4.4.2 → 5.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundled.d.ts +6 -0
- package/dist/bundled.d.ts.map +1 -0
- package/dist/bundled.js +7 -0
- package/dist/bundled.js.map +1 -0
- package/dist/geoparquet-loader-with-parser.d.ts +34 -0
- package/dist/geoparquet-loader-with-parser.d.ts.map +1 -0
- package/dist/geoparquet-loader-with-parser.js +52 -0
- package/dist/geoparquet-loader-with-parser.js.map +1 -0
- package/dist/geoparquet-loader.d.ts +61 -0
- package/dist/geoparquet-loader.d.ts.map +1 -0
- package/dist/geoparquet-loader.js +30 -0
- package/dist/geoparquet-loader.js.map +1 -0
- package/dist/index.cjs +5879 -5643
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -11
- package/dist/index.js.map +1 -1
- package/dist/lib/constants.d.ts +1 -1
- package/dist/lib/constants.js +2 -2
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/encoders/encode-arrow-to-parquet.d.ts +2 -2
- package/dist/lib/encoders/encode-arrow-to-parquet.d.ts.map +1 -1
- package/dist/lib/encoders/encode-arrow-to-parquet.js +3 -10
- package/dist/lib/encoders/encode-arrow-to-parquet.js.map +1 -1
- package/dist/lib/encoders/encode-table-to-parquet-js.d.ts +5 -0
- package/dist/lib/encoders/encode-table-to-parquet-js.d.ts.map +1 -0
- package/dist/lib/encoders/encode-table-to-parquet-js.js +149 -0
- package/dist/lib/encoders/encode-table-to-parquet-js.js.map +1 -0
- package/dist/lib/geo/geospatial-metadata.d.ts +67 -0
- package/dist/lib/geo/geospatial-metadata.d.ts.map +1 -0
- package/dist/lib/geo/geospatial-metadata.js +357 -0
- package/dist/lib/geo/geospatial-metadata.js.map +1 -0
- package/dist/lib/parsers/get-parquet-schema.d.ts.map +1 -1
- package/dist/lib/parsers/get-parquet-schema.js +3 -1
- package/dist/lib/parsers/get-parquet-schema.js.map +1 -1
- package/dist/lib/parsers/parse-geoparquet-to-geojson.d.ts +4 -4
- package/dist/lib/parsers/parse-geoparquet-to-geojson.d.ts.map +1 -1
- package/dist/lib/parsers/parse-geoparquet-to-geojson.js +19 -6
- package/dist/lib/parsers/parse-geoparquet-to-geojson.js.map +1 -1
- package/dist/lib/parsers/parse-parquet-tables.d.ts +50 -0
- package/dist/lib/parsers/parse-parquet-tables.d.ts.map +1 -0
- package/dist/lib/parsers/parse-parquet-tables.js +101 -0
- package/dist/lib/parsers/parse-parquet-tables.js.map +1 -0
- package/dist/lib/parsers/parse-parquet-to-arrow-js.d.ts +6 -0
- package/dist/lib/parsers/parse-parquet-to-arrow-js.d.ts.map +1 -0
- package/dist/lib/parsers/parse-parquet-to-arrow-js.js +23 -0
- package/dist/lib/parsers/parse-parquet-to-arrow-js.js.map +1 -0
- package/dist/lib/parsers/parse-parquet-to-arrow.d.ts +7 -7
- package/dist/lib/parsers/parse-parquet-to-arrow.d.ts.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-arrow.js +45 -32
- package/dist/lib/parsers/parse-parquet-to-arrow.js.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-columns.d.ts +3 -3
- package/dist/lib/parsers/parse-parquet-to-columns.d.ts.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-columns.js +1 -4
- package/dist/lib/parsers/parse-parquet-to-columns.js.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-json.d.ts +3 -3
- package/dist/lib/parsers/parse-parquet-to-json.d.ts.map +1 -1
- package/dist/lib/parsers/parse-parquet-to-json.js +77 -26
- package/dist/lib/parsers/parse-parquet-to-json.js.map +1 -1
- package/dist/lib/utils/load-wasm.d.ts +2 -2
- package/dist/lib/utils/load-wasm.d.ts.map +1 -1
- package/dist/lib/utils/load-wasm.js +7 -7
- package/dist/lib/utils/load-wasm.js.map +1 -1
- package/dist/lib/utils/make-stream-iterator.js +1 -1
- package/dist/lib/utils/make-stream-iterator.js.map +1 -1
- package/dist/lib/utils/normalize-parquet-options.d.ts +5 -0
- package/dist/lib/utils/normalize-parquet-options.d.ts.map +1 -0
- package/dist/lib/utils/normalize-parquet-options.js +11 -0
- package/dist/lib/utils/normalize-parquet-options.js.map +1 -0
- package/dist/parquet-format.d.ts +2 -0
- package/dist/parquet-format.d.ts.map +1 -1
- package/dist/parquet-format.js +2 -0
- package/dist/parquet-format.js.map +1 -1
- package/dist/parquet-js-loader.d.ts +57 -0
- package/dist/parquet-js-loader.d.ts.map +1 -0
- package/dist/parquet-js-loader.js +33 -0
- package/dist/parquet-js-loader.js.map +1 -0
- package/dist/parquet-js-writer.d.ts +34 -0
- package/dist/parquet-js-writer.d.ts.map +1 -0
- package/dist/parquet-js-writer.js +28 -0
- package/dist/parquet-js-writer.js.map +1 -0
- package/dist/parquet-loader-options.d.ts +56 -0
- package/dist/parquet-loader-options.d.ts.map +1 -0
- package/dist/parquet-loader-options.js +11 -0
- package/dist/parquet-loader-options.js.map +1 -0
- package/dist/parquet-loader-with-parser.d.ts +33 -0
- package/dist/parquet-loader-with-parser.d.ts.map +1 -0
- package/dist/parquet-loader-with-parser.js +40 -0
- package/dist/parquet-loader-with-parser.js.map +1 -0
- package/dist/parquet-loader.d.ts +62 -0
- package/dist/parquet-loader.d.ts.map +1 -0
- package/dist/parquet-loader.js +53 -0
- package/dist/parquet-loader.js.map +1 -0
- package/dist/parquet-wasm-loader-with-parser.d.ts +40 -0
- package/dist/parquet-wasm-loader-with-parser.d.ts.map +1 -0
- package/dist/parquet-wasm-loader-with-parser.js +68 -0
- package/dist/parquet-wasm-loader-with-parser.js.map +1 -0
- package/dist/parquet-writer.d.ts +10 -0
- package/dist/parquet-writer.d.ts.map +1 -0
- package/dist/parquet-writer.js +29 -0
- package/dist/parquet-writer.js.map +1 -0
- package/dist/parquet_wasm_bg.wasm +0 -0
- package/dist/parquetjs/codecs/declare.d.ts +2 -2
- package/dist/parquetjs/codecs/declare.d.ts.map +1 -1
- package/dist/parquetjs/codecs/dictionary.js +1 -1
- package/dist/parquetjs/codecs/dictionary.js.map +1 -1
- package/dist/parquetjs/codecs/plain.d.ts +1 -1
- package/dist/parquetjs/codecs/plain.d.ts.map +1 -1
- package/dist/parquetjs/codecs/plain.js +36 -41
- package/dist/parquetjs/codecs/plain.js.map +1 -1
- package/dist/parquetjs/codecs/rle.d.ts +1 -1
- package/dist/parquetjs/codecs/rle.d.ts.map +1 -1
- package/dist/parquetjs/codecs/rle.js +16 -21
- package/dist/parquetjs/codecs/rle.js.map +1 -1
- package/dist/parquetjs/compression.d.ts +2 -3
- package/dist/parquetjs/compression.d.ts.map +1 -1
- package/dist/parquetjs/compression.js +4 -105
- package/dist/parquetjs/compression.js.map +1 -1
- package/dist/parquetjs/encoder/parquet-encoder.d.ts +4 -4
- package/dist/parquetjs/encoder/parquet-encoder.d.ts.map +1 -1
- package/dist/parquetjs/encoder/parquet-encoder.js +38 -33
- package/dist/parquetjs/encoder/parquet-encoder.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/ColumnIndex.js +1 -1
- package/dist/parquetjs/parquet-thrift/ColumnIndex.js.map +1 -1
- package/dist/parquetjs/parquet-thrift/index.d.ts +0 -1
- package/dist/parquetjs/parquet-thrift/index.d.ts.map +1 -1
- package/dist/parquetjs/parquet-thrift/index.js +0 -1
- package/dist/parquetjs/parquet-thrift/index.js.map +1 -1
- package/dist/parquetjs/parser/decoders.d.ts +1 -1
- package/dist/parquetjs/parser/decoders.d.ts.map +1 -1
- package/dist/parquetjs/parser/decoders.js +4 -22
- package/dist/parquetjs/parser/decoders.js.map +1 -1
- package/dist/parquetjs/parser/parquet-reader.d.ts +1 -1
- package/dist/parquetjs/parser/parquet-reader.d.ts.map +1 -1
- package/dist/parquetjs/parser/parquet-reader.js +9 -9
- package/dist/parquetjs/parser/parquet-reader.js.map +1 -1
- package/dist/parquetjs/schema/declare.d.ts +1 -1
- package/dist/parquetjs/schema/declare.d.ts.map +1 -1
- package/dist/parquetjs/schema/types.d.ts.map +1 -1
- package/dist/parquetjs/schema/types.js +36 -35
- package/dist/parquetjs/schema/types.js.map +1 -1
- package/dist/parquetjs/utils/binary-utils.d.ts +39 -0
- package/dist/parquetjs/utils/binary-utils.d.ts.map +1 -0
- package/dist/parquetjs/utils/binary-utils.js +102 -0
- package/dist/parquetjs/utils/binary-utils.js.map +1 -0
- package/dist/parquetjs/utils/file-utils.d.ts +1 -1
- package/dist/parquetjs/utils/file-utils.d.ts.map +1 -1
- package/dist/parquetjs/utils/file-utils.js +3 -3
- package/dist/parquetjs/utils/file-utils.js.map +1 -1
- package/dist/parquetjs/utils/read-utils.d.ts +4 -4
- package/dist/parquetjs/utils/read-utils.d.ts.map +1 -1
- package/dist/parquetjs/utils/read-utils.js +12 -17
- package/dist/parquetjs/utils/read-utils.js.map +1 -1
- package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.d.ts +78 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.d.ts.map +1 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.js +213 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.js.map +1 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol.d.ts +78 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol.d.ts.map +1 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol.js +276 -0
- package/dist/parquetjs/utils/uint8-array-compact-protocol.js.map +1 -0
- package/dist/parquetjs/utils/uint8-array-transport.d.ts +25 -0
- package/dist/parquetjs/utils/uint8-array-transport.d.ts.map +1 -0
- package/dist/parquetjs/utils/uint8-array-transport.js +62 -0
- package/dist/parquetjs/utils/uint8-array-transport.js.map +1 -0
- package/dist/unbundled.d.ts +6 -0
- package/dist/unbundled.d.ts.map +1 -0
- package/dist/unbundled.js +7 -0
- package/dist/unbundled.js.map +1 -0
- package/package.json +21 -25
- package/src/bundled.ts +9 -0
- package/src/geoparquet-loader-with-parser.ts +95 -0
- package/src/geoparquet-loader.ts +54 -0
- package/src/index.ts +7 -25
- package/src/lib/constants.ts +1 -1
- package/src/lib/encoders/encode-arrow-to-parquet.ts +9 -15
- package/src/lib/encoders/encode-table-to-parquet-js.ts +199 -0
- package/src/lib/geo/geospatial-metadata.ts +507 -0
- package/src/lib/parsers/get-parquet-schema.ts +3 -1
- package/src/lib/parsers/parse-geoparquet-to-geojson.ts +27 -14
- package/src/lib/parsers/parse-parquet-tables.ts +137 -0
- package/src/lib/parsers/parse-parquet-to-arrow-js.ts +36 -0
- package/src/lib/parsers/parse-parquet-to-arrow.ts +63 -36
- package/src/lib/parsers/parse-parquet-to-columns.ts +6 -7
- package/src/lib/parsers/parse-parquet-to-json.ts +101 -33
- package/src/lib/utils/load-wasm.ts +16 -9
- package/src/lib/utils/make-stream-iterator.ts +1 -1
- package/src/lib/utils/normalize-parquet-options.ts +14 -0
- package/src/parquet-format.ts +2 -0
- package/src/parquet-js-loader.ts +43 -0
- package/src/parquet-js-writer.ts +52 -0
- package/src/parquet-loader-options.ts +63 -0
- package/src/parquet-loader-with-parser.ts +68 -0
- package/src/parquet-loader.ts +79 -0
- package/src/parquet-wasm-loader-with-parser.ts +115 -0
- package/src/parquet-writer.ts +44 -0
- package/src/parquetjs/codecs/declare.ts +2 -2
- package/src/parquetjs/codecs/dictionary.ts +1 -1
- package/src/parquetjs/codecs/plain.ts +67 -53
- package/src/parquetjs/codecs/rle.ts +20 -26
- package/src/parquetjs/compression.ts +7 -114
- package/src/parquetjs/encoder/parquet-encoder.ts +49 -43
- package/src/parquetjs/parquet-thrift/ColumnIndex.ts +1 -1
- package/src/parquetjs/parquet-thrift/index.ts +0 -2
- package/src/parquetjs/parser/decoders.ts +5 -23
- package/src/parquetjs/parser/parquet-reader.ts +10 -12
- package/src/parquetjs/schema/declare.ts +1 -1
- package/src/parquetjs/schema/types.ts +48 -40
- package/src/parquetjs/utils/binary-utils.ts +127 -0
- package/src/parquetjs/utils/file-utils.ts +4 -4
- package/src/parquetjs/utils/read-utils.ts +19 -34
- package/src/parquetjs/utils/uint8-array-compact-protocol-writer.ts +254 -0
- package/src/parquetjs/utils/uint8-array-compact-protocol.ts +322 -0
- package/src/parquetjs/utils/uint8-array-transport.ts +79 -0
- package/src/unbundled.ts +9 -0
- package/dist/parquet-arrow-loader.d.ts +0 -43
- package/dist/parquet-arrow-loader.d.ts.map +0 -1
- package/dist/parquet-arrow-loader.js +0 -49
- package/dist/parquet-arrow-loader.js.map +0 -1
- package/dist/parquet-arrow-writer.d.ts +0 -9
- package/dist/parquet-arrow-writer.d.ts.map +0 -1
- package/dist/parquet-arrow-writer.js +0 -23
- package/dist/parquet-arrow-writer.js.map +0 -1
- package/dist/parquet-json-loader.d.ts +0 -148
- package/dist/parquet-json-loader.d.ts.map +0 -1
- package/dist/parquet-json-loader.js +0 -106
- package/dist/parquet-json-loader.js.map +0 -1
- package/dist/parquet-json-writer.d.ts +0 -19
- package/dist/parquet-json-writer.d.ts.map +0 -1
- package/dist/parquet-json-writer.js +0 -20
- package/dist/parquet-json-writer.js.map +0 -1
- package/dist/polyfills/buffer/buffer-polyfill.browser.d.ts +0 -3
- package/dist/polyfills/buffer/buffer-polyfill.browser.d.ts.map +0 -1
- package/dist/polyfills/buffer/buffer-polyfill.browser.js +0 -12
- package/dist/polyfills/buffer/buffer-polyfill.browser.js.map +0 -1
- package/dist/polyfills/buffer/buffer-polyfill.node.d.ts +0 -3
- package/dist/polyfills/buffer/buffer-polyfill.node.d.ts.map +0 -1
- package/dist/polyfills/buffer/buffer-polyfill.node.js +0 -17
- package/dist/polyfills/buffer/buffer-polyfill.node.js.map +0 -1
- package/dist/polyfills/buffer/buffer.d.ts +0 -222
- package/dist/polyfills/buffer/buffer.d.ts.map +0 -1
- package/dist/polyfills/buffer/buffer.js +0 -1868
- package/dist/polyfills/buffer/buffer.js.map +0 -1
- package/dist/polyfills/buffer/index.d.ts +0 -4
- package/dist/polyfills/buffer/index.d.ts.map +0 -1
- package/dist/polyfills/buffer/index.js +0 -9
- package/dist/polyfills/buffer/index.js.map +0 -1
- package/dist/polyfills/buffer/install-buffer-polyfill.d.ts +0 -2
- package/dist/polyfills/buffer/install-buffer-polyfill.d.ts.map +0 -1
- package/dist/polyfills/buffer/install-buffer-polyfill.js +0 -10
- package/dist/polyfills/buffer/install-buffer-polyfill.js.map +0 -1
- package/dist/workers/parquet-json-worker.d.ts +0 -2
- package/dist/workers/parquet-json-worker.d.ts.map +0 -1
- package/dist/workers/parquet-json-worker.js +0 -7
- package/dist/workers/parquet-json-worker.js.map +0 -1
- package/src/parquet-arrow-loader.ts +0 -74
- package/src/parquet-arrow-writer.ts +0 -33
- package/src/parquet-json-loader.ts +0 -160
- package/src/parquet-json-writer.ts +0 -27
- package/src/parquetjs/modules.d.ts +0 -25
- package/src/polyfills/buffer/buffer-polyfill.browser.ts +0 -14
- package/src/polyfills/buffer/buffer-polyfill.node.ts +0 -19
- package/src/polyfills/buffer/buffer.ts +0 -2205
- package/src/polyfills/buffer/index.ts +0 -11
- package/src/polyfills/buffer/install-buffer-polyfill.ts +0 -12
- package/src/workers/parquet-json-worker.ts +0 -8
|
@@ -7,13 +7,28 @@
|
|
|
7
7
|
/* eslint-disable camelcase */
|
|
8
8
|
import type {PrimitiveType} from '../schema/declare';
|
|
9
9
|
import type {CursorBuffer, ParquetCodecOptions} from './declare';
|
|
10
|
-
import
|
|
10
|
+
import {
|
|
11
|
+
concatUint8Arrays,
|
|
12
|
+
copyUint8Array,
|
|
13
|
+
encodeUtf8,
|
|
14
|
+
readDoubleLE,
|
|
15
|
+
readFloatLE,
|
|
16
|
+
readInt32LE,
|
|
17
|
+
readInt64LE,
|
|
18
|
+
readUInt32LE,
|
|
19
|
+
toUint8Array,
|
|
20
|
+
writeDoubleLE,
|
|
21
|
+
writeFloatLE,
|
|
22
|
+
writeInt32LE,
|
|
23
|
+
writeInt64LE,
|
|
24
|
+
writeUInt32LE
|
|
25
|
+
} from '../utils/binary-utils';
|
|
11
26
|
|
|
12
27
|
export function encodeValues(
|
|
13
28
|
type: PrimitiveType,
|
|
14
29
|
values: any[],
|
|
15
30
|
opts: ParquetCodecOptions
|
|
16
|
-
):
|
|
31
|
+
): Uint8Array {
|
|
17
32
|
switch (type) {
|
|
18
33
|
case 'BOOLEAN':
|
|
19
34
|
return encodeValues_BOOLEAN(values);
|
|
@@ -64,9 +79,8 @@ export function decodeValues(
|
|
|
64
79
|
}
|
|
65
80
|
}
|
|
66
81
|
|
|
67
|
-
function encodeValues_BOOLEAN(values: boolean[]):
|
|
68
|
-
const buf =
|
|
69
|
-
buf.fill(0);
|
|
82
|
+
function encodeValues_BOOLEAN(values: boolean[]): Uint8Array {
|
|
83
|
+
const buf = new Uint8Array(Math.ceil(values.length / 8));
|
|
70
84
|
for (let i = 0; i < values.length; i++) {
|
|
71
85
|
if (values[i]) {
|
|
72
86
|
buf[Math.floor(i / 8)] |= 1 << (i % 8);
|
|
@@ -85,10 +99,10 @@ function decodeValues_BOOLEAN(cursor: CursorBuffer, count: number): boolean[] {
|
|
|
85
99
|
return values;
|
|
86
100
|
}
|
|
87
101
|
|
|
88
|
-
function encodeValues_INT32(values: number[]):
|
|
89
|
-
const buf =
|
|
102
|
+
function encodeValues_INT32(values: number[]): Uint8Array {
|
|
103
|
+
const buf = new Uint8Array(4 * values.length);
|
|
90
104
|
for (let i = 0; i < values.length; i++) {
|
|
91
|
-
|
|
105
|
+
writeInt32LE(buf, values[i], i * 4);
|
|
92
106
|
}
|
|
93
107
|
return buf;
|
|
94
108
|
}
|
|
@@ -96,16 +110,16 @@ function encodeValues_INT32(values: number[]): Buffer {
|
|
|
96
110
|
function decodeValues_INT32(cursor: CursorBuffer, count: number): number[] {
|
|
97
111
|
const values: number[] = [];
|
|
98
112
|
for (let i = 0; i < count; i++) {
|
|
99
|
-
values.push(cursor.buffer
|
|
113
|
+
values.push(readInt32LE(cursor.buffer, cursor.offset));
|
|
100
114
|
cursor.offset += 4;
|
|
101
115
|
}
|
|
102
116
|
return values;
|
|
103
117
|
}
|
|
104
118
|
|
|
105
|
-
function encodeValues_INT64(values: number[]):
|
|
106
|
-
const buf =
|
|
119
|
+
function encodeValues_INT64(values: number[]): Uint8Array {
|
|
120
|
+
const buf = new Uint8Array(8 * values.length);
|
|
107
121
|
for (let i = 0; i < values.length; i++) {
|
|
108
|
-
|
|
122
|
+
writeInt64LE(buf, values[i], i * 8);
|
|
109
123
|
}
|
|
110
124
|
return buf;
|
|
111
125
|
}
|
|
@@ -113,22 +127,17 @@ function encodeValues_INT64(values: number[]): Buffer {
|
|
|
113
127
|
function decodeValues_INT64(cursor: CursorBuffer, count: number): number[] {
|
|
114
128
|
const values: number[] = [];
|
|
115
129
|
for (let i = 0; i < count; i++) {
|
|
116
|
-
values.push(
|
|
130
|
+
values.push(readInt64LE(cursor.buffer, cursor.offset));
|
|
117
131
|
cursor.offset += 8;
|
|
118
132
|
}
|
|
119
133
|
return values;
|
|
120
134
|
}
|
|
121
135
|
|
|
122
|
-
function encodeValues_INT96(values: number[]):
|
|
123
|
-
const buf =
|
|
136
|
+
function encodeValues_INT96(values: number[]): Uint8Array {
|
|
137
|
+
const buf = new Uint8Array(12 * values.length);
|
|
124
138
|
for (let i = 0; i < values.length; i++) {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
buf.writeUInt32LE(0, i * 12 + 8); // truncate to 64 actual precision
|
|
128
|
-
} else {
|
|
129
|
-
INT53.writeInt64LE(~-values[i] + 1, buf, i * 12);
|
|
130
|
-
buf.writeUInt32LE(0xffffffff, i * 12 + 8); // truncate to 64 actual precision
|
|
131
|
-
}
|
|
139
|
+
writeInt64LE(buf, values[i], i * 12);
|
|
140
|
+
writeUInt32LE(buf, values[i] >= 0 ? 0 : 0xffffffff, i * 12 + 8);
|
|
132
141
|
}
|
|
133
142
|
return buf;
|
|
134
143
|
}
|
|
@@ -136,8 +145,8 @@ function encodeValues_INT96(values: number[]): Buffer {
|
|
|
136
145
|
function decodeValues_INT96(cursor: CursorBuffer, count: number): number[] {
|
|
137
146
|
const values: number[] = [];
|
|
138
147
|
for (let i = 0; i < count; i++) {
|
|
139
|
-
const low =
|
|
140
|
-
const high = cursor.buffer
|
|
148
|
+
const low = readInt64LE(cursor.buffer, cursor.offset);
|
|
149
|
+
const high = readUInt32LE(cursor.buffer, cursor.offset + 8);
|
|
141
150
|
if (high === 0xffffffff) {
|
|
142
151
|
values.push(~-low + 1); // truncate to 64 actual precision
|
|
143
152
|
} else {
|
|
@@ -148,10 +157,10 @@ function decodeValues_INT96(cursor: CursorBuffer, count: number): number[] {
|
|
|
148
157
|
return values;
|
|
149
158
|
}
|
|
150
159
|
|
|
151
|
-
function encodeValues_FLOAT(values: number[]):
|
|
152
|
-
const buf =
|
|
160
|
+
function encodeValues_FLOAT(values: number[]): Uint8Array {
|
|
161
|
+
const buf = new Uint8Array(4 * values.length);
|
|
153
162
|
for (let i = 0; i < values.length; i++) {
|
|
154
|
-
|
|
163
|
+
writeFloatLE(buf, values[i], i * 4);
|
|
155
164
|
}
|
|
156
165
|
return buf;
|
|
157
166
|
}
|
|
@@ -159,16 +168,16 @@ function encodeValues_FLOAT(values: number[]): Buffer {
|
|
|
159
168
|
function decodeValues_FLOAT(cursor: CursorBuffer, count: number): number[] {
|
|
160
169
|
const values: number[] = [];
|
|
161
170
|
for (let i = 0; i < count; i++) {
|
|
162
|
-
values.push(cursor.buffer
|
|
171
|
+
values.push(readFloatLE(cursor.buffer, cursor.offset));
|
|
163
172
|
cursor.offset += 4;
|
|
164
173
|
}
|
|
165
174
|
return values;
|
|
166
175
|
}
|
|
167
176
|
|
|
168
|
-
function encodeValues_DOUBLE(values: number[]):
|
|
169
|
-
const buf =
|
|
177
|
+
function encodeValues_DOUBLE(values: number[]): Uint8Array {
|
|
178
|
+
const buf = new Uint8Array(8 * values.length);
|
|
170
179
|
for (let i = 0; i < values.length; i++) {
|
|
171
|
-
|
|
180
|
+
writeDoubleLE(buf, values[i], i * 8);
|
|
172
181
|
}
|
|
173
182
|
return buf;
|
|
174
183
|
}
|
|
@@ -176,67 +185,72 @@ function encodeValues_DOUBLE(values: number[]): Buffer {
|
|
|
176
185
|
function decodeValues_DOUBLE(cursor: CursorBuffer, count: number): number[] {
|
|
177
186
|
const values: number[] = [];
|
|
178
187
|
for (let i = 0; i < count; i++) {
|
|
179
|
-
values.push(cursor.buffer
|
|
188
|
+
values.push(readDoubleLE(cursor.buffer, cursor.offset));
|
|
180
189
|
cursor.offset += 8;
|
|
181
190
|
}
|
|
182
191
|
return values;
|
|
183
192
|
}
|
|
184
193
|
|
|
185
|
-
function encodeValues_BYTE_ARRAY(values:
|
|
194
|
+
function encodeValues_BYTE_ARRAY(values: any[]): Uint8Array {
|
|
195
|
+
const byteValues = values.map(toPrimitiveBytes);
|
|
186
196
|
// tslint:disable-next-line:variable-name
|
|
187
197
|
let buf_len = 0;
|
|
188
|
-
for (let i = 0; i <
|
|
189
|
-
|
|
190
|
-
buf_len += 4 + values[i].length;
|
|
198
|
+
for (let i = 0; i < byteValues.length; i++) {
|
|
199
|
+
buf_len += 4 + byteValues[i].length;
|
|
191
200
|
}
|
|
192
|
-
const buf =
|
|
201
|
+
const buf = new Uint8Array(buf_len);
|
|
193
202
|
// tslint:disable-next-line:variable-name
|
|
194
203
|
let buf_pos = 0;
|
|
195
|
-
for (let i = 0; i <
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
buf_pos += 4 +
|
|
204
|
+
for (let i = 0; i < byteValues.length; i++) {
|
|
205
|
+
writeUInt32LE(buf, byteValues[i].length, buf_pos);
|
|
206
|
+
buf.set(byteValues[i], buf_pos + 4);
|
|
207
|
+
buf_pos += 4 + byteValues[i].length;
|
|
199
208
|
}
|
|
200
209
|
return buf;
|
|
201
210
|
}
|
|
202
211
|
|
|
203
|
-
function decodeValues_BYTE_ARRAY(cursor: CursorBuffer, count: number):
|
|
204
|
-
const values:
|
|
212
|
+
function decodeValues_BYTE_ARRAY(cursor: CursorBuffer, count: number): Uint8Array[] {
|
|
213
|
+
const values: Uint8Array[] = [];
|
|
205
214
|
for (let i = 0; i < count; i++) {
|
|
206
|
-
const len = cursor.buffer
|
|
215
|
+
const len = readUInt32LE(cursor.buffer, cursor.offset);
|
|
207
216
|
cursor.offset += 4;
|
|
208
|
-
|
|
209
|
-
values.push(cursor.buffer.slice(cursor.offset, cursor.offset + len));
|
|
217
|
+
values.push(copyUint8Array(cursor.buffer.subarray(cursor.offset, cursor.offset + len)));
|
|
210
218
|
cursor.offset += len;
|
|
211
219
|
}
|
|
212
220
|
return values;
|
|
213
221
|
}
|
|
214
222
|
|
|
215
|
-
function encodeValues_FIXED_LEN_BYTE_ARRAY(values:
|
|
223
|
+
function encodeValues_FIXED_LEN_BYTE_ARRAY(values: any[], opts: ParquetCodecOptions): Uint8Array {
|
|
216
224
|
if (!opts.typeLength) {
|
|
217
225
|
throw new Error('missing option: typeLength (required for FIXED_LEN_BYTE_ARRAY)');
|
|
218
226
|
}
|
|
227
|
+
const byteValues = values.map(toPrimitiveBytes);
|
|
219
228
|
for (let i = 0; i < values.length; i++) {
|
|
220
|
-
|
|
221
|
-
if (values[i].length !== opts.typeLength) {
|
|
229
|
+
if (byteValues[i].length !== opts.typeLength) {
|
|
222
230
|
throw new Error(`invalid value for FIXED_LEN_BYTE_ARRAY: ${values[i]}`);
|
|
223
231
|
}
|
|
224
232
|
}
|
|
225
|
-
return
|
|
233
|
+
return concatUint8Arrays(byteValues);
|
|
226
234
|
}
|
|
227
235
|
|
|
228
236
|
function decodeValues_FIXED_LEN_BYTE_ARRAY(
|
|
229
237
|
cursor: CursorBuffer,
|
|
230
238
|
count: number,
|
|
231
239
|
opts: ParquetCodecOptions
|
|
232
|
-
):
|
|
233
|
-
const values:
|
|
240
|
+
): Uint8Array[] {
|
|
241
|
+
const values: Uint8Array[] = [];
|
|
234
242
|
if (!opts.typeLength) {
|
|
235
243
|
throw new Error('missing option: typeLength (required for FIXED_LEN_BYTE_ARRAY)');
|
|
236
244
|
}
|
|
237
245
|
for (let i = 0; i < count; i++) {
|
|
238
|
-
values.push(
|
|
246
|
+
values.push(
|
|
247
|
+
copyUint8Array(cursor.buffer.subarray(cursor.offset, cursor.offset + opts.typeLength))
|
|
248
|
+
);
|
|
239
249
|
cursor.offset += opts.typeLength;
|
|
240
250
|
}
|
|
241
251
|
return values;
|
|
242
252
|
}
|
|
253
|
+
|
|
254
|
+
function toPrimitiveBytes(value: any): Uint8Array {
|
|
255
|
+
return typeof value === 'string' ? encodeUtf8(value) : toUint8Array(value);
|
|
256
|
+
}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
import type {PrimitiveType} from '../schema/declare';
|
|
8
8
|
import type {CursorBuffer, ParquetCodecOptions} from './declare';
|
|
9
|
+
import {concatUint8Arrays, writeUInt32LE} from '../utils/binary-utils';
|
|
9
10
|
import varint from 'varint';
|
|
10
11
|
|
|
11
12
|
// eslint-disable-next-line max-statements, complexity
|
|
@@ -13,7 +14,7 @@ export function encodeValues(
|
|
|
13
14
|
type: PrimitiveType,
|
|
14
15
|
values: any[],
|
|
15
16
|
opts: ParquetCodecOptions
|
|
16
|
-
):
|
|
17
|
+
): Uint8Array {
|
|
17
18
|
if (!('bitWidth' in opts)) {
|
|
18
19
|
throw new Error('bitWidth is required');
|
|
19
20
|
}
|
|
@@ -23,14 +24,14 @@ export function encodeValues(
|
|
|
23
24
|
case 'INT32':
|
|
24
25
|
case 'INT64':
|
|
25
26
|
// tslint:disable-next-line:no-parameter-reassignment
|
|
26
|
-
values = values.map(
|
|
27
|
+
values = values.map(x => parseInt(x, 10));
|
|
27
28
|
break;
|
|
28
29
|
|
|
29
30
|
default:
|
|
30
31
|
throw new Error(`unsupported type: ${type}`);
|
|
31
32
|
}
|
|
32
33
|
|
|
33
|
-
|
|
34
|
+
const buffers: Uint8Array[] = [];
|
|
34
35
|
let run: any[] = [];
|
|
35
36
|
let repeats = 0;
|
|
36
37
|
|
|
@@ -40,7 +41,7 @@ export function encodeValues(
|
|
|
40
41
|
if (repeats === 0 && run.length % 8 === 0 && values[i] === values[i + 1]) {
|
|
41
42
|
// If we have any data in runs we need to encode them
|
|
42
43
|
if (run.length) {
|
|
43
|
-
|
|
44
|
+
buffers.push(encodeRunBitpacked(run, opts));
|
|
44
45
|
run = [];
|
|
45
46
|
}
|
|
46
47
|
repeats = 1;
|
|
@@ -49,7 +50,7 @@ export function encodeValues(
|
|
|
49
50
|
} else {
|
|
50
51
|
// If values changes we need to post any previous repeated values
|
|
51
52
|
if (repeats) {
|
|
52
|
-
|
|
53
|
+
buffers.push(encodeRunRepeated(values[i - 1], repeats, opts));
|
|
53
54
|
repeats = 0;
|
|
54
55
|
}
|
|
55
56
|
run.push(values[i]);
|
|
@@ -57,23 +58,19 @@ export function encodeValues(
|
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
if (repeats) {
|
|
60
|
-
|
|
61
|
-
buf,
|
|
62
|
-
encodeRunRepeated(values[values.length - 1], repeats, opts)
|
|
63
|
-
] as Uint8Array[]);
|
|
61
|
+
buffers.push(encodeRunRepeated(values[values.length - 1], repeats, opts));
|
|
64
62
|
} else if (run.length) {
|
|
65
|
-
|
|
63
|
+
buffers.push(encodeRunBitpacked(run, opts));
|
|
66
64
|
}
|
|
67
65
|
|
|
66
|
+
const buf = concatUint8Arrays(buffers);
|
|
68
67
|
if (opts.disableEnvelope) {
|
|
69
68
|
return buf;
|
|
70
69
|
}
|
|
71
70
|
|
|
72
|
-
const envelope =
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
envelope.writeUInt32LE(buf.length, undefined);
|
|
76
|
-
buf.copy(envelope as Uint8Array, 4);
|
|
71
|
+
const envelope = new Uint8Array(buf.length + 4);
|
|
72
|
+
writeUInt32LE(envelope, buf.length, 0);
|
|
73
|
+
envelope.set(buf, 4);
|
|
77
74
|
|
|
78
75
|
return envelope;
|
|
79
76
|
}
|
|
@@ -94,7 +91,7 @@ export function decodeValues(
|
|
|
94
91
|
|
|
95
92
|
let values: number[] = [];
|
|
96
93
|
while (values.length < count) {
|
|
97
|
-
const header = varint.decode(cursor.buffer, cursor.offset);
|
|
94
|
+
const header = varint.decode(cursor.buffer as any, cursor.offset);
|
|
98
95
|
cursor.offset += varint.encodingLength(header);
|
|
99
96
|
let decodedValues: number[];
|
|
100
97
|
if (header & 1) {
|
|
@@ -163,7 +160,7 @@ function decodeRunRepeated(
|
|
|
163
160
|
return new Array(count).fill(value);
|
|
164
161
|
}
|
|
165
162
|
|
|
166
|
-
function encodeRunBitpacked(values: number[], opts: ParquetCodecOptions):
|
|
163
|
+
function encodeRunBitpacked(values: number[], opts: ParquetCodecOptions): Uint8Array {
|
|
167
164
|
// @ts-ignore
|
|
168
165
|
const bitWidth: number = opts.bitWidth;
|
|
169
166
|
|
|
@@ -171,30 +168,27 @@ function encodeRunBitpacked(values: number[], opts: ParquetCodecOptions): Buffer
|
|
|
171
168
|
values.push(0);
|
|
172
169
|
}
|
|
173
170
|
|
|
174
|
-
const buf =
|
|
171
|
+
const buf = new Uint8Array(Math.ceil(bitWidth * (values.length / 8)));
|
|
175
172
|
for (let b = 0; b < bitWidth * values.length; b++) {
|
|
176
173
|
if ((values[Math.floor(b / bitWidth)] & (1 << (b % bitWidth))) > 0) {
|
|
177
174
|
buf[Math.floor(b / 8)] |= 1 << (b % 8);
|
|
178
175
|
}
|
|
179
176
|
}
|
|
180
177
|
|
|
181
|
-
return
|
|
182
|
-
Buffer.from(varint.encode(((values.length / 8) << 1) | 1)),
|
|
183
|
-
buf
|
|
184
|
-
] as Uint8Array[]);
|
|
178
|
+
return concatUint8Arrays([Uint8Array.from(varint.encode(((values.length / 8) << 1) | 1)), buf]);
|
|
185
179
|
}
|
|
186
180
|
|
|
187
|
-
function encodeRunRepeated(value: number, count: number, opts: ParquetCodecOptions):
|
|
181
|
+
function encodeRunRepeated(value: number, count: number, opts: ParquetCodecOptions): Uint8Array {
|
|
188
182
|
// @ts-ignore
|
|
189
183
|
const bitWidth: number = opts.bitWidth;
|
|
190
184
|
|
|
191
|
-
const buf =
|
|
185
|
+
const buf = new Uint8Array(Math.ceil(bitWidth / 8));
|
|
192
186
|
|
|
193
187
|
for (let i = 0; i < buf.length; i++) {
|
|
194
|
-
buf
|
|
188
|
+
buf[i] = value & 0xff;
|
|
195
189
|
// eslint-disable-next-line
|
|
196
190
|
value >> 8; // TODO - this looks wrong
|
|
197
191
|
}
|
|
198
192
|
|
|
199
|
-
return
|
|
193
|
+
return concatUint8Arrays([Uint8Array.from(varint.encode(count << 1)), buf]);
|
|
200
194
|
}
|
|
@@ -18,20 +18,7 @@ import {
|
|
|
18
18
|
import {registerJSModules} from '@loaders.gl/loader-utils';
|
|
19
19
|
|
|
20
20
|
import {ParquetCompression} from './schema/declare';
|
|
21
|
-
|
|
22
|
-
/** We can't use loaders-util buffer handling since we are dependent on buffers even in the browser */
|
|
23
|
-
function toBuffer(arrayBuffer: ArrayBuffer): Buffer {
|
|
24
|
-
return Buffer.from(arrayBuffer);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function toArrayBuffer(buffer: Buffer): ArrayBuffer {
|
|
28
|
-
// TODO - per docs we should just be able to call buffer.buffer, but there are issues
|
|
29
|
-
if (Buffer.isBuffer(buffer)) {
|
|
30
|
-
const typedArray = new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.length);
|
|
31
|
-
return typedArray.slice().buffer;
|
|
32
|
-
}
|
|
33
|
-
return buffer;
|
|
34
|
-
}
|
|
21
|
+
import {toArrayBuffer, toUint8Array} from './utils/binary-utils';
|
|
35
22
|
|
|
36
23
|
// TODO switch to worker compression to avoid bundling...
|
|
37
24
|
|
|
@@ -79,22 +66,20 @@ export const PARQUET_COMPRESSION_METHODS: Record<ParquetCompression, Compression
|
|
|
79
66
|
export async function preloadCompressions(options?: {modules?: {[key: string]: any}}) {
|
|
80
67
|
registerJSModules(options?.modules);
|
|
81
68
|
const compressions = Object.values(PARQUET_COMPRESSION_METHODS);
|
|
82
|
-
return await Promise.all(
|
|
83
|
-
compressions.map((compression) => compression.preload(options?.modules))
|
|
84
|
-
);
|
|
69
|
+
return await Promise.all(compressions.map(compression => compression.preload(options?.modules)));
|
|
85
70
|
}
|
|
86
71
|
|
|
87
72
|
/**
|
|
88
73
|
* Deflate a value using compression method `method`
|
|
89
74
|
*/
|
|
90
|
-
export async function deflate(method: ParquetCompression, value:
|
|
75
|
+
export async function deflate(method: ParquetCompression, value: Uint8Array): Promise<Uint8Array> {
|
|
91
76
|
const compression = PARQUET_COMPRESSION_METHODS[method];
|
|
92
77
|
if (!compression) {
|
|
93
78
|
throw new Error(`parquet: invalid compression method: ${method}`);
|
|
94
79
|
}
|
|
95
80
|
const inputArrayBuffer = toArrayBuffer(value);
|
|
96
81
|
const compressedArrayBuffer = await compression.compress(inputArrayBuffer);
|
|
97
|
-
return
|
|
82
|
+
return toUint8Array(compressedArrayBuffer);
|
|
98
83
|
}
|
|
99
84
|
|
|
100
85
|
/**
|
|
@@ -102,106 +87,14 @@ export async function deflate(method: ParquetCompression, value: Buffer): Promis
|
|
|
102
87
|
*/
|
|
103
88
|
export async function decompress(
|
|
104
89
|
method: ParquetCompression,
|
|
105
|
-
value:
|
|
90
|
+
value: Uint8Array,
|
|
106
91
|
size: number
|
|
107
|
-
): Promise<
|
|
92
|
+
): Promise<Uint8Array> {
|
|
108
93
|
const compression = PARQUET_COMPRESSION_METHODS[method];
|
|
109
94
|
if (!compression) {
|
|
110
95
|
throw new Error(`parquet: invalid compression method: ${method}`);
|
|
111
96
|
}
|
|
112
97
|
const inputArrayBuffer = toArrayBuffer(value);
|
|
113
98
|
const compressedArrayBuffer = await compression.decompress(inputArrayBuffer, size);
|
|
114
|
-
return
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/*
|
|
118
|
-
* Inflate a value using compression method `method`
|
|
119
|
-
*/
|
|
120
|
-
export function inflate(method: ParquetCompression, value: Buffer, size: number): Buffer {
|
|
121
|
-
if (!(method in PARQUET_COMPRESSION_METHODS)) {
|
|
122
|
-
throw new Error(`invalid compression method: ${method}`);
|
|
123
|
-
}
|
|
124
|
-
// @ts-ignore
|
|
125
|
-
return PARQUET_COMPRESSION_METHODS[method].inflate(value, size);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/*
|
|
129
|
-
function deflate_identity(value: Buffer): Buffer {
|
|
130
|
-
return value;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
function deflate_gzip(value: Buffer): Buffer {
|
|
134
|
-
return zlib.gzipSync(value);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
function deflate_snappy(value: Buffer): Buffer {
|
|
138
|
-
return snappyjs.compress(value);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
function deflate_lzo(value: Buffer): Buffer {
|
|
142
|
-
lzo = lzo || Util.load('lzo');
|
|
143
|
-
return lzo.compress(value);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
function deflate_brotli(value: Buffer): Buffer {
|
|
147
|
-
brotli = brotli || Util.load('brotli');
|
|
148
|
-
const result = brotli.compress(value, {
|
|
149
|
-
mode: 0,
|
|
150
|
-
quality: 8,
|
|
151
|
-
lgwin: 22
|
|
152
|
-
});
|
|
153
|
-
return result ? Buffer.from(result) : Buffer.alloc(0);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
function deflate_lz4(value: Buffer): Buffer {
|
|
157
|
-
lz4js = lz4js || Util.load('lz4js');
|
|
158
|
-
try {
|
|
159
|
-
// let result = Buffer.alloc(lz4js.encodeBound(value.length));
|
|
160
|
-
// const compressedSize = lz4.encodeBlock(value, result);
|
|
161
|
-
// // remove unnecessary bytes
|
|
162
|
-
// result = result.slice(0, compressedSize);
|
|
163
|
-
// return result;
|
|
164
|
-
return Buffer.from(lz4js.compress(value));
|
|
165
|
-
} catch (err) {
|
|
166
|
-
throw err;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
function inflate_identity(value: Buffer): Buffer {
|
|
170
|
-
return value;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
function inflate_gzip(value: Buffer): Buffer {
|
|
174
|
-
return zlib.gunzipSync(value);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
function inflate_snappy(value: Buffer): Buffer {
|
|
178
|
-
return snappyjs.uncompress(value);
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
function inflate_lzo(value: Buffer, size: number): Buffer {
|
|
182
|
-
lzo = lzo || Util.load('lzo');
|
|
183
|
-
return lzo.decompress(value, size);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
function inflate_lz4(value: Buffer, size: number): Buffer {
|
|
187
|
-
lz4js = lz4js || Util.load('lz4js');
|
|
188
|
-
try {
|
|
189
|
-
// let result = Buffer.alloc(size);
|
|
190
|
-
// const uncompressedSize = lz4js.decodeBlock(value, result);
|
|
191
|
-
// // remove unnecessary bytes
|
|
192
|
-
// result = result.slice(0, uncompressedSize);
|
|
193
|
-
// return result;
|
|
194
|
-
return Buffer.from(lz4js.decompress(value, size));
|
|
195
|
-
} catch (err) {
|
|
196
|
-
throw err;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
function inflate_brotli(value: Buffer): Buffer {
|
|
201
|
-
brotli = brotli || Util.load('brotli');
|
|
202
|
-
if (!value.length) {
|
|
203
|
-
return Buffer.alloc(0);
|
|
204
|
-
}
|
|
205
|
-
return Buffer.from(brotli.decompress(value));
|
|
99
|
+
return toUint8Array(compressedArrayBuffer);
|
|
206
100
|
}
|
|
207
|
-
*/
|