Spaces:
Sleeping
Sleeping
// 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.mjs'; | |
import { Builder } from '../builder.mjs'; | |
import { makeBuilder } from '../factories.mjs'; | |
/** @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 = makeBuilder({ 'type': this.type.indices, 'nullValues': nulls }); | |
this.dictionary = makeBuilder({ '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) { | |
const keysToIndices = this._keysToIndices; | |
const 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 | |