diff --git a/js/src/vector.ts b/js/src/vector.ts index 33b13ad739d1c..60315857ed851 100644 --- a/js/src/vector.ts +++ b/js/src/vector.ts @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -import { Data, ChunkedData, FlatData, BoolData, FlatListData, NestedData } from './data'; +import { Data, ChunkedData, FlatData, BoolData, FlatListData, NestedData, DictionaryData } from './data'; import { VisitorNode, TypeVisitor, VectorVisitor } from './visitor'; import { DataType, ListType, FlatType, NestedType, FlatListType, TimeUnit } from './type'; import { IterableArrayLike, Precision, DateUnit, IntervalUnit, UnionMode } from './type'; @@ -373,16 +373,21 @@ export class DictionaryVector extends Vector; constructor(data: Data>, view: View> = new DictionaryView(data.dictionary, new IntVector(data.indicies))) { super(data as Data, view); - if (view instanceof DictionaryView) { + if (data instanceof DictionaryData && view instanceof DictionaryView) { this.indicies = view.indicies; - this.dictionary = view.dictionary; - } else if (view instanceof ChunkedView) { - this.dictionary = (view.chunks[0] as DictionaryVector).dictionary; - this.indicies = (view.chunks as DictionaryVector[]).reduce | null>( + this.dictionary = data.dictionary; + } else if (data instanceof ChunkedData && view instanceof ChunkedView) { + const chunks = view.chunks as DictionaryVector[]; + // Assume the last chunk's dictionary data is the most up-to-date, + // including data from DictionaryBatches that were marked as deltas + this.dictionary = chunks[chunks.length - 1].dictionary; + this.indicies = chunks.reduce | null>( (idxs: Vector | null, dict: DictionaryVector) => !idxs ? dict.indicies! : idxs.concat(dict.indicies!), null )!; + } else { + throw new TypeError(`Unrecognized DictionaryVector view`); } } public getKey(index: number) { return this.indicies.get(index); }