@@ -2,38 +2,40 @@ import ParquetWorker from './parquetWorker?worker&inline'
22/// ^ the worker is bundled with the main thread code (inline) which is easier for users to import
33/// (no need to copy the worker file to the right place)
44import { ColumnData } from 'hyparquet'
5- import type { ParquetMessage , ParquetReadWorkerOptions , ParquetSortIndexOptions , Row , SortParquetMessage } from './types.js'
5+ import type { Cells , ColumnRanksClientMessage , ColumnRanksWorkerMessage , ColumnRanksWorkerOptions , QueryClientMessage , QueryWorkerMessage , QueryWorkerOptions } from './types.js'
66
77let worker : Worker | undefined
88let nextQueryId = 0
9- interface SortQueryAgent {
10- kind : 'sortIndex' ;
11- resolve : ( value : number [ ] ) => void ;
12- reject : ( error : Error ) => void ;
13- }
149interface RowsQueryAgent {
1510 kind : 'query' ;
16- resolve : ( value : Row [ ] ) => void ;
11+ resolve : ( value : Cells [ ] ) => void ;
1712 reject : ( error : Error ) => void ;
1813 onChunk ?: ( chunk : ColumnData ) => void ;
1914}
20- type QueryAgent = SortQueryAgent | RowsQueryAgent
15+ interface ColumnRanksQueryAgent {
16+ kind : 'columnRanks' ;
17+ resolve : ( value : number [ ] ) => void ;
18+ reject : ( error : Error ) => void ;
19+ }
20+ type QueryAgent = RowsQueryAgent | ColumnRanksQueryAgent
2121
2222const pending = new Map < number , QueryAgent > ( )
2323
2424function getWorker ( ) {
2525 if ( ! worker ) {
2626 worker = new ParquetWorker ( )
27- worker . onmessage = ( { data } : { data : ParquetMessage | SortParquetMessage } ) => {
27+ worker . onmessage = ( { data } : { data : QueryWorkerMessage | ColumnRanksWorkerMessage } ) => {
2828 const pendingQueryAgent = pending . get ( data . queryId )
2929 if ( ! pendingQueryAgent ) {
3030 console . warn (
3131 `Unexpected: no pending promise found for queryId: ${ data . queryId . toString ( ) } `
3232 )
3333 return
3434 }
35+
3536 if ( pendingQueryAgent . kind === 'query' ) {
36- const { resolve, reject, onChunk } = pendingQueryAgent
37+ const { resolve, reject } = pendingQueryAgent
38+ const { onChunk } = pendingQueryAgent
3739 if ( 'error' in data ) {
3840 reject ( data . error )
3941 } else if ( 'result' in data ) {
@@ -43,15 +45,16 @@ function getWorker() {
4345 } else {
4446 reject ( new Error ( 'Unexpected message from worker' ) )
4547 }
48+ return
49+ }
50+
51+ const { resolve, reject } = pendingQueryAgent
52+ if ( 'error' in data ) {
53+ reject ( data . error )
54+ } else if ( 'columnRanks' in data ) {
55+ resolve ( data . columnRanks )
4656 } else {
47- const { resolve, reject } = pendingQueryAgent
48- if ( 'error' in data ) {
49- reject ( data . error )
50- } else if ( 'indices' in data ) {
51- resolve ( data . indices )
52- } else {
53- reject ( new Error ( 'Unexpected message from worker' ) )
54- }
57+ reject ( new Error ( 'Unexpected message from worker' ) )
5558 }
5659 }
5760 }
@@ -64,25 +67,26 @@ function getWorker() {
6467 * Instead of taking an AsyncBuffer, it takes a AsyncBufferFrom, because it needs
6568 * to be serialized to the worker.
6669 */
67- export function parquetQueryWorker ( { metadata, from, rowStart, rowEnd, orderBy, onChunk } : ParquetReadWorkerOptions ) : Promise < Row [ ] > {
70+ export function parquetQueryWorker ( { metadata, from, rowStart, rowEnd, onChunk } : QueryWorkerOptions ) : Promise < Cells [ ] > {
71+ // TODO(SL) Support passing columns?
6872 return new Promise ( ( resolve , reject ) => {
6973 const queryId = nextQueryId ++
7074 pending . set ( queryId , { kind : 'query' , resolve, reject, onChunk } )
7175 const worker = getWorker ( )
7276
7377 // If caller provided an onChunk callback, worker will send chunks as they are parsed
7478 const chunks = onChunk !== undefined
75- worker . postMessage ( { queryId, metadata, from, rowStart, rowEnd, orderBy, chunks } )
79+ const message : QueryClientMessage = { queryId, metadata, from, rowStart, rowEnd, chunks, kind : 'query' }
80+ worker . postMessage ( message )
7681 } )
7782}
7883
79- export function parquetSortIndexWorker ( { metadata, from, orderBy } : ParquetSortIndexOptions ) : Promise < number [ ] > {
84+ export function parquetColumnRanksWorker ( { metadata, from, column } : ColumnRanksWorkerOptions ) : Promise < number [ ] > {
8085 return new Promise ( ( resolve , reject ) => {
8186 const queryId = nextQueryId ++
82- pending . set ( queryId , { kind : 'sortIndex ' , resolve, reject } )
87+ pending . set ( queryId , { kind : 'columnRanks ' , resolve, reject } )
8388 const worker = getWorker ( )
84- worker . postMessage ( {
85- queryId, metadata, from, orderBy, sortIndex : true ,
86- } )
89+ const message : ColumnRanksClientMessage = { queryId, metadata, from, column, kind : 'columnRanks' }
90+ worker . postMessage ( message )
8791 } )
8892}
0 commit comments