@loaders.gl/parquet 3.0.12 → 3.1.0-alpha.4
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/dist.min.js +7 -18
- package/dist/dist.min.js.map +1 -1
- package/dist/es5/bundle.js +2 -4
- package/dist/es5/bundle.js.map +1 -1
- package/dist/es5/constants.js +17 -0
- package/dist/es5/constants.js.map +1 -0
- package/dist/es5/index.js +53 -21
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/convert-schema.js +82 -0
- package/dist/es5/lib/convert-schema.js.map +1 -0
- package/dist/es5/lib/parse-parquet.js +173 -0
- package/dist/es5/lib/parse-parquet.js.map +1 -0
- package/dist/es5/lib/read-array-buffer.js +53 -0
- package/dist/es5/lib/read-array-buffer.js.map +1 -0
- package/dist/es5/parquet-loader.js +6 -79
- package/dist/es5/parquet-loader.js.map +1 -1
- package/dist/es5/parquet-writer.js +1 -1
- package/dist/es5/parquet-writer.js.map +1 -1
- package/dist/es5/parquetjs/codecs/dictionary.js +30 -0
- package/dist/es5/parquetjs/codecs/dictionary.js.map +1 -0
- package/dist/es5/parquetjs/codecs/index.js +10 -0
- package/dist/es5/parquetjs/codecs/index.js.map +1 -1
- package/dist/es5/parquetjs/codecs/rle.js +2 -2
- package/dist/es5/parquetjs/codecs/rle.js.map +1 -1
- package/dist/es5/parquetjs/compression.js +138 -104
- package/dist/es5/parquetjs/compression.js.map +1 -1
- package/dist/es5/parquetjs/{writer.js → encoder/writer.js} +397 -228
- package/dist/es5/parquetjs/encoder/writer.js.map +1 -0
- package/dist/es5/parquetjs/parquet-thrift/CompressionCodec.js +1 -0
- package/dist/es5/parquetjs/parquet-thrift/CompressionCodec.js.map +1 -1
- package/dist/es5/parquetjs/parser/decoders.js +495 -0
- package/dist/es5/parquetjs/parser/decoders.js.map +1 -0
- package/dist/es5/parquetjs/parser/parquet-cursor.js +215 -0
- package/dist/es5/parquetjs/parser/parquet-cursor.js.map +1 -0
- package/dist/es5/parquetjs/parser/parquet-envelope-reader.js +452 -0
- package/dist/es5/parquetjs/parser/parquet-envelope-reader.js.map +1 -0
- package/dist/es5/parquetjs/parser/parquet-reader.js +413 -0
- package/dist/es5/parquetjs/parser/parquet-reader.js.map +1 -0
- package/dist/es5/parquetjs/schema/declare.js.map +1 -1
- package/dist/es5/parquetjs/schema/schema.js +2 -0
- package/dist/es5/parquetjs/schema/schema.js.map +1 -1
- package/dist/es5/parquetjs/schema/shred.js +2 -1
- package/dist/es5/parquetjs/schema/shred.js.map +1 -1
- package/dist/es5/parquetjs/schema/types.js +79 -4
- package/dist/es5/parquetjs/schema/types.js.map +1 -1
- package/dist/es5/parquetjs/utils/buffer-utils.js +21 -0
- package/dist/es5/parquetjs/utils/buffer-utils.js.map +1 -0
- package/dist/es5/parquetjs/utils/file-utils.js +108 -0
- package/dist/es5/parquetjs/utils/file-utils.js.map +1 -0
- package/dist/es5/parquetjs/{util.js → utils/read-utils.js} +13 -113
- package/dist/es5/parquetjs/utils/read-utils.js.map +1 -0
- package/dist/esm/bundle.js +2 -4
- package/dist/esm/bundle.js.map +1 -1
- package/dist/esm/constants.js +6 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/index.js +14 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/convert-schema.js +71 -0
- package/dist/esm/lib/convert-schema.js.map +1 -0
- package/dist/esm/lib/parse-parquet.js +28 -0
- package/dist/esm/lib/parse-parquet.js.map +1 -0
- package/dist/esm/lib/read-array-buffer.js +9 -0
- package/dist/esm/lib/read-array-buffer.js.map +1 -0
- package/dist/esm/parquet-loader.js +4 -24
- package/dist/esm/parquet-loader.js.map +1 -1
- package/dist/esm/parquet-writer.js +1 -1
- package/dist/esm/parquet-writer.js.map +1 -1
- package/dist/esm/parquetjs/codecs/dictionary.js +12 -0
- package/dist/esm/parquetjs/codecs/dictionary.js.map +1 -0
- package/dist/esm/parquetjs/codecs/index.js +9 -0
- package/dist/esm/parquetjs/codecs/index.js.map +1 -1
- package/dist/esm/parquetjs/codecs/rle.js +2 -2
- package/dist/esm/parquetjs/codecs/rle.js.map +1 -1
- package/dist/esm/parquetjs/compression.js +54 -105
- package/dist/esm/parquetjs/compression.js.map +1 -1
- package/dist/esm/parquetjs/{writer.js → encoder/writer.js} +32 -35
- package/dist/esm/parquetjs/encoder/writer.js.map +1 -0
- package/dist/esm/parquetjs/parquet-thrift/CompressionCodec.js +1 -0
- package/dist/esm/parquetjs/parquet-thrift/CompressionCodec.js.map +1 -1
- package/dist/esm/parquetjs/parser/decoders.js +300 -0
- package/dist/esm/parquetjs/parser/decoders.js.map +1 -0
- package/dist/esm/parquetjs/parser/parquet-cursor.js +90 -0
- package/dist/esm/parquetjs/parser/parquet-cursor.js.map +1 -0
- package/dist/esm/parquetjs/parser/parquet-envelope-reader.js +164 -0
- package/dist/esm/parquetjs/parser/parquet-envelope-reader.js.map +1 -0
- package/dist/esm/parquetjs/parser/parquet-reader.js +133 -0
- package/dist/esm/parquetjs/parser/parquet-reader.js.map +1 -0
- package/dist/esm/parquetjs/schema/declare.js.map +1 -1
- package/dist/esm/parquetjs/schema/schema.js +2 -0
- package/dist/esm/parquetjs/schema/schema.js.map +1 -1
- package/dist/esm/parquetjs/schema/shred.js +2 -1
- package/dist/esm/parquetjs/schema/shred.js.map +1 -1
- package/dist/esm/parquetjs/schema/types.js +78 -4
- package/dist/esm/parquetjs/schema/types.js.map +1 -1
- package/dist/esm/parquetjs/utils/buffer-utils.js +12 -0
- package/dist/esm/parquetjs/utils/buffer-utils.js.map +1 -0
- package/dist/esm/parquetjs/utils/file-utils.js +79 -0
- package/dist/esm/parquetjs/utils/file-utils.js.map +1 -0
- package/dist/esm/parquetjs/{util.js → utils/read-utils.js} +11 -89
- package/dist/esm/parquetjs/utils/read-utils.js.map +1 -0
- package/dist/parquet-worker.js +7 -18
- package/dist/parquet-worker.js.map +1 -1
- package/package.json +10 -10
- package/src/bundle.ts +2 -3
- package/src/constants.ts +17 -0
- package/src/index.ts +30 -4
- package/src/lib/convert-schema.ts +95 -0
- package/src/lib/parse-parquet.ts +27 -0
- package/{dist/es5/libs → src/lib}/read-array-buffer.ts +0 -0
- package/src/parquet-loader.ts +4 -24
- package/src/parquetjs/codecs/dictionary.ts +11 -0
- package/src/parquetjs/codecs/index.ts +13 -0
- package/src/parquetjs/codecs/rle.ts +4 -2
- package/src/parquetjs/compression.ts +89 -50
- package/src/parquetjs/{writer.ts → encoder/writer.ts} +46 -45
- package/src/parquetjs/parquet-thrift/CompressionCodec.ts +2 -1
- package/src/parquetjs/parser/decoders.ts +448 -0
- package/src/parquetjs/parser/parquet-cursor.ts +94 -0
- package/src/parquetjs/parser/parquet-envelope-reader.ts +210 -0
- package/src/parquetjs/parser/parquet-reader.ts +179 -0
- package/src/parquetjs/schema/declare.ts +48 -2
- package/src/parquetjs/schema/schema.ts +2 -0
- package/src/parquetjs/schema/shred.ts +3 -1
- package/src/parquetjs/schema/types.ts +82 -5
- package/src/parquetjs/utils/buffer-utils.ts +18 -0
- package/src/parquetjs/utils/file-utils.ts +96 -0
- package/src/parquetjs/{util.ts → utils/read-utils.ts} +13 -110
- package/dist/dist.es5.min.js +0 -51
- package/dist/dist.es5.min.js.map +0 -1
- package/dist/es5/parquetjs/compression.ts.disabled +0 -105
- package/dist/es5/parquetjs/reader.js +0 -1078
- package/dist/es5/parquetjs/reader.js.map +0 -1
- package/dist/es5/parquetjs/util.js.map +0 -1
- package/dist/es5/parquetjs/writer.js.map +0 -1
- package/dist/esm/libs/read-array-buffer.ts +0 -31
- package/dist/esm/parquetjs/compression.ts.disabled +0 -105
- package/dist/esm/parquetjs/reader.js +0 -524
- package/dist/esm/parquetjs/reader.js.map +0 -1
- package/dist/esm/parquetjs/util.js.map +0 -1
- package/dist/esm/parquetjs/writer.js.map +0 -1
- package/src/libs/read-array-buffer.ts +0 -31
- package/src/parquetjs/compression.ts.disabled +0 -105
- package/src/parquetjs/reader.ts +0 -707
|
@@ -1,10 +1,23 @@
|
|
|
1
1
|
// Forked from https://github.com/kbajalc/parquets under MIT license (Copyright (c) 2017 ironSource Ltd.)
|
|
2
|
+
import Int64 from 'node-int64';
|
|
3
|
+
import type {PageHeader} from '../parquet-thrift';
|
|
2
4
|
|
|
3
|
-
export type ParquetCodec = 'PLAIN' | 'RLE';
|
|
4
|
-
export type ParquetCompression =
|
|
5
|
+
export type ParquetCodec = 'PLAIN' | 'RLE' | 'PLAIN_DICTIONARY';
|
|
6
|
+
export type ParquetCompression =
|
|
7
|
+
| 'UNCOMPRESSED'
|
|
8
|
+
| 'GZIP'
|
|
9
|
+
| 'SNAPPY'
|
|
10
|
+
| 'LZO'
|
|
11
|
+
| 'BROTLI'
|
|
12
|
+
| 'LZ4'
|
|
13
|
+
| 'LZ4_RAW'
|
|
14
|
+
| 'ZSTD';
|
|
5
15
|
export type RepetitionType = 'REQUIRED' | 'OPTIONAL' | 'REPEATED';
|
|
6
16
|
export type ParquetType = PrimitiveType | OriginalType;
|
|
7
17
|
|
|
18
|
+
/**
|
|
19
|
+
* Physical type
|
|
20
|
+
*/
|
|
8
21
|
export type PrimitiveType =
|
|
9
22
|
// Base Types
|
|
10
23
|
| 'BOOLEAN' // 0
|
|
@@ -16,6 +29,9 @@ export type PrimitiveType =
|
|
|
16
29
|
| 'BYTE_ARRAY' // 6,
|
|
17
30
|
| 'FIXED_LEN_BYTE_ARRAY'; // 7
|
|
18
31
|
|
|
32
|
+
/**
|
|
33
|
+
* Logical type
|
|
34
|
+
*/
|
|
19
35
|
export type OriginalType =
|
|
20
36
|
// Converted Types
|
|
21
37
|
| 'UTF8' // 0
|
|
@@ -24,6 +40,10 @@ export type OriginalType =
|
|
|
24
40
|
// | 'LIST' // 3
|
|
25
41
|
// | 'ENUM' // 4
|
|
26
42
|
// | 'DECIMAL' // 5
|
|
43
|
+
| 'DECIMAL_INT32' // 5
|
|
44
|
+
| 'DECIMAL_INT64' // 5
|
|
45
|
+
| 'DECIMAL_BYTE_ARRAY' // 5
|
|
46
|
+
| 'DECIMAL_FIXED_LEN_BYTE_ARRAY' // 5
|
|
27
47
|
| 'DATE' // 6
|
|
28
48
|
| 'TIME_MILLIS' // 7
|
|
29
49
|
| 'TIME_MICROS' // 8
|
|
@@ -41,6 +61,8 @@ export type OriginalType =
|
|
|
41
61
|
| 'BSON' // 20
|
|
42
62
|
| 'INTERVAL'; // 21
|
|
43
63
|
|
|
64
|
+
export type ParquetDictionary = string[];
|
|
65
|
+
|
|
44
66
|
export interface SchemaDefinition {
|
|
45
67
|
[string: string]: FieldDefinition;
|
|
46
68
|
}
|
|
@@ -48,6 +70,8 @@ export interface SchemaDefinition {
|
|
|
48
70
|
export interface FieldDefinition {
|
|
49
71
|
type?: ParquetType;
|
|
50
72
|
typeLength?: number;
|
|
73
|
+
presision?: number;
|
|
74
|
+
scale?: number;
|
|
51
75
|
encoding?: ParquetCodec;
|
|
52
76
|
compression?: ParquetCompression;
|
|
53
77
|
optional?: boolean;
|
|
@@ -63,6 +87,8 @@ export interface ParquetField {
|
|
|
63
87
|
originalType?: OriginalType;
|
|
64
88
|
repetitionType: RepetitionType;
|
|
65
89
|
typeLength?: number;
|
|
90
|
+
presision?: number;
|
|
91
|
+
scale?: number;
|
|
66
92
|
encoding?: ParquetCodec;
|
|
67
93
|
compression?: ParquetCompression;
|
|
68
94
|
rLevelMax: number;
|
|
@@ -72,11 +98,31 @@ export interface ParquetField {
|
|
|
72
98
|
fields?: Record<string, ParquetField>;
|
|
73
99
|
}
|
|
74
100
|
|
|
101
|
+
export interface ParquetOptions {
|
|
102
|
+
type: ParquetType;
|
|
103
|
+
rLevelMax: number;
|
|
104
|
+
dLevelMax: number;
|
|
105
|
+
compression: ParquetCompression;
|
|
106
|
+
column: ParquetField;
|
|
107
|
+
numValues?: Int64;
|
|
108
|
+
dictionary?: ParquetDictionary;
|
|
109
|
+
}
|
|
110
|
+
|
|
75
111
|
export interface ParquetData {
|
|
76
112
|
dlevels: number[];
|
|
77
113
|
rlevels: number[];
|
|
78
114
|
values: any[];
|
|
79
115
|
count: number;
|
|
116
|
+
pageHeaders: PageHeader[];
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export interface ParquetPageData {
|
|
120
|
+
dlevels: number[];
|
|
121
|
+
rlevels: number[];
|
|
122
|
+
values: any[];
|
|
123
|
+
count: number;
|
|
124
|
+
dictionary?: ParquetDictionary;
|
|
125
|
+
pageHeader: PageHeader;
|
|
80
126
|
}
|
|
81
127
|
|
|
82
128
|
export interface ParquetRecord {
|
|
@@ -13,6 +13,7 @@ export function shredBuffer(schema: ParquetSchema): ParquetBuffer {
|
|
|
13
13
|
dlevels: [],
|
|
14
14
|
rlevels: [],
|
|
15
15
|
values: [],
|
|
16
|
+
pageHeaders: [],
|
|
16
17
|
count: 0
|
|
17
18
|
};
|
|
18
19
|
}
|
|
@@ -203,7 +204,8 @@ function materializeColumn(
|
|
|
203
204
|
const value = Types.fromPrimitive(
|
|
204
205
|
// @ts-ignore
|
|
205
206
|
field.originalType || field.primitiveType,
|
|
206
|
-
data.values[vIndex]
|
|
207
|
+
data.values[vIndex],
|
|
208
|
+
field
|
|
207
209
|
);
|
|
208
210
|
vIndex++;
|
|
209
211
|
if (field.repetitionType === 'REPEATED') {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Forked from https://github.com/kbajalc/parquets under MIT license (Copyright (c) 2017 ironSource Ltd.)
|
|
2
2
|
/* eslint-disable camelcase */
|
|
3
3
|
import BSON from 'bson';
|
|
4
|
-
import {OriginalType, ParquetType, PrimitiveType} from './declare';
|
|
4
|
+
import {OriginalType, ParquetField, ParquetType, PrimitiveType} from './declare';
|
|
5
5
|
|
|
6
6
|
export interface ParquetTypeKit {
|
|
7
7
|
primitiveType: PrimitiveType;
|
|
@@ -137,6 +137,30 @@ export const PARQUET_LOGICAL_TYPES: Record<ParquetType, ParquetTypeKit> = {
|
|
|
137
137
|
typeLength: 12,
|
|
138
138
|
toPrimitive: toPrimitive_INTERVAL,
|
|
139
139
|
fromPrimitive: fromPrimitive_INTERVAL
|
|
140
|
+
},
|
|
141
|
+
DECIMAL_INT32: {
|
|
142
|
+
primitiveType: 'INT32',
|
|
143
|
+
originalType: 'DECIMAL_INT32',
|
|
144
|
+
toPrimitive: decimalToPrimitive_INT32,
|
|
145
|
+
fromPrimitive: decimalFromPrimitive_INT
|
|
146
|
+
},
|
|
147
|
+
DECIMAL_INT64: {
|
|
148
|
+
primitiveType: 'INT64',
|
|
149
|
+
originalType: 'DECIMAL_INT64',
|
|
150
|
+
toPrimitive: decimalToPrimitive_INT64,
|
|
151
|
+
fromPrimitive: decimalFromPrimitive_INT
|
|
152
|
+
},
|
|
153
|
+
DECIMAL_BYTE_ARRAY: {
|
|
154
|
+
primitiveType: 'BYTE_ARRAY',
|
|
155
|
+
originalType: 'DECIMAL_BYTE_ARRAY',
|
|
156
|
+
toPrimitive: decimalToPrimitive_BYTE_ARRAY,
|
|
157
|
+
fromPrimitive: decimalFromPrimitive_BYTE_ARRAY
|
|
158
|
+
},
|
|
159
|
+
DECIMAL_FIXED_LEN_BYTE_ARRAY: {
|
|
160
|
+
primitiveType: 'FIXED_LEN_BYTE_ARRAY',
|
|
161
|
+
originalType: 'DECIMAL_FIXED_LEN_BYTE_ARRAY',
|
|
162
|
+
toPrimitive: decimalToPrimitive_BYTE_ARRAY,
|
|
163
|
+
fromPrimitive: decimalFromPrimitive_BYTE_ARRAY
|
|
140
164
|
}
|
|
141
165
|
};
|
|
142
166
|
|
|
@@ -144,25 +168,25 @@ export const PARQUET_LOGICAL_TYPES: Record<ParquetType, ParquetTypeKit> = {
|
|
|
144
168
|
* Convert a value from it's native representation to the internal/underlying
|
|
145
169
|
* primitive type
|
|
146
170
|
*/
|
|
147
|
-
export function toPrimitive(type: ParquetType, value: any) {
|
|
171
|
+
export function toPrimitive(type: ParquetType, value: any, field?: ParquetField) {
|
|
148
172
|
if (!(type in PARQUET_LOGICAL_TYPES)) {
|
|
149
173
|
throw new Error(`invalid type: ${type}`);
|
|
150
174
|
}
|
|
151
175
|
|
|
152
|
-
return PARQUET_LOGICAL_TYPES[type].toPrimitive(value);
|
|
176
|
+
return PARQUET_LOGICAL_TYPES[type].toPrimitive(value, field);
|
|
153
177
|
}
|
|
154
178
|
|
|
155
179
|
/**
|
|
156
180
|
* Convert a value from it's internal/underlying primitive representation to
|
|
157
181
|
* the native representation
|
|
158
182
|
*/
|
|
159
|
-
export function fromPrimitive(type: ParquetType, value: any) {
|
|
183
|
+
export function fromPrimitive(type: ParquetType, value: any, field?: ParquetField) {
|
|
160
184
|
if (!(type in PARQUET_LOGICAL_TYPES)) {
|
|
161
185
|
throw new Error(`invalid type: ${type}`);
|
|
162
186
|
}
|
|
163
187
|
|
|
164
188
|
if ('fromPrimitive' in PARQUET_LOGICAL_TYPES[type]) {
|
|
165
|
-
return PARQUET_LOGICAL_TYPES[type].fromPrimitive?.(value);
|
|
189
|
+
return PARQUET_LOGICAL_TYPES[type].fromPrimitive?.(value, field);
|
|
166
190
|
// tslint:disable-next-line:no-else-after-return
|
|
167
191
|
}
|
|
168
192
|
return value;
|
|
@@ -239,6 +263,16 @@ function toPrimitive_INT32(value: any) {
|
|
|
239
263
|
return v;
|
|
240
264
|
}
|
|
241
265
|
|
|
266
|
+
function decimalToPrimitive_INT32(value: number, field: ParquetField) {
|
|
267
|
+
const primitiveValue = value * 10 ** (field.scale || 0);
|
|
268
|
+
const v = Math.round(((primitiveValue * 10 ** -field.presision!) % 1) * 10 ** field.presision!);
|
|
269
|
+
if (v < -0x80000000 || v > 0x7fffffff || isNaN(v)) {
|
|
270
|
+
throw new Error(`invalid value for INT32: ${value}`);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
return v;
|
|
274
|
+
}
|
|
275
|
+
|
|
242
276
|
function toPrimitive_UINT32(value: any) {
|
|
243
277
|
const v = parseInt(value, 10);
|
|
244
278
|
if (v < 0 || v > 0xffffffffffff || isNaN(v)) {
|
|
@@ -257,6 +291,16 @@ function toPrimitive_INT64(value: any) {
|
|
|
257
291
|
return v;
|
|
258
292
|
}
|
|
259
293
|
|
|
294
|
+
function decimalToPrimitive_INT64(value: number, field: ParquetField) {
|
|
295
|
+
const primitiveValue = value * 10 ** (field.scale || 0);
|
|
296
|
+
const v = Math.round(((primitiveValue * 10 ** -field.presision!) % 1) * 10 ** field.presision!);
|
|
297
|
+
if (isNaN(v)) {
|
|
298
|
+
throw new Error(`invalid value for INT64: ${value}`);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
return v;
|
|
302
|
+
}
|
|
303
|
+
|
|
260
304
|
function toPrimitive_UINT64(value: any) {
|
|
261
305
|
const v = parseInt(value, 10);
|
|
262
306
|
if (v < 0 || isNaN(v)) {
|
|
@@ -279,6 +323,11 @@ function toPrimitive_BYTE_ARRAY(value: any) {
|
|
|
279
323
|
return Buffer.from(value);
|
|
280
324
|
}
|
|
281
325
|
|
|
326
|
+
function decimalToPrimitive_BYTE_ARRAY(value: any) {
|
|
327
|
+
// TBD
|
|
328
|
+
return Buffer.from(value);
|
|
329
|
+
}
|
|
330
|
+
|
|
282
331
|
function toPrimitive_UTF8(value: any) {
|
|
283
332
|
return Buffer.from(value, 'utf8');
|
|
284
333
|
}
|
|
@@ -409,3 +458,31 @@ function fromPrimitive_INTERVAL(value: any) {
|
|
|
409
458
|
|
|
410
459
|
return {months, days, milliseconds: millis};
|
|
411
460
|
}
|
|
461
|
+
|
|
462
|
+
function decimalFromPrimitive_INT(value: any, field: ParquetField) {
|
|
463
|
+
const presisionInt = Math.round(((value * 10 ** -field.presision!) % 1) * 10 ** field.presision!);
|
|
464
|
+
return presisionInt * 10 ** -(field.scale || 0);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
function decimalFromPrimitive_BYTE_ARRAY(value: any, field: ParquetField) {
|
|
468
|
+
let number = 0;
|
|
469
|
+
if (value.length <= 4) {
|
|
470
|
+
// Bytewise operators faster. Use them if it is possible
|
|
471
|
+
for (let i = 0; i < value.length; i++) {
|
|
472
|
+
// `value.length - i - 1` bytes have reverse order (big-endian)
|
|
473
|
+
const component = value[i] << (8 * (value.length - i - 1));
|
|
474
|
+
number += component;
|
|
475
|
+
}
|
|
476
|
+
} else {
|
|
477
|
+
for (let i = 0; i < value.length; i++) {
|
|
478
|
+
// `value.length - i - 1` bytes have reverse order (big-endian)
|
|
479
|
+
const component = value[i] * 2 ** (8 * (value.length - 1 - i));
|
|
480
|
+
number += component;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
const presisionInt = Math.round(
|
|
485
|
+
((number * 10 ** -field.presision!) % 1) * 10 ** field.presision!
|
|
486
|
+
);
|
|
487
|
+
return presisionInt * 10 ** -(field.scale || 0);
|
|
488
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert Buffer to ArrayBuffer
|
|
3
|
+
*/
|
|
4
|
+
export function toArrayBuffer(buffer: Buffer): ArrayBuffer {
|
|
5
|
+
// TODO - per docs we should just be able to call buffer.buffer, but there are issues
|
|
6
|
+
if (Buffer.isBuffer(buffer)) {
|
|
7
|
+
const typedArray = new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.length);
|
|
8
|
+
return typedArray.slice().buffer;
|
|
9
|
+
}
|
|
10
|
+
return buffer;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Convert (copy) ArrayBuffer to Buffer
|
|
15
|
+
*/
|
|
16
|
+
export function toBuffer(arrayBuffer: ArrayBuffer): Buffer {
|
|
17
|
+
return Buffer.from(arrayBuffer);
|
|
18
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// Forked from https://github.com/kbajalc/parquets under MIT license (Copyright (c) 2017 ironSource Ltd.)
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import {Writable} from 'stream';
|
|
4
|
+
|
|
5
|
+
export function load(name: string): any {
|
|
6
|
+
return (module || (global as any)).require(name);
|
|
7
|
+
}
|
|
8
|
+
export interface WriteStreamOptions {
|
|
9
|
+
flags?: string;
|
|
10
|
+
encoding?: string;
|
|
11
|
+
fd?: number;
|
|
12
|
+
mode?: number;
|
|
13
|
+
autoClose?: boolean;
|
|
14
|
+
start?: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function fopen(filePath: string): Promise<number> {
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
fs.open(filePath, 'r', (err, fd) => {
|
|
20
|
+
if (err) {
|
|
21
|
+
reject(err);
|
|
22
|
+
} else {
|
|
23
|
+
resolve(fd);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function fstat(filePath: string): Promise<fs.Stats> {
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
fs.stat(filePath, (err, stat) => {
|
|
32
|
+
if (err) {
|
|
33
|
+
reject(err);
|
|
34
|
+
} else {
|
|
35
|
+
resolve(stat);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function fread(fd: number, position: number, length: number): Promise<Buffer> {
|
|
42
|
+
const buffer = Buffer.alloc(length);
|
|
43
|
+
return new Promise((resolve, reject) => {
|
|
44
|
+
fs.read(fd, buffer, 0, length, position, (err, bytesRead, buf) => {
|
|
45
|
+
if (err || bytesRead !== length) {
|
|
46
|
+
reject(err || Error('read failed'));
|
|
47
|
+
} else {
|
|
48
|
+
resolve(buf);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function fclose(fd: number): Promise<void> {
|
|
55
|
+
return new Promise((resolve, reject) => {
|
|
56
|
+
fs.close(fd, (err) => {
|
|
57
|
+
if (err) {
|
|
58
|
+
reject(err);
|
|
59
|
+
} else {
|
|
60
|
+
resolve();
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function oswrite(os: Writable, buf: Buffer): Promise<void> {
|
|
67
|
+
return new Promise((resolve, reject) => {
|
|
68
|
+
os.write(buf, (err) => {
|
|
69
|
+
if (err) {
|
|
70
|
+
reject(err);
|
|
71
|
+
} else {
|
|
72
|
+
resolve();
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function osclose(os: Writable): Promise<void> {
|
|
79
|
+
return new Promise((resolve, reject) => {
|
|
80
|
+
(os as any).close((err: any) => {
|
|
81
|
+
if (err) {
|
|
82
|
+
reject(err);
|
|
83
|
+
} else {
|
|
84
|
+
resolve();
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export function osopen(path: string, opts?: WriteStreamOptions): Promise<fs.WriteStream> {
|
|
91
|
+
return new Promise((resolve, reject) => {
|
|
92
|
+
const outputStream = fs.createWriteStream(path, opts as any);
|
|
93
|
+
outputStream.once('open', (fd) => resolve(outputStream));
|
|
94
|
+
outputStream.once('error', (err) => reject(err));
|
|
95
|
+
});
|
|
96
|
+
}
|
|
@@ -1,17 +1,5 @@
|
|
|
1
|
-
// Forked from https://github.com/kbajalc/parquets under MIT license (Copyright (c) 2017 ironSource Ltd.)
|
|
2
|
-
import fs from 'fs';
|
|
3
1
|
import {TBufferedTransport, TCompactProtocol, TFramedTransport} from 'thrift';
|
|
4
|
-
import {FileMetaData, PageHeader} from '
|
|
5
|
-
import {Writable} from 'stream';
|
|
6
|
-
|
|
7
|
-
export interface WriteStreamOptions {
|
|
8
|
-
flags?: string;
|
|
9
|
-
encoding?: string;
|
|
10
|
-
fd?: number;
|
|
11
|
-
mode?: number;
|
|
12
|
-
autoClose?: boolean;
|
|
13
|
-
start?: number;
|
|
14
|
-
}
|
|
2
|
+
import {FileMetaData, PageHeader} from '../parquet-thrift';
|
|
15
3
|
|
|
16
4
|
class UFramedTransport extends TFramedTransport {
|
|
17
5
|
public readPos: number = 0;
|
|
@@ -47,6 +35,18 @@ export function decodeThrift(obj: any, buf: Buffer, offset?: number) {
|
|
|
47
35
|
return transport.readPos - offset;
|
|
48
36
|
}
|
|
49
37
|
|
|
38
|
+
/**
|
|
39
|
+
* FIXME not ideal that this is linear
|
|
40
|
+
*/
|
|
41
|
+
export function getThriftEnum(klass: any, value: number | string): string {
|
|
42
|
+
for (const k in klass) {
|
|
43
|
+
if (klass[k] === value) {
|
|
44
|
+
return k;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
throw new Error('Invalid ENUM value');
|
|
48
|
+
}
|
|
49
|
+
|
|
50
50
|
export function decodeFileMetadata(buf: Buffer, offset?: number) {
|
|
51
51
|
if (!offset) {
|
|
52
52
|
// tslint:disable-next-line:no-parameter-reassignment
|
|
@@ -84,99 +84,6 @@ export function getBitWidth(val: number): number {
|
|
|
84
84
|
return Math.ceil(Math.log2(val + 1));
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
/**
|
|
88
|
-
* FIXME not ideal that this is linear
|
|
89
|
-
*/
|
|
90
|
-
export function getThriftEnum(klass: any, value: number | string): string {
|
|
91
|
-
for (const k in klass) {
|
|
92
|
-
if (klass[k] === value) {
|
|
93
|
-
return k;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
throw new Error('Invalid ENUM value');
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export function fopen(filePath: string): Promise<number> {
|
|
100
|
-
return new Promise((resolve, reject) => {
|
|
101
|
-
fs.open(filePath, 'r', (err, fd) => {
|
|
102
|
-
if (err) {
|
|
103
|
-
reject(err);
|
|
104
|
-
} else {
|
|
105
|
-
resolve(fd);
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export function fstat(filePath: string): Promise<fs.Stats> {
|
|
112
|
-
return new Promise((resolve, reject) => {
|
|
113
|
-
fs.stat(filePath, (err, stat) => {
|
|
114
|
-
if (err) {
|
|
115
|
-
reject(err);
|
|
116
|
-
} else {
|
|
117
|
-
resolve(stat);
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
export function fread(fd: number, position: number, length: number): Promise<Buffer> {
|
|
124
|
-
const buffer = Buffer.alloc(length);
|
|
125
|
-
return new Promise((resolve, reject) => {
|
|
126
|
-
fs.read(fd, buffer, 0, length, position, (err, bytesRead, buf) => {
|
|
127
|
-
if (err || bytesRead !== length) {
|
|
128
|
-
reject(err || Error('read failed'));
|
|
129
|
-
} else {
|
|
130
|
-
resolve(buf);
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
export function fclose(fd: number): Promise<void> {
|
|
137
|
-
return new Promise((resolve, reject) => {
|
|
138
|
-
fs.close(fd, (err) => {
|
|
139
|
-
if (err) {
|
|
140
|
-
reject(err);
|
|
141
|
-
} else {
|
|
142
|
-
resolve();
|
|
143
|
-
}
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
export function oswrite(os: Writable, buf: Buffer): Promise<void> {
|
|
149
|
-
return new Promise((resolve, reject) => {
|
|
150
|
-
os.write(buf, (err) => {
|
|
151
|
-
if (err) {
|
|
152
|
-
reject(err);
|
|
153
|
-
} else {
|
|
154
|
-
resolve();
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
export function osclose(os: Writable): Promise<void> {
|
|
161
|
-
return new Promise((resolve, reject) => {
|
|
162
|
-
(os as any).close((err: any) => {
|
|
163
|
-
if (err) {
|
|
164
|
-
reject(err);
|
|
165
|
-
} else {
|
|
166
|
-
resolve();
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
export function osopen(path: string, opts?: WriteStreamOptions): Promise<fs.WriteStream> {
|
|
173
|
-
return new Promise((resolve, reject) => {
|
|
174
|
-
const outputStream = fs.createWriteStream(path, opts as any);
|
|
175
|
-
outputStream.once('open', (fd) => resolve(outputStream));
|
|
176
|
-
outputStream.once('error', (err) => reject(err));
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
|
|
180
87
|
// Supports MQTT path wildcards
|
|
181
88
|
// + all immediate children
|
|
182
89
|
// # all descendents
|
|
@@ -200,7 +107,3 @@ export function fieldIndexOf(arr: string[][], elem: string[]): number {
|
|
|
200
107
|
}
|
|
201
108
|
return -1;
|
|
202
109
|
}
|
|
203
|
-
|
|
204
|
-
export function load(name: string): any {
|
|
205
|
-
return (module || (global as any)).require(name);
|
|
206
|
-
}
|