Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions bench/web/components/Header.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@ describe('Header (server-rendered chrome)', () => {
expect(matches).toHaveLength(2);
});

it('links the Vortex logo to vortex.dev', () => {
expect(html).toContain(
'<a class="logo-link" href="https://vortex.dev" aria-label="vortex.dev home">',
);
});

it('renders the theme toggle with the v3 server-default label', () => {
expect(html).toContain('data-role="theme-toggle"');
expect(html).toContain('data-next-theme="light"');
Expand Down
8 changes: 4 additions & 4 deletions bench/web/components/Header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

'use client';

import Link from 'next/link';
import { useEffect, useLayoutEffect, useRef, useState } from 'react';

import { FilterBar } from '@/components/FilterBar';
Expand All @@ -24,7 +23,8 @@ import { effectiveTheme } from '@/lib/theme';
* `server/src/html/render.rs::site_header` plus the section-18 header controls
* of `chart-init.js`: the hamburger-toggled mobile nav panel (expand/collapse
* all, the global filter dropdown, and the mobile-only GitHub link), the
* theme-aware logo, the desktop GitHub link, and the theme toggle.
* theme-aware logo (a link to vortex.dev), the desktop GitHub link, and the
* theme toggle.
*
* Expand/Collapse All writes `details.open` on every group disclosure
* directly, then schedules one write of the open set into the URL fragment
Expand Down Expand Up @@ -139,7 +139,7 @@ export function Header({
>
<MenuIcon size={18} />
</button>
<Link className="logo-link" href="/" aria-label="bench.vortex.dev home">
<a className="logo-link" href="https://vortex.dev" aria-label="vortex.dev home">
<img
className="site-logo logo-light"
src="/Vortex_Black_NoBG.svg"
Expand All @@ -154,7 +154,7 @@ export function Header({
width={654}
height={190}
/>
</Link>
</a>
<h1 className="site-title">Vortex Benchmarks</h1>
</div>
<div className="header-center">
Expand Down
2 changes: 1 addition & 1 deletion src/components/logo-banner/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ export function LogoBanner({ className }: { className?: string | undefined }) {
/>
{soon && (
<span className="vx-label-sm vx-logos-soon">
Coming soon
In proposal
</span>
)}
</a>
Expand Down
18 changes: 9 additions & 9 deletions src/components/logo-banner/logos.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export type Logo = {
height: number;
/** The owner's page about its Vortex use, else its homepage. */
href: string;
/** Tagged "Coming soon": its Vortex support has not shipped yet. */
/** Tagged "In proposal": its Vortex support is proposed, not shipped. */
soon?: true;
};

Expand All @@ -37,7 +37,7 @@ export type Logo = {
// links to the owner's own page that mentions Vortex where there is one
// (docs, a post or a list of users), else to the owner's homepage. Dash0
// links to the Vortex post by Polar Signals, which it acquired. Apache
// Iceberg is tagged "Coming soon" until its Vortex support ships.
// Iceberg is tagged "In proposal" until its Vortex support ships.
export const LOGOS: readonly Logo[] = [
{
name: "Microsoft",
Expand Down Expand Up @@ -74,13 +74,6 @@ export const LOGOS: readonly Logo[] = [
height: 26,
href: "https://spice.ai/blog/vortex-at-spice-ai-the-columnar-format-for-data-intensive-workloads"
},
{
name: "LangChain",
image: langchain,
width: 136,
height: 25,
href: "https://www.langchain.com/blog/introducing-smithdb"
},
{
name: "DatologyAI",
image: datologyai,
Expand All @@ -95,6 +88,13 @@ export const LOGOS: readonly Logo[] = [
height: 23,
href: "https://www.polarsignals.com/blog/posts/2025/11/25/interface-parquet-vortex"
},
{
name: "LangChain",
image: langchain,
width: 136,
height: 25,
href: "https://www.langchain.com/blog/introducing-smithdb"
},
{
name: "Milvus",
image: milvus,
Expand Down
6 changes: 3 additions & 3 deletions src/lib/bench-summary.ts
Original file line number Diff line number Diff line change
Expand Up @@ -135,19 +135,19 @@ const SOURCES: (Source | Panel)[] = [
},
GPU_PANEL,
{
title: "Random access, NVMe, cold",
title: "Random access, NVMe, hot",
unit: "ms",
kind: "speed",
better: "lower",
group: "Random Access (NVMe)",
rankings: (s) => s.coldRankings,
rankings: (s) => s.hotRankings,
name: (f) => f,
score: "score",
systems: WITH_ARROW,
// Bench sums a dataset's charts ("taxi", "taxi/correlated",
// "taxi/uniform") into one time per dataset.
times: {
series: (f) => `${f}:cold`,
series: (f) => `${f}:hot`,
bucket: (chart) => chart.split("/")[0] ?? chart
}
},
Expand Down
4 changes: 2 additions & 2 deletions tests/smoke.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ test.describe("home bands", () => {
expect(names.slice(0, 3)).toEqual(["Microsoft", "Palantir", "Spiral"]);
expect(new Set(names).size).toBe(names.length);
await expect(
banner.getByRole("link", { name: "Apache Iceberg Coming soon" })
banner.getByRole("link", { name: "Apache Iceberg In proposal" })
).toHaveClass("is-soon");
// Every mark loads.
for (const img of await banner.getByRole("img").all())
Expand Down Expand Up @@ -1026,7 +1026,7 @@ test.describe("logo banner under reduced motion", () => {
.locator('section[aria-label="Ecosystem"] .vx-logos-set')
.first();
expect(await set.locator("img").count()).toBeGreaterThanOrEqual(16);
// A "Coming soon" tag hangs past its logo, so the tags are checked too.
// An "In proposal" tag hangs past its logo, so the tags are checked too.
const marks = set.locator(":is(img, .vx-logos-soon)");
for (const box of await marks.evaluateAll((els) =>
els.map((e) => e.getBoundingClientRect().toJSON())
Expand Down
28 changes: 14 additions & 14 deletions tests/unit/bench-summary.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ const PAYLOAD = fixture("bench-groups.json") as {
};
// bench.vortex.dev/api/group/{slug}?n=20 for the two time panels' groups, read
// at the same time, cut down to the series the card reads (and one it does
// not) and their last five commits.
// not) and their last five commits. Random access's hot series were read on
// 30 Oct 2026, from the same two commits as the rest.
const CHARTS = {
Clickbench: fixture("bench-group-clickbench.json"),
"Random Access (NVMe)": fixture("bench-group-random-access-nvme.json")
Expand Down Expand Up @@ -60,18 +61,19 @@ const charts = () =>
>;

// Each system's geomean time in ms, computed from the fixture apart from the
// site's code (Python, 29 Oct 2026): the latest time per ClickBench query,
// and per random-access dataset the sum of its charts' latest times.
// site's code (Python, 29 Oct 2026; random access, 30 Oct): the latest time
// per ClickBench query, and per random-access dataset the sum of its charts'
// latest hot times.
const CLICKBENCH_MS = {
Vortex: 42.24600623816063,
Parquet: 65.621614465414,
Lance: 578.6306006236966
};
const RANDOM_ACCESS_MS = {
Vortex: 2.222937250565255,
Parquet: 70.3627371272798,
Lance: 3.5349948744551765,
Arrow: 3.716574078241951
Vortex: 0.7290522397517741,
Parquet: 70.61301694616571,
Lance: 2.1526584338038828,
Arrow: 3.7780608403173668
};

// The six panels from the fixtures. The ratio panels carry bench's published
Expand Down Expand Up @@ -127,7 +129,7 @@ const PANELS: Panel[] = [
},
GPU_PANEL,
{
title: "Random access, NVMe, cold",
title: "Random access, NVMe, hot",
unit: "ms",
kind: "speed",
better: "lower",
Expand Down Expand Up @@ -181,7 +183,7 @@ describe("panelsFrom", () => {
};
for (const [i, g, key, name] of [
[2, "Clickbench", "rankings", (f: string) => `datafusion:${f}`],
[4, "Random Access (NVMe)", "coldRankings", (f: string) => f]
[4, "Random Access (NVMe)", "hotRankings", (f: string) => f]
] as const) {
const rows = panels?.[i]?.rows ?? [];
const ms = (s: string) => rows.find((r) => r.system === s)?.score ?? NaN;
Expand Down Expand Up @@ -210,10 +212,8 @@ describe("panelsFrom", () => {

it("drops a time that bench does not score", () => {
const gs = groups();
const cold = group(gs, "Random Access (NVMe)").summary;
cold.coldRankings = (cold.coldRankings ?? []).filter(
(r) => r.name !== "lance"
);
const hot = group(gs, "Random Access (NVMe)").summary;
hot.hotRankings = (hot.hotRankings ?? []).filter((r) => r.name !== "lance");
assert.deepEqual(panelsFrom(gs, charts())?.[4]?.rows[2], {
system: "Lance",
score: null,
Expand Down Expand Up @@ -341,7 +341,7 @@ describe("panelsFrom", () => {

it("gives null when a group reports none of the systems it shows", () => {
const gs = groups();
group(gs, "Random Access (NVMe)").summary.coldRankings = [];
group(gs, "Random Access (NVMe)").summary.hotRankings = [];
assert.equal(panelsFrom(gs, charts()), null);
// Arrow alone is shown only where bench runs it, so a scan ranking that
// listed only Arrow still counts as none.
Expand Down
12 changes: 6 additions & 6 deletions tests/unit/benchmark-card.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ describe("BenchPanel", () => {

it("matches renderPanel for a missing and a partial system", () => {
const panel: Panel = {
title: "Random access, NVMe, cold",
title: "Random access, NVMe, hot",
unit: "ms",
kind: "speed",
better: "lower",
Expand Down Expand Up @@ -115,7 +115,7 @@ describe("BenchmarkCard", () => {
});

// Note 34: the bars and the big figure read the same numbers, so NVMe's
// bars give the 32× above them. Note 63: time panels show geomean ms, each
// bars give the 97× above them. Note 63: time panels show geomean ms, each
// value carries a short unit, and below 2× the figure is a percentage.
it("ends each bar in its value and unit, keeps the full unit for screen readers and hover, and the bars agree with the figure", () => {
assert.ok(PANELS);
Expand All @@ -133,7 +133,7 @@ describe("BenchmarkCard", () => {
["1.58×", "1.00×", "0.53×"],
["42.25 ms", "65.62 ms", "578.63 ms"],
["17.00 ms", "65.88 ms", "N/A"],
["2.22 ms", "3.53 ms", "3.72 ms", "70.36 ms"],
["0.73 ms", "2.15 ms", "3.78 ms", "70.61 ms"],
["1×", "1.07×", "1.99×", "5.59×"]
].flat()
);
Expand All @@ -150,11 +150,11 @@ describe("BenchmarkCard", () => {
["1.58× Parquet", "1.00× Parquet", "0.53× Parquet"],
["42.25 ms", "65.62 ms", "578.63 ms"],
["17.00 ms", "65.88 ms", "not available, no cuDF integration"],
["2.22 ms", "3.53 ms", "3.72 ms", "70.36 ms"],
["0.73 ms", "2.15 ms", "3.78 ms", "70.61 ms"],
["1×", "1.07×", "1.99×", "5.59×"]
].flat()
);
assert.match(html, /<div class="vx-bar is-arrow" title="Arrow: 3\.72 ms">/);
assert.match(html, /<div class="vx-bar is-arrow" title="Arrow: 3\.78 ms">/);
const big = [
...html.matchAll(
/class="vx-bench-big"><span class="vx-stat">([^<]*)<\/span> <span class="vx-caption vx-bench-note">([^<]*)</g
Expand All @@ -165,7 +165,7 @@ describe("BenchmarkCard", () => {
"58% faster than Parquet",
"55% faster than Parquet",
"3.9× faster than Parquet",
"32× faster than Parquet",
"97× faster than Parquet",
"7% larger than Parquet"
]);
// Each panel's value column fits its longest value, so its bars share a scale.
Expand Down
Loading
Loading