hypequery is a typescript-first query builder for ClickHouse designed specifically for building type-safe analytics dashboards. Unlike generic SQL query builders, hypequery understands your ClickHouse schema and provides full type checking, making it ideal for data-intensive applications.
- π― Type-Safe: Full TypeScript support with types from your ClickHouse schema
- π Performant: Built for real-time analytics with optimized query generation
- π Cross Filtering: Powerful cross-filtering capabilities for interactive dashboards
- π οΈ Developer Friendly: Fluent API design for an intuitive development experience
- π± Platform Agnostic: Works in both Node.js and browser environments
- π Schema Generation: CLI tool to generate TypeScript types from your ClickHouse schema
This library requires one of the following ClickHouse clients as a peer dependency:
npm install @hypequery/clickhousenpm install @hypequery/clickhouse @clickhouse/client-webNote: The library supports multiple client selection strategies:
- Manual injection: Explicitly provide a client instance (required for browser environments)
- Auto-detection: Automatically selects the client for Node.js environments
import { createQueryBuilder } from '@hypequery/clickhouse';
import type { IntrospectedSchema } from './generated-schema';
// Initialize the query builder
const db = createQueryBuilder<IntrospectedSchema>({
host: 'your-clickhouse-host',
username: 'default',
password: 'your-password',
database: 'default'
});
// Build and execute a query
const results = await db
.table('trips')
.select(['pickup_datetime', 'dropoff_datetime', 'total_amount'])
.where('total_amount', '>', 50)
.orderBy('pickup_datetime', 'DESC')
.limit(10)
.execute();import { createQueryBuilder } from '@hypequery/clickhouse';
import { createClient } from '@clickhouse/client-web';
import type { IntrospectedSchema } from './generated-schema';
// Create the ClickHouse client explicitly
const client = createClient({
host: 'your-clickhouse-host',
username: 'default',
password: '',
database: 'default'
});
// Initialize the query builder with the client
const db = createQueryBuilder<IntrospectedSchema>({
client // Explicitly provide the client
});
// Build and execute a query
const results = await db
.table('trips')
.select(['pickup_datetime', 'dropoff_datetime', 'total_amount'])
.where('total_amount', '>', 50)
.orderBy('pickup_datetime', 'DESC')
.limit(10)
.execute();hypequery provides a CLI tool to generate TypeScript types from your ClickHouse schema:
# Install globally (optional)
npm install -g @hypequery/clickhouse
# Generate schema types
npx hypequery-generate-types --host your-clickhouse-host --database your-databaseThis creates a generated-schema.ts file that you can import in your application:
import { createQueryBuilder } from '@hypequery/clickhouse';
import type { IntrospectedSchema } from './generated-schema';
const db = createQueryBuilder<IntrospectedSchema>({
// connection details
});hypequery provides full TypeScript support, ensuring your queries are type-safe:
// Column names are type-checked
const query = db.table('trips')
.select(['pickup_datetime', 'total_amount'])
.where('total_amount', 'gt', 50)
.execute();
// Type error if column doesn't exist
db.table('trips').select(['non_existent_column']); // TypeScript errorImplement interactive dashboards with cross-filtering support:
import { CrossFilter } from '@hypequery/clickhouse';
// Create a filter
const filter = new CrossFilter()
.add({
column: 'pickup_datetime',
operator: 'gte',
value: '2024-01-01'
})
.add({
column: 'total_amount',
operator: 'gt',
value: 20
});
// Apply to multiple queries
const query1 = db.table('trips')
.applyCrossFilters(filter)
.execute();
const query2 = db.table('drivers')
.applyCrossFilters(filter)
.execute();hypequery supports complex queries including joins, aggregations, and subqueries:
// Aggregations
const stats = await db.table('trips')
.avg('total_amount')
.max('trip_distance')
.count('trip_id')
.where('pickup_datetime', 'gte', '2024-01-01')
.execute();
// Joins
const tripsWithDrivers = await db.table('trips')
.select(['trips.trip_id', 'trips.total_amount', 'drivers.name'])
.join('drivers', 'trips.driver_id', 'drivers.id')
.execute();Benefits:
- β Works in all environments (Node.js, browser, bundlers)
- β Explicit control over client configuration
- β Required for browser environments (require() doesn't work in browsers)
- β Synchronous API throughout
const db = createQueryBuilder<IntrospectedSchema>({
host: 'your-clickhouse-host',
username: 'default',
password: '',
database: 'default'
});hypequery follows semantic versioning and provides multiple release channels:
- Latest: Stable releases (
npm install @hypequery/clickhouse) - Beta: Pre-release versions (
npm install @hypequery/clickhouse@beta)
For detailed documentation and examples, visit our documentation site.
- Connection Errors: Ensure your ClickHouse server is running and accessible
- CORS Issues: Use a proxy server for browser environments
- Type Errors: Make sure to regenerate your schema types after schema changes
- Client Not Found: Make sure you have installed at least one of the required peer dependencies:
@clickhouse/client(for Node.js environments)@clickhouse/client-web(for browser/universal environments)
- Browser Auto-Detection: Auto-detection doesn't work in browsers because
require()calls don't work. Use manual injection instead.
This project is licensed under the Apache-2.0 License - see the LICENSE file for details.
- π Documentation
- π Issue Tracker
- π¬ Discussions