|
9 | 9 | * - FragmentSource that yields decoded rows |
10 | 10 | */ |
11 | 11 |
|
12 | | -import type { FormatReader, DataSource } from "../reader.js"; |
| 12 | +import { type FormatReader, type DataSource, encodeColumnBuffer } from "../reader.js"; |
13 | 13 | import type { ColumnMeta, DataType, PageInfo, Row } from "../types.js"; |
14 | 14 | import type { FragmentSource } from "../operators.js"; |
15 | 15 |
|
@@ -302,108 +302,6 @@ class CsvFragmentSource implements FragmentSource { |
302 | 302 | } |
303 | 303 | } |
304 | 304 |
|
305 | | -// --------------------------------------------------------------------------- |
306 | | -// Encode column values into the binary wire format used by decodePage() |
307 | | -// --------------------------------------------------------------------------- |
308 | | - |
309 | | -function encodeColumnBuffer( |
310 | | - values: (number | bigint | string | boolean | null)[], |
311 | | - dtype: DataType, |
312 | | -): ArrayBuffer { |
313 | | - switch (dtype) { |
314 | | - case "bool": { |
315 | | - const numBytes = Math.ceil(values.length / 8); |
316 | | - const buf = new Uint8Array(numBytes); |
317 | | - for (let i = 0; i < values.length; i++) { |
318 | | - if (values[i] === true || values[i] === 1) { |
319 | | - buf[i >> 3] |= 1 << (i & 7); |
320 | | - } |
321 | | - } |
322 | | - return buf.buffer; |
323 | | - } |
324 | | - case "int8": { |
325 | | - const arr = new Int8Array(values.length); |
326 | | - for (let i = 0; i < values.length; i++) arr[i] = Number(values[i] ?? 0); |
327 | | - return arr.buffer; |
328 | | - } |
329 | | - case "uint8": { |
330 | | - const arr = new Uint8Array(values.length); |
331 | | - for (let i = 0; i < values.length; i++) arr[i] = Number(values[i] ?? 0); |
332 | | - return arr.buffer; |
333 | | - } |
334 | | - case "int16": { |
335 | | - const arr = new Int16Array(values.length); |
336 | | - for (let i = 0; i < values.length; i++) arr[i] = Number(values[i] ?? 0); |
337 | | - return arr.buffer; |
338 | | - } |
339 | | - case "uint16": { |
340 | | - const arr = new Uint16Array(values.length); |
341 | | - for (let i = 0; i < values.length; i++) arr[i] = Number(values[i] ?? 0); |
342 | | - return arr.buffer; |
343 | | - } |
344 | | - case "int32": { |
345 | | - const arr = new Int32Array(values.length); |
346 | | - for (let i = 0; i < values.length; i++) arr[i] = Number(values[i] ?? 0); |
347 | | - return arr.buffer; |
348 | | - } |
349 | | - case "uint32": { |
350 | | - const arr = new Uint32Array(values.length); |
351 | | - for (let i = 0; i < values.length; i++) arr[i] = Number(values[i] ?? 0); |
352 | | - return arr.buffer; |
353 | | - } |
354 | | - case "int64": { |
355 | | - const arr = new BigInt64Array(values.length); |
356 | | - for (let i = 0; i < values.length; i++) { |
357 | | - const v = values[i]; |
358 | | - arr[i] = typeof v === "bigint" ? v : BigInt(Math.trunc(Number(v ?? 0))); |
359 | | - } |
360 | | - return arr.buffer; |
361 | | - } |
362 | | - case "uint64": { |
363 | | - const arr = new BigUint64Array(values.length); |
364 | | - for (let i = 0; i < values.length; i++) { |
365 | | - const v = values[i]; |
366 | | - arr[i] = typeof v === "bigint" ? BigInt.asUintN(64, v) : BigInt(Math.trunc(Number(v ?? 0))); |
367 | | - } |
368 | | - return arr.buffer; |
369 | | - } |
370 | | - case "float32": { |
371 | | - const arr = new Float32Array(values.length); |
372 | | - for (let i = 0; i < values.length; i++) arr[i] = Number(values[i] ?? 0); |
373 | | - return arr.buffer; |
374 | | - } |
375 | | - case "float64": { |
376 | | - const arr = new Float64Array(values.length); |
377 | | - for (let i = 0; i < values.length; i++) arr[i] = Number(values[i] ?? 0); |
378 | | - return arr.buffer; |
379 | | - } |
380 | | - case "utf8": |
381 | | - case "binary": { |
382 | | - // Lance/QueryMode utf8 wire format: [u32 len][bytes]... |
383 | | - const encoder = new TextEncoder(); |
384 | | - const parts: Uint8Array[] = []; |
385 | | - let totalLen = 0; |
386 | | - for (const v of values) { |
387 | | - const str = v === null ? "" : String(v); |
388 | | - const encoded = encoder.encode(str); |
389 | | - const header = new Uint8Array(4); |
390 | | - new DataView(header.buffer).setUint32(0, encoded.length, true); |
391 | | - parts.push(header, encoded); |
392 | | - totalLen += 4 + encoded.length; |
393 | | - } |
394 | | - const buf = new Uint8Array(totalLen); |
395 | | - let off = 0; |
396 | | - for (const p of parts) { |
397 | | - buf.set(p, off); |
398 | | - off += p.length; |
399 | | - } |
400 | | - return buf.buffer; |
401 | | - } |
402 | | - default: |
403 | | - return new ArrayBuffer(0); |
404 | | - } |
405 | | -} |
406 | | - |
407 | 305 | // --------------------------------------------------------------------------- |
408 | 306 | // CsvReader — implements FormatReader |
409 | 307 | // --------------------------------------------------------------------------- |
|
0 commit comments