Skip to content

Commit 614b688

Browse files
committed
add asEpochMs to date and timestamp vectors
1 parent 87334a5 commit 614b688

File tree

7 files changed

+89
-29
lines changed

7 files changed

+89
-29
lines changed

js/src/Arrow.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,14 +139,19 @@ export namespace view {
139139
export import NullView = view_.NullView;
140140
export import BoolView = view_.BoolView;
141141
export import ValidityView = view_.ValidityView;
142+
export import PrimitiveView = view_.PrimitiveView;
142143
export import FixedSizeView = view_.FixedSizeView;
143144
export import Float16View = view_.Float16View;
144145
export import DateDayView = view_.DateDayView;
145146
export import DateMillisecondView = view_.DateMillisecondView;
147+
export import TimestampDayView = view_.TimestampDayView;
148+
export import TimestampSecondView = view_.TimestampSecondView;
149+
export import TimestampMillisecondView = view_.TimestampMillisecondView;
150+
export import TimestampMicrosecondView = view_.TimestampMicrosecondView;
151+
export import TimestampNanosecondView = view_.TimestampNanosecondView;
146152
export import IntervalYearMonthView = view_.IntervalYearMonthView;
147153
export import IntervalYearView = view_.IntervalYearView;
148154
export import IntervalMonthView = view_.IntervalMonthView;
149-
export import PrimitiveView = view_.PrimitiveView;
150155
}
151156

152157
/* These exports are needed for the closure and uglify umd targets */

js/src/vector.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
import { Data, ChunkedData, FlatData, BoolData, FlatListData, NestedData } from './data';
1919
import { VisitorNode, TypeVisitor, VectorVisitor } from './visitor';
20-
import { DataType, ListType, FlatType, NestedType, FlatListType } from './type';
20+
import { DataType, ListType, FlatType, NestedType, FlatListType, TimeUnit } from './type';
2121
import { IterableArrayLike, Precision, DateUnit, IntervalUnit, UnionMode } from './type';
2222

2323
export interface VectorLike { length: number; nullCount: number; }
@@ -157,7 +157,9 @@ import { ChunkedView } from './vector/chunked';
157157
import { DictionaryView } from './vector/dictionary';
158158
import { ListView, FixedSizeListView, BinaryView, Utf8View } from './vector/list';
159159
import { UnionView, DenseUnionView, NestedView, StructView, MapView } from './vector/nested';
160-
import { FlatView, NullView, BoolView, ValidityView, FixedSizeView, Float16View, DateDayView, DateMillisecondView, IntervalYearMonthView, PrimitiveView } from './vector/flat';
160+
import { FlatView, NullView, BoolView, ValidityView, PrimitiveView, FixedSizeView, Float16View } from './vector/flat';
161+
import { DateDayView, DateMillisecondView, IntervalYearMonthView } from './vector/flat';
162+
import { TimestampDayView, TimestampSecondView, TimestampMillisecondView, TimestampMicrosecondView, TimestampNanosecondView } from './vector/flat';
161163
import { packBools } from './util/bit';
162164

