@loaders.gl/arrow 4.0.2 → 4.0.3

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.
@@ -953,7 +953,7 @@
953
953
  }
954
954
 
955
955
  // src/arrow-loader.ts
956
- var VERSION = true ? "4.0.2" : "latest";
956
+ var VERSION = true ? "4.0.3" : "latest";
957
957
  var ArrowLoader = {
958
958
  name: "Apache Arrow",
959
959
  id: "arrow",
@@ -1,9 +1,9 @@
1
- import type { Writer, WriterOptions } from '@loaders.gl/loader-utils';
1
+ import type { WriterWithEncoder, WriterOptions } from '@loaders.gl/loader-utils';
2
2
  import { ColumnarTable } from './lib/encode-arrow';
3
3
  type ArrowWriterOptions = WriterOptions & {
4
4
  arrow?: {};
5
5
  };
6
6
  /** Apache Arrow writer */
7
- export declare const ArrowWriter: Writer<ColumnarTable, never, ArrowWriterOptions>;
7
+ export declare const ArrowWriter: WriterWithEncoder<ColumnarTable, never, ArrowWriterOptions>;
8
8
  export {};
9
9
  //# sourceMappingURL=arrow-writer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"arrow-writer.d.ts","sourceRoot":"","sources":["../src/arrow-writer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,MAAM,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AAOjD,KAAK,kBAAkB,GAAG,aAAa,GAAG;IACxC,KAAK,CAAC,EAAE,EAAE,CAAC;CACZ,CAAC;AAEF,0BAA0B;AAC1B,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,kBAAkB,CAmBxE,CAAC"}
1
+ {"version":3,"file":"arrow-writer.d.ts","sourceRoot":"","sources":["../src/arrow-writer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,iBAAiB,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AAOjD,KAAK,kBAAkB,GAAG,aAAa,GAAG;IACxC,KAAK,CAAC,EAAE,EAAE,CAAC;CACZ,CAAC;AAEF,0BAA0B;AAC1B,eAAO,MAAM,WAAW,EAAE,iBAAiB,CAAC,aAAa,EAAE,KAAK,EAAE,kBAAkB,CAmBnF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"arrow-writer.js","names":["encodeArrowSync","VERSION","__VERSION__","ArrowWriter","name","id","module","version","extensions","mimeTypes","binary","options","encode","encodeArrow","data","encodeSync"],"sources":["../src/arrow-writer.ts"],"sourcesContent":["// import type {} from '@loaders.gl/loader-utils';\n\nimport type {Writer, WriterOptions} from '@loaders.gl/loader-utils';\nimport {ColumnarTable} from './lib/encode-arrow';\nimport {encodeArrowSync} from './lib/encode-arrow';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\ntype ArrowWriterOptions = WriterOptions & {\n arrow?: {};\n};\n\n/** Apache Arrow writer */\nexport const ArrowWriter: Writer<ColumnarTable, never, ArrowWriterOptions> = {\n name: 'Apache Arrow',\n id: 'arrow',\n module: 'arrow',\n version: VERSION,\n extensions: ['arrow', 'feather'],\n mimeTypes: [\n 'application/vnd.apache.arrow.file',\n 'application/vnd.apache.arrow.stream',\n 'application/octet-stream'\n ],\n binary: true,\n options: {},\n encode: async function encodeArrow(data, options?): Promise<ArrayBuffer> {\n return encodeArrowSync(data);\n },\n encodeSync(data, options?) {\n return encodeArrowSync(data);\n }\n};\n"],"mappings":"SAIQA,eAAe;AAIvB,MAAMC,OAAO,GAAG,OAAOC,WAAW,KAAK,WAAW,GAAGA,WAAW,GAAG,QAAQ;AAO3E,OAAO,MAAMC,WAA6D,GAAG;EAC3EC,IAAI,EAAE,cAAc;EACpBC,EAAE,EAAE,OAAO;EACXC,MAAM,EAAE,OAAO;EACfC,OAAO,EAAEN,OAAO;EAChBO,UAAU,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;EAChCC,SAAS,EAAE,CACT,mCAAmC,EACnC,qCAAqC,EACrC,0BAA0B,CAC3B;EACDC,MAAM,EAAE,IAAI;EACZC,OAAO,EAAE,CAAC,CAAC;EACXC,MAAM,EAAE,eAAeC,WAAWA,CAACC,IAAI,EAAEH,OAAQ,EAAwB;IACvE,OAAOX,eAAe,CAACc,IAAI,CAAC;EAC9B,CAAC;EACDC,UAAUA,CAACD,IAAI,EAAEH,OAAQ,EAAE;IACzB,OAAOX,eAAe,CAACc,IAAI,CAAC;EAC9B;AACF,CAAC"}
1
+ {"version":3,"file":"arrow-writer.js","names":["encodeArrowSync","VERSION","__VERSION__","ArrowWriter","name","id","module","version","extensions","mimeTypes","binary","options","encode","encodeArrow","data","encodeSync"],"sources":["../src/arrow-writer.ts"],"sourcesContent":["// import type {} from '@loaders.gl/loader-utils';\n\nimport type {WriterWithEncoder, WriterOptions} from '@loaders.gl/loader-utils';\nimport {ColumnarTable} from './lib/encode-arrow';\nimport {encodeArrowSync} from './lib/encode-arrow';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\ntype ArrowWriterOptions = WriterOptions & {\n arrow?: {};\n};\n\n/** Apache Arrow writer */\nexport const ArrowWriter: WriterWithEncoder<ColumnarTable, never, ArrowWriterOptions> = {\n name: 'Apache Arrow',\n id: 'arrow',\n module: 'arrow',\n version: VERSION,\n extensions: ['arrow', 'feather'],\n mimeTypes: [\n 'application/vnd.apache.arrow.file',\n 'application/vnd.apache.arrow.stream',\n 'application/octet-stream'\n ],\n binary: true,\n options: {},\n encode: async function encodeArrow(data, options?): Promise<ArrayBuffer> {\n return encodeArrowSync(data);\n },\n encodeSync(data, options?) {\n return encodeArrowSync(data);\n }\n};\n"],"mappings":"SAIQA,eAAe;AAIvB,MAAMC,OAAO,GAAG,OAAOC,WAAW,KAAK,WAAW,GAAGA,WAAW,GAAG,QAAQ;AAO3E,OAAO,MAAMC,WAAwE,GAAG;EACtFC,IAAI,EAAE,cAAc;EACpBC,EAAE,EAAE,OAAO;EACXC,MAAM,EAAE,OAAO;EACfC,OAAO,EAAEN,OAAO;EAChBO,UAAU,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;EAChCC,SAAS,EAAE,CACT,mCAAmC,EACnC,qCAAqC,EACrC,0BAA0B,CAC3B;EACDC,MAAM,EAAE,IAAI;EACZC,OAAO,EAAE,CAAC,CAAC;EACXC,MAAM,EAAE,eAAeC,WAAWA,CAACC,IAAI,EAAEH,OAAQ,EAAwB;IACvE,OAAOX,eAAe,CAACc,IAAI,CAAC;EAC9B,CAAC;EACDC,UAAUA,CAACD,IAAI,EAAEH,OAAQ,EAAE;IACzB,OAAOX,eAAe,CAACc,IAAI,CAAC;EAC9B;AACF,CAAC"}
package/dist/dist.dev.js CHANGED
@@ -12554,7 +12554,15 @@ return true;`);
12554
12554
  return "float64";
12555
12555
  case Utf8:
12556
12556
  return "utf8";
12557
- case Date:
12557
+ case Decimal:
12558
+ const decimal = arrowType;
12559
+ return {
12560
+ type: "decimal",
12561
+ bitWidth: decimal.bitWidth,
12562
+ precision: decimal.precision,
12563
+ scale: decimal.scale
12564
+ };
12565
+ case Date_:
12558
12566
  const dateUnit = arrowType.unit;
12559
12567
  return dateUnit === DateUnit.DAY ? "date-day" : "date-millisecond";
12560
12568
  case DateDay:
@@ -12619,6 +12627,13 @@ return true;`);
12619
12627
  return "interval-daytime";
12620
12628
  case IntervalYearMonth:
12621
12629
  return "interval-yearmonth";
12630
+ case Map_:
12631
+ const mapType = arrowType;
12632
+ return {
12633
+ type: "map",
12634
+ keysSorted: mapType.keysSorted,
12635
+ children: mapType.children.map((arrowField) => serializeArrowField(arrowField))
12636
+ };
12622
12637
  case List:
12623
12638
  const listType = arrowType;
12624
12639
  const listField = listType.valueField;
@@ -12627,18 +12642,30 @@ return true;`);
12627
12642
  children: [serializeArrowField(listField)]
12628
12643
  };
12629
12644
  case FixedSizeList:
12645
+ const fixedSizeList = arrowType;
12630
12646
  return {
12631
12647
  type: "fixed-size-list",
12632
- listSize: arrowType.listSize,
12633
- children: [serializeArrowField(arrowType.children[0])]
12648
+ listSize: fixedSizeList.listSize,
12649
+ children: [serializeArrowField(fixedSizeList.children[0])]
12650
+ };
12651
+ case Struct:
12652
+ const structType = arrowType;
12653
+ return {
12654
+ type: "struct",
12655
+ children: structType.children.map((arrowField) => serializeArrowField(arrowField))
12634
12656
  };
12635
12657
  default:
12636
- throw new Error("array type not supported");
12658
+ throw new Error(`arrow type not supported: ${arrowType.constructor.name}`);
12637
12659
  }
12638
12660
  }
12639
12661
  function deserializeArrowType(dataType) {
12640
12662
  if (typeof dataType === "object") {
12641
12663
  switch (dataType.type) {
12664
+ case "decimal":
12665
+ return new Decimal(dataType.precision, dataType.scale, dataType.bitWidth);
12666
+ case "map":
12667
+ let children = dataType.children.map((arrowField) => deserializeArrowField(arrowField));
12668
+ return new Map_(children, dataType.keysSorted);
12642
12669
  case "list":
12643
12670
  const field = deserializeArrowField(dataType.children[0]);
12644
12671
  return new List(field);
@@ -12646,7 +12673,7 @@ return true;`);
12646
12673
  const child = deserializeArrowField(dataType.children[0]);
12647
12674
  return new FixedSizeList(dataType.listSize, child);
12648
12675
  case "struct":
12649
- const children = dataType.children.map((arrowField) => deserializeArrowField(arrowField));
12676
+ children = dataType.children.map((arrowField) => deserializeArrowField(arrowField));
12650
12677
  return new Struct(children);
12651
12678
  default:
12652
12679
  throw new Error("array type not supported");
@@ -12817,9 +12844,8 @@ return true;`);
12817
12844
  nDim,
12818
12845
  geomOffset
12819
12846
  } = getBinaryGeometriesFromChunk(chunk, geoEncoding);
12820
- const numOfVertices = flatCoordinateArray.length / nDim;
12821
- const globalFeatureIds = new Uint32Array(numOfVertices);
12822
- for (let i = 0; i < numOfVertices; i++) {
12847
+ const globalFeatureIds = new Uint32Array(featureIds.length);
12848
+ for (let i = 0; i < featureIds.length; i++) {
12823
12849
  globalFeatureIds[i] = featureIds[i] + globalFeatureIdOffset;
12824
12850
  }
12825
12851
  const binaryContent = {
@@ -12896,22 +12922,23 @@ return true;`);
12896
12922
  function getBinaryPolygonsFromChunk(chunk, geoEncoding) {
12897
12923
  const isMultiPolygon = geoEncoding === "geoarrow.multipolygon";
12898
12924
  const polygonData = isMultiPolygon ? chunk.children[0] : chunk;
12925
+ const polygonOffset = polygonData.valueOffsets;
12926
+ const partData = isMultiPolygon ? chunk.valueOffsets.map((i) => polygonOffset.at(i) || i) : chunk.valueOffsets;
12899
12927
  const ringData = polygonData.children[0];
12900
12928
  const pointData = ringData.children[0];
12901
12929
  const coordData = pointData.children[0];
12902
12930
  const nDim = pointData.stride;
12903
12931
  const geomOffset = ringData.valueOffsets;
12904
12932
  const flatCoordinateArray = coordData.values;
12905
- const geometryIndicies = new Uint16Array(chunk.length + 1);
12906
- for (let i = 0; i < chunk.length; i++) {
12907
- geometryIndicies[i] = geomOffset[chunk.valueOffsets[i]];
12933
+ const geometryIndicies = new Uint16Array(polygonOffset.length);
12934
+ for (let i = 0; i < polygonOffset.length; i++) {
12935
+ geometryIndicies[i] = geomOffset[polygonOffset[i]];
12908
12936
  }
12909
- geometryIndicies[chunk.length] = flatCoordinateArray.length / nDim;
12910
12937
  const numOfVertices = flatCoordinateArray.length / nDim;
12911
12938
  const featureIds = new Uint32Array(numOfVertices);
12912
- for (let i = 0; i < chunk.length - 1; i++) {
12913
- const startIdx = geomOffset[chunk.valueOffsets[i]];
12914
- const endIdx = geomOffset[chunk.valueOffsets[i + 1]];
12939
+ for (let i = 0; i < partData.length - 1; i++) {
12940
+ const startIdx = geomOffset[partData[i]];
12941
+ const endIdx = geomOffset[partData[i + 1]];
12915
12942
  for (let j = startIdx; j < endIdx; j++) {
12916
12943
  featureIds[j] = i;
12917
12944
  }
@@ -1 +1 @@
1
- {"version":3,"file":"convert-geoarrow-to-binary-geometry.d.ts","sourceRoot":"","sources":["../../src/geoarrow/convert-geoarrow-to-binary-geometry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAC,uBAAuB,IAAI,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAC,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;AAGjD;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,gBAAgB,EAAE,cAAc,EAAE,CAAC;IACnC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,YAAY,EAAE;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAC,CAAC;CACjE,CAAC;AAWF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;CAMpC,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,KAAK,CAAC,MAAM,EACvB,WAAW,EAAE,gBAAgB,GAC5B,sBAAsB,CA0ExB"}
1
+ {"version":3,"file":"convert-geoarrow-to-binary-geometry.d.ts","sourceRoot":"","sources":["../../src/geoarrow/convert-geoarrow-to-binary-geometry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAC,uBAAuB,IAAI,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAC,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;AAGjD;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,gBAAgB,EAAE,cAAc,EAAE,CAAC;IACnC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,YAAY,EAAE;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAC,CAAC;CACjE,CAAC;AAWF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;CAMpC,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,KAAK,CAAC,MAAM,EACvB,WAAW,EAAE,gBAAgB,GAC5B,sBAAsB,CAyExB"}
@@ -32,9 +32,8 @@ export function getBinaryGeometriesFromArrow(geoColumn, geoEncoding) {
32
32
  nDim,
33
33
  geomOffset
34
34
  } = getBinaryGeometriesFromChunk(chunk, geoEncoding);
35
- const numOfVertices = flatCoordinateArray.length / nDim;
36
- const globalFeatureIds = new Uint32Array(numOfVertices);
37
- for (let i = 0; i < numOfVertices; i++) {
35
+ const globalFeatureIds = new Uint32Array(featureIds.length);
36
+ for (let i = 0; i < featureIds.length; i++) {
38
37
  globalFeatureIds[i] = featureIds[i] + globalFeatureIdOffset;
39
38
  }
40
39
  const binaryContent = {
@@ -111,22 +110,23 @@ function getBinaryGeometriesFromChunk(chunk, geoEncoding) {
111
110
  function getBinaryPolygonsFromChunk(chunk, geoEncoding) {
112
111
  const isMultiPolygon = geoEncoding === 'geoarrow.multipolygon';
113
112
  const polygonData = isMultiPolygon ? chunk.children[0] : chunk;
113
+ const polygonOffset = polygonData.valueOffsets;
114
+ const partData = isMultiPolygon ? chunk.valueOffsets.map(i => polygonOffset.at(i) || i) : chunk.valueOffsets;
114
115
  const ringData = polygonData.children[0];
115
116
  const pointData = ringData.children[0];
116
117
  const coordData = pointData.children[0];
117
118
  const nDim = pointData.stride;
118
119
  const geomOffset = ringData.valueOffsets;
119
120
  const flatCoordinateArray = coordData.values;
120
- const geometryIndicies = new Uint16Array(chunk.length + 1);
121
- for (let i = 0; i < chunk.length; i++) {
122
- geometryIndicies[i] = geomOffset[chunk.valueOffsets[i]];
121
+ const geometryIndicies = new Uint16Array(polygonOffset.length);
122
+ for (let i = 0; i < polygonOffset.length; i++) {
123
+ geometryIndicies[i] = geomOffset[polygonOffset[i]];
123
124
  }
124
- geometryIndicies[chunk.length] = flatCoordinateArray.length / nDim;
125
125
  const numOfVertices = flatCoordinateArray.length / nDim;
126
126
  const featureIds = new Uint32Array(numOfVertices);
127
- for (let i = 0; i < chunk.length - 1; i++) {
128
- const startIdx = geomOffset[chunk.valueOffsets[i]];
129
- const endIdx = geomOffset[chunk.valueOffsets[i + 1]];
127
+ for (let i = 0; i < partData.length - 1; i++) {
128
+ const startIdx = geomOffset[partData[i]];
129
+ const endIdx = geomOffset[partData[i + 1]];
130
130
  for (let j = startIdx; j < endIdx; j++) {
131
131
  featureIds[j] = i;
132
132
  }
@@ -1 +1 @@
1
- {"version":3,"file":"convert-geoarrow-to-binary-geometry.js","names":["updateBoundsFromGeoArrowSamples","BINARY_GEOMETRY_TEMPLATE","globalFeatureIds","value","Uint32Array","size","positions","Float32Array","properties","numericProps","featureIds","getBinaryGeometriesFromArrow","geoColumn","geoEncoding","featureTypes","polygon","point","line","chunks","data","bounds","Infinity","globalFeatureIdOffset","binaryGeometries","forEach","chunk","flatCoordinateArray","nDim","geomOffset","getBinaryGeometriesFromChunk","numOfVertices","length","i","binaryContent","Array","keys","map","index","push","shape","points","type","lines","pathIndices","Uint16Array","polygons","polygonIndices","primitivePolygonIndices","getBinaryPointsFromChunk","getBinaryLinesFromChunk","getBinaryPolygonsFromChunk","Error","isMultiPolygon","polygonData","children","ringData","pointData","coordData","stride","valueOffsets","values","geometryIndicies","startIdx","endIdx","j","isMultiLineString","lineData","isMultiPoint","Int32Array"],"sources":["../../src/geoarrow/convert-geoarrow-to-binary-geometry.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport * as arrow from 'apache-arrow';\nimport {BinaryFeatureCollection as BinaryFeatures} from '@loaders.gl/schema';\nimport {GeoArrowEncoding} from '@loaders.gl/gis';\nimport {updateBoundsFromGeoArrowSamples} from './get-arrow-bounds';\n\n/**\n * Binary data from geoarrow column and can be used by e.g. deck.gl GeojsonLayer\n */\nexport type BinaryDataFromGeoArrow = {\n binaryGeometries: BinaryFeatures[];\n bounds: [number, number, number, number];\n featureTypes: {polygon: boolean; point: boolean; line: boolean};\n};\n\ntype BinaryGeometryContent = {\n featureIds: Uint32Array;\n flatCoordinateArray: Float64Array;\n nDim: number;\n geomOffset: Int32Array;\n geometryIndicies: Uint16Array;\n};\n\n// binary geometry template, see deck.gl BinaryGeometry\nexport const BINARY_GEOMETRY_TEMPLATE = {\n globalFeatureIds: {value: new Uint32Array(0), size: 1},\n positions: {value: new Float32Array(0), size: 2},\n properties: [],\n numericProps: {},\n featureIds: {value: new Uint32Array(0), size: 1}\n};\n\n/**\n * get binary geometries from geoarrow column\n *\n * @param geoColumn the geoarrow column, e.g. arrowTable.getChildAt(geoColumnIndex)\n * @param geoEncoding the geo encoding of the geoarrow column, e.g. getGeoArrowEncoding(arrowTable.schema, geoColumnName)\n * @returns BinaryDataFromGeoArrow\n */\nexport function getBinaryGeometriesFromArrow(\n geoColumn: arrow.Vector,\n geoEncoding: GeoArrowEncoding\n): BinaryDataFromGeoArrow {\n const featureTypes = {\n polygon: geoEncoding === 'geoarrow.multipolygon' || geoEncoding === 'geoarrow.polygon',\n point: geoEncoding === 'geoarrow.multipoint' || geoEncoding === 'geoarrow.point',\n line: geoEncoding === 'geoarrow.multilinestring' || geoEncoding === 'geoarrow.linestring'\n };\n\n const chunks = geoColumn.data;\n let bounds: [number, number, number, number] = [Infinity, Infinity, -Infinity, -Infinity];\n let globalFeatureIdOffset = 0;\n const binaryGeometries: BinaryFeatures[] = [];\n\n chunks.forEach((chunk) => {\n const {featureIds, flatCoordinateArray, nDim, geomOffset} = getBinaryGeometriesFromChunk(\n chunk,\n geoEncoding\n );\n\n const numOfVertices = flatCoordinateArray.length / nDim;\n const globalFeatureIds = new Uint32Array(numOfVertices);\n for (let i = 0; i < numOfVertices; i++) {\n globalFeatureIds[i] = featureIds[i] + globalFeatureIdOffset;\n }\n\n const binaryContent = {\n globalFeatureIds: {value: globalFeatureIds, size: 1},\n positions: {\n value: flatCoordinateArray,\n size: nDim\n },\n featureIds: {value: featureIds, size: 1},\n properties: [...Array(chunk.length).keys()].map((i) => ({\n index: i + globalFeatureIdOffset\n }))\n };\n\n // TODO: check if chunks are sequentially accessed\n globalFeatureIdOffset += chunk.length;\n\n // NOTE: deck.gl defines the BinaryFeatures structure must have points, lines, polygons even if they are empty\n binaryGeometries.push({\n shape: 'binary-feature-collection',\n points: {\n type: 'Point',\n ...BINARY_GEOMETRY_TEMPLATE,\n ...(featureTypes.point ? binaryContent : {})\n },\n lines: {\n type: 'LineString',\n ...BINARY_GEOMETRY_TEMPLATE,\n ...(featureTypes.line ? binaryContent : {}),\n pathIndices: {value: featureTypes.line ? geomOffset : new Uint16Array(0), size: 1}\n },\n polygons: {\n type: 'Polygon',\n ...BINARY_GEOMETRY_TEMPLATE,\n ...(featureTypes.polygon ? binaryContent : {}),\n polygonIndices: {\n // TODO why deck.gl's tessellatePolygon performance is not good when using geometryIndicies\n // even when there is no hole in any polygon\n value: featureTypes.polygon ? geomOffset : new Uint16Array(0),\n size: 1\n },\n primitivePolygonIndices: {\n value: featureTypes.polygon ? geomOffset : new Uint16Array(0),\n size: 1\n }\n }\n });\n\n bounds = updateBoundsFromGeoArrowSamples(flatCoordinateArray, nDim, bounds);\n });\n\n return {binaryGeometries, bounds, featureTypes};\n}\n\n/**\n * get binary geometries from geoarrow column\n * @param chunk one chunk/batch of geoarrow column\n * @param geoEncoding geo encoding of the geoarrow column\n * @returns BinaryGeometryContent\n */\nfunction getBinaryGeometriesFromChunk(\n chunk: arrow.Data,\n geoEncoding: GeoArrowEncoding\n): BinaryGeometryContent {\n switch (geoEncoding) {\n case 'geoarrow.point':\n case 'geoarrow.multipoint':\n return getBinaryPointsFromChunk(chunk, geoEncoding);\n case 'geoarrow.linestring':\n case 'geoarrow.multilinestring':\n return getBinaryLinesFromChunk(chunk, geoEncoding);\n case 'geoarrow.polygon':\n case 'geoarrow.multipolygon':\n return getBinaryPolygonsFromChunk(chunk, geoEncoding);\n default:\n throw Error('invalid geoarrow encoding');\n }\n}\n\n/**\n * get binary polygons from geoarrow polygon column\n * @param chunk one chunk of geoarrow polygon column\n * @param geoEncoding the geo encoding of the geoarrow polygon column\n * @returns BinaryGeometryContent\n */\nfunction getBinaryPolygonsFromChunk(chunk: arrow.Data, geoEncoding: string): BinaryGeometryContent {\n const isMultiPolygon = geoEncoding === 'geoarrow.multipolygon';\n\n const polygonData = isMultiPolygon ? chunk.children[0] : chunk;\n const ringData = polygonData.children[0];\n const pointData = ringData.children[0];\n const coordData = pointData.children[0];\n const nDim = pointData.stride;\n const geomOffset = ringData.valueOffsets;\n const flatCoordinateArray = coordData.values;\n\n const geometryIndicies = new Uint16Array(chunk.length + 1);\n for (let i = 0; i < chunk.length; i++) {\n geometryIndicies[i] = geomOffset[chunk.valueOffsets[i]];\n }\n geometryIndicies[chunk.length] = flatCoordinateArray.length / nDim;\n\n const numOfVertices = flatCoordinateArray.length / nDim;\n const featureIds = new Uint32Array(numOfVertices);\n for (let i = 0; i < chunk.length - 1; i++) {\n const startIdx = geomOffset[chunk.valueOffsets[i]];\n const endIdx = geomOffset[chunk.valueOffsets[i + 1]];\n for (let j = startIdx; j < endIdx; j++) {\n featureIds[j] = i;\n }\n }\n\n return {\n featureIds,\n flatCoordinateArray,\n nDim,\n geomOffset,\n geometryIndicies\n };\n}\n\n/**\n * get binary lines from geoarrow line column\n * @param chunk one chunk/batch of geoarrow column\n * @param geoEncoding the geo encoding of the geoarrow column\n * @returns BinaryGeometryContent\n */\nfunction getBinaryLinesFromChunk(chunk: arrow.Data, geoEncoding: string): BinaryGeometryContent {\n const isMultiLineString = geoEncoding === 'geoarrow.multilinestring';\n\n const lineData = isMultiLineString ? chunk.children[0] : chunk;\n const pointData = lineData.children[0];\n const coordData = pointData.children[0];\n\n const nDim = pointData.stride;\n const geomOffset = lineData.valueOffsets;\n const flatCoordinateArray = coordData.values;\n\n // geometryIndicies is not needed for line string\n const geometryIndicies = new Uint16Array(0);\n\n const numOfVertices = flatCoordinateArray.length / nDim;\n const featureIds = new Uint32Array(numOfVertices);\n for (let i = 0; i < chunk.length; i++) {\n const startIdx = geomOffset[i];\n const endIdx = geomOffset[i + 1];\n for (let j = startIdx; j < endIdx; j++) {\n featureIds[j] = i;\n }\n }\n\n return {\n featureIds,\n flatCoordinateArray,\n nDim,\n geomOffset,\n geometryIndicies\n };\n}\n\n/**\n * get binary points from geoarrow point column\n * @param chunk one chunk/batch of geoarrow column\n * @param geoEncoding geo encoding of the geoarrow column\n * @returns BinaryGeometryContent\n */\nfunction getBinaryPointsFromChunk(chunk: arrow.Data, geoEncoding: string): BinaryGeometryContent {\n const isMultiPoint = geoEncoding === 'geoarrow.multipoint';\n\n const pointData = isMultiPoint ? chunk.children[0] : chunk;\n const coordData = pointData.children[0];\n\n const nDim = pointData.stride;\n const flatCoordinateArray = coordData.values;\n\n // geometryIndices is not needed for point\n const geometryIndicies = new Uint16Array(0);\n // geomOffset is not needed for point\n const geomOffset = new Int32Array(0);\n\n const numOfVertices = flatCoordinateArray.length / nDim;\n const featureIds = new Uint32Array(numOfVertices);\n for (let i = 0; i < chunk.length; i++) {\n featureIds[i] = i;\n }\n\n return {\n featureIds,\n flatCoordinateArray,\n nDim,\n geomOffset,\n geometryIndicies\n };\n}\n"],"mappings":"SAMQA,+BAA+B;AAoBvC,OAAO,MAAMC,wBAAwB,GAAG;EACtCC,gBAAgB,EAAE;IAACC,KAAK,EAAE,IAAIC,WAAW,CAAC,CAAC,CAAC;IAAEC,IAAI,EAAE;EAAC,CAAC;EACtDC,SAAS,EAAE;IAACH,KAAK,EAAE,IAAII,YAAY,CAAC,CAAC,CAAC;IAAEF,IAAI,EAAE;EAAC,CAAC;EAChDG,UAAU,EAAE,EAAE;EACdC,YAAY,EAAE,CAAC,CAAC;EAChBC,UAAU,EAAE;IAACP,KAAK,EAAE,IAAIC,WAAW,CAAC,CAAC,CAAC;IAAEC,IAAI,EAAE;EAAC;AACjD,CAAC;AASD,OAAO,SAASM,4BAA4BA,CAC1CC,SAAuB,EACvBC,WAA6B,EACL;EACxB,MAAMC,YAAY,GAAG;IACnBC,OAAO,EAAEF,WAAW,KAAK,uBAAuB,IAAIA,WAAW,KAAK,kBAAkB;IACtFG,KAAK,EAAEH,WAAW,KAAK,qBAAqB,IAAIA,WAAW,KAAK,gBAAgB;IAChFI,IAAI,EAAEJ,WAAW,KAAK,0BAA0B,IAAIA,WAAW,KAAK;EACtE,CAAC;EAED,MAAMK,MAAM,GAAGN,SAAS,CAACO,IAAI;EAC7B,IAAIC,MAAwC,GAAG,CAACC,QAAQ,EAAEA,QAAQ,EAAE,CAACA,QAAQ,EAAE,CAACA,QAAQ,CAAC;EACzF,IAAIC,qBAAqB,GAAG,CAAC;EAC7B,MAAMC,gBAAkC,GAAG,EAAE;EAE7CL,MAAM,CAACM,OAAO,CAAEC,KAAK,IAAK;IACxB,MAAM;MAACf,UAAU;MAAEgB,mBAAmB;MAAEC,IAAI;MAAEC;IAAU,CAAC,GAAGC,4BAA4B,CACtFJ,KAAK,EACLZ,WACF,CAAC;IAED,MAAMiB,aAAa,GAAGJ,mBAAmB,CAACK,MAAM,GAAGJ,IAAI;IACvD,MAAMzB,gBAAgB,GAAG,IAAIE,WAAW,CAAC0B,aAAa,CAAC;IACvD,KAAK,IAAIE,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,aAAa,EAAEE,CAAC,EAAE,EAAE;MACtC9B,gBAAgB,CAAC8B,CAAC,CAAC,GAAGtB,UAAU,CAACsB,CAAC,CAAC,GAAGV,qBAAqB;IAC7D;IAEA,MAAMW,aAAa,GAAG;MACpB/B,gBAAgB,EAAE;QAACC,KAAK,EAAED,gBAAgB;QAAEG,IAAI,EAAE;MAAC,CAAC;MACpDC,SAAS,EAAE;QACTH,KAAK,EAAEuB,mBAAmB;QAC1BrB,IAAI,EAAEsB;MACR,CAAC;MACDjB,UAAU,EAAE;QAACP,KAAK,EAAEO,UAAU;QAAEL,IAAI,EAAE;MAAC,CAAC;MACxCG,UAAU,EAAE,CAAC,GAAG0B,KAAK,CAACT,KAAK,CAACM,MAAM,CAAC,CAACI,IAAI,CAAC,CAAC,CAAC,CAACC,GAAG,CAAEJ,CAAC,KAAM;QACtDK,KAAK,EAAEL,CAAC,GAAGV;MACb,CAAC,CAAC;IACJ,CAAC;IAGDA,qBAAqB,IAAIG,KAAK,CAACM,MAAM;IAGrCR,gBAAgB,CAACe,IAAI,CAAC;MACpBC,KAAK,EAAE,2BAA2B;MAClCC,MAAM,EAAE;QACNC,IAAI,EAAE,OAAO;QACb,GAAGxC,wBAAwB;QAC3B,IAAIa,YAAY,CAACE,KAAK,GAAGiB,aAAa,GAAG,CAAC,CAAC;MAC7C,CAAC;MACDS,KAAK,EAAE;QACLD,IAAI,EAAE,YAAY;QAClB,GAAGxC,wBAAwB;QAC3B,IAAIa,YAAY,CAACG,IAAI,GAAGgB,aAAa,GAAG,CAAC,CAAC,CAAC;QAC3CU,WAAW,EAAE;UAACxC,KAAK,EAAEW,YAAY,CAACG,IAAI,GAAGW,UAAU,GAAG,IAAIgB,WAAW,CAAC,CAAC,CAAC;UAAEvC,IAAI,EAAE;QAAC;MACnF,CAAC;MACDwC,QAAQ,EAAE;QACRJ,IAAI,EAAE,SAAS;QACf,GAAGxC,wBAAwB;QAC3B,IAAIa,YAAY,CAACC,OAAO,GAAGkB,aAAa,GAAG,CAAC,CAAC,CAAC;QAC9Ca,cAAc,EAAE;UAGd3C,KAAK,EAAEW,YAAY,CAACC,OAAO,GAAGa,UAAU,GAAG,IAAIgB,WAAW,CAAC,CAAC,CAAC;UAC7DvC,IAAI,EAAE;QACR,CAAC;QACD0C,uBAAuB,EAAE;UACvB5C,KAAK,EAAEW,YAAY,CAACC,OAAO,GAAGa,UAAU,GAAG,IAAIgB,WAAW,CAAC,CAAC,CAAC;UAC7DvC,IAAI,EAAE;QACR;MACF;IACF,CAAC,CAAC;IAEFe,MAAM,GAAGpB,+BAA+B,CAAC0B,mBAAmB,EAAEC,IAAI,EAAEP,MAAM,CAAC;EAC7E,CAAC,CAAC;EAEF,OAAO;IAACG,gBAAgB;IAAEH,MAAM;IAAEN;EAAY,CAAC;AACjD;AAQA,SAASe,4BAA4BA,CACnCJ,KAAiB,EACjBZ,WAA6B,EACN;EACvB,QAAQA,WAAW;IACjB,KAAK,gBAAgB;IACrB,KAAK,qBAAqB;MACxB,OAAOmC,wBAAwB,CAACvB,KAAK,EAAEZ,WAAW,CAAC;IACrD,KAAK,qBAAqB;IAC1B,KAAK,0BAA0B;MAC7B,OAAOoC,uBAAuB,CAACxB,KAAK,EAAEZ,WAAW,CAAC;IACpD,KAAK,kBAAkB;IACvB,KAAK,uBAAuB;MAC1B,OAAOqC,0BAA0B,CAACzB,KAAK,EAAEZ,WAAW,CAAC;IACvD;MACE,MAAMsC,KAAK,CAAC,2BAA2B,CAAC;EAC5C;AACF;AAQA,SAASD,0BAA0BA,CAACzB,KAAiB,EAAEZ,WAAmB,EAAyB;EACjG,MAAMuC,cAAc,GAAGvC,WAAW,KAAK,uBAAuB;EAE9D,MAAMwC,WAAW,GAAGD,cAAc,GAAG3B,KAAK,CAAC6B,QAAQ,CAAC,CAAC,CAAC,GAAG7B,KAAK;EAC9D,MAAM8B,QAAQ,GAAGF,WAAW,CAACC,QAAQ,CAAC,CAAC,CAAC;EACxC,MAAME,SAAS,GAAGD,QAAQ,CAACD,QAAQ,CAAC,CAAC,CAAC;EACtC,MAAMG,SAAS,GAAGD,SAAS,CAACF,QAAQ,CAAC,CAAC,CAAC;EACvC,MAAM3B,IAAI,GAAG6B,SAAS,CAACE,MAAM;EAC7B,MAAM9B,UAAU,GAAG2B,QAAQ,CAACI,YAAY;EACxC,MAAMjC,mBAAmB,GAAG+B,SAAS,CAACG,MAAM;EAE5C,MAAMC,gBAAgB,GAAG,IAAIjB,WAAW,CAACnB,KAAK,CAACM,MAAM,GAAG,CAAC,CAAC;EAC1D,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGP,KAAK,CAACM,MAAM,EAAEC,CAAC,EAAE,EAAE;IACrC6B,gBAAgB,CAAC7B,CAAC,CAAC,GAAGJ,UAAU,CAACH,KAAK,CAACkC,YAAY,CAAC3B,CAAC,CAAC,CAAC;EACzD;EACA6B,gBAAgB,CAACpC,KAAK,CAACM,MAAM,CAAC,GAAGL,mBAAmB,CAACK,MAAM,GAAGJ,IAAI;EAElE,MAAMG,aAAa,GAAGJ,mBAAmB,CAACK,MAAM,GAAGJ,IAAI;EACvD,MAAMjB,UAAU,GAAG,IAAIN,WAAW,CAAC0B,aAAa,CAAC;EACjD,KAAK,IAAIE,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGP,KAAK,CAACM,MAAM,GAAG,CAAC,EAAEC,CAAC,EAAE,EAAE;IACzC,MAAM8B,QAAQ,GAAGlC,UAAU,CAACH,KAAK,CAACkC,YAAY,CAAC3B,CAAC,CAAC,CAAC;IAClD,MAAM+B,MAAM,GAAGnC,UAAU,CAACH,KAAK,CAACkC,YAAY,CAAC3B,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD,KAAK,IAAIgC,CAAC,GAAGF,QAAQ,EAAEE,CAAC,GAAGD,MAAM,EAAEC,CAAC,EAAE,EAAE;MACtCtD,UAAU,CAACsD,CAAC,CAAC,GAAGhC,CAAC;IACnB;EACF;EAEA,OAAO;IACLtB,UAAU;IACVgB,mBAAmB;IACnBC,IAAI;IACJC,UAAU;IACViC;EACF,CAAC;AACH;AAQA,SAASZ,uBAAuBA,CAACxB,KAAiB,EAAEZ,WAAmB,EAAyB;EAC9F,MAAMoD,iBAAiB,GAAGpD,WAAW,KAAK,0BAA0B;EAEpE,MAAMqD,QAAQ,GAAGD,iBAAiB,GAAGxC,KAAK,CAAC6B,QAAQ,CAAC,CAAC,CAAC,GAAG7B,KAAK;EAC9D,MAAM+B,SAAS,GAAGU,QAAQ,CAACZ,QAAQ,CAAC,CAAC,CAAC;EACtC,MAAMG,SAAS,GAAGD,SAAS,CAACF,QAAQ,CAAC,CAAC,CAAC;EAEvC,MAAM3B,IAAI,GAAG6B,SAAS,CAACE,MAAM;EAC7B,MAAM9B,UAAU,GAAGsC,QAAQ,CAACP,YAAY;EACxC,MAAMjC,mBAAmB,GAAG+B,SAAS,CAACG,MAAM;EAG5C,MAAMC,gBAAgB,GAAG,IAAIjB,WAAW,CAAC,CAAC,CAAC;EAE3C,MAAMd,aAAa,GAAGJ,mBAAmB,CAACK,MAAM,GAAGJ,IAAI;EACvD,MAAMjB,UAAU,GAAG,IAAIN,WAAW,CAAC0B,aAAa,CAAC;EACjD,KAAK,IAAIE,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGP,KAAK,CAACM,MAAM,EAAEC,CAAC,EAAE,EAAE;IACrC,MAAM8B,QAAQ,GAAGlC,UAAU,CAACI,CAAC,CAAC;IAC9B,MAAM+B,MAAM,GAAGnC,UAAU,CAACI,CAAC,GAAG,CAAC,CAAC;IAChC,KAAK,IAAIgC,CAAC,GAAGF,QAAQ,EAAEE,CAAC,GAAGD,MAAM,EAAEC,CAAC,EAAE,EAAE;MACtCtD,UAAU,CAACsD,CAAC,CAAC,GAAGhC,CAAC;IACnB;EACF;EAEA,OAAO;IACLtB,UAAU;IACVgB,mBAAmB;IACnBC,IAAI;IACJC,UAAU;IACViC;EACF,CAAC;AACH;AAQA,SAASb,wBAAwBA,CAACvB,KAAiB,EAAEZ,WAAmB,EAAyB;EAC/F,MAAMsD,YAAY,GAAGtD,WAAW,KAAK,qBAAqB;EAE1D,MAAM2C,SAAS,GAAGW,YAAY,GAAG1C,KAAK,CAAC6B,QAAQ,CAAC,CAAC,CAAC,GAAG7B,KAAK;EAC1D,MAAMgC,SAAS,GAAGD,SAAS,CAACF,QAAQ,CAAC,CAAC,CAAC;EAEvC,MAAM3B,IAAI,GAAG6B,SAAS,CAACE,MAAM;EAC7B,MAAMhC,mBAAmB,GAAG+B,SAAS,CAACG,MAAM;EAG5C,MAAMC,gBAAgB,GAAG,IAAIjB,WAAW,CAAC,CAAC,CAAC;EAE3C,MAAMhB,UAAU,GAAG,IAAIwC,UAAU,CAAC,CAAC,CAAC;EAEpC,MAAMtC,aAAa,GAAGJ,mBAAmB,CAACK,MAAM,GAAGJ,IAAI;EACvD,MAAMjB,UAAU,GAAG,IAAIN,WAAW,CAAC0B,aAAa,CAAC;EACjD,KAAK,IAAIE,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGP,KAAK,CAACM,MAAM,EAAEC,CAAC,EAAE,EAAE;IACrCtB,UAAU,CAACsB,CAAC,CAAC,GAAGA,CAAC;EACnB;EAEA,OAAO;IACLtB,UAAU;IACVgB,mBAAmB;IACnBC,IAAI;IACJC,UAAU;IACViC;EACF,CAAC;AACH"}
1
+ {"version":3,"file":"convert-geoarrow-to-binary-geometry.js","names":["updateBoundsFromGeoArrowSamples","BINARY_GEOMETRY_TEMPLATE","globalFeatureIds","value","Uint32Array","size","positions","Float32Array","properties","numericProps","featureIds","getBinaryGeometriesFromArrow","geoColumn","geoEncoding","featureTypes","polygon","point","line","chunks","data","bounds","Infinity","globalFeatureIdOffset","binaryGeometries","forEach","chunk","flatCoordinateArray","nDim","geomOffset","getBinaryGeometriesFromChunk","length","i","binaryContent","Array","keys","map","index","push","shape","points","type","lines","pathIndices","Uint16Array","polygons","polygonIndices","primitivePolygonIndices","getBinaryPointsFromChunk","getBinaryLinesFromChunk","getBinaryPolygonsFromChunk","Error","isMultiPolygon","polygonData","children","polygonOffset","valueOffsets","partData","at","ringData","pointData","coordData","stride","values","geometryIndicies","numOfVertices","startIdx","endIdx","j","isMultiLineString","lineData","isMultiPoint","Int32Array"],"sources":["../../src/geoarrow/convert-geoarrow-to-binary-geometry.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport * as arrow from 'apache-arrow';\nimport {BinaryFeatureCollection as BinaryFeatures} from '@loaders.gl/schema';\nimport {GeoArrowEncoding} from '@loaders.gl/gis';\nimport {updateBoundsFromGeoArrowSamples} from './get-arrow-bounds';\n\n/**\n * Binary data from geoarrow column and can be used by e.g. deck.gl GeojsonLayer\n */\nexport type BinaryDataFromGeoArrow = {\n binaryGeometries: BinaryFeatures[];\n bounds: [number, number, number, number];\n featureTypes: {polygon: boolean; point: boolean; line: boolean};\n};\n\ntype BinaryGeometryContent = {\n featureIds: Uint32Array;\n flatCoordinateArray: Float64Array;\n nDim: number;\n geomOffset: Int32Array;\n geometryIndicies: Uint16Array;\n};\n\n// binary geometry template, see deck.gl BinaryGeometry\nexport const BINARY_GEOMETRY_TEMPLATE = {\n globalFeatureIds: {value: new Uint32Array(0), size: 1},\n positions: {value: new Float32Array(0), size: 2},\n properties: [],\n numericProps: {},\n featureIds: {value: new Uint32Array(0), size: 1}\n};\n\n/**\n * get binary geometries from geoarrow column\n *\n * @param geoColumn the geoarrow column, e.g. arrowTable.getChildAt(geoColumnIndex)\n * @param geoEncoding the geo encoding of the geoarrow column, e.g. getGeoArrowEncoding(arrowTable.schema, geoColumnName)\n * @returns BinaryDataFromGeoArrow\n */\nexport function getBinaryGeometriesFromArrow(\n geoColumn: arrow.Vector,\n geoEncoding: GeoArrowEncoding\n): BinaryDataFromGeoArrow {\n const featureTypes = {\n polygon: geoEncoding === 'geoarrow.multipolygon' || geoEncoding === 'geoarrow.polygon',\n point: geoEncoding === 'geoarrow.multipoint' || geoEncoding === 'geoarrow.point',\n line: geoEncoding === 'geoarrow.multilinestring' || geoEncoding === 'geoarrow.linestring'\n };\n\n const chunks = geoColumn.data;\n let bounds: [number, number, number, number] = [Infinity, Infinity, -Infinity, -Infinity];\n let globalFeatureIdOffset = 0;\n const binaryGeometries: BinaryFeatures[] = [];\n\n chunks.forEach((chunk) => {\n const {featureIds, flatCoordinateArray, nDim, geomOffset} = getBinaryGeometriesFromChunk(\n chunk,\n geoEncoding\n );\n\n const globalFeatureIds = new Uint32Array(featureIds.length);\n for (let i = 0; i < featureIds.length; i++) {\n globalFeatureIds[i] = featureIds[i] + globalFeatureIdOffset;\n }\n\n const binaryContent = {\n globalFeatureIds: {value: globalFeatureIds, size: 1},\n positions: {\n value: flatCoordinateArray,\n size: nDim\n },\n featureIds: {value: featureIds, size: 1},\n properties: [...Array(chunk.length).keys()].map((i) => ({\n index: i + globalFeatureIdOffset\n }))\n };\n\n // TODO: check if chunks are sequentially accessed\n globalFeatureIdOffset += chunk.length;\n\n // NOTE: deck.gl defines the BinaryFeatures structure must have points, lines, polygons even if they are empty\n binaryGeometries.push({\n shape: 'binary-feature-collection',\n points: {\n type: 'Point',\n ...BINARY_GEOMETRY_TEMPLATE,\n ...(featureTypes.point ? binaryContent : {})\n },\n lines: {\n type: 'LineString',\n ...BINARY_GEOMETRY_TEMPLATE,\n ...(featureTypes.line ? binaryContent : {}),\n pathIndices: {value: featureTypes.line ? geomOffset : new Uint16Array(0), size: 1}\n },\n polygons: {\n type: 'Polygon',\n ...BINARY_GEOMETRY_TEMPLATE,\n ...(featureTypes.polygon ? binaryContent : {}),\n polygonIndices: {\n // TODO why deck.gl's tessellatePolygon performance is not good when using geometryIndicies\n // even when there is no hole in any polygon\n value: featureTypes.polygon ? geomOffset : new Uint16Array(0),\n size: 1\n },\n primitivePolygonIndices: {\n value: featureTypes.polygon ? geomOffset : new Uint16Array(0),\n size: 1\n }\n }\n });\n\n bounds = updateBoundsFromGeoArrowSamples(flatCoordinateArray, nDim, bounds);\n });\n\n return {binaryGeometries, bounds, featureTypes};\n}\n\n/**\n * get binary geometries from geoarrow column\n * @param chunk one chunk/batch of geoarrow column\n * @param geoEncoding geo encoding of the geoarrow column\n * @returns BinaryGeometryContent\n */\nfunction getBinaryGeometriesFromChunk(\n chunk: arrow.Data,\n geoEncoding: GeoArrowEncoding\n): BinaryGeometryContent {\n switch (geoEncoding) {\n case 'geoarrow.point':\n case 'geoarrow.multipoint':\n return getBinaryPointsFromChunk(chunk, geoEncoding);\n case 'geoarrow.linestring':\n case 'geoarrow.multilinestring':\n return getBinaryLinesFromChunk(chunk, geoEncoding);\n case 'geoarrow.polygon':\n case 'geoarrow.multipolygon':\n return getBinaryPolygonsFromChunk(chunk, geoEncoding);\n default:\n throw Error('invalid geoarrow encoding');\n }\n}\n\n/**\n * get binary polygons from geoarrow polygon column\n * @param chunk one chunk of geoarrow polygon column\n * @param geoEncoding the geo encoding of the geoarrow polygon column\n * @returns BinaryGeometryContent\n */\nfunction getBinaryPolygonsFromChunk(chunk: arrow.Data, geoEncoding: string): BinaryGeometryContent {\n const isMultiPolygon = geoEncoding === 'geoarrow.multipolygon';\n\n const polygonData = isMultiPolygon ? chunk.children[0] : chunk;\n const polygonOffset = polygonData.valueOffsets;\n const partData = isMultiPolygon\n ? chunk.valueOffsets.map((i) => polygonOffset.at(i) || i)\n : chunk.valueOffsets;\n const ringData = polygonData.children[0];\n const pointData = ringData.children[0];\n const coordData = pointData.children[0];\n const nDim = pointData.stride;\n const geomOffset = ringData.valueOffsets;\n const flatCoordinateArray = coordData.values;\n\n const geometryIndicies = new Uint16Array(polygonOffset.length);\n for (let i = 0; i < polygonOffset.length; i++) {\n geometryIndicies[i] = geomOffset[polygonOffset[i]];\n }\n\n const numOfVertices = flatCoordinateArray.length / nDim;\n const featureIds = new Uint32Array(numOfVertices);\n for (let i = 0; i < partData.length - 1; i++) {\n const startIdx = geomOffset[partData[i]];\n const endIdx = geomOffset[partData[i + 1]];\n for (let j = startIdx; j < endIdx; j++) {\n featureIds[j] = i;\n }\n }\n\n return {\n featureIds,\n flatCoordinateArray,\n nDim,\n geomOffset,\n geometryIndicies\n };\n}\n\n/**\n * get binary lines from geoarrow line column\n * @param chunk one chunk/batch of geoarrow column\n * @param geoEncoding the geo encoding of the geoarrow column\n * @returns BinaryGeometryContent\n */\nfunction getBinaryLinesFromChunk(chunk: arrow.Data, geoEncoding: string): BinaryGeometryContent {\n const isMultiLineString = geoEncoding === 'geoarrow.multilinestring';\n\n const lineData = isMultiLineString ? chunk.children[0] : chunk;\n const pointData = lineData.children[0];\n const coordData = pointData.children[0];\n\n const nDim = pointData.stride;\n const geomOffset = lineData.valueOffsets;\n const flatCoordinateArray = coordData.values;\n\n // geometryIndicies is not needed for line string\n const geometryIndicies = new Uint16Array(0);\n\n const numOfVertices = flatCoordinateArray.length / nDim;\n const featureIds = new Uint32Array(numOfVertices);\n for (let i = 0; i < chunk.length; i++) {\n const startIdx = geomOffset[i];\n const endIdx = geomOffset[i + 1];\n for (let j = startIdx; j < endIdx; j++) {\n featureIds[j] = i;\n }\n }\n\n return {\n featureIds,\n flatCoordinateArray,\n nDim,\n geomOffset,\n geometryIndicies\n };\n}\n\n/**\n * get binary points from geoarrow point column\n * @param chunk one chunk/batch of geoarrow column\n * @param geoEncoding geo encoding of the geoarrow column\n * @returns BinaryGeometryContent\n */\nfunction getBinaryPointsFromChunk(chunk: arrow.Data, geoEncoding: string): BinaryGeometryContent {\n const isMultiPoint = geoEncoding === 'geoarrow.multipoint';\n\n const pointData = isMultiPoint ? chunk.children[0] : chunk;\n const coordData = pointData.children[0];\n\n const nDim = pointData.stride;\n const flatCoordinateArray = coordData.values;\n\n // geometryIndices is not needed for point\n const geometryIndicies = new Uint16Array(0);\n // geomOffset is not needed for point\n const geomOffset = new Int32Array(0);\n\n const numOfVertices = flatCoordinateArray.length / nDim;\n const featureIds = new Uint32Array(numOfVertices);\n for (let i = 0; i < chunk.length; i++) {\n featureIds[i] = i;\n }\n\n return {\n featureIds,\n flatCoordinateArray,\n nDim,\n geomOffset,\n geometryIndicies\n };\n}\n"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -308,7 +308,15 @@ function serializeArrowType(arrowType) {
308
308
  return "float64";
309
309
  case arrow5.Utf8:
310
310
  return "utf8";
311
- case Date:
311
+ case arrow5.Decimal:
312
+ const decimal = arrowType;
313
+ return {
314
+ type: "decimal",
315
+ bitWidth: decimal.bitWidth,
316
+ precision: decimal.precision,
317
+ scale: decimal.scale
318
+ };
319
+ case arrow5.Date_:
312
320
  const dateUnit = arrowType.unit;
313
321
  return dateUnit === arrow5.DateUnit.DAY ? "date-day" : "date-millisecond";
314
322
  case arrow5.DateDay:
@@ -373,6 +381,13 @@ function serializeArrowType(arrowType) {
373
381
  return "interval-daytime";
374
382
  case arrow5.IntervalYearMonth:
375
383
  return "interval-yearmonth";
384
+ case arrow5.Map_:
385
+ const mapType = arrowType;
386
+ return {
387
+ type: "map",
388
+ keysSorted: mapType.keysSorted,
389
+ children: mapType.children.map((arrowField) => serializeArrowField(arrowField))
390
+ };
376
391
  case arrow5.List:
377
392
  const listType = arrowType;
378
393
  const listField = listType.valueField;
@@ -381,18 +396,30 @@ function serializeArrowType(arrowType) {
381
396
  children: [serializeArrowField(listField)]
382
397
  };
383
398
  case arrow5.FixedSizeList:
399
+ const fixedSizeList = arrowType;
384
400
  return {
385
401
  type: "fixed-size-list",
386
- listSize: arrowType.listSize,
387
- children: [serializeArrowField(arrowType.children[0])]
402
+ listSize: fixedSizeList.listSize,
403
+ children: [serializeArrowField(fixedSizeList.children[0])]
404
+ };
405
+ case arrow5.Struct:
406
+ const structType = arrowType;
407
+ return {
408
+ type: "struct",
409
+ children: structType.children.map((arrowField) => serializeArrowField(arrowField))
388
410
  };
389
411
  default:
390
- throw new Error("array type not supported");
412
+ throw new Error(`arrow type not supported: ${arrowType.constructor.name}`);
391
413
  }
392
414
  }
393
415
  function deserializeArrowType(dataType) {
394
416
  if (typeof dataType === "object") {
395
417
  switch (dataType.type) {
418
+ case "decimal":
419
+ return new arrow5.Decimal(dataType.precision, dataType.scale, dataType.bitWidth);
420
+ case "map":
421
+ let children = dataType.children.map((arrowField) => deserializeArrowField(arrowField));
422
+ return new arrow5.Map_(children, dataType.keysSorted);
396
423
  case "list":
397
424
  const field = deserializeArrowField(dataType.children[0]);
398
425
  return new arrow5.List(field);
@@ -400,7 +427,7 @@ function deserializeArrowType(dataType) {
400
427
  const child = deserializeArrowField(dataType.children[0]);
401
428
  return new arrow5.FixedSizeList(dataType.listSize, child);
402
429
  case "struct":
403
- const children = dataType.children.map((arrowField) => deserializeArrowField(arrowField));
430
+ children = dataType.children.map((arrowField) => deserializeArrowField(arrowField));
404
431
  return new arrow5.Struct(children);
405
432
  default:
406
433
  throw new Error("array type not supported");
@@ -565,9 +592,8 @@ function getBinaryGeometriesFromArrow(geoColumn, geoEncoding) {
565
592
  chunk,
566
593
  geoEncoding
567
594
  );
568
- const numOfVertices = flatCoordinateArray.length / nDim;
569
- const globalFeatureIds = new Uint32Array(numOfVertices);
570
- for (let i = 0; i < numOfVertices; i++) {
595
+ const globalFeatureIds = new Uint32Array(featureIds.length);
596
+ for (let i = 0; i < featureIds.length; i++) {
571
597
  globalFeatureIds[i] = featureIds[i] + globalFeatureIdOffset;
572
598
  }
573
599
  const binaryContent = {
@@ -633,22 +659,23 @@ function getBinaryGeometriesFromChunk(chunk, geoEncoding) {
633
659
  function getBinaryPolygonsFromChunk(chunk, geoEncoding) {
634
660
  const isMultiPolygon = geoEncoding === "geoarrow.multipolygon";
635
661
  const polygonData = isMultiPolygon ? chunk.children[0] : chunk;
662
+ const polygonOffset = polygonData.valueOffsets;
663
+ const partData = isMultiPolygon ? chunk.valueOffsets.map((i) => polygonOffset.at(i) || i) : chunk.valueOffsets;
636
664
  const ringData = polygonData.children[0];
637
665
  const pointData = ringData.children[0];
638
666
  const coordData = pointData.children[0];
639
667
  const nDim = pointData.stride;
640
668
  const geomOffset = ringData.valueOffsets;
641
669
  const flatCoordinateArray = coordData.values;
642
- const geometryIndicies = new Uint16Array(chunk.length + 1);
643
- for (let i = 0; i < chunk.length; i++) {
644
- geometryIndicies[i] = geomOffset[chunk.valueOffsets[i]];
670
+ const geometryIndicies = new Uint16Array(polygonOffset.length);
671
+ for (let i = 0; i < polygonOffset.length; i++) {
672
+ geometryIndicies[i] = geomOffset[polygonOffset[i]];
645
673
  }
646
- geometryIndicies[chunk.length] = flatCoordinateArray.length / nDim;
647
674
  const numOfVertices = flatCoordinateArray.length / nDim;
648
675
  const featureIds = new Uint32Array(numOfVertices);
649
- for (let i = 0; i < chunk.length - 1; i++) {
650
- const startIdx = geomOffset[chunk.valueOffsets[i]];
651
- const endIdx = geomOffset[chunk.valueOffsets[i + 1]];
676
+ for (let i = 0; i < partData.length - 1; i++) {
677
+ const startIdx = geomOffset[partData[i]];
678
+ const endIdx = geomOffset[partData[i + 1]];
652
679
  for (let j = startIdx; j < endIdx; j++) {
653
680
  featureIds[j] = i;
654
681
  }
@@ -1 +1 @@
1
- {"version":3,"file":"convert-arrow-schema.d.ts","sourceRoot":"","sources":["../../src/schema/convert-arrow-schema.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAChF,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,uFAAuF;AACvF,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAKtE;AAED,0FAA0F;AAC1F,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAKnE;AAED,gHAAgH;AAChH,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,cAAc,CAEzF;AAED,mHAAmH;AACnH,wBAAgB,wBAAwB,CAAC,QAAQ,CAAC,EAAE,cAAc,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAEvF;AAED,mFAAmF;AACnF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAO7D;AAED,uFAAuF;AACvF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAO/D;AAED,+EAA+E;AAE/E,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAmItE;AAED,+EAA+E;AAE/E,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,KAAK,CAAC,QAAQ,CA2EvE"}
1
+ {"version":3,"file":"convert-arrow-schema.d.ts","sourceRoot":"","sources":["../../src/schema/convert-arrow-schema.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAChF,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,uFAAuF;AACvF,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAKtE;AAED,0FAA0F;AAC1F,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAKnE;AAED,gHAAgH;AAChH,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,cAAc,CAEzF;AAED,mHAAmH;AACnH,wBAAgB,wBAAwB,CAAC,QAAQ,CAAC,EAAE,cAAc,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAEvF;AAED,mFAAmF;AACnF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAO7D;AAED,uFAAuF;AACvF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAO/D;AAED,+EAA+E;AAE/E,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAuJtE;AAED,+EAA+E;AAE/E,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAgFvE"}
@@ -72,7 +72,15 @@ export function serializeArrowType(arrowType) {
72
72
  return 'float64';
73
73
  case arrow.Utf8:
74
74
  return 'utf8';
75
- case Date:
75
+ case arrow.Decimal:
76
+ const decimal = arrowType;
77
+ return {
78
+ type: 'decimal',
79
+ bitWidth: decimal.bitWidth,
80
+ precision: decimal.precision,
81
+ scale: decimal.scale
82
+ };
83
+ case arrow.Date_:
76
84
  const dateUnit = arrowType.unit;
77
85
  return dateUnit === arrow.DateUnit.DAY ? 'date-day' : 'date-millisecond';
78
86
  case arrow.DateDay:
@@ -137,6 +145,13 @@ export function serializeArrowType(arrowType) {
137
145
  return 'interval-daytime';
138
146
  case arrow.IntervalYearMonth:
139
147
  return 'interval-yearmonth';
148
+ case arrow.Map_:
149
+ const mapType = arrowType;
150
+ return {
151
+ type: 'map',
152
+ keysSorted: mapType.keysSorted,
153
+ children: mapType.children.map(arrowField => serializeArrowField(arrowField))
154
+ };
140
155
  case arrow.List:
141
156
  const listType = arrowType;
142
157
  const listField = listType.valueField;
@@ -145,18 +160,30 @@ export function serializeArrowType(arrowType) {
145
160
  children: [serializeArrowField(listField)]
146
161
  };
147
162
  case arrow.FixedSizeList:
163
+ const fixedSizeList = arrowType;
148
164
  return {
149
165
  type: 'fixed-size-list',
150
- listSize: arrowType.listSize,
151
- children: [serializeArrowField(arrowType.children[0])]
166
+ listSize: fixedSizeList.listSize,
167
+ children: [serializeArrowField(fixedSizeList.children[0])]
168
+ };
169
+ case arrow.Struct:
170
+ const structType = arrowType;
171
+ return {
172
+ type: 'struct',
173
+ children: structType.children.map(arrowField => serializeArrowField(arrowField))
152
174
  };
153
175
  default:
154
- throw new Error('array type not supported');
176
+ throw new Error(`arrow type not supported: ${arrowType.constructor.name}`);
155
177
  }
156
178
  }
157
179
  export function deserializeArrowType(dataType) {
158
180
  if (typeof dataType === 'object') {
159
181
  switch (dataType.type) {
182
+ case 'decimal':
183
+ return new arrow.Decimal(dataType.precision, dataType.scale, dataType.bitWidth);
184
+ case 'map':
185
+ let children = dataType.children.map(arrowField => deserializeArrowField(arrowField));
186
+ return new arrow.Map_(children, dataType.keysSorted);
160
187
  case 'list':
161
188
  const field = deserializeArrowField(dataType.children[0]);
162
189
  return new arrow.List(field);
@@ -164,7 +191,7 @@ export function deserializeArrowType(dataType) {
164
191
  const child = deserializeArrowField(dataType.children[0]);
165
192
  return new arrow.FixedSizeList(dataType.listSize, child);
166
193
  case 'struct':
167
- const children = dataType.children.map(arrowField => deserializeArrowField(arrowField));
194
+ children = dataType.children.map(arrowField => deserializeArrowField(arrowField));
168
195
  return new arrow.Struct(children);
169
196
  default:
170
197
  throw new Error('array type not supported');
@@ -1 +1 @@
1
- {"version":3,"file":"convert-arrow-schema.js","names":["arrow","serializeArrowSchema","arrowSchema","fields","map","arrowField","serializeArrowField","metadata","serializeArrowMetadata","deserializeArrowSchema","schema","Schema","field","deserializeArrowField","deserializeArrowMetadata","arrowMetadata","Object","fromEntries","Map","entries","name","type","serializeArrowType","nullable","Field","deserializeArrowType","arrowType","constructor","Null","Binary","Bool","Int","intType","isSigned","bitWidth","Int8","Int16","Int32","Int64","Uint8","Uint16","Uint32","Uint64","Float","precision","Precision","HALF","SINGLE","DOUBLE","Float16","Float32","Float64","Utf8","Date","dateUnit","unit","DateUnit","DAY","DateDay","DateMillisecond","Time","timeUnit","TimeUnit","SECOND","MILLISECOND","MICROSECOND","NANOSECOND","TimeMillisecond","TimeSecond","TimeMicrosecond","TimeNanosecond","Timestamp","timeStampUnit","TimestampSecond","TimestampMillisecond","TimestampMicrosecond","TimestampNanosecond","Interval","intervalUnit","IntervalUnit","DAY_TIME","YEAR_MONTH","IntervalDayTime","IntervalYearMonth","List","listType","listField","valueField","children","FixedSizeList","listSize","Error","dataType","child","Struct"],"sources":["../../src/schema/convert-arrow-schema.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport type {DataType, Field, Schema, SchemaMetadata} from '@loaders.gl/schema';\nimport * as arrow from 'apache-arrow';\n\n/** Convert Apache Arrow Schema (class instance) to a serialized Schema (plain data) */\nexport function serializeArrowSchema(arrowSchema: arrow.Schema): Schema {\n return {\n fields: arrowSchema.fields.map((arrowField) => serializeArrowField(arrowField)),\n metadata: serializeArrowMetadata(arrowSchema.metadata)\n };\n}\n\n/** Convert a serialized Schema (plain data) to an Apache Arrow Schema (class instance) */\nexport function deserializeArrowSchema(schema: Schema): arrow.Schema {\n return new arrow.Schema(\n schema.fields.map((field) => deserializeArrowField(field)),\n deserializeArrowMetadata(schema.metadata)\n );\n}\n\n/** Convert Apache Arrow Schema metadata (Map<string, string>) to serialized metadata (Record<string, string> */\nexport function serializeArrowMetadata(arrowMetadata: Map<string, string>): SchemaMetadata {\n return Object.fromEntries(arrowMetadata);\n}\n\n/** Convert serialized metadata (Record<string, string> to Apache Arrow Schema metadata (Map<string, string>) to */\nexport function deserializeArrowMetadata(metadata?: SchemaMetadata): Map<string, string> {\n return metadata ? new Map(Object.entries(metadata)) : new Map<string, string>();\n}\n\n/** Convert Apache Arrow Field (class instance) to serialized Field (plain data) */\nexport function serializeArrowField(field: arrow.Field): Field {\n return {\n name: field.name,\n type: serializeArrowType(field.type),\n nullable: field.nullable,\n metadata: serializeArrowMetadata(field.metadata)\n };\n}\n\n/** Convert a serialized Field (plain data) to an Apache Arrow Field (class instance)*/\nexport function deserializeArrowField(field: Field): arrow.Field {\n return new arrow.Field(\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: arrow.DataType): DataType {\n switch (arrowType.constructor) {\n case arrow.Null:\n return 'null';\n case arrow.Binary:\n return 'binary';\n case arrow.Bool:\n return 'bool';\n case arrow.Int:\n const intType = arrowType as arrow.Int;\n return `${intType.isSigned ? 'u' : ''}int${intType.bitWidth}`;\n case arrow.Int8:\n return 'int8';\n case arrow.Int16:\n return 'int16';\n case arrow.Int32:\n return 'int32';\n case arrow.Int64:\n return 'int64';\n case arrow.Uint8:\n return 'uint8';\n case arrow.Uint16:\n return 'uint16';\n case arrow.Uint32:\n return 'uint32';\n case arrow.Uint64:\n return 'uint64';\n case arrow.Float:\n const precision = (arrowType as arrow.Float).precision;\n // return `float(precision + 1) * 16`;\n switch (precision) {\n case arrow.Precision.HALF:\n return 'float16';\n case arrow.Precision.SINGLE:\n return 'float32';\n case arrow.Precision.DOUBLE:\n return 'float64';\n default:\n return 'float16';\n }\n case arrow.Float16:\n return 'float16';\n case arrow.Float32:\n return 'float32';\n case arrow.Float64:\n return 'float64';\n case arrow.Utf8:\n return 'utf8';\n case Date:\n const dateUnit = (arrowType as arrow.Date_).unit;\n return dateUnit === arrow.DateUnit.DAY ? 'date-day' : 'date-millisecond';\n case arrow.DateDay:\n return 'date-day';\n case arrow.DateMillisecond:\n return 'date-millisecond';\n case arrow.Time:\n const timeUnit = (arrowType as arrow.Time).unit;\n switch (timeUnit) {\n case arrow.TimeUnit.SECOND:\n return 'time-second';\n case arrow.TimeUnit.MILLISECOND:\n return 'time-millisecond';\n case arrow.TimeUnit.MICROSECOND:\n return 'time-microsecond';\n case arrow.TimeUnit.NANOSECOND:\n return 'time-nanosecond';\n default:\n return 'time-second';\n }\n case arrow.TimeMillisecond:\n return 'time-millisecond';\n case arrow.TimeSecond:\n return 'time-second';\n case arrow.TimeMicrosecond:\n return 'time-microsecond';\n case arrow.TimeNanosecond:\n return 'time-nanosecond';\n case arrow.Timestamp:\n const timeStampUnit = (arrowType as arrow.Timestamp).unit;\n switch (timeStampUnit) {\n case arrow.TimeUnit.SECOND:\n return 'timestamp-second';\n case arrow.TimeUnit.MILLISECOND:\n return 'timestamp-millisecond';\n case arrow.TimeUnit.MICROSECOND:\n return 'timestamp-microsecond';\n case arrow.TimeUnit.NANOSECOND:\n return 'timestamp-nanosecond';\n default:\n return 'timestamp-second';\n }\n case arrow.TimestampSecond:\n return 'timestamp-second';\n case arrow.TimestampMillisecond:\n return 'timestamp-millisecond';\n case arrow.TimestampMicrosecond:\n return 'timestamp-microsecond';\n case arrow.TimestampNanosecond:\n return 'timestamp-nanosecond';\n case arrow.Interval:\n const intervalUnit = (arrowType as arrow.Interval).unit;\n switch (intervalUnit) {\n case arrow.IntervalUnit.DAY_TIME:\n return 'interval-daytime';\n case arrow.IntervalUnit.YEAR_MONTH:\n return 'interval-yearmonth';\n default:\n return 'interval-daytime';\n }\n case arrow.IntervalDayTime:\n return 'interval-daytime';\n case arrow.IntervalYearMonth:\n return 'interval-yearmonth';\n case arrow.List:\n const listType = arrowType as arrow.List;\n const listField = listType.valueField;\n return {\n type: 'list',\n children: [serializeArrowField(listField)]\n };\n case arrow.FixedSizeList:\n return {\n type: 'fixed-size-list',\n listSize: (arrowType as arrow.FixedSizeList).listSize,\n children: [serializeArrowField((arrowType as arrow.FixedSizeList).children[0])]\n };\n // case arrow.Struct:\n // return {type: 'struct', children: (arrowType as arrow.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): arrow.DataType {\n if (typeof dataType === 'object') {\n switch (dataType.type) {\n case 'list':\n const field = deserializeArrowField(dataType.children[0]);\n return new arrow.List(field);\n case 'fixed-size-list':\n const child = deserializeArrowField(dataType.children[0]);\n return new arrow.FixedSizeList(dataType.listSize, child);\n case 'struct':\n const children = dataType.children.map((arrowField) => deserializeArrowField(arrowField));\n return new arrow.Struct(children);\n default:\n throw new Error('array type not supported');\n }\n }\n\n switch (dataType) {\n case 'null':\n return new arrow.Null();\n case 'binary':\n return new arrow.Binary();\n case 'bool':\n return new arrow.Bool();\n case 'int8':\n return new arrow.Int8();\n case 'int16':\n return new arrow.Int16();\n case 'int32':\n return new arrow.Int32();\n case 'int64':\n return new arrow.Int64();\n case 'uint8':\n return new arrow.Uint8();\n case 'uint16':\n return new arrow.Uint16();\n case 'uint32':\n return new arrow.Uint32();\n case 'uint64':\n return new arrow.Uint64();\n case 'float16':\n return new arrow.Float16();\n case 'float32':\n return new arrow.Float32();\n case 'float64':\n return new arrow.Float64();\n case 'utf8':\n return new arrow.Utf8();\n case 'date-day':\n return new arrow.DateDay();\n case 'date-millisecond':\n return new arrow.DateMillisecond();\n case 'time-second':\n return new arrow.TimeSecond();\n case 'time-millisecond':\n return new arrow.TimeMillisecond();\n case 'time-microsecond':\n return new arrow.TimeMicrosecond();\n case 'time-nanosecond':\n return new arrow.TimeNanosecond();\n case 'timestamp-second':\n return new arrow.TimestampSecond();\n case 'timestamp-millisecond':\n return new arrow.TimestampMillisecond();\n case 'timestamp-microsecond':\n return new arrow.TimestampMicrosecond();\n case 'timestamp-nanosecond':\n return new arrow.TimestampNanosecond();\n case 'interval-daytime':\n return new arrow.IntervalDayTime();\n case 'interval-yearmonth':\n return new arrow.IntervalYearMonth();\n default:\n throw new Error('array type not supported');\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"convert-arrow-schema.js","names":["arrow","serializeArrowSchema","arrowSchema","fields","map","arrowField","serializeArrowField","metadata","serializeArrowMetadata","deserializeArrowSchema","schema","Schema","field","deserializeArrowField","deserializeArrowMetadata","arrowMetadata","Object","fromEntries","Map","entries","name","type","serializeArrowType","nullable","Field","deserializeArrowType","arrowType","constructor","Null","Binary","Bool","Int","intType","isSigned","bitWidth","Int8","Int16","Int32","Int64","Uint8","Uint16","Uint32","Uint64","Float","precision","Precision","HALF","SINGLE","DOUBLE","Float16","Float32","Float64","Utf8","Decimal","decimal","scale","Date_","dateUnit","unit","DateUnit","DAY","DateDay","DateMillisecond","Time","timeUnit","TimeUnit","SECOND","MILLISECOND","MICROSECOND","NANOSECOND","TimeMillisecond","TimeSecond","TimeMicrosecond","TimeNanosecond","Timestamp","timeStampUnit","TimestampSecond","TimestampMillisecond","TimestampMicrosecond","TimestampNanosecond","Interval","intervalUnit","IntervalUnit","DAY_TIME","YEAR_MONTH","IntervalDayTime","IntervalYearMonth","Map_","mapType","keysSorted","children","List","listType","listField","valueField","FixedSizeList","fixedSizeList","listSize","Struct","structType","Error","dataType","child"],"sources":["../../src/schema/convert-arrow-schema.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport type {DataType, Field, Schema, SchemaMetadata} from '@loaders.gl/schema';\nimport * as arrow from 'apache-arrow';\n\n/** Convert Apache Arrow Schema (class instance) to a serialized Schema (plain data) */\nexport function serializeArrowSchema(arrowSchema: arrow.Schema): Schema {\n return {\n fields: arrowSchema.fields.map((arrowField) => serializeArrowField(arrowField)),\n metadata: serializeArrowMetadata(arrowSchema.metadata)\n };\n}\n\n/** Convert a serialized Schema (plain data) to an Apache Arrow Schema (class instance) */\nexport function deserializeArrowSchema(schema: Schema): arrow.Schema {\n return new arrow.Schema(\n schema.fields.map((field) => deserializeArrowField(field)),\n deserializeArrowMetadata(schema.metadata)\n );\n}\n\n/** Convert Apache Arrow Schema metadata (Map<string, string>) to serialized metadata (Record<string, string> */\nexport function serializeArrowMetadata(arrowMetadata: Map<string, string>): SchemaMetadata {\n return Object.fromEntries(arrowMetadata);\n}\n\n/** Convert serialized metadata (Record<string, string> to Apache Arrow Schema metadata (Map<string, string>) to */\nexport function deserializeArrowMetadata(metadata?: SchemaMetadata): Map<string, string> {\n return metadata ? new Map(Object.entries(metadata)) : new Map<string, string>();\n}\n\n/** Convert Apache Arrow Field (class instance) to serialized Field (plain data) */\nexport function serializeArrowField(field: arrow.Field): Field {\n return {\n name: field.name,\n type: serializeArrowType(field.type),\n nullable: field.nullable,\n metadata: serializeArrowMetadata(field.metadata)\n };\n}\n\n/** Convert a serialized Field (plain data) to an Apache Arrow Field (class instance)*/\nexport function deserializeArrowField(field: Field): arrow.Field {\n return new arrow.Field(\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: arrow.DataType): DataType {\n switch (arrowType.constructor) {\n case arrow.Null:\n return 'null';\n case arrow.Binary:\n return 'binary';\n case arrow.Bool:\n return 'bool';\n case arrow.Int:\n const intType = arrowType as arrow.Int;\n return `${intType.isSigned ? 'u' : ''}int${intType.bitWidth}`;\n case arrow.Int8:\n return 'int8';\n case arrow.Int16:\n return 'int16';\n case arrow.Int32:\n return 'int32';\n case arrow.Int64:\n return 'int64';\n case arrow.Uint8:\n return 'uint8';\n case arrow.Uint16:\n return 'uint16';\n case arrow.Uint32:\n return 'uint32';\n case arrow.Uint64:\n return 'uint64';\n case arrow.Float:\n const precision = (arrowType as arrow.Float).precision;\n // return `float(precision + 1) * 16`;\n switch (precision) {\n case arrow.Precision.HALF:\n return 'float16';\n case arrow.Precision.SINGLE:\n return 'float32';\n case arrow.Precision.DOUBLE:\n return 'float64';\n default:\n return 'float16';\n }\n case arrow.Float16:\n return 'float16';\n case arrow.Float32:\n return 'float32';\n case arrow.Float64:\n return 'float64';\n case arrow.Utf8:\n return 'utf8';\n case arrow.Decimal:\n const decimal = arrowType as arrow.Decimal;\n return {\n type: 'decimal',\n bitWidth: decimal.bitWidth,\n precision: decimal.precision,\n scale: decimal.scale\n };\n case arrow.Date_:\n const dateUnit = (arrowType as arrow.Date_).unit;\n return dateUnit === arrow.DateUnit.DAY ? 'date-day' : 'date-millisecond';\n case arrow.DateDay:\n return 'date-day';\n case arrow.DateMillisecond:\n return 'date-millisecond';\n case arrow.Time:\n const timeUnit = (arrowType as arrow.Time).unit;\n switch (timeUnit) {\n case arrow.TimeUnit.SECOND:\n return 'time-second';\n case arrow.TimeUnit.MILLISECOND:\n return 'time-millisecond';\n case arrow.TimeUnit.MICROSECOND:\n return 'time-microsecond';\n case arrow.TimeUnit.NANOSECOND:\n return 'time-nanosecond';\n default:\n return 'time-second';\n }\n case arrow.TimeMillisecond:\n return 'time-millisecond';\n case arrow.TimeSecond:\n return 'time-second';\n case arrow.TimeMicrosecond:\n return 'time-microsecond';\n case arrow.TimeNanosecond:\n return 'time-nanosecond';\n case arrow.Timestamp:\n const timeStampUnit = (arrowType as arrow.Timestamp).unit;\n switch (timeStampUnit) {\n case arrow.TimeUnit.SECOND:\n return 'timestamp-second';\n case arrow.TimeUnit.MILLISECOND:\n return 'timestamp-millisecond';\n case arrow.TimeUnit.MICROSECOND:\n return 'timestamp-microsecond';\n case arrow.TimeUnit.NANOSECOND:\n return 'timestamp-nanosecond';\n default:\n return 'timestamp-second';\n }\n case arrow.TimestampSecond:\n return 'timestamp-second';\n case arrow.TimestampMillisecond:\n return 'timestamp-millisecond';\n case arrow.TimestampMicrosecond:\n return 'timestamp-microsecond';\n case arrow.TimestampNanosecond:\n return 'timestamp-nanosecond';\n case arrow.Interval:\n const intervalUnit = (arrowType as arrow.Interval).unit;\n switch (intervalUnit) {\n case arrow.IntervalUnit.DAY_TIME:\n return 'interval-daytime';\n case arrow.IntervalUnit.YEAR_MONTH:\n return 'interval-yearmonth';\n default:\n return 'interval-daytime';\n }\n case arrow.IntervalDayTime:\n return 'interval-daytime';\n case arrow.IntervalYearMonth:\n return 'interval-yearmonth';\n case arrow.Map_:\n const mapType = arrowType as arrow.Map_;\n return {\n type: 'map',\n keysSorted: mapType.keysSorted,\n children: mapType.children.map((arrowField) => serializeArrowField(arrowField))\n };\n case arrow.List:\n const listType = arrowType as arrow.List;\n const listField = listType.valueField;\n return {\n type: 'list',\n children: [serializeArrowField(listField)]\n };\n case arrow.FixedSizeList:\n const fixedSizeList = arrowType as arrow.FixedSizeList;\n return {\n type: 'fixed-size-list',\n listSize: fixedSizeList.listSize,\n children: [serializeArrowField(fixedSizeList.children[0])]\n };\n case arrow.Struct:\n const structType = arrowType as arrow.Struct;\n return {\n type: 'struct',\n children: structType.children.map((arrowField) => serializeArrowField(arrowField))\n };\n default:\n throw new Error(`arrow type not supported: ${arrowType.constructor.name}`);\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): arrow.DataType {\n if (typeof dataType === 'object') {\n switch (dataType.type) {\n case 'decimal':\n return new arrow.Decimal(dataType.precision, dataType.scale, dataType.bitWidth);\n case 'map':\n let children = dataType.children.map((arrowField) => deserializeArrowField(arrowField));\n return new arrow.Map_(children as any, dataType.keysSorted);\n case 'list':\n const field = deserializeArrowField(dataType.children[0]);\n return new arrow.List(field);\n case 'fixed-size-list':\n const child = deserializeArrowField(dataType.children[0]);\n return new arrow.FixedSizeList(dataType.listSize, child);\n case 'struct':\n children = dataType.children.map((arrowField) => deserializeArrowField(arrowField));\n return new arrow.Struct(children);\n default:\n throw new Error('array type not supported');\n }\n }\n\n switch (dataType) {\n case 'null':\n return new arrow.Null();\n case 'binary':\n return new arrow.Binary();\n case 'bool':\n return new arrow.Bool();\n case 'int8':\n return new arrow.Int8();\n case 'int16':\n return new arrow.Int16();\n case 'int32':\n return new arrow.Int32();\n case 'int64':\n return new arrow.Int64();\n case 'uint8':\n return new arrow.Uint8();\n case 'uint16':\n return new arrow.Uint16();\n case 'uint32':\n return new arrow.Uint32();\n case 'uint64':\n return new arrow.Uint64();\n case 'float16':\n return new arrow.Float16();\n case 'float32':\n return new arrow.Float32();\n case 'float64':\n return new arrow.Float64();\n case 'utf8':\n return new arrow.Utf8();\n case 'date-day':\n return new arrow.DateDay();\n case 'date-millisecond':\n return new arrow.DateMillisecond();\n case 'time-second':\n return new arrow.TimeSecond();\n case 'time-millisecond':\n return new arrow.TimeMillisecond();\n case 'time-microsecond':\n return new arrow.TimeMicrosecond();\n case 'time-nanosecond':\n return new arrow.TimeNanosecond();\n case 'timestamp-second':\n return new arrow.TimestampSecond();\n case 'timestamp-millisecond':\n return new arrow.TimestampMillisecond();\n case 'timestamp-microsecond':\n return new arrow.TimestampMicrosecond();\n case 'timestamp-nanosecond':\n return new arrow.TimestampNanosecond();\n case 'interval-daytime':\n return new arrow.IntervalDayTime();\n case 'interval-yearmonth':\n return new arrow.IntervalYearMonth();\n default:\n throw new Error('array type not supported');\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loaders.gl/arrow",
3
- "version": "4.0.2",
3
+ "version": "4.0.3",
4
4
  "description": "Simple columnar table loader for the Apache Arrow format",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -46,10 +46,10 @@
46
46
  "build-worker2": "esbuild src/workers/arrow-worker.ts --bundle --outfile=dist/arrow-worker.js --platform=browser --external:{stream}"
47
47
  },
48
48
  "dependencies": {
49
- "@loaders.gl/gis": "4.0.2",
50
- "@loaders.gl/loader-utils": "4.0.2",
51
- "@loaders.gl/schema": "4.0.2",
49
+ "@loaders.gl/gis": "4.0.3",
50
+ "@loaders.gl/loader-utils": "4.0.3",
51
+ "@loaders.gl/schema": "4.0.3",
52
52
  "apache-arrow": "^13.0.0"
53
53
  },
54
- "gitHead": "471058d109d5652f28c32c1f296fd632f9a5c806"
54
+ "gitHead": "03c871839b36c997249dabae1844df53a35d3760"
55
55
  }
@@ -1,6 +1,6 @@
1
1
  // import type {} from '@loaders.gl/loader-utils';
2
2
 
3
- import type {Writer, WriterOptions} from '@loaders.gl/loader-utils';
3
+ import type {WriterWithEncoder, WriterOptions} from '@loaders.gl/loader-utils';
4
4
  import {ColumnarTable} from './lib/encode-arrow';
5
5
  import {encodeArrowSync} from './lib/encode-arrow';
6
6
 
@@ -13,7 +13,7 @@ type ArrowWriterOptions = WriterOptions & {
13
13
  };
14
14
 
15
15
  /** Apache Arrow writer */
16
- export const ArrowWriter: Writer<ColumnarTable, never, ArrowWriterOptions> = {
16
+ export const ArrowWriter: WriterWithEncoder<ColumnarTable, never, ArrowWriterOptions> = {
17
17
  name: 'Apache Arrow',
18
18
  id: 'arrow',
19
19
  module: 'arrow',
@@ -60,9 +60,8 @@ export function getBinaryGeometriesFromArrow(
60
60
  geoEncoding
61
61
  );
62
62
 
63
- const numOfVertices = flatCoordinateArray.length / nDim;
64
- const globalFeatureIds = new Uint32Array(numOfVertices);
65
- for (let i = 0; i < numOfVertices; i++) {
63
+ const globalFeatureIds = new Uint32Array(featureIds.length);
64
+ for (let i = 0; i < featureIds.length; i++) {
66
65
  globalFeatureIds[i] = featureIds[i] + globalFeatureIdOffset;
67
66
  }
68
67
 
@@ -153,6 +152,10 @@ function getBinaryPolygonsFromChunk(chunk: arrow.Data, geoEncoding: string): Bin
153
152
  const isMultiPolygon = geoEncoding === 'geoarrow.multipolygon';
154
153
 
155
154
  const polygonData = isMultiPolygon ? chunk.children[0] : chunk;
155
+ const polygonOffset = polygonData.valueOffsets;
156
+ const partData = isMultiPolygon
157
+ ? chunk.valueOffsets.map((i) => polygonOffset.at(i) || i)
158
+ : chunk.valueOffsets;
156
159
  const ringData = polygonData.children[0];
157
160
  const pointData = ringData.children[0];
158
161
  const coordData = pointData.children[0];
@@ -160,17 +163,16 @@ function getBinaryPolygonsFromChunk(chunk: arrow.Data, geoEncoding: string): Bin
160
163
  const geomOffset = ringData.valueOffsets;
161
164
  const flatCoordinateArray = coordData.values;
162
165
 
163
- const geometryIndicies = new Uint16Array(chunk.length + 1);
164
- for (let i = 0; i < chunk.length; i++) {
165
- geometryIndicies[i] = geomOffset[chunk.valueOffsets[i]];
166
+ const geometryIndicies = new Uint16Array(polygonOffset.length);
167
+ for (let i = 0; i < polygonOffset.length; i++) {
168
+ geometryIndicies[i] = geomOffset[polygonOffset[i]];
166
169
  }
167
- geometryIndicies[chunk.length] = flatCoordinateArray.length / nDim;
168
170
 
169
171
  const numOfVertices = flatCoordinateArray.length / nDim;
170
172
  const featureIds = new Uint32Array(numOfVertices);
171
- for (let i = 0; i < chunk.length - 1; i++) {
172
- const startIdx = geomOffset[chunk.valueOffsets[i]];
173
- const endIdx = geomOffset[chunk.valueOffsets[i + 1]];
173
+ for (let i = 0; i < partData.length - 1; i++) {
174
+ const startIdx = geomOffset[partData[i]];
175
+ const endIdx = geomOffset[partData[i + 1]];
174
176
  for (let j = startIdx; j < endIdx; j++) {
175
177
  featureIds[j] = i;
176
178
  }
@@ -100,7 +100,15 @@ export function serializeArrowType(arrowType: arrow.DataType): DataType {
100
100
  return 'float64';
101
101
  case arrow.Utf8:
102
102
  return 'utf8';
103
- case Date:
103
+ case arrow.Decimal:
104
+ const decimal = arrowType as arrow.Decimal;
105
+ return {
106
+ type: 'decimal',
107
+ bitWidth: decimal.bitWidth,
108
+ precision: decimal.precision,
109
+ scale: decimal.scale
110
+ };
111
+ case arrow.Date_:
104
112
  const dateUnit = (arrowType as arrow.Date_).unit;
105
113
  return dateUnit === arrow.DateUnit.DAY ? 'date-day' : 'date-millisecond';
106
114
  case arrow.DateDay:
@@ -165,6 +173,13 @@ export function serializeArrowType(arrowType: arrow.DataType): DataType {
165
173
  return 'interval-daytime';
166
174
  case arrow.IntervalYearMonth:
167
175
  return 'interval-yearmonth';
176
+ case arrow.Map_:
177
+ const mapType = arrowType as arrow.Map_;
178
+ return {
179
+ type: 'map',
180
+ keysSorted: mapType.keysSorted,
181
+ children: mapType.children.map((arrowField) => serializeArrowField(arrowField))
182
+ };
168
183
  case arrow.List:
169
184
  const listType = arrowType as arrow.List;
170
185
  const listField = listType.valueField;
@@ -173,15 +188,20 @@ export function serializeArrowType(arrowType: arrow.DataType): DataType {
173
188
  children: [serializeArrowField(listField)]
174
189
  };
175
190
  case arrow.FixedSizeList:
191
+ const fixedSizeList = arrowType as arrow.FixedSizeList;
176
192
  return {
177
193
  type: 'fixed-size-list',
178
- listSize: (arrowType as arrow.FixedSizeList).listSize,
179
- children: [serializeArrowField((arrowType as arrow.FixedSizeList).children[0])]
194
+ listSize: fixedSizeList.listSize,
195
+ children: [serializeArrowField(fixedSizeList.children[0])]
196
+ };
197
+ case arrow.Struct:
198
+ const structType = arrowType as arrow.Struct;
199
+ return {
200
+ type: 'struct',
201
+ children: structType.children.map((arrowField) => serializeArrowField(arrowField))
180
202
  };
181
- // case arrow.Struct:
182
- // return {type: 'struct', children: (arrowType as arrow.Struct).children};
183
203
  default:
184
- throw new Error('array type not supported');
204
+ throw new Error(`arrow type not supported: ${arrowType.constructor.name}`);
185
205
  }
186
206
  }
187
207
 
@@ -190,6 +210,11 @@ export function serializeArrowType(arrowType: arrow.DataType): DataType {
190
210
  export function deserializeArrowType(dataType: DataType): arrow.DataType {
191
211
  if (typeof dataType === 'object') {
192
212
  switch (dataType.type) {
213
+ case 'decimal':
214
+ return new arrow.Decimal(dataType.precision, dataType.scale, dataType.bitWidth);
215
+ case 'map':
216
+ let children = dataType.children.map((arrowField) => deserializeArrowField(arrowField));
217
+ return new arrow.Map_(children as any, dataType.keysSorted);
193
218
  case 'list':
194
219
  const field = deserializeArrowField(dataType.children[0]);
195
220
  return new arrow.List(field);
@@ -197,7 +222,7 @@ export function deserializeArrowType(dataType: DataType): arrow.DataType {
197
222
  const child = deserializeArrowField(dataType.children[0]);
198
223
  return new arrow.FixedSizeList(dataType.listSize, child);
199
224
  case 'struct':
200
- const children = dataType.children.map((arrowField) => deserializeArrowField(arrowField));
225
+ children = dataType.children.map((arrowField) => deserializeArrowField(arrowField));
201
226
  return new arrow.Struct(children);
202
227
  default:
203
228
  throw new Error('array type not supported');