blob: c88b6bd311579c2c669b6f1c39fa6221e060e842 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
import { Vector } from './vector';
import { Type, DataType, Dictionary } from './type';
import { Utf8, Binary, Decimal, FixedSizeBinary } from './type';
import { List, FixedSizeList, Union, Map_, Struct } from './type';
import { Bool, Null, Int, Float, Date_, Time, Interval, Timestamp } from './type';
export interface VisitorNode {
acceptTypeVisitor(visitor: TypeVisitor): any;
acceptVectorVisitor(visitor: VectorVisitor): any;
}
export abstract class TypeVisitor {
visit(type: Partial<VisitorNode>): any {
return type.acceptTypeVisitor && type.acceptTypeVisitor(this) || null;
}
visitMany(types: Partial<VisitorNode>[]): any[] {
return types.map((type) => this.visit(type));
}
abstract visitNull?(type: Null): any;
abstract visitBool?(type: Bool): any;
abstract visitInt?(type: Int): any;
abstract visitFloat?(type: Float): any;
abstract visitUtf8?(type: Utf8): any;
abstract visitBinary?(type: Binary): any;
abstract visitFixedSizeBinary?(type: FixedSizeBinary): any;
abstract visitDate?(type: Date_): any;
abstract visitTimestamp?(type: Timestamp): any;
abstract visitTime?(type: Time): any;
abstract visitDecimal?(type: Decimal): any;
abstract visitList?(type: List): any;
abstract visitStruct?(type: Struct): any;
abstract visitUnion?(type: Union<any>): any;
abstract visitDictionary?(type: Dictionary): any;
abstract visitInterval?(type: Interval): any;
abstract visitFixedSizeList?(type: FixedSizeList): any;
abstract visitMap?(type: Map_): any;
static visitTypeInline<T extends DataType>(visitor: TypeVisitor, type: T): any {
switch (type.TType) {
case Type.Null: return visitor.visitNull && visitor.visitNull(type as any as Null);
case Type.Int: return visitor.visitInt && visitor.visitInt(type as any as Int);
case Type.Float: return visitor.visitFloat && visitor.visitFloat(type as any as Float);
case Type.Binary: return visitor.visitBinary && visitor.visitBinary(type as any as Binary);
case Type.Utf8: return visitor.visitUtf8 && visitor.visitUtf8(type as any as Utf8);
case Type.Bool: return visitor.visitBool && visitor.visitBool(type as any as Bool);
case Type.Decimal: return visitor.visitDecimal && visitor.visitDecimal(type as any as Decimal);
case Type.Date: return visitor.visitDate && visitor.visitDate(type as any as Date_);
case Type.Time: return visitor.visitTime && visitor.visitTime(type as any as Time);
case Type.Timestamp: return visitor.visitTimestamp && visitor.visitTimestamp(type as any as Timestamp);
case Type.Interval: return visitor.visitInterval && visitor.visitInterval(type as any as Interval);
case Type.List: return visitor.visitList && visitor.visitList(type as any as List<T>);
case Type.Struct: return visitor.visitStruct && visitor.visitStruct(type as any as Struct);
case Type.Union: return visitor.visitUnion && visitor.visitUnion(type as any as Union);
case Type.FixedSizeBinary: return visitor.visitFixedSizeBinary && visitor.visitFixedSizeBinary(type as any as FixedSizeBinary);
case Type.FixedSizeList: return visitor.visitFixedSizeList && visitor.visitFixedSizeList(type as any as FixedSizeList);
case Type.Map: return visitor.visitMap && visitor.visitMap(type as any as Map_);
case Type.Dictionary: return visitor.visitDictionary && visitor.visitDictionary(type as any as Dictionary);
default: return null;
}
}
}
export abstract class VectorVisitor {
visit(vector: Partial<VisitorNode>): any {
return vector.acceptVectorVisitor && vector.acceptVectorVisitor(this) || null;
}
visitMany(vectors: Partial<VisitorNode>[]): any[] {
return vectors.map((vector) => this.visit(vector));
}
abstract visitNull?(vector: Vector<Null>): any;
abstract visitBool?(vector: Vector<Bool>): any;
abstract visitInt?(vector: Vector<Int>): any;
abstract visitFloat?(vector: Vector<Float>): any;
abstract visitUtf8?(vector: Vector<Utf8>): any;
abstract visitBinary?(vector: Vector<Binary>): any;
abstract visitFixedSizeBinary?(vector: Vector<FixedSizeBinary>): any;
abstract visitDate?(vector: Vector<Date_>): any;
abstract visitTimestamp?(vector: Vector<Timestamp>): any;
abstract visitTime?(vector: Vector<Time>): any;
abstract visitDecimal?(vector: Vector<Decimal>): any;
abstract visitList?(vector: Vector<List>): any;
abstract visitStruct?(vector: Vector<Struct>): any;
abstract visitUnion?(vector: Vector<Union<any>>): any;
abstract visitDictionary?(vector: Vector<Dictionary>): any;
abstract visitInterval?(vector: Vector<Interval>): any;
abstract visitFixedSizeList?(vector: Vector<FixedSizeList>): any;
abstract visitMap?(vector: Vector<Map_>): any;
static visitTypeInline<T extends DataType>(visitor: VectorVisitor, type: T, vector: Vector<T>): any {
switch (type.TType) {
case Type.Null: return visitor.visitNull && visitor.visitNull(vector as any as Vector<Null>);
case Type.Int: return visitor.visitInt && visitor.visitInt(vector as any as Vector<Int>);
case Type.Float: return visitor.visitFloat && visitor.visitFloat(vector as any as Vector<Float>);
case Type.Binary: return visitor.visitBinary && visitor.visitBinary(vector as any as Vector<Binary>);
case Type.Utf8: return visitor.visitUtf8 && visitor.visitUtf8(vector as any as Vector<Utf8>);
case Type.Bool: return visitor.visitBool && visitor.visitBool(vector as any as Vector<Bool>);
case Type.Decimal: return visitor.visitDecimal && visitor.visitDecimal(vector as any as Vector<Decimal>);
case Type.Date: return visitor.visitDate && visitor.visitDate(vector as any as Vector<Date_>);
case Type.Time: return visitor.visitTime && visitor.visitTime(vector as any as Vector<Time>);
case Type.Timestamp: return visitor.visitTimestamp && visitor.visitTimestamp(vector as any as Vector<Timestamp>);
case Type.Interval: return visitor.visitInterval && visitor.visitInterval(vector as any as Vector<Interval>);
case Type.List: return visitor.visitList && visitor.visitList(vector as any as Vector<List<T>>);
case Type.Struct: return visitor.visitStruct && visitor.visitStruct(vector as any as Vector<Struct>);
case Type.Union: return visitor.visitUnion && visitor.visitUnion(vector as any as Vector<Union>);
case Type.FixedSizeBinary: return visitor.visitFixedSizeBinary && visitor.visitFixedSizeBinary(vector as any as Vector<FixedSizeBinary>);
case Type.FixedSizeList: return visitor.visitFixedSizeList && visitor.visitFixedSizeList(vector as any as Vector<FixedSizeList>);
case Type.Map: return visitor.visitMap && visitor.visitMap(vector as any as Vector<Map_>);
case Type.Dictionary: return visitor.visitDictionary && visitor.visitDictionary(vector as any as Vector<Dictionary>);
default: return null;
}
}
}