163165
export class NullVector extends Vector<Null> {
@@ -242,6 +244,14 @@ export class DateVector extends FlatVector<Date_> {
242244
public highs(): IntVector<Int32> {
243245
return this.type.unit === DateUnit.DAY ? this.asInt32(0, 1) : this.asInt32(1, 2);
244246
}
247+
public asEpochMilliseconds(): IntVector<Int32> {
248+
let data = (this.data as FlatData<any>).clone(new Int32());
249+
switch (this.type.unit) {
250+
case DateUnit.DAY: return new IntVector(data, new TimestampDayView(data as any, 1) as any);
251+
case DateUnit.MILLISECOND: return new IntVector(data, new TimestampMillisecondView(data as any, 2) as any);
252+
}
253+
throw new TypeError(`Unrecognized date unit "${DateUnit[this.type.unit]}"`);
254+
}
245255
}
246256

247257
export class DecimalVector extends FlatVector<Decimal> {
@@ -269,6 +279,16 @@ export class TimestampVector extends FlatVector<Timestamp> {
269279
constructor(data: Data<Timestamp>, view: View<Timestamp> = new FixedSizeView(data, 2)) {
270280
super(data, view);
271281
}
282+
public asEpochMilliseconds(): IntVector<Int32> {
283+
let data = (this.data as FlatData<any>).clone(new Int32());
284+
switch (this.type.unit) {
285+
case TimeUnit.SECOND: return new IntVector(data, new TimestampSecondView(data as any, 1) as any);
286+
case TimeUnit.MILLISECOND: return new IntVector(data, new TimestampMillisecondView(data as any, 2) as any);
287+
case TimeUnit.MICROSECOND: return new IntVector(data, new TimestampMicrosecondView(data as any, 2) as any);
288+
case TimeUnit.NANOSECOND: return new IntVector(data, new TimestampNanosecondView(data as any, 2) as any);
289+
}
290+
throw new TypeError(`Unrecognized time unit "${TimeUnit[this.type.unit]}"`);
291+
}
272292
}
273293

274294
export class IntervalVector extends FlatVector<Interval> {

js/src/vector/chunked.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,6 @@ import { DataType, TypedArray, IterableArrayLike } from '../type';
2222
export class ChunkedView<T extends DataType> implements View<T> {
2323
public chunks: Vector<T>[];
2424
public offsets: Uint32Array;
25-
// @ts-ignore
26-
protected _length: number;
27-
// @ts-ignore
28-
protected _nullCount: number;
2925
constructor(data: ChunkedData<T>) {
3026
this.chunks = data.childVectors;
3127
this.offsets = data.childOffsets;

js/src/vector/flat.ts

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,11 @@
1818
import { Data } from '../data';
1919
import { View } from '../vector';
2020
import { getBool, setBool, iterateBits } from '../util/bit';
21-
import { Bool, Float16, Date_, Interval, Null, Int32 } from '../type';
21+
import { Bool, Float16, Date_, Interval, Null, Int32, Timestamp } from '../type';
2222
import { DataType, FlatType, PrimitiveType, IterableArrayLike } from '../type';
2323

2424
export class FlatView<T extends FlatType> implements View<T> {
25-
// @ts-ignore
2625
public length: number;
27-
// @ts-ignore
2826
public values: T['TArray'];
2927
constructor(data: Data<T>) {
3028
this.length = data.length;
@@ -51,7 +49,6 @@ export class FlatView<T extends FlatType> implements View<T> {
5149
}
5250

5351
export class NullView implements View<Null> {
54-
// @ts-ignore
5552
public length: number;
5653
constructor(data: Data<Null>) {
5754
this.length = data.length;
@@ -75,7 +72,6 @@ export class NullView implements View<Null> {
7572
}
7673

7774
export class BoolView extends FlatView<Bool> {
78-
// @ts-ignore
7975
protected offset: number;
8076
constructor(data: Data<Bool>) {
8177
super(data);
@@ -96,11 +92,8 @@ export class BoolView extends FlatView<Bool> {
9692

9793
export class ValidityView<T extends DataType> implements View<T> {
9894
protected view: View<T>;
99-
// @ts-ignore
10095
protected length: number;
101-
// @ts-ignore
10296
protected offset: number;
103-
// @ts-ignore
10497
protected nullBitmap: Uint8Array;
10598
constructor(data: Data<T>, view: View<T>) {
10699
this.view = view;
@@ -136,9 +129,7 @@ export class ValidityView<T extends DataType> implements View<T> {
136129
}
137130

138131
export class PrimitiveView<T extends PrimitiveType> extends FlatView<T> {
139-
// @ts-ignore
140132
public size: number;
141-
// @ts-ignore
142133
public ArrayType: T['ArrayType'];
143134
constructor(data: Data<T>, size?: number) {
144135
super(data);
@@ -216,6 +207,59 @@ export class DateMillisecondView extends FixedSizeView<Date_> {
216207
}
217208
}
218209

210+
export class TimestampDayView extends PrimitiveView<Timestamp> {
211+
public toArray() { return [...this]; }
212+
protected getValue(values: Int32Array, index: number, size: number): number {
213+
return epochDaysToMs(values, index * size);
214+
}
215+
protected setValue(values: Int32Array, index: number, size: number, epochMs: number): void {
216+
values[index * size] = (epochMs / 86400000) | 0;
217+
}
218+
}
219+
220+
export class TimestampSecondView extends PrimitiveView<Timestamp> {
221+
public toArray() { return [...this]; }
222+
protected getValue(values: Int32Array, index: number, size: number): number {
223+
return epochSecondsToMs(values, index * size);
224+
}
225+
protected setValue(values: Int32Array, index: number, size: number, epochMs: number): void {
226+
values[index * size] = (epochMs / 1000) | 0;
227+
}
228+
}
229+
230+
export class TimestampMillisecondView extends PrimitiveView<Timestamp> {
231+
public toArray() { return [...this]; }
232+
protected getValue(values: Int32Array, index: number, size: number): number {
233+
return epochMillisecondsLongToMs(values, index * size);
234+
}
235+
protected setValue(values: Int32Array, index: number, size: number, epochMs: number): void {
236+
values[index * size] = (epochMs % 4294967296) | 0;
237+
values[index * size + size] = (epochMs / 4294967296) | 0;
238+
}
239+
}
240+
241+
export class TimestampMicrosecondView extends PrimitiveView<Timestamp> {
242+
public toArray() { return [...this]; }
243+
protected getValue(values: Int32Array, index: number, size: number): number {
244+
return epochMicrosecondsLongToMs(values, index * size);
245+
}
246+
protected setValue(values: Int32Array, index: number, size: number, epochMs: number): void {
247+
values[index * size] = ((epochMs / 1000) % 4294967296) | 0;
248+
values[index * size + size] = ((epochMs / 1000) / 4294967296) | 0;
249+
}
250+
}
251+
252+
export class TimestampNanosecondView extends PrimitiveView<Timestamp> {
253+
public toArray() { return [...this]; }
254+
protected getValue(values: Int32Array, index: number, size: number): number {
255+
return epochNanosecondsLongToMs(values, index * size);
256+
}
257+
protected setValue(values: Int32Array, index: number, size: number, epochMs: number): void {
258+
values[index * size] = ((epochMs / 1000000) % 4294967296) | 0;
259+
values[index * size + size] = ((epochMs / 1000000) / 4294967296) | 0;
260+
}
261+
}
262+
219263
export class IntervalYearMonthView extends PrimitiveView<Interval> {
220264
public toArray() { return [...this]; }
221265
protected getValue(values: Int32Array, index: number, size: number): Int32Array {

js/src/vector/list.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,9 @@ export const decodeUtf8 = ((decoder) =>
3030
)(new TextDecoder('utf-8'));
3131

3232
export abstract class ListViewBase<T extends (ListType | FlatListType)> implements View<T> {
33-
// @ts-ignore
34-
protected length: number;
35-
// @ts-ignore
36-
protected values: T['TArray'];
37-
// @ts-ignore
38-
protected valueOffsets?: Int32Array;
33+
public length: number;
34+
public values: T['TArray'];
35+
public valueOffsets?: Int32Array;
3936
constructor(data: Data<T>) {
4037
this.length = data.length;
4138
this.values = data.values;
@@ -86,7 +83,6 @@ export class ListView<T extends DataType> extends ListViewBase<List<T>> {
8683
}
8784

8885
export class FixedSizeListView<T extends DataType> extends ListViewBase<FixedSizeList<T>> {
89-
// @ts-ignore
9086
public size: number;
9187
constructor(data: Data<FixedSizeList<T>>) {
9288
super(data);

js/src/vector/nested.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,9 @@ import { View, Vector, createVector } from '../vector';
2121
import { DataType, NestedType, DenseUnion, SparseUnion, Struct, Map_ } from '../type';
2222

2323
export abstract class NestedView<T extends NestedType> implements View<T> {
24-
// @ts-ignore
2524
public length: number;
26-
// @ts-ignore
2725
public numChildren: number;
28-
// @ts-ignore
2926
public childData: Data<any>[];
30-
// @ts-ignore
3127
protected children: Vector<any>[];
3228
constructor(data: Data<T>, children?: Vector<any>[]) {
3329
this.length = data.length;

js/src/vector/view.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,7 @@ export { ChunkedView } from './chunked';
22
export { DictionaryView } from './dictionary';
33
export { ListView, FixedSizeListView, BinaryView, Utf8View } from './list';
44
export { UnionView, DenseUnionView, NestedView, StructView, MapView } from './nested';
5-
export { FlatView, NullView, BoolView, ValidityView, FixedSizeView, Float16View, DateDayView, DateMillisecondView, IntervalYearMonthView, IntervalYearView, IntervalMonthView, PrimitiveView } from './flat';
5+
export { FlatView, NullView, BoolView, ValidityView, PrimitiveView, FixedSizeView, Float16View } from './flat';
6+
export { DateDayView, DateMillisecondView } from './flat';
7+
export { IntervalYearMonthView, IntervalYearView, IntervalMonthView } from './flat';
8+
export { TimestampDayView, TimestampSecondView, TimestampMillisecondView, TimestampMicrosecondView, TimestampNanosecondView } from './flat';

0 commit comments

Comments
 (0)