@loaders.gl/arrow 4.0.0 → 4.0.2

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 (82) hide show
  1. package/dist/arrow-loader.d.ts.map +1 -1
  2. package/dist/arrow-loader.js.map +1 -1
  3. package/dist/arrow-worker.js +34 -26
  4. package/dist/arrow-writer.d.ts.map +1 -1
  5. package/dist/arrow-writer.js +6 -3
  6. package/dist/arrow-writer.js.map +1 -1
  7. package/dist/dist.dev.js +658 -6
  8. package/dist/geoarrow/convert-geoarrow-to-binary-geometry.d.ts +40 -0
  9. package/dist/geoarrow/convert-geoarrow-to-binary-geometry.d.ts.map +1 -0
  10. package/dist/geoarrow/convert-geoarrow-to-binary-geometry.js +189 -0
  11. package/dist/geoarrow/convert-geoarrow-to-binary-geometry.js.map +1 -0
  12. package/dist/geoarrow/convert-geoarrow-to-geojson.d.ts +19 -0
  13. package/dist/geoarrow/convert-geoarrow-to-geojson.d.ts.map +1 -0
  14. package/dist/geoarrow/convert-geoarrow-to-geojson.js +138 -0
  15. package/dist/geoarrow/convert-geoarrow-to-geojson.js.map +1 -0
  16. package/dist/geoarrow/get-arrow-bounds.d.ts +11 -0
  17. package/dist/geoarrow/get-arrow-bounds.d.ts.map +1 -0
  18. package/dist/geoarrow/get-arrow-bounds.js +24 -0
  19. package/dist/geoarrow/get-arrow-bounds.js.map +1 -0
  20. package/dist/index.cjs +627 -32
  21. package/dist/index.d.ts +6 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +5 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/lib/arrow-table-batch.d.ts +2 -2
  26. package/dist/lib/arrow-table-batch.d.ts.map +1 -1
  27. package/dist/lib/arrow-table-batch.js +7 -7
  28. package/dist/lib/arrow-table-batch.js.map +1 -1
  29. package/dist/lib/arrow-table.d.ts +3 -3
  30. package/dist/lib/arrow-table.d.ts.map +1 -1
  31. package/dist/lib/arrow-table.js.map +1 -1
  32. package/dist/lib/encode-arrow.js +5 -5
  33. package/dist/lib/encode-arrow.js.map +1 -1
  34. package/dist/lib/parse-arrow-in-batches.js +3 -3
  35. package/dist/lib/parse-arrow-in-batches.js.map +1 -1
  36. package/dist/lib/parse-arrow-sync.d.ts.map +1 -1
  37. package/dist/lib/parse-arrow-sync.js +3 -3
  38. package/dist/lib/parse-arrow-sync.js.map +1 -1
  39. package/dist/schema/arrow-type-utils.d.ts +3 -2
  40. package/dist/schema/arrow-type-utils.d.ts.map +1 -1
  41. package/dist/schema/arrow-type-utils.js +9 -9
  42. package/dist/schema/arrow-type-utils.js.map +1 -1
  43. package/dist/schema/convert-arrow-schema.d.ts +19 -0
  44. package/dist/schema/convert-arrow-schema.d.ts.map +1 -0
  45. package/dist/schema/convert-arrow-schema.js +232 -0
  46. package/dist/schema/convert-arrow-schema.js.map +1 -0
  47. package/dist/{lib/convert-table.d.ts → tables/convert-arrow-to-table.d.ts} +4 -4
  48. package/dist/tables/convert-arrow-to-table.d.ts.map +1 -0
  49. package/dist/{lib/convert-table.js → tables/convert-arrow-to-table.js} +1 -1
  50. package/dist/tables/convert-arrow-to-table.js.map +1 -0
  51. package/dist/{schema → tables}/convert-table-to-arrow.d.ts.map +1 -1
  52. package/dist/{schema → tables}/convert-table-to-arrow.js.map +1 -1
  53. package/dist/types.d.ts.map +1 -1
  54. package/dist/types.js.map +1 -1
  55. package/dist/workers/arrow-worker.js.map +1 -1
  56. package/package.json +5 -4
  57. package/src/arrow-loader.ts +1 -0
  58. package/src/arrow-writer.ts +7 -3
  59. package/src/geoarrow/convert-geoarrow-to-binary-geometry.ts +260 -0
  60. package/src/geoarrow/convert-geoarrow-to-geojson.ts +192 -0
  61. package/src/geoarrow/get-arrow-bounds.ts +40 -0
  62. package/src/index.ts +33 -4
  63. package/src/lib/arrow-table-batch.ts +13 -23
  64. package/src/lib/arrow-table.ts +3 -3
  65. package/src/lib/encode-arrow.ts +8 -8
  66. package/src/lib/parse-arrow-in-batches.ts +4 -4
  67. package/src/lib/parse-arrow-sync.ts +6 -3
  68. package/src/schema/arrow-type-utils.ts +11 -29
  69. package/src/schema/convert-arrow-schema.ts +265 -0
  70. package/src/{lib/convert-table.ts → tables/convert-arrow-to-table.ts} +4 -3
  71. package/src/types.ts +3 -0
  72. package/src/workers/arrow-worker.ts +3 -0
  73. package/dist/lib/convert-table.d.ts.map +0 -1
  74. package/dist/lib/convert-table.js.map +0 -1
  75. package/dist/schema/convert-schema-arrow.d.ts +0 -13
  76. package/dist/schema/convert-schema-arrow.d.ts.map +0 -1
  77. package/dist/schema/convert-schema-arrow.js +0 -158
  78. package/dist/schema/convert-schema-arrow.js.map +0 -1
  79. package/src/schema/convert-schema-arrow.ts +0 -233
  80. /package/dist/{schema → tables}/convert-table-to-arrow.d.ts +0 -0
  81. /package/dist/{schema → tables}/convert-table-to-arrow.js +0 -0
  82. /package/src/{schema → tables}/convert-table-to-arrow.ts +0 -0
