Skip to content

Commit bf3b0da

Browse files
committed
factorize code
1 parent 66896a3 commit bf3b0da

File tree

3 files changed

+27
-29
lines changed

3 files changed

+27
-29
lines changed

src/lib/utils.ts

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { stringify } from 'hightable'
2-
import { AsyncBuffer, asyncBufferFromUrl, cachedAsyncBuffer } from 'hyparquet'
2+
import { AsyncBuffer } from 'hyparquet'
33
import { AsyncBufferFrom } from './workers/types.js'
4+
import { fromToAsyncBuffer } from './workers/utils.js'
45

56
/**
67
* Helper function to join class names
@@ -13,17 +14,7 @@ export function cn(...names: (string | undefined | false)[]): string {
1314
* Convert AsyncBufferFromUrl to AsyncBuffer.
1415
*/
1516
export function asyncBufferFrom(from: AsyncBufferFrom): Promise<AsyncBuffer> {
16-
if ('url' in from) {
17-
// Cached asyncBuffer for urls only
18-
const key = JSON.stringify(from)
19-
const cached = cache.get(key)
20-
if (cached) return cached
21-
const asyncBuffer = asyncBufferFromUrl(from).then(cachedAsyncBuffer)
22-
cache.set(key, asyncBuffer)
23-
return asyncBuffer
24-
} else {
25-
return from.file.arrayBuffer()
26-
}
17+
return fromToAsyncBuffer(from, cache)
2718
}
2819
const cache = new Map<string, Promise<AsyncBuffer>>()
2920
// TODO(SL): do we really want a singleton?

src/lib/workers/parquetWorker.ts

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,11 @@
11
import type { ColumnData } from 'hyparquet'
2-
import { AsyncBuffer, asyncBufferFromUrl, cachedAsyncBuffer, parquetRead } from 'hyparquet'
2+
import { AsyncBuffer, parquetRead } from 'hyparquet'
33
import { compressors } from 'hyparquet-compressors'
4-
import type { AsyncBufferFrom, ChunkMessage, ClientMessage, ErrorMessage, ResultMessage } from './types.js'
4+
import type { ChunkMessage, ClientMessage, ErrorMessage, ResultMessage } from './types.js'
5+
import { fromToAsyncBuffer } from './utils.js'
56

67
const cache = new Map<string, Promise<AsyncBuffer>>()
78

8-
export function asyncBufferFrom(from: AsyncBufferFrom): Promise<AsyncBuffer> {
9-
if ('url' in from) {
10-
// Cached asyncBuffer for urls only
11-
const key = JSON.stringify(from)
12-
const cached = cache.get(key)
13-
if (cached) return cached
14-
const asyncBuffer = asyncBufferFromUrl(from).then(cachedAsyncBuffer)
15-
cache.set(key, asyncBuffer)
16-
return asyncBuffer
17-
} else {
18-
return from.file.arrayBuffer()
19-
}
20-
}
21-
229
function postChunkMessage ({ chunk, queryId }: ChunkMessage) {
2310
self.postMessage({ chunk, queryId })
2411
}
@@ -31,7 +18,7 @@ function postErrorMessage ({ error, queryId }: ErrorMessage) {
3118

3219
self.onmessage = async ({ data }: { data: ClientMessage }) => {
3320
const { rowStart, rowEnd, columns, metadata, from, queryId } = data
34-
const file = await asyncBufferFrom(from)
21+
const file = await fromToAsyncBuffer(from, cache)
3522
try {
3623
await parquetRead({ metadata, file, rowStart, rowEnd, columns, compressors, onChunk })
3724
postResultMessage({ queryId })

src/lib/workers/utils.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { AsyncBuffer, asyncBufferFromUrl, cachedAsyncBuffer } from 'hyparquet'
2+
import { AsyncBufferFrom } from './types.js'
3+
4+
export function fromToAsyncBuffer(from: AsyncBufferFrom, cache?: Map<string, Promise<AsyncBuffer>>): Promise<AsyncBuffer> {
5+
if ('url' in from) {
6+
// Cached asyncBuffer for urls only
7+
const key = JSON.stringify(from)
8+
if (cache) {
9+
const cached = cache.get(key)
10+
if (cached) return cached
11+
}
12+
const asyncBuffer = asyncBufferFromUrl(from).then(cachedAsyncBuffer)
13+
if (cache) {
14+
cache.set(key, asyncBuffer)
15+
}
16+
return asyncBuffer
17+
} else {
18+
return from.file.arrayBuffer()
19+
}
20+
}

0 commit comments

Comments
 (0)