diff --git a/js/src/Arrow.ts b/js/src/Arrow.ts index 39b625df09c8e..1cbc6c36aa39c 100644 --- a/js/src/Arrow.ts +++ b/js/src/Arrow.ts @@ -139,14 +139,19 @@ export namespace view { export import NullView = view_.NullView; export import BoolView = view_.BoolView; export import ValidityView = view_.ValidityView; + export import PrimitiveView = view_.PrimitiveView; export import FixedSizeView = view_.FixedSizeView; export import Float16View = view_.Float16View; export import DateDayView = view_.DateDayView; export import DateMillisecondView = view_.DateMillisecondView; + export import TimestampDayView = view_.TimestampDayView; + export import TimestampSecondView = view_.TimestampSecondView; + export import TimestampMillisecondView = view_.TimestampMillisecondView; + export import TimestampMicrosecondView = view_.TimestampMicrosecondView; + export import TimestampNanosecondView = view_.TimestampNanosecondView; export import IntervalYearMonthView = view_.IntervalYearMonthView; export import IntervalYearView = view_.IntervalYearView; export import IntervalMonthView = view_.IntervalMonthView; - export import PrimitiveView = view_.PrimitiveView; } /* These exports are needed for the closure and uglify umd targets */ diff --git a/js/src/vector.ts b/js/src/vector.ts index 0f1995008bd0a..b2fc206cf6d1c 100644 --- a/js/src/vector.ts +++ b/js/src/vector.ts @@ -17,7 +17,7 @@ import { Data, ChunkedData, FlatData, BoolData, FlatListData, NestedData } from './data'; import { VisitorNode, TypeVisitor, VectorVisitor } from './visitor'; -import { DataType, ListType, FlatType, NestedType, FlatListType } from './type'; +import { DataType, ListType, FlatType, NestedType, FlatListType, TimeUnit } from './type'; import { IterableArrayLike, Precision, DateUnit, IntervalUnit, UnionMode } from './type'; export interface VectorLike { length: number; nullCount: number; } @@ -157,7 +157,9 @@ import { ChunkedView } from './vector/chunked'; import { DictionaryView } from './vector/dictionary'; import { ListView, FixedSizeListView, BinaryView, Utf8View } from './vector/list'; import { UnionView, DenseUnionView, NestedView, StructView, MapView } from './vector/nested'; -import { FlatView, NullView, BoolView, ValidityView, FixedSizeView, Float16View, DateDayView, DateMillisecondView, IntervalYearMonthView, PrimitiveView } from './vector/flat'; +import { FlatView, NullView, BoolView, ValidityView, PrimitiveView, FixedSizeView, Float16View } from './vector/flat'; +import { DateDayView, DateMillisecondView, IntervalYearMonthView } from './vector/flat'; +import { TimestampDayView, TimestampSecondView, TimestampMillisecondView, TimestampMicrosecondView, TimestampNanosecondView } from './vector/flat'; import { packBools } from './util/bit'; export class NullVector extends Vector { @@ -242,6 +244,14 @@ export class DateVector extends FlatVector { public highs(): IntVector { return this.type.unit === DateUnit.DAY ? this.asInt32(0, 1) : this.asInt32(1, 2); } + public asEpochMilliseconds(): IntVector { + let data = (this.data as FlatData).clone(new Int32()); + switch (this.type.unit) { + case DateUnit.DAY: return new IntVector(data, new TimestampDayView(data as any, 1) as any); + case DateUnit.MILLISECOND: return new IntVector(data, new TimestampMillisecondView(data as any, 2) as any); + } + throw new TypeError(`Unrecognized date unit "${DateUnit[this.type.unit]}"`); + } } export class DecimalVector extends FlatVector { @@ -269,6 +279,16 @@ export class TimestampVector extends FlatVector { constructor(data: Data, view: View = new FixedSizeView(data, 2)) { super(data, view); } + public asEpochMilliseconds(): IntVector { + let data = (this.data as FlatData).clone(new Int32()); + switch (this.type.unit) { + case TimeUnit.SECOND: return new IntVector(data, new TimestampSecondView(data as any, 1) as any); + case TimeUnit.MILLISECOND: return new IntVector(data, new TimestampMillisecondView(data as any, 2) as any); + case TimeUnit.MICROSECOND: return new IntVector(data, new TimestampMicrosecondView(data as any, 2) as any); + case TimeUnit.NANOSECOND: return new IntVector(data, new TimestampNanosecondView(data as any, 2) as any); + } + throw new TypeError(`Unrecognized time unit "${TimeUnit[this.type.unit]}"`); + } } export class IntervalVector extends FlatVector { diff --git a/js/src/vector/chunked.ts b/js/src/vector/chunked.ts index 24272d2635248..96317fc57350b 100644 --- a/js/src/vector/chunked.ts +++ b/js/src/vector/chunked.ts @@ -22,10 +22,6 @@ import { DataType, TypedArray, IterableArrayLike } from '../type'; export class ChunkedView implements View { public chunks: Vector[]; public offsets: Uint32Array; - // @ts-ignore - protected _length: number; - // @ts-ignore - protected _nullCount: number; constructor(data: ChunkedData) { this.chunks = data.childVectors; this.offsets = data.childOffsets; diff --git a/js/src/vector/flat.ts b/js/src/vector/flat.ts index bc3d81a0ca713..800dbd5479145 100644 --- a/js/src/vector/flat.ts +++ b/js/src/vector/flat.ts @@ -18,13 +18,11 @@ import { Data } from '../data'; import { View } from '../vector'; import { getBool, setBool, iterateBits } from '../util/bit'; -import { Bool, Float16, Date_, Interval, Null, Int32 } from '../type'; +import { Bool, Float16, Date_, Interval, Null, Int32, Timestamp } from '../type'; import { DataType, FlatType, PrimitiveType, IterableArrayLike } from '../type'; export class FlatView implements View { - // @ts-ignore public length: number; - // @ts-ignore public values: T['TArray']; constructor(data: Data) { this.length = data.length; @@ -51,7 +49,6 @@ export class FlatView implements View { } export class NullView implements View { - // @ts-ignore public length: number; constructor(data: Data) { this.length = data.length; @@ -75,7 +72,6 @@ export class NullView implements View { } export class BoolView extends FlatView { - // @ts-ignore protected offset: number; constructor(data: Data) { super(data); @@ -96,11 +92,8 @@ export class BoolView extends FlatView { export class ValidityView implements View { protected view: View; - // @ts-ignore protected length: number; - // @ts-ignore protected offset: number; - // @ts-ignore protected nullBitmap: Uint8Array; constructor(data: Data, view: View) { this.view = view; @@ -136,9 +129,7 @@ export class ValidityView implements View { } export class PrimitiveView extends FlatView { - // @ts-ignore public size: number; - // @ts-ignore public ArrayType: T['ArrayType']; constructor(data: Data, size?: number) { super(data); @@ -216,6 +207,59 @@ export class DateMillisecondView extends FixedSizeView { } } +export class TimestampDayView extends PrimitiveView { + public toArray() { return [...this]; } + protected getValue(values: Int32Array, index: number, size: number): number { + return epochDaysToMs(values, index * size); + } + protected setValue(values: Int32Array, index: number, size: number, epochMs: number): void { + values[index * size] = (epochMs / 86400000) | 0; + } +} + +export class TimestampSecondView extends PrimitiveView { + public toArray() { return [...this]; } + protected getValue(values: Int32Array, index: number, size: number): number { + return epochSecondsToMs(values, index * size); + } + protected setValue(values: Int32Array, index: number, size: number, epochMs: number): void { + values[index * size] = (epochMs / 1000) | 0; + } +} + +export class TimestampMillisecondView extends PrimitiveView { + public toArray() { return [...this]; } + protected getValue(values: Int32Array, index: number, size: number): number { + return epochMillisecondsLongToMs(values, index * size); + } + protected setValue(values: Int32Array, index: number, size: number, epochMs: number): void { + values[index * size] = (epochMs % 4294967296) | 0; + values[index * size + size] = (epochMs / 4294967296) | 0; + } +} + +export class TimestampMicrosecondView extends PrimitiveView { + public toArray() { return [...this]; } + protected getValue(values: Int32Array, index: number, size: number): number { + return epochMicrosecondsLongToMs(values, index * size); + } + protected setValue(values: Int32Array, index: number, size: number, epochMs: number): void { + values[index * size] = ((epochMs / 1000) % 4294967296) | 0; + values[index * size + size] = ((epochMs / 1000) / 4294967296) | 0; + } +} + +export class TimestampNanosecondView extends PrimitiveView { + public toArray() { return [...this]; } + protected getValue(values: Int32Array, index: number, size: number): number { + return epochNanosecondsLongToMs(values, index * size); + } + protected setValue(values: Int32Array, index: number, size: number, epochMs: number): void { + values[index * size] = ((epochMs / 1000000) % 4294967296) | 0; + values[index * size + size] = ((epochMs / 1000000) / 4294967296) | 0; + } +} + export class IntervalYearMonthView extends PrimitiveView { public toArray() { return [...this]; } protected getValue(values: Int32Array, index: number, size: number): Int32Array { diff --git a/js/src/vector/list.ts b/js/src/vector/list.ts index e56c1071d11a3..2185841ee3843 100644 --- a/js/src/vector/list.ts +++ b/js/src/vector/list.ts @@ -30,12 +30,9 @@ export const decodeUtf8 = ((decoder) => )(new TextDecoder('utf-8')); export abstract class ListViewBase implements View { - // @ts-ignore - protected length: number; - // @ts-ignore - protected values: T['TArray']; - // @ts-ignore - protected valueOffsets?: Int32Array; + public length: number; + public values: T['TArray']; + public valueOffsets?: Int32Array; constructor(data: Data) { this.length = data.length; this.values = data.values; @@ -86,7 +83,6 @@ export class ListView extends ListViewBase> { } export class FixedSizeListView extends ListViewBase> { - // @ts-ignore public size: number; constructor(data: Data>) { super(data); diff --git a/js/src/vector/nested.ts b/js/src/vector/nested.ts index d30e4203f99dd..17e98294c835a 100644 --- a/js/src/vector/nested.ts +++ b/js/src/vector/nested.ts @@ -21,13 +21,9 @@ import { View, Vector, createVector } from '../vector'; import { DataType, NestedType, DenseUnion, SparseUnion, Struct, Map_ } from '../type'; export abstract class NestedView implements View { - // @ts-ignore public length: number; - // @ts-ignore public numChildren: number; - // @ts-ignore public childData: Data[]; - // @ts-ignore protected children: Vector[]; constructor(data: Data, children?: Vector[]) { this.length = data.length; diff --git a/js/src/vector/view.ts b/js/src/vector/view.ts index 03991e9288b96..c314a3180a5bf 100644 --- a/js/src/vector/view.ts +++ b/js/src/vector/view.ts @@ -2,4 +2,7 @@ export { ChunkedView } from './chunked'; export { DictionaryView } from './dictionary'; export { ListView, FixedSizeListView, BinaryView, Utf8View } from './list'; export { UnionView, DenseUnionView, NestedView, StructView, MapView } from './nested'; -export { FlatView, NullView, BoolView, ValidityView, FixedSizeView, Float16View, DateDayView, DateMillisecondView, IntervalYearMonthView, IntervalYearView, IntervalMonthView, PrimitiveView } from './flat'; +export { FlatView, NullView, BoolView, ValidityView, PrimitiveView, FixedSizeView, Float16View } from './flat'; +export { DateDayView, DateMillisecondView } from './flat'; +export { IntervalYearMonthView, IntervalYearView, IntervalMonthView } from './flat'; +export { TimestampDayView, TimestampSecondView, TimestampMillisecondView, TimestampMicrosecondView, TimestampNanosecondView } from './flat';