@@ -1,6 +1,6 @@
1
1
  // TODO - this import defeats the sophisticated typescript checking in ArrowJS
2
2
  import type {ArrowTableBatch} from './arrow-table';
3
- import {RecordBatchReader, Table as ApacheArrowTable} from 'apache-arrow';
3
+ import * as arrow from 'apache-arrow';
4
4
  // import {isIterable} from '@loaders.gl/core';
5
5
 
6
6
  /**
@@ -8,7 +8,7 @@ import {RecordBatchReader, Table as ApacheArrowTable} from 'apache-arrow';
8
8
  export function parseArrowInBatches(
9
9
  asyncIterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>
10
10
  ): AsyncIterable<ArrowTableBatch> {
11
- // Creates the appropriate RecordBatchReader subclasses from the input
11
+ // Creates the appropriate arrow.RecordBatchReader subclasses from the input
12
12
  // This will also close the underlying source in case of early termination or errors
13
13
 
14
14
  // As an optimization, return a non-async iterator
@@ -28,13 +28,13 @@ export function parseArrowInBatches(
28
28
 
29
29
  async function* makeArrowAsyncIterator(): AsyncIterator<ArrowTableBatch> {
30
30
  // @ts-ignore
31
- const readers = RecordBatchReader.readAll(asyncIterator);
31
+ const readers = arrow.RecordBatchReader.readAll(asyncIterator);
32
32
  for await (const reader of readers) {
33
33
  for await (const recordBatch of reader) {
34
34
  const arrowTabledBatch: ArrowTableBatch = {
35
35
  shape: 'arrow-table',
36
36
  batchType: 'data',
37
- data: new ApacheArrowTable([recordBatch]),
37
+ data: new arrow.Table([recordBatch]),
38
38
  length: recordBatch.data.length
39
39
  };
40
40
  // processBatch(recordBatch);
@@ -1,16 +1,19 @@
1
1
  import type {ColumnarTable, ObjectRowTable} from '@loaders.gl/schema';
2
2
  import type {ArrowTable} from './arrow-table';
3
3
  import {convertTable} from '@loaders.gl/schema';
4
- import {tableFromIPC} from 'apache-arrow';
4
+ import * as arrow from 'apache-arrow';
5
5
  import type {ArrowLoaderOptions} from '../arrow-loader';
6
- import {convertApacheArrowToArrowTable, convertArrowToColumnarTable} from './convert-table';
6
+ import {
7
+ convertApacheArrowToArrowTable,
8
+ convertArrowToColumnarTable
9
+ } from '../tables/convert-arrow-to-table';
7
10
 
8
11
  // Parses arrow to a columnar table
9
12
  export default function parseArrowSync(
10
13
  arrayBuffer,
11
14
  options?: ArrowLoaderOptions
12
15
  ): ArrowTable | ColumnarTable | ObjectRowTable {
13
- const apacheArrowTable = tableFromIPC([new Uint8Array(arrayBuffer)]);
16
+ const apacheArrowTable = arrow.tableFromIPC([new Uint8Array(arrayBuffer)]);
14
17
  const arrowTable = convertApacheArrowToArrowTable(apacheArrowTable);
15
18
 
16
19
  const shape = options?.arrow?.shape || 'arrow-table';
@@ -2,45 +2,27 @@
2
2
  // Copyright (c) vis.gl contributors
3
3
 
4
4
  import type {TypedArray} from '@loaders.gl/schema';
5
- import {
6
- DataType,
7
- Float32,
8
- Float64,
9
- Int16,
10
- Int32,
11
- Int8,
12
- Uint16,
13
- Uint32,
14
- Uint8
15
- // Int8Vector,
16
- // Uint8Vector,
17
- // Int16Vector,
18
- // Uint16Vector,
19
- // Int32Vector,
20
- // Uint32Vector,
21
- // Float32Vector,
22
- // Float64Vector
23
- } from 'apache-arrow';
24
- // import {AbstractVector} from 'apache-arrow/vector';
5
+ import * as arrow from 'apache-arrow';
25
6
 
26
- export function getArrowType(array: TypedArray): DataType {
7
+ /** Return an Apache Arrow Type instance that corresponds to the type of the elements in the supplied Typed Array */
8
+ export function getArrowType(array: TypedArray): arrow.DataType {
27
9
  switch (array.constructor) {
28
10
  case Int8Array:
29
- return new Int8();
11
+ return new arrow.Int8();
30
12
  case Uint8Array:
31
- return new Uint8();
13
+ return new arrow.Uint8();
32
14
  case Int16Array:
33
- return new Int16();
15
+ return new arrow.Int16();
34
16
  case Uint16Array:
35
- return new Uint16();
17
+ return new arrow.Uint16();
36
18
  case Int32Array:
37
- return new Int32();
19
+ return new arrow.Int32();
38
20
  case Uint32Array:
39
- return new Uint32();
21
+ return new arrow.Uint32();
40
22
  case Float32Array:
41
- return new Float32();
23
+ return new arrow.Float32();
42
24
  case Float64Array:
43
- return new Float64();
25
+ return new arrow.Float64();
44
26
  default:
45
27
  throw new Error('array type not supported');
46
28
  }
@@ -0,0 +1,265 @@
1
+ // loaders.gl, MIT license
2
+ // Copyright (c) vis.gl contributors
3
+
4
+ import type {DataType, Field, Schema, SchemaMetadata} from '@loaders.gl/schema';
5
+ import * as arrow from 'apache-arrow';
6
+
7
+ /** Convert Apache Arrow Schema (class instance) to a serialized Schema (plain data) */
8
+ export function serializeArrowSchema(arrowSchema: arrow.Schema): Schema {
9
+ return {
10
+ fields: arrowSchema.fields.map((arrowField) => serializeArrowField(arrowField)),
11
+ metadata: serializeArrowMetadata(arrowSchema.metadata)
12
+ };
13
+ }
14
+
15
+ /** Convert a serialized Schema (plain data) to an Apache Arrow Schema (class instance) */
16
+ export function deserializeArrowSchema(schema: Schema): arrow.Schema {
17
+ return new arrow.Schema(
18
+ schema.fields.map((field) => deserializeArrowField(field)),
19
+ deserializeArrowMetadata(schema.metadata)
20
+ );
21
+ }
22
+
23
+ /** Convert Apache Arrow Schema metadata (Map<string, string>) to serialized metadata (Record<string, string> */
24
+ export function serializeArrowMetadata(arrowMetadata: Map<string, string>): SchemaMetadata {
25
+ return Object.fromEntries(arrowMetadata);
26
+ }
27
+
28
+ /** Convert serialized metadata (Record<string, string> to Apache Arrow Schema metadata (Map<string, string>) to */
29
+ export function deserializeArrowMetadata(metadata?: SchemaMetadata): Map<string, string> {
30
+ return metadata ? new Map(Object.entries(metadata)) : new Map<string, string>();
31
+ }
32
+
33
+ /** Convert Apache Arrow Field (class instance) to serialized Field (plain data) */
34
+ export function serializeArrowField(field: arrow.Field): Field {
35
+ return {
36
+ name: field.name,
37
+ type: serializeArrowType(field.type),
38
+ nullable: field.nullable,
39
+ metadata: serializeArrowMetadata(field.metadata)
40
+ };
41
+ }
42
+
43
+ /** Convert a serialized Field (plain data) to an Apache Arrow Field (class instance)*/
44
+ export function deserializeArrowField(field: Field): arrow.Field {
45
+ return new arrow.Field(
46
+ field.name,
47
+ deserializeArrowType(field.type),
48
+ field.nullable,
49
+ deserializeArrowMetadata(field.metadata)
50
+ );
51
+ }
52
+
53
+ /** Converts a serializable loaders.gl data type to hydrated arrow data type */
54
+ // eslint-disable-next-line complexity
55
+ export function serializeArrowType(arrowType: arrow.DataType): DataType {
56
+ switch (arrowType.constructor) {
57
+ case arrow.Null:
58
+ return 'null';
59
+ case arrow.Binary:
60
+ return 'binary';
61
+ case arrow.Bool:
62
+ return 'bool';
63
+ case arrow.Int:
64
+ const intType = arrowType as arrow.Int;
65
+ return `${intType.isSigned ? 'u' : ''}int${intType.bitWidth}`;
66
+ case arrow.Int8:
67
+ return 'int8';
68
+ case arrow.Int16:
69
+ return 'int16';
70
+ case arrow.Int32:
71
+ return 'int32';
72
+ case arrow.Int64:
73
+ return 'int64';
74
+ case arrow.Uint8:
75
+ return 'uint8';
76
+ case arrow.Uint16:
77
+ return 'uint16';
78
+ case arrow.Uint32:
79
+ return 'uint32';
80
+ case arrow.Uint64:
81
+ return 'uint64';
82
+ case arrow.Float:
83
+ const precision = (arrowType as arrow.Float).precision;
84
+ // return `float(precision + 1) * 16`;
85
+ switch (precision) {
86
+ case arrow.Precision.HALF:
87
+ return 'float16';
88
+ case arrow.Precision.SINGLE:
89
+ return 'float32';
90
+ case arrow.Precision.DOUBLE:
91
+ return 'float64';
92
+ default:
93
+ return 'float16';
94
+ }
95
+ case arrow.Float16:
96
+ return 'float16';
97
+ case arrow.Float32:
98
+ return 'float32';
99
+ case arrow.Float64:
100
+ return 'float64';
101
+ case arrow.Utf8:
102
+ return 'utf8';
103
+ case Date:
104
+ const dateUnit = (arrowType as arrow.Date_).unit;
105
+ return dateUnit === arrow.DateUnit.DAY ? 'date-day' : 'date-millisecond';
106
+ case arrow.DateDay:
107
+ return 'date-day';
108
+ case arrow.DateMillisecond:
109
+ return 'date-millisecond';
110
+ case arrow.Time:
111
+ const timeUnit = (arrowType as arrow.Time).unit;
112
+ switch (timeUnit) {
113
+ case arrow.TimeUnit.SECOND:
114
+ return 'time-second';
115
+ case arrow.TimeUnit.MILLISECOND:
116
+ return 'time-millisecond';
117
+ case arrow.TimeUnit.MICROSECOND:
118
+ return 'time-microsecond';
119
+ case arrow.TimeUnit.NANOSECOND:
120
+ return 'time-nanosecond';
121
+ default:
122
+ return 'time-second';
123
+ }
124
+ case arrow.TimeMillisecond:
125
+ return 'time-millisecond';
126
+ case arrow.TimeSecond:
127
+ return 'time-second';
128
+ case arrow.TimeMicrosecond:
129
+ return 'time-microsecond';
130
+ case arrow.TimeNanosecond:
131
+ return 'time-nanosecond';
132
+ case arrow.Timestamp:
133
+ const timeStampUnit = (arrowType as arrow.Timestamp).unit;
134
+ switch (timeStampUnit) {
135
+ case arrow.TimeUnit.SECOND:
136
+ return 'timestamp-second';
137
+ case arrow.TimeUnit.MILLISECOND:
138
+ return 'timestamp-millisecond';
139
+ case arrow.TimeUnit.MICROSECOND:
140
+ return 'timestamp-microsecond';
141
+ case arrow.TimeUnit.NANOSECOND:
142
+ return 'timestamp-nanosecond';
143
+ default:
144
+ return 'timestamp-second';
145
+ }
146
+ case arrow.TimestampSecond:
147
+ return 'timestamp-second';
148
+ case arrow.TimestampMillisecond:
149
+ return 'timestamp-millisecond';
150
+ case arrow.TimestampMicrosecond:
151
+ return 'timestamp-microsecond';
152
+ case arrow.TimestampNanosecond:
153
+ return 'timestamp-nanosecond';
154
+ case arrow.Interval:
155
+ const intervalUnit = (arrowType as arrow.Interval).unit;
156
+ switch (intervalUnit) {
157
+ case arrow.IntervalUnit.DAY_TIME:
158
+ return 'interval-daytime';
159
+ case arrow.IntervalUnit.YEAR_MONTH:
160
+ return 'interval-yearmonth';
161
+ default:
162
+ return 'interval-daytime';
163
+ }
164
+ case arrow.IntervalDayTime:
165
+ return 'interval-daytime';
166
+ case arrow.IntervalYearMonth:
167
+ return 'interval-yearmonth';
168
+ case arrow.List:
169
+ const listType = arrowType as arrow.List;
170
+ const listField = listType.valueField;
171
+ return {
172
+ type: 'list',
173
+ children: [serializeArrowField(listField)]
174
+ };
175
+ case arrow.FixedSizeList:
176
+ return {
177
+ type: 'fixed-size-list',
178
+ listSize: (arrowType as arrow.FixedSizeList).listSize,
179
+ children: [serializeArrowField((arrowType as arrow.FixedSizeList).children[0])]
180
+ };
181
+ // case arrow.Struct:
182
+ // return {type: 'struct', children: (arrowType as arrow.Struct).children};
183
+ default:
184
+ throw new Error('array type not supported');
185
+ }
186
+ }
187
+
188
+ /** Converts a serializable loaders.gl data type to hydrated arrow data type */
189
+ // eslint-disable-next-line complexity
190
+ export function deserializeArrowType(dataType: DataType): arrow.DataType {
191
+ if (typeof dataType === 'object') {
192
+ switch (dataType.type) {
193
+ case 'list':
194
+ const field = deserializeArrowField(dataType.children[0]);
195
+ return new arrow.List(field);
196
+ case 'fixed-size-list':
197
+ const child = deserializeArrowField(dataType.children[0]);
198
+ return new arrow.FixedSizeList(dataType.listSize, child);
199
+ case 'struct':
200
+ const children = dataType.children.map((arrowField) => deserializeArrowField(arrowField));
201
+ return new arrow.Struct(children);
202
+ default:
203
+ throw new Error('array type not supported');
204
+ }
205
+ }
206
+
207
+ switch (dataType) {
208
+ case 'null':
209
+ return new arrow.Null();
210
+ case 'binary':
211
+ return new arrow.Binary();
212
+ case 'bool':
213
+ return new arrow.Bool();
214
+ case 'int8':
215
+ return new arrow.Int8();
216
+ case 'int16':
217
+ return new arrow.Int16();
218
+ case 'int32':
219
+ return new arrow.Int32();
220
+ case 'int64':
221
+ return new arrow.Int64();
222
+ case 'uint8':
223
+ return new arrow.Uint8();
224
+ case 'uint16':
225
+ return new arrow.Uint16();
226
+ case 'uint32':
227
+ return new arrow.Uint32();
228
+ case 'uint64':
229
+ return new arrow.Uint64();
230
+ case 'float16':
231
+ return new arrow.Float16();
232
+ case 'float32':
233
+ return new arrow.Float32();
234
+ case 'float64':
235
+ return new arrow.Float64();
236
+ case 'utf8':
237
+ return new arrow.Utf8();
238
+ case 'date-day':
239
+ return new arrow.DateDay();
240
+ case 'date-millisecond':
241
+ return new arrow.DateMillisecond();
242
+ case 'time-second':
243
+ return new arrow.TimeSecond();
244
+ case 'time-millisecond':
245
+ return new arrow.TimeMillisecond();
246
+ case 'time-microsecond':
247
+ return new arrow.TimeMicrosecond();
248
+ case 'time-nanosecond':
249
+ return new arrow.TimeNanosecond();
250
+ case 'timestamp-second':
251
+ return new arrow.TimestampSecond();
252
+ case 'timestamp-millisecond':
253
+ return new arrow.TimestampMillisecond();
254
+ case 'timestamp-microsecond':
255
+ return new arrow.TimestampMicrosecond();
256
+ case 'timestamp-nanosecond':
257
+ return new arrow.TimestampNanosecond();
258
+ case 'interval-daytime':
259
+ return new arrow.IntervalDayTime();
260
+ case 'interval-yearmonth':
261
+ return new arrow.IntervalYearMonth();
262
+ default:
263
+ throw new Error('array type not supported');
264
+ }
265
+ }
@@ -1,8 +1,9 @@
1
1
  // loaders.gl, MIT license
2
2
  // Copyright (c) vis.gl contributors
3
+
3
4
  import type {ColumnarTable, ObjectRowTable} from '@loaders.gl/schema';
4
- import type {Table as ApacheArrowTable} from 'apache-arrow';
5
- import type {ArrowTable} from './arrow-table';
5
+ import type * as arrow from 'apache-arrow';
6
+ import type {ArrowTable} from '../lib/arrow-table';
6
7
 
7
8
  /**
8
9
  * Wrap an apache arrow table in a loaders.gl table wrapper.
@@ -10,7 +11,7 @@ import type {ArrowTable} from './arrow-table';
10
11
  * @param arrowTable
11
12
  * @returns
12
13
  */
13
- export function convertApacheArrowToArrowTable(arrowTable: ApacheArrowTable): ArrowTable {
14
+ export function convertApacheArrowToArrowTable(arrowTable: arrow.Table): ArrowTable {
14
15
  return {
15
16
  shape: 'arrow-table',
16
17
  data: arrowTable
package/src/types.ts CHANGED
@@ -1,3 +1,6 @@
1
+ // loaders.gl, MIT license
2
+ // Copyright (c) vis.gl contributors
3
+
1
4
  type TypedIntArray = Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array;
2
5
 
3
6
  type TypedFloatArray = Float32Array | Float64Array;
@@ -1,3 +1,6 @@
1
+ // loaders.gl, MIT license
2
+ // Copyright (c) vis.gl contributors
3
+
1
4
  import {createLoaderWorker} from '@loaders.gl/loader-utils';
2
5
  import {ArrowLoader} from '../index';
3
6
 
@@ -1 +0,0 @@
1
- {"version":3,"file":"convert-table.d.ts","sourceRoot":"","sources":["../../src/lib/convert-table.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,aAAa,EAAE,cAAc,EAAC,MAAM,oBAAoB,CAAC;AACtE,OAAO,KAAK,EAAC,KAAK,IAAI,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAC5D,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AAE9C;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,UAAU,EAAE,gBAAgB,GAAG,UAAU,CAKvF;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,CAkB5E;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,aAAa,EAAE,aAAa,GAAG,cAAc,CAmB5F"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"convert-table.js","names":["convertApacheArrowToArrowTable","arrowTable","shape","data","convertArrowToColumnarTable","table","columnarTable","field","schema","fields","arrowColumn","getChild","name","values","toArray","convertColumnarToRowFormatTable","tableKeys","Object","keys","tableRowsCount","length","rowFormatTable","index","tableItem","keyIndex","fieldName","push"],"sources":["../../src/lib/convert-table.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\nimport type {ColumnarTable, ObjectRowTable} from '@loaders.gl/schema';\nimport type {Table as ApacheArrowTable} from 'apache-arrow';\nimport type {ArrowTable} from './arrow-table';\n\n/**\n * Wrap an apache arrow table in a loaders.gl table wrapper.\n * From this additional conversions are available.\n * @param arrowTable\n * @returns\n */\nexport function convertApacheArrowToArrowTable(arrowTable: ApacheArrowTable): ArrowTable {\n return {\n shape: 'arrow-table',\n data: arrowTable\n };\n}\n\n/**\n * Convert an Apache Arrow table to a ColumnarTable\n * @note Currently does not convert schema\n */\nexport function convertArrowToColumnarTable(table: ArrowTable): ColumnarTable {\n // TODO - avoid calling `getColumn` on columns we are not interested in?\n // Add options object?\n\n const arrowTable = table.data;\n const columnarTable = {};\n\n for (const field of arrowTable.schema.fields) {\n // This (is intended to) coalesce all record batches into a single typed array\n const arrowColumn = arrowTable.getChild(field.name);\n const values = arrowColumn?.toArray();\n columnarTable[field.name] = values;\n }\n\n return {\n shape: 'columnar-table',\n data: columnarTable\n };\n}\n\n/**\n *\n * @note - should be part of schema module\n */\nexport function convertColumnarToRowFormatTable(columnarTable: ColumnarTable): ObjectRowTable {\n const tableKeys = Object.keys(columnarTable);\n const tableRowsCount = columnarTable[tableKeys[0]].length;\n\n const rowFormatTable: {}[] = [];\n\n for (let index = 0; index < tableRowsCount; index++) {\n const tableItem = {};\n for (let keyIndex = 0; keyIndex < tableKeys.length; keyIndex++) {\n const fieldName = tableKeys[keyIndex];\n tableItem[fieldName] = columnarTable[fieldName][index];\n }\n rowFormatTable.push(tableItem);\n }\n\n return {\n shape: 'object-row-table',\n data: rowFormatTable\n };\n}\n"],"mappings":"AAYA,OAAO,SAASA,8BAA8BA,CAACC,UAA4B,EAAc;EACvF,OAAO;IACLC,KAAK,EAAE,aAAa;IACpBC,IAAI,EAAEF;EACR,CAAC;AACH;AAMA,OAAO,SAASG,2BAA2BA,CAACC,KAAiB,EAAiB;EAI5E,MAAMJ,UAAU,GAAGI,KAAK,CAACF,IAAI;EAC7B,MAAMG,aAAa,GAAG,CAAC,CAAC;EAExB,KAAK,MAAMC,KAAK,IAAIN,UAAU,CAACO,MAAM,CAACC,MAAM,EAAE;IAE5C,MAAMC,WAAW,GAAGT,UAAU,CAACU,QAAQ,CAACJ,KAAK,CAACK,IAAI,CAAC;IACnD,MAAMC,MAAM,GAAGH,WAAW,aAAXA,WAAW,uBAAXA,WAAW,CAAEI,OAAO,CAAC,CAAC;IACrCR,aAAa,CAACC,KAAK,CAACK,IAAI,CAAC,GAAGC,MAAM;EACpC;EAEA,OAAO;IACLX,KAAK,EAAE,gBAAgB;IACvBC,IAAI,EAAEG;EACR,CAAC;AACH;AAMA,OAAO,SAASS,+BAA+BA,CAACT,aAA4B,EAAkB;EAC5F,MAAMU,SAAS,GAAGC,MAAM,CAACC,IAAI,CAACZ,aAAa,CAAC;EAC5C,MAAMa,cAAc,GAAGb,aAAa,CAACU,SAAS,CAAC,CAAC,CAAC,CAAC,CAACI,MAAM;EAEzD,MAAMC,cAAoB,GAAG,EAAE;EAE/B,KAAK,IAAIC,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGH,cAAc,EAAEG,KAAK,EAAE,EAAE;IACnD,MAAMC,SAAS,GAAG,CAAC,CAAC;IACpB,KAAK,IAAIC,QAAQ,GAAG,CAAC,EAAEA,QAAQ,GAAGR,SAAS,CAACI,MAAM,EAAEI,QAAQ,EAAE,EAAE;MAC9D,MAAMC,SAAS,GAAGT,SAAS,CAACQ,QAAQ,CAAC;MACrCD,SAAS,CAACE,SAAS,CAAC,GAAGnB,aAAa,CAACmB,SAAS,CAAC,CAACH,KAAK,CAAC;IACxD;IACAD,cAAc,CAACK,IAAI,CAACH,SAAS,CAAC;EAChC;EAEA,OAAO;IACLrB,KAAK,EAAE,kBAAkB;IACzBC,IAAI,EAAEkB;EACR,CAAC;AACH"}
@@ -1,13 +0,0 @@
1
- import type { DataType, Field, Schema, SchemaMetadata } from '@loaders.gl/schema';
2
- import { Field as ArrowField, Schema as ArrowSchema, DataType as ArrowDataType } from 'apache-arrow';
3
- export declare function serializeArrowSchema(arrowSchema: ArrowSchema): Schema;
4
- export declare function deserializeArrowSchema(schema: Schema): ArrowSchema;
5
- export declare function serializeArrowMetadata(arrowMetadata: Map<string, string>): SchemaMetadata;
6
- export declare function deserializeArrowMetadata(metadata?: SchemaMetadata): Map<string, string>;
7
- export declare function serializeArrowField(field: ArrowField): Field;
8
- export declare function deserializeArrowField(field: Field): ArrowField;
9
- /** Converts a serializable loaders.gl data type to hydrated arrow data type */
10
- export declare function serializeArrowType(arrowType: ArrowDataType): DataType;
11
- /** Converts a serializable loaders.gl data type to hydrated arrow data type */
12
- export declare function deserializeArrowType(dataType: DataType): ArrowDataType;
13
- //# sourceMappingURL=convert-schema-arrow.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"convert-schema-arrow.d.ts","sourceRoot":"","sources":["../../src/schema/convert-schema-arrow.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAChF,OAAO,EACL,KAAK,IAAI,UAAU,EACnB,MAAM,IAAI,WAAW,EACrB,QAAQ,IAAI,aAAa,EAkC1B,MAAM,cAAc,CAAC;AAEtB,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAKrE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAKlE;AAED,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,cAAc,CAEzF;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,CAAC,EAAE,cAAc,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAEvF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CAO5D;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAO9D;AAED,+EAA+E;AAE/E,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,aAAa,GAAG,QAAQ,CAqErE;AAED,+EAA+E;AAE/E,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,aAAa,CA0EtE"}
@@ -1,158 +0,0 @@
1
- import { Field as ArrowField, Schema as ArrowSchema, Null, Binary, Bool, Int8, Int16, Int32, Int64, Uint8, Uint16, Uint32, Uint64, Float16, Float32, Float64, Utf8, DateDay, DateMillisecond, TimeMillisecond, TimeSecond, TimestampSecond, TimestampMillisecond, TimestampMicrosecond, TimestampNanosecond, IntervalDayTime, IntervalYearMonth, FixedSizeList, Struct } from 'apache-arrow';
2
- export function serializeArrowSchema(arrowSchema) {
3
- return {
4
- fields: arrowSchema.fields.map(arrowField => serializeArrowField(arrowField)),
5
- metadata: serializeArrowMetadata(arrowSchema.metadata)
6
- };
7
- }
8
- export function deserializeArrowSchema(schema) {
9
- return new ArrowSchema(schema.fields.map(field => deserializeArrowField(field)), deserializeArrowMetadata(schema.metadata));
10
- }
11
- export function serializeArrowMetadata(arrowMetadata) {
12
- return Object.fromEntries(arrowMetadata);
13
- }
14
- export function deserializeArrowMetadata(metadata) {
15
- return metadata ? new Map(Object.entries(metadata)) : new Map();
16
- }
17
- export function serializeArrowField(field) {
18
- return {
19
- name: field.name,
20
- type: serializeArrowType(field.type),
21
- nullable: field.nullable,
22
- metadata: serializeArrowMetadata(field.metadata)
23
- };
24
- }
25
- export function deserializeArrowField(field) {
26
- return new ArrowField(field.name, deserializeArrowType(field.type), field.nullable, deserializeArrowMetadata(field.metadata));
27
- }
28
- export function serializeArrowType(arrowType) {
29
- switch (arrowType.constructor) {
30
- case Null:
31
- return 'null';
32
- case Binary:
33
- return 'binary';
34
- case Bool:
35
- return 'bool';
36
- case Int8:
37
- return 'int8';
38
- case Int16:
39
- return 'int16';
40
- case Int32:
41
- return 'int32';
42
- case Int64:
43
- return 'int64';
44
- case Uint8:
45
- return 'uint8';
46
- case Uint16:
47
- return 'uint16';
48
- case Uint32:
49
- return 'uint32';
50
- case Uint64:
51
- return 'uint64';
52
- case Float16:
53
- return 'float16';
54
- case Float32:
55
- return 'float32';
56
- case Float64:
57
- return 'float64';
58
- case Utf8:
59
- return 'utf8';
60
- case DateDay:
61
- return 'date-day';
62
- case DateMillisecond:
63
- return 'date-millisecond';
64
- case TimeMillisecond:
65
- return 'time-millisecond';
66
- case TimeSecond:
67
- return 'time-second';
68
- case TimestampSecond:
69
- return 'timestamp-second';
70
- case TimestampMillisecond:
71
- return 'timestamp-millisecond';
72
- case TimestampMicrosecond:
73
- return 'timestamp-microsecond';
74
- case TimestampNanosecond:
75
- return 'timestamp-nanosecond';
76
- case IntervalDayTime:
77
- return 'interval-daytime';
78
- case IntervalYearMonth:
79
- return 'interval-yearmonth';
80
- case FixedSizeList:
81
- return {
82
- type: 'fixed-size-list',
83
- listSize: arrowType.listSize,
84
- children: [serializeArrowField(arrowType.children[0])]
85
- };
86
- default:
87
- throw new Error('array type not supported');
88
- }
89
- }
90
- export function deserializeArrowType(dataType) {
91
- if (typeof dataType === 'object') {
92
- switch (dataType.type) {
93
- case 'fixed-size-list':
94
- const child = deserializeArrowField(dataType.children[0]);
95
- return new FixedSizeList(dataType.listSize, child);
96
- case 'struct':
97
- const children = dataType.children.map(arrowField => deserializeArrowField(arrowField));
98
- return new Struct(children);
99
- default:
100
- throw new Error('array type not supported');
101
- }
102
- }
103
- switch (dataType) {
104
- case 'null':
105
- return new Null();
106
- case 'binary':
107
- return new Binary();
108
- case 'bool':
109
- return new Bool();
110
- case 'int8':
111
- return new Int8();
112
- case 'int16':
113
- return new Int16();
114
- case 'int32':
115
- return new Int32();
116
- case 'int64':
117
- return new Int64();
118
- case 'uint8':
119
- return new Uint8();
120
- case 'uint16':
121
- return new Uint16();
122
- case 'uint32':
123
- return new Uint32();
124
- case 'uint64':
125
- return new Uint64();
126
- case 'float16':
127
- return new Float16();
128
- case 'float32':
129
- return new Float32();
130
- case 'float64':
131
- return new Float64();
132
- case 'utf8':
133
- return new Utf8();
134
- case 'date-day':
135
- return new DateDay();
136
- case 'date-millisecond':
137
- return new DateMillisecond();
138
- case 'time-millisecond':
139
- return new TimeMillisecond();
140
- case 'time-second':
141
- return new TimeSecond();
142
- case 'timestamp-second':
143
- return new TimestampSecond();
144
- case 'timestamp-millisecond':
145
- return new TimestampMillisecond();
146
- case 'timestamp-microsecond':
147
- return new TimestampMicrosecond();
148
- case 'timestamp-nanosecond':
149
- return new TimestampNanosecond();
150
- case 'interval-daytime':
151
- return new IntervalDayTime();
152
- case 'interval-yearmonth':
153
- return new IntervalYearMonth();
154
- default:
155
- throw new Error('array type not supported');
156
- }
157
- }
158
- //# sourceMappingURL=convert-schema-arrow.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"convert-schema-arrow.js","names":["Field","ArrowField","Schema","ArrowSchema","Null","Binary","Bool","Int8","Int16","Int32","Int64","Uint8","Uint16","Uint32","Uint64","Float16","Float32","Float64","Utf8","DateDay","DateMillisecond","TimeMillisecond","TimeSecond","TimestampSecond","TimestampMillisecond","TimestampMicrosecond","TimestampNanosecond","IntervalDayTime","IntervalYearMonth","FixedSizeList","Struct","serializeArrowSchema","arrowSchema","fields","map","arrowField","serializeArrowField","metadata","serializeArrowMetadata","deserializeArrowSchema","schema","field","deserializeArrowField","deserializeArrowMetadata","arrowMetadata","Object","fromEntries","Map","entries","name","type","serializeArrowType","nullable","deserializeArrowType","arrowType","constructor","listSize","children","Error","dataType","child"],"sources":["../../src/schema/convert-schema-arrow.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport type {DataType, Field, Schema, SchemaMetadata} from '@loaders.gl/schema';\nimport {\n Field as ArrowField,\n Schema as ArrowSchema,\n DataType as ArrowDataType,\n Null,\n Binary,\n Bool,\n // Int,\n Int8,\n Int16,\n Int32,\n Int64,\n Uint8,\n Uint16,\n Uint32,\n Uint64,\n // Float,\n Float16,\n Float32,\n Float64,\n Utf8,\n // Date,\n DateDay,\n DateMillisecond,\n // Time,\n TimeMillisecond,\n TimeSecond,\n // Timestamp,\n TimestampSecond,\n TimestampMillisecond,\n TimestampMicrosecond,\n TimestampNanosecond,\n // Interval,\n IntervalDayTime,\n IntervalYearMonth,\n FixedSizeList,\n Struct\n} from 'apache-arrow';\n\nexport function serializeArrowSchema(arrowSchema: ArrowSchema): Schema {\n return {\n fields: arrowSchema.fields.map((arrowField) => serializeArrowField(arrowField)),\n metadata: serializeArrowMetadata(arrowSchema.metadata)\n };\n}\n\nexport function deserializeArrowSchema(schema: Schema): ArrowSchema {\n return new ArrowSchema(\n schema.fields.map((field) => deserializeArrowField(field)),\n deserializeArrowMetadata(schema.metadata)\n );\n}\n\nexport function serializeArrowMetadata(arrowMetadata: Map<string, string>): SchemaMetadata {\n return Object.fromEntries(arrowMetadata);\n}\n\nexport function deserializeArrowMetadata(metadata?: SchemaMetadata): Map<string, string> {\n return metadata ? new Map(Object.entries(metadata)) : new Map<string, string>();\n}\n\nexport function serializeArrowField(field: ArrowField): Field {\n return {\n name: field.name,\n type: serializeArrowType(field.type),\n nullable: field.nullable,\n metadata: serializeArrowMetadata(field.metadata)\n };\n}\n\nexport function deserializeArrowField(field: Field): ArrowField {\n return new ArrowField(\n field.name,\n deserializeArrowType(field.type),\n field.nullable,\n deserializeArrowMetadata(field.metadata)\n );\n}\n\n/** Converts a serializable loaders.gl data type to hydrated arrow data type */\n// eslint-disable-next-line complexity\nexport function serializeArrowType(arrowType: ArrowDataType): DataType {\n switch (arrowType.constructor) {\n case Null:\n return 'null';\n case Binary:\n return 'binary';\n case Bool:\n return 'bool';\n // case Int: return 'int';\n case Int8:\n return 'int8';\n case Int16:\n return 'int16';\n case Int32:\n return 'int32';\n case Int64:\n return 'int64';\n case Uint8:\n return 'uint8';\n case Uint16:\n return 'uint16';\n case Uint32:\n return 'uint32';\n case Uint64:\n return 'uint64';\n // case Float: return 'float';\n case Float16:\n return 'float16';\n case Float32:\n return 'float32';\n case Float64:\n return 'float64';\n case Utf8:\n return 'utf8';\n // case Date: return 'date';\n case DateDay:\n return 'date-day';\n case DateMillisecond:\n return 'date-millisecond';\n // case Time: return 'time';\n case TimeMillisecond:\n return 'time-millisecond';\n case TimeSecond:\n return 'time-second';\n // case Timestamp: return 'timestamp';\n case TimestampSecond:\n return 'timestamp-second';\n case TimestampMillisecond:\n return 'timestamp-millisecond';\n case TimestampMicrosecond:\n return 'timestamp-microsecond';\n case TimestampNanosecond:\n return 'timestamp-nanosecond';\n // case Interval: return 'interval';\n case IntervalDayTime:\n return 'interval-daytime';\n case IntervalYearMonth:\n return 'interval-yearmonth';\n case FixedSizeList:\n return {\n type: 'fixed-size-list',\n listSize: (arrowType as FixedSizeList).listSize,\n children: [serializeArrowField((arrowType as FixedSizeList).children[0])]\n };\n // case Struct:\n // return {type: 'struct', children: (arrowType as Struct).children};\n default:\n throw new Error('array type not supported');\n }\n}\n\n/** Converts a serializable loaders.gl data type to hydrated arrow data type */\n// eslint-disable-next-line complexity\nexport function deserializeArrowType(dataType: DataType): ArrowDataType {\n if (typeof dataType === 'object') {\n switch (dataType.type) {\n case 'fixed-size-list':\n const child = deserializeArrowField(dataType.children[0]);\n return new FixedSizeList(dataType.listSize, child);\n case 'struct':\n const children = dataType.children.map((arrowField) => deserializeArrowField(arrowField));\n return new Struct(children);\n default:\n throw new Error('array type not supported');\n }\n }\n\n switch (dataType) {\n case 'null':\n return new Null();\n case 'binary':\n return new Binary();\n case 'bool':\n return new Bool();\n // case 'int': return new Int();\n case 'int8':\n return new Int8();\n case 'int16':\n return new Int16();\n case 'int32':\n return new Int32();\n case 'int64':\n return new Int64();\n case 'uint8':\n return new Uint8();\n case 'uint16':\n return new Uint16();\n case 'uint32':\n return new Uint32();\n case 'uint64':\n return new Uint64();\n // case 'float': return new Float();\n case 'float16':\n return new Float16();\n case 'float32':\n return new Float32();\n case 'float64':\n return new Float64();\n case 'utf8':\n return new Utf8();\n // case 'date': return new Date();\n case 'date-day':\n return new DateDay();\n case 'date-millisecond':\n return new DateMillisecond();\n // case 'time': return new Time();\n case 'time-millisecond':\n return new TimeMillisecond();\n case 'time-second':\n return new TimeSecond();\n // case 'timestamp': return new Timestamp();\n case 'timestamp-second':\n return new TimestampSecond();\n case 'timestamp-millisecond':\n return new TimestampMillisecond();\n case 'timestamp-microsecond':\n return new TimestampMicrosecond();\n case 'timestamp-nanosecond':\n return new TimestampNanosecond();\n // case 'interval': return new Interval();\n case 'interval-daytime':\n return new IntervalDayTime();\n case 'interval-yearmonth':\n return new IntervalYearMonth();\n default:\n throw new Error('array type not supported');\n }\n}\n"],"mappings":"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"}