83 lines
3.4 KiB
JavaScript
83 lines
3.4 KiB
JavaScript
// 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 { Dictionary } from '../type';
|
|
import { Builder } from '../builder';
|
|
/** @ignore */
|
|
export class DictionaryBuilder extends Builder {
|
|
constructor({ 'type': type, 'nullValues': nulls, 'dictionaryHashFunction': hashFn }) {
|
|
super({ type: new Dictionary(type.dictionary, type.indices, type.id, type.isOrdered) });
|
|
this._nulls = null;
|
|
this._dictionaryOffset = 0;
|
|
this._keysToIndices = Object.create(null);
|
|
this.indices = Builder.new({ 'type': this.type.indices, 'nullValues': nulls });
|
|
this.dictionary = Builder.new({ 'type': this.type.dictionary, 'nullValues': null });
|
|
if (typeof hashFn === 'function') {
|
|
this.valueToKey = hashFn;
|
|
}
|
|
}
|
|
get values() { return this.indices.values; }
|
|
get nullCount() { return this.indices.nullCount; }
|
|
get nullBitmap() { return this.indices.nullBitmap; }
|
|
get byteLength() { return this.indices.byteLength + this.dictionary.byteLength; }
|
|
get reservedLength() { return this.indices.reservedLength + this.dictionary.reservedLength; }
|
|
get reservedByteLength() { return this.indices.reservedByteLength + this.dictionary.reservedByteLength; }
|
|
isValid(value) { return this.indices.isValid(value); }
|
|
setValid(index, valid) {
|
|
const indices = this.indices;
|
|
valid = indices.setValid(index, valid);
|
|
this.length = indices.length;
|
|
return valid;
|
|
}
|
|
setValue(index, value) {
|
|
let keysToIndices = this._keysToIndices;
|
|
let key = this.valueToKey(value);
|
|
let idx = keysToIndices[key];
|
|
if (idx === undefined) {
|
|
keysToIndices[key] = idx = this._dictionaryOffset + this.dictionary.append(value).length - 1;
|
|
}
|
|
return this.indices.setValue(index, idx);
|
|
}
|
|
flush() {
|
|
const type = this.type;
|
|
const prev = this._dictionary;
|
|
const curr = this.dictionary.toVector();
|
|
const data = this.indices.flush().clone(type);
|
|
data.dictionary = prev ? prev.concat(curr) : curr;
|
|
this.finished || (this._dictionaryOffset += curr.length);
|
|
this._dictionary = data.dictionary;
|
|
this.clear();
|
|
return data;
|
|
}
|
|
finish() {
|
|
this.indices.finish();
|
|
this.dictionary.finish();
|
|
this._dictionaryOffset = 0;
|
|
this._keysToIndices = Object.create(null);
|
|
return super.finish();
|
|
}
|
|
clear() {
|
|
this.indices.clear();
|
|
this.dictionary.clear();
|
|
return super.clear();
|
|
}
|
|
valueToKey(val) {
|
|
return typeof val === 'string' ? val : `${val}`;
|
|
}
|
|
}
|
|
|
|
//# sourceMappingURL=dictionary.mjs.map
|