@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.
Files changed (143) hide show
  1. package/dist/dist.min.js +7 -18
  2. package/dist/dist.min.js.map +1 -1
  3. package/dist/es5/bundle.js +2 -4
  4. package/dist/es5/bundle.js.map +1 -1
  5. package/dist/es5/constants.js +17 -0
  6. package/dist/es5/constants.js.map +1 -0
  7. package/dist/es5/index.js +53 -21
  8. package/dist/es5/index.js.map +1 -1
  9. package/dist/es5/lib/convert-schema.js +82 -0
  10. package/dist/es5/lib/convert-schema.js.map +1 -0
  11. package/dist/es5/lib/parse-parquet.js +173 -0
  12. package/dist/es5/lib/parse-parquet.js.map +1 -0
  13. package/dist/es5/lib/read-array-buffer.js +53 -0
  14. package/dist/es5/lib/read-array-buffer.js.map +1 -0
  15. package/dist/es5/parquet-loader.js +6 -79
  16. package/dist/es5/parquet-loader.js.map +1 -1
  17. package/dist/es5/parquet-writer.js +1 -1
  18. package/dist/es5/parquet-writer.js.map +1 -1
  19. package/dist/es5/parquetjs/codecs/dictionary.js +30 -0
  20. package/dist/es5/parquetjs/codecs/dictionary.js.map +1 -0
  21. package/dist/es5/parquetjs/codecs/index.js +10 -0
  22. package/dist/es5/parquetjs/codecs/index.js.map +1 -1
  23. package/dist/es5/parquetjs/codecs/rle.js +2 -2
  24. package/dist/es5/parquetjs/codecs/rle.js.map +1 -1
  25. package/dist/es5/parquetjs/compression.js +138 -104
  26. package/dist/es5/parquetjs/compression.js.map +1 -1
  27. package/dist/es5/parquetjs/{writer.js → encoder/writer.js} +397 -228
  28. package/dist/es5/parquetjs/encoder/writer.js.map +1 -0
  29. package/dist/es5/parquetjs/parquet-thrift/CompressionCodec.js +1 -0
  30. package/dist/es5/parquetjs/parquet-thrift/CompressionCodec.js.map +1 -1
  31. package/dist/es5/parquetjs/parser/decoders.js +495 -0
  32. package/dist/es5/parquetjs/parser/decoders.js.map +1 -0
  33. package/dist/es5/parquetjs/parser/parquet-cursor.js +215 -0
  34. package/dist/es5/parquetjs/parser/parquet-cursor.js.map +1 -0
  35. package/dist/es5/parquetjs/parser/parquet-envelope-reader.js +452 -0
  36. package/dist/es5/parquetjs/parser/parquet-envelope-reader.js.map +1 -0
  37. package/dist/es5/parquetjs/parser/parquet-reader.js +413 -0
  38. package/dist/es5/parquetjs/parser/parquet-reader.js.map +1 -0
  39. package/dist/es5/parquetjs/schema/declare.js.map +1 -1
  40. package/dist/es5/parquetjs/schema/schema.js +2 -0
  41. package/dist/es5/parquetjs/schema/schema.js.map +1 -1
  42. package/dist/es5/parquetjs/schema/shred.js +2 -1
  43. package/dist/es5/parquetjs/schema/shred.js.map +1 -1
  44. package/dist/es5/parquetjs/schema/types.js +79 -4
  45. package/dist/es5/parquetjs/schema/types.js.map +1 -1
  46. package/dist/es5/parquetjs/utils/buffer-utils.js +21 -0
  47. package/dist/es5/parquetjs/utils/buffer-utils.js.map +1 -0
  48. package/dist/es5/parquetjs/utils/file-utils.js +108 -0
  49. package/dist/es5/parquetjs/utils/file-utils.js.map +1 -0
  50. package/dist/es5/parquetjs/{util.js → utils/read-utils.js} +13 -113
  51. package/dist/es5/parquetjs/utils/read-utils.js.map +1 -0
  52. package/dist/esm/bundle.js +2 -4
  53. package/dist/esm/bundle.js.map +1 -1
  54. package/dist/esm/constants.js +6 -0
  55. package/dist/esm/constants.js.map +1 -0
  56. package/dist/esm/index.js +14 -4
  57. package/dist/esm/index.js.map +1 -1
  58. package/dist/esm/lib/convert-schema.js +71 -0
  59. package/dist/esm/lib/convert-schema.js.map +1 -0
  60. package/dist/esm/lib/parse-parquet.js +28 -0
  61. package/dist/esm/lib/parse-parquet.js.map +1 -0
  62. package/dist/esm/lib/read-array-buffer.js +9 -0
  63. package/dist/esm/lib/read-array-buffer.js.map +1 -0
  64. package/dist/esm/parquet-loader.js +4 -24
  65. package/dist/esm/parquet-loader.js.map +1 -1
  66. package/dist/esm/parquet-writer.js +1 -1
  67. package/dist/esm/parquet-writer.js.map +1 -1
  68. package/dist/esm/parquetjs/codecs/dictionary.js +12 -0
  69. package/dist/esm/parquetjs/codecs/dictionary.js.map +1 -0
  70. package/dist/esm/parquetjs/codecs/index.js +9 -0
  71. package/dist/esm/parquetjs/codecs/index.js.map +1 -1
  72. package/dist/esm/parquetjs/codecs/rle.js +2 -2
  73. package/dist/esm/parquetjs/codecs/rle.js.map +1 -1
  74. package/dist/esm/parquetjs/compression.js +54 -105
  75. package/dist/esm/parquetjs/compression.js.map +1 -1
  76. package/dist/esm/parquetjs/{writer.js → encoder/writer.js} +32 -35
  77. package/dist/esm/parquetjs/encoder/writer.js.map +1 -0
  78. package/dist/esm/parquetjs/parquet-thrift/CompressionCodec.js +1 -0
  79. package/dist/esm/parquetjs/parquet-thrift/CompressionCodec.js.map +1 -1
  80. package/dist/esm/parquetjs/parser/decoders.js +300 -0
  81. package/dist/esm/parquetjs/parser/decoders.js.map +1 -0
  82. package/dist/esm/parquetjs/parser/parquet-cursor.js +90 -0
  83. package/dist/esm/parquetjs/parser/parquet-cursor.js.map +1 -0
  84. package/dist/esm/parquetjs/parser/parquet-envelope-reader.js +164 -0
  85. package/dist/esm/parquetjs/parser/parquet-envelope-reader.js.map +1 -0
  86. package/dist/esm/parquetjs/parser/parquet-reader.js +133 -0
  87. package/dist/esm/parquetjs/parser/parquet-reader.js.map +1 -0
  88. package/dist/esm/parquetjs/schema/declare.js.map +1 -1
  89. package/dist/esm/parquetjs/schema/schema.js +2 -0
  90. package/dist/esm/parquetjs/schema/schema.js.map +1 -1
  91. package/dist/esm/parquetjs/schema/shred.js +2 -1
  92. package/dist/esm/parquetjs/schema/shred.js.map +1 -1
  93. package/dist/esm/parquetjs/schema/types.js +78 -4
  94. package/dist/esm/parquetjs/schema/types.js.map +1 -1
  95. package/dist/esm/parquetjs/utils/buffer-utils.js +12 -0
  96. package/dist/esm/parquetjs/utils/buffer-utils.js.map +1 -0
  97. package/dist/esm/parquetjs/utils/file-utils.js +79 -0
  98. package/dist/esm/parquetjs/utils/file-utils.js.map +1 -0
  99. package/dist/esm/parquetjs/{util.js → utils/read-utils.js} +11 -89
  100. package/dist/esm/parquetjs/utils/read-utils.js.map +1 -0
  101. package/dist/parquet-worker.js +7 -18
  102. package/dist/parquet-worker.js.map +1 -1
  103. package/package.json +10 -10
  104. package/src/bundle.ts +2 -3
  105. package/src/constants.ts +17 -0
  106. package/src/index.ts +30 -4
  107. package/src/lib/convert-schema.ts +95 -0
  108. package/src/lib/parse-parquet.ts +27 -0
  109. package/{dist/es5/libs → src/lib}/read-array-buffer.ts +0 -0
  110. package/src/parquet-loader.ts +4 -24
  111. package/src/parquetjs/codecs/dictionary.ts +11 -0
  112. package/src/parquetjs/codecs/index.ts +13 -0
  113. package/src/parquetjs/codecs/rle.ts +4 -2
  114. package/src/parquetjs/compression.ts +89 -50
  115. package/src/parquetjs/{writer.ts → encoder/writer.ts} +46 -45
  116. package/src/parquetjs/parquet-thrift/CompressionCodec.ts +2 -1
  117. package/src/parquetjs/parser/decoders.ts +448 -0
  118. package/src/parquetjs/parser/parquet-cursor.ts +94 -0
  119. package/src/parquetjs/parser/parquet-envelope-reader.ts +210 -0
  120. package/src/parquetjs/parser/parquet-reader.ts +179 -0
  121. package/src/parquetjs/schema/declare.ts +48 -2
  122. package/src/parquetjs/schema/schema.ts +2 -0
  123. package/src/parquetjs/schema/shred.ts +3 -1
  124. package/src/parquetjs/schema/types.ts +82 -5
  125. package/src/parquetjs/utils/buffer-utils.ts +18 -0
  126. package/src/parquetjs/utils/file-utils.ts +96 -0
  127. package/src/parquetjs/{util.ts → utils/read-utils.ts} +13 -110
  128. package/dist/dist.es5.min.js +0 -51
  129. package/dist/dist.es5.min.js.map +0 -1
  130. package/dist/es5/parquetjs/compression.ts.disabled +0 -105
  131. package/dist/es5/parquetjs/reader.js +0 -1078
  132. package/dist/es5/parquetjs/reader.js.map +0 -1
  133. package/dist/es5/parquetjs/util.js.map +0 -1
  134. package/dist/es5/parquetjs/writer.js.map +0 -1
  135. package/dist/esm/libs/read-array-buffer.ts +0 -31
  136. package/dist/esm/parquetjs/compression.ts.disabled +0 -105
  137. package/dist/esm/parquetjs/reader.js +0 -524
  138. package/dist/esm/parquetjs/reader.js.map +0 -1
  139. package/dist/esm/parquetjs/util.js.map +0 -1
  140. package/dist/esm/parquetjs/writer.js.map +0 -1
  141. package/src/libs/read-array-buffer.ts +0 -31
  142. package/src/parquetjs/compression.ts.disabled +0 -105
  143. 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 = 'UNCOMPRESSED' | 'GZIP' | 'SNAPPY' | 'LZO' | 'BROTLI' | 'LZ4';
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 {
@@ -173,6 +173,8 @@ function buildFields(
173
173
  encoding: opts.encoding,
174
174
  compression: opts.compression,
175
175
  typeLength: opts.typeLength || typeDef.typeLength,
176
+ presision: opts.presision,
177
+ scale: opts.scale,
176
178
  rLevelMax,
177
179
  dLevelMax
178
180
  };
@@ -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 './parquet-thrift';
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
- }