Spaces:
Runtime error
Runtime error
| // 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. | |
| /** @ignore */ | |
| export class ChunkedIterator { | |
| constructor(numChunks = 0, getChunkIterator) { | |
| this.numChunks = numChunks; | |
| this.getChunkIterator = getChunkIterator; | |
| this.chunkIndex = 0; | |
| this.chunkIterator = this.getChunkIterator(0); | |
| } | |
| next() { | |
| while (this.chunkIndex < this.numChunks) { | |
| const next = this.chunkIterator.next(); | |
| if (!next.done) { | |
| return next; | |
| } | |
| if (++this.chunkIndex < this.numChunks) { | |
| this.chunkIterator = this.getChunkIterator(this.chunkIndex); | |
| } | |
| } | |
| return { done: true, value: null }; | |
| } | |
| [Symbol.iterator]() { | |
| return this; | |
| } | |
| } | |
| /** @ignore */ | |
| export function computeChunkNullCounts(chunks) { | |
| return chunks.reduce((nullCount, chunk) => nullCount + chunk.nullCount, 0); | |
| } | |
| /** @ignore */ | |
| export function computeChunkOffsets(chunks) { | |
| return chunks.reduce((offsets, chunk, index) => { | |
| offsets[index + 1] = offsets[index] + chunk.length; | |
| return offsets; | |
| }, new Uint32Array(chunks.length + 1)); | |
| } | |
| /** @ignore */ | |
| export function sliceChunks(chunks, offsets, begin, end) { | |
| const slices = []; | |
| for (let i = -1, n = chunks.length; ++i < n;) { | |
| const chunk = chunks[i]; | |
| const offset = offsets[i]; | |
| const { length } = chunk; | |
| // Stop if the child is to the right of the slice boundary | |
| if (offset >= end) { | |
| break; | |
| } | |
| // Exclude children to the left of of the slice boundary | |
| if (begin >= offset + length) { | |
| continue; | |
| } | |
| // Include entire child if between both left and right boundaries | |
| if (offset >= begin && (offset + length) <= end) { | |
| slices.push(chunk); | |
| continue; | |
| } | |
| // Include the child slice that overlaps one of the slice boundaries | |
| const from = Math.max(0, begin - offset); | |
| const to = Math.min(end - offset, length); | |
| slices.push(chunk.slice(from, to - from)); | |
| } | |
| if (slices.length === 0) { | |
| slices.push(chunks[0].slice(0, 0)); | |
| } | |
| return slices; | |
| } | |
| /** @ignore */ | |
| export function binarySearch(chunks, offsets, idx, fn) { | |
| let lhs = 0, mid = 0, rhs = offsets.length - 1; | |
| do { | |
| if (lhs >= rhs - 1) { | |
| return (idx < offsets[rhs]) ? fn(chunks, lhs, idx - offsets[lhs]) : null; | |
| } | |
| mid = lhs + (Math.trunc((rhs - lhs) * .5)); | |
| idx < offsets[mid] ? (rhs = mid) : (lhs = mid); | |
| } while (lhs < rhs); | |
| } | |
| /** @ignore */ | |
| export function isChunkedValid(data, index) { | |
| return data.getValid(index); | |
| } | |
| /** @ignore */ | |
| export function wrapChunkedCall1(fn) { | |
| function chunkedFn(chunks, i, j) { return fn(chunks[i], j); } | |
| return function (index) { | |
| const data = this.data; | |
| return binarySearch(data, this._offsets, index, chunkedFn); | |
| }; | |
| } | |
| /** @ignore */ | |
| export function wrapChunkedCall2(fn) { | |
| let _2; | |
| function chunkedFn(chunks, i, j) { return fn(chunks[i], j, _2); } | |
| return function (index, value) { | |
| const data = this.data; | |
| _2 = value; | |
| const result = binarySearch(data, this._offsets, index, chunkedFn); | |
| _2 = undefined; | |
| return result; | |
| }; | |
| } | |
| /** @ignore */ | |
| export function wrapChunkedIndexOf(indexOf) { | |
| let _1; | |
| function chunkedIndexOf(data, chunkIndex, fromIndex) { | |
| let begin = fromIndex, index = 0, total = 0; | |
| for (let i = chunkIndex - 1, n = data.length; ++i < n;) { | |
| const chunk = data[i]; | |
| if (~(index = indexOf(chunk, _1, begin))) { | |
| return total + index; | |
| } | |
| begin = 0; | |
| total += chunk.length; | |
| } | |
| return -1; | |
| } | |
| return function (element, offset) { | |
| _1 = element; | |
| const data = this.data; | |
| const result = typeof offset !== 'number' | |
| ? chunkedIndexOf(data, 0, 0) | |
| : binarySearch(data, this._offsets, offset, chunkedIndexOf); | |
| _1 = undefined; | |
| return result; | |
| }; | |
| } | |
| //# sourceMappingURL=chunk.mjs.map | |