> hypequery

What hypequery supports today

Current capability matrix for the ClickHouse TypeScript query builder, semantic datasets, Serve APIs, React hooks, and MCP tools.

What hypequery supports today

This page records the shipped surface of hypequery as of 11 August 2026. It is a capability matrix, not a roadmap: “native” means a public typed method exists, “expression” means the feature is supported through an explicit SQL expression inside an otherwise typed query, and “semantic” means it can be declared and executed through @hypequery/datasets.

Short version

argMax, argMin, percentiles, median, standard deviation, variance, final(), limitBy(), array joins, PREWHERE, CTEs, and window expressions are supported today. The tables below show the exact public syntax.

ClickHouse query builder

CapabilityStatusPublic TypeScript syntax
Typed table and column selectionNativetable(), select(), selectConst()
FiltersNativewhere(), orWhere(), grouped predicates, null, range, list, tuple, and pattern operators
PREWHERENativeprewhere(), orPrewhere() and null helpers
JoinsNativeinner, left, right, full, and leftAnyJoin()
Grouping and HAVINGNativegroupBy(), groupByTimeInterval(), having()
Ordering and paginationNativeorderBy(), limit(), offset()
ClickHouse LIMIT BYNativelimitBy(count, field) or multiple fields
ReplacingMergeTree FINALNativefinal()
Array expansionNativearrayJoin(), leftArrayJoin()
Totals and distinct resultsNativewithTotals(), distinct()
CTEsNativewithCTE() with a builder or SQL body
ClickHouse settingsNativesettings()
StreamingNativestream(), streamForEach()
Query SQL inspectionNativetoSQL(), toSQLWithParams()
Result cachingNativecache() and cache providers
Window functionsExpressionselectExpr('... OVER (...)', 'alias')

FINAL

const currentRows = await db
  .table('orders')
  .final()
  .select(['id', 'status', 'updated_at'])
  .execute();

LIMIT BY

const topThreePerRegion = await db
  .table('orders')
  .select(['region', 'id', 'amount'])
  .orderBy('amount', 'DESC')
  .limitBy(3, 'region')
  .execute();

Multiple grouping fields are accepted:

.limitBy(5, ['tenant_id', 'category'])

Window functions

Window functions use the public selectExpr escape hatch. The selected alias remains part of the inferred result type, while the expression body is trusted model code:

import { selectExpr } from '@hypequery/clickhouse';

const ranked = await db
  .table('orders')
  .select([
    'region',
    'amount',
    selectExpr(
      'row_number() OVER (PARTITION BY region ORDER BY amount DESC)',
      'rank',
    ),
  ])
  .execute();

This same pattern covers row_number, rank, dense_rank, lag, lead, running totals, moving averages, and custom window frames.

Query-builder aggregate surface

MethodClickHouse output
sum(column, alias?)sum(column)
count(column, alias?)count(column)
countDistinct(column, alias?)distinct count
avg(column, alias?)avg(column)
min(column, alias?)min(column)
max(column, alias?)max(column)
quantile(column, level, alias?)quantile(level)(column)
argMax(column, by, alias?)argMax(column, by)
argMin(column, by, alias?)argMin(column, by)
stddev(column, alias?)sample standard deviation with stddevSamp
variance(column, alias?)sample variance with varSamp
const statistics = await db
  .table('orders')
  .select(['region'])
  .sum('amount', 'revenue')
  .countDistinct('customer_id', 'unique_customers')
  .quantile('amount', 0.95, 'p95_order_value')
  .argMax('status', 'created_at', 'latest_status')
  .stddev('amount', 'amount_stddev')
  .variance('amount', 'amount_variance')
  .groupBy('region')
  .execute();

Semantic datasets and metrics

@hypequery/datasets supports direct execution through createDatasetClient, HTTP execution through @hypequery/serve, typed React consumers, generated tool schemas, and MCP.

Semantic capabilityStatus
String, number, boolean, and timestamp dimensionsShipped
Column aliases and trusted SQL-backed dimensionsShipped
Named measures and base metricsShipped
Derived metric formulasShipped
Measure-level filtersShipped
Day, week, month, quarter, and year grainsShipped
Runtime tenant isolation with fail-closed scopeShipped
Dataset queries with selected dimensions and measuresShipped
Metric queries with dimensions, filters, order, limit, and offsetShipped
One-hop belongsTo / hasOne dimension traversalShipped
Semantic catalogs and stable contractsShipped
OpenAI, AI SDK, and MCP tool schema generationShipped
Semantic result caching and pagination metadataShipped

The semantic aggregate helpers mirror the builder surface:

measure.sum('amount')
measure.count('id')
measure.countDistinct('customerId')
measure.avg('amount')
measure.min('amount')
measure.max('amount')
measure.percentile('amount', 0.95)
measure.median('amount')
measure.argMax('status', 'createdAt')
measure.argMin('status', 'createdAt')
measure.stddev('amount')
measure.variance('amount')

Percentile naming

The low-level query builder calls ClickHouse’s aggregate quantile(). The semantic layer uses the product-facing name percentile() and compiles it to quantile(level) for ClickHouse. median() is percentile 0.5.

Serve, React, and MCP

SurfaceShipped capabilities
@hypequery/serveIn-process execution, HTTP routes, zod validation, OpenAPI, auth, roles/scopes, tenant injection, CORS, rate limiting, observability, Node and Fetch adapters
@hypequery/reactTyped named-query hooks, metric hooks, dataset hooks, mutations, infinite queries, route manifests, per-request auth headers, one-time 401 refresh
@hypequery/mcpDataset discovery, schema introspection, named metric queries, ad hoc dataset queries, generated JSON schemas, host-controlled tenant scope, stdio transport

A complete current dataset

import {
  dataset,
  dimension,
  divide,
  measure,
  nullIfZero,
} from '@hypequery/datasets';

export const Orders = dataset('orders', {
  source: 'orders',
  tenantKey: 'tenant_id',
  timeKey: 'created_at',
  dimensions: {
    region: dimension.string(),
    status: dimension.string(),
    customerId: dimension.string({ column: 'customer_id' }),
    createdAt: dimension.timestamp({ column: 'created_at' }),
  },
  measures: {
    revenue: measure.sum('amount'),
    orderCount: measure.count('id'),
    p95OrderValue: measure.percentile('amount', 0.95),
    latestStatus: measure.argMax('status', 'createdAt'),
  },
});

export const revenue = Orders.metric('revenue', { measure: 'revenue' });
export const orderCount = Orders.metric('orderCount', {
  measure: 'orderCount',
});

export const averageOrderValue = Orders.metric('averageOrderValue', {
  uses: { revenue, orderCount },
  formula: ({ revenue, orderCount }) =>
    divide(revenue, nullIfZero(orderCount)),
});

Keep this page current

When a public capability is added or renamed, update this matrix in the same pull request as the implementation and package README. Use the changelog for release-by-release history and the roadmap for work that has not shipped.

On this page