Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions js/src/reader/arrow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import { readFile } from './file';
import { readStream } from './stream';
import { readVector } from './vector';
import { Vector } from '../vector/vector';
import { readDictionaries } from './dictionary';
import { readDictionary } from './dictionary';

import ByteBuffer = flatbuffers.ByteBuffer;
export import Schema = Schema_.org.apache.arrow.flatbuf.Schema;
Expand Down Expand Up @@ -51,9 +51,13 @@ export function* readBuffers(...bytes: Array<Uint8Array | Buffer | string>) {
let state = { nodeIndex: 0, bufferIndex: 0 };
let index = -1, fieldsLength = schema.fieldsLength();
if (batch.id) {
// A dictionary batch only contain a single vector. Traverse each
// field and its children until we find one that uses this dictionary
while (++index < fieldsLength) {
for (let [id, vector] of readDictionaries(schema.fields(index), batch, state, dictionaries)) {
dictionaries[id] = dictionaries[id] && dictionaries[id].concat(vector) || vector;
let vector = readDictionary(schema.fields(index), batch, state, dictionaries);
if (vector) {
dictionaries[batch.id] = dictionaries[batch.id] && dictionaries[batch.id].concat(vector) || vector;
break;
}
}
} else {
Expand Down
18 changes: 7 additions & 11 deletions js/src/reader/dictionary.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,20 +21,16 @@ import * as Schema_ from '../format/Schema_generated';
import { IteratorState, Dictionaries } from './arrow';
import Field = Schema_.org.apache.arrow.flatbuf.Field;

export function* readDictionaries(field: Field | null,
batch: MessageBatch,
iterator: IteratorState,
dictionaries: Dictionaries) {
export function readDictionary(field: Field | null,
batch: MessageBatch,
iterator: IteratorState,
dictionaries: Dictionaries) {
let id: string, encoding = field && field.dictionary();
if (encoding && batch.id === (id = encoding.id().toFloat64().toString())) {
yield [id, readVector(field, batch, iterator, null)];
return;
return readVector(field, batch, iterator, null);
}
for (let i = -1, n = field && field.childrenLength() || 0; ++i < n;) {
// Since a dictionary batch can only contain a single vector, return early after we find it
for (let result of readDictionaries(field.children(i), batch, iterator, dictionaries)) {
yield result;
return;
}
let vector = readDictionary(field.children(i), batch, iterator, dictionaries);
if (vector) return vector;
}
}