diff --git a/eslint.config.js b/eslint.config.js index 857a7f7c..f4f41da2 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -9,7 +9,11 @@ import typescript from 'typescript-eslint' export default typescript.config( { ignores: ['coverage/', 'dist/', 'lib/'] }, { - extends: [javascript.configs.recommended, ...typescript.configs.strictTypeChecked, ...typescript.configs.stylisticTypeChecked], + extends: [ + javascript.configs.recommended, + ...typescript.configs.strictTypeChecked, + ...typescript.configs.stylisticTypeChecked, + ], files: ['**/*.{ts,tsx,js}'], languageOptions: { globals: globals.browser, @@ -49,6 +53,7 @@ export default typescript.config( 'func-style': ['error', 'declaration'], indent: ['error', 2, { SwitchCase: 1 }], 'key-spacing': 'error', + 'keyword-spacing': 'error', 'no-constant-condition': 'off', 'no-extra-parens': 'error', 'no-multi-spaces': 'error', diff --git a/package.json b/package.json index 67685f91..2741b505 100644 --- a/package.json +++ b/package.json @@ -64,25 +64,25 @@ }, "devDependencies": { "@eslint/js": "9.29.0", - "@storybook/react-vite": "9.0.12", + "@storybook/react-vite": "9.0.13", "@testing-library/react": "16.3.0", - "@types/node": "24.0.3", + "@types/node": "24.0.4", "@types/react": "19.1.8", "@types/react-dom": "19.1.6", - "@vitejs/plugin-react": "4.5.2", + "@vitejs/plugin-react": "4.6.0", "@vitest/coverage-v8": "3.2.4", "eslint": "9.29.0", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "5.2.0", "eslint-plugin-react-refresh": "0.4.20", - "eslint-plugin-storybook": "9.0.12", + "eslint-plugin-storybook": "9.0.13", "globals": "16.2.0", "jsdom": "26.1.0", "nodemon": "3.1.10", "npm-run-all": "4.1.5", - "storybook": "9.0.12", + "storybook": "9.0.13", "typescript": "5.8.3", - "typescript-eslint": "8.34.1", + "typescript-eslint": "8.35.0", "vite": "6.3.5", "vitest": "3.2.4" }, diff --git a/src/lib/workers/parquetWorker.ts b/src/lib/workers/parquetWorker.ts index a3f29874..eff4c12a 100644 --- a/src/lib/workers/parquetWorker.ts +++ b/src/lib/workers/parquetWorker.ts @@ -51,10 +51,10 @@ self.onmessage = async ({ data }: { data: ClientMessage }) => { postErrorMessage({ error: error as Error, queryId }) } } else { - const { rowStart, rowEnd, chunks } = data + const { rowStart, rowEnd, orderBy, filter, chunks } = data const onChunk = chunks ? (chunk: ColumnData) => { postChunkMessage({ chunk, queryId }) } : undefined try { - const result = await parquetQuery({ metadata, file, rowStart, rowEnd, compressors, onChunk }) + const result = await parquetQuery({ metadata, file, rowStart, rowEnd, orderBy, filter, compressors, onChunk }) postResultMessage({ result, queryId }) } catch (error) { postErrorMessage({ error: error as Error, queryId }) diff --git a/src/lib/workers/parquetWorkerClient.ts b/src/lib/workers/parquetWorkerClient.ts index 6b64ecba..c7e1f7f4 100644 --- a/src/lib/workers/parquetWorkerClient.ts +++ b/src/lib/workers/parquetWorkerClient.ts @@ -1,7 +1,7 @@ import ParquetWorker from './parquetWorker?worker&inline' /// ^ the worker is bundled with the main thread code (inline) which is easier for users to import /// (no need to copy the worker file to the right place) -import { ColumnData } from 'hyparquet' +import type { ColumnData } from 'hyparquet' import type { Cells, ColumnRanksClientMessage, ColumnRanksWorkerMessage, ColumnRanksWorkerOptions, QueryClientMessage, QueryWorkerMessage, QueryWorkerOptions } from './types.js' let worker: Worker | undefined @@ -66,7 +66,7 @@ function getWorker() { * Instead of taking an AsyncBuffer, it takes a AsyncBufferFrom, because it needs * to be serialized to the worker. */ -export function parquetQueryWorker({ metadata, from, rowStart, rowEnd, onChunk }: QueryWorkerOptions): Promise { +export function parquetQueryWorker({ metadata, from, rowStart, rowEnd, orderBy, filter, onChunk }: QueryWorkerOptions): Promise { // TODO(SL) Support passing columns? return new Promise((resolve, reject) => { const queryId = nextQueryId++ @@ -75,7 +75,7 @@ export function parquetQueryWorker({ metadata, from, rowStart, rowEnd, onChunk } // If caller provided an onChunk callback, worker will send chunks as they are parsed const chunks = onChunk !== undefined - const message: QueryClientMessage = { queryId, metadata, from, rowStart, rowEnd, chunks, kind: 'query' } + const message: QueryClientMessage = { queryId, metadata, from, rowStart, rowEnd, orderBy, filter, chunks, kind: 'query' } worker.postMessage(message) }) } diff --git a/src/lib/workers/types.ts b/src/lib/workers/types.ts index babc0b25..df26444b 100644 --- a/src/lib/workers/types.ts +++ b/src/lib/workers/types.ts @@ -1,4 +1,5 @@ -import { ColumnData, FileMetaData } from 'hyparquet' +import type { ColumnData, FileMetaData } from 'hyparquet' +import type { ParquetQueryFilter } from 'hyparquet/src/types.js' // Serializable constructors for AsyncBuffers interface AsyncBufferFromFile { @@ -29,6 +30,8 @@ export interface ErrorMessage extends Message { export interface QueryWorkerOptions extends CommonWorkerOptions { rowStart?: number, rowEnd?: number, + orderBy?: string, + filter?: ParquetQueryFilter, onChunk?: (chunk: ColumnData) => void } export interface QueryClientMessage extends QueryWorkerOptions, Message {