Skip to content

Commit e3eb3d7

Browse files
committed
make run selector the first selector and move most filters into a dropdown
1 parent 1f9c2ce commit e3eb3d7

1 file changed

Lines changed: 108 additions & 37 deletions

File tree

index.html

Lines changed: 108 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -197,12 +197,10 @@
197197

198198
.th-entry-hilite {
199199
background: var(--highlight-color);
200-
font-weight: bold;
201200
}
202201

203202
.summary-row:hover, .summary-row-hilite {
204203
background: var(--highlight-color) !important;
205-
font-weight: bold;
206204
}
207205

208206
#details {
@@ -228,6 +226,15 @@
228226

229227
#nothing-selected {
230228
display: none;
229+
width: 100%;
230+
height: 45vh;
231+
overflow-y: scroll;
232+
scrollbar-gutter: stable;
233+
box-sizing: border-box;
234+
align-items: center;
235+
padding-right: 1rem;
236+
margin-top: 1.5rem;
237+
margin-bottom: 1rem;
231238
font-size: 32pt;
232239
font-weight: bold;
233240
color: var(--nothing-selected-color);
@@ -398,7 +405,30 @@ <h1>ClickBench — a Benchmark For Analytical DBMS</h1>
398405
</tbody>
399406
</table>
400407

408+
<div id="nothing-selected" class="stick-left">Nothing selected</div>
409+
401410
<table class="selectors-container stick-left">
411+
<tr>
412+
<th>Metric: </th>
413+
<td id="selectors_run">
414+
<a class="selector" id="selector-metric-combined">Combined</a>
415+
<a class="selector" id="selector-metric-cold">Cold Run</a>
416+
<a class="selector" id="selector-metric-hot">Hot Run</a>
417+
<a class="selector" id="selector-metric-load">Load Time</a>
418+
<a class="selector" id="selector-metric-size">Storage Size</a>
419+
</td>
420+
</tr>
421+
<tr>
422+
<th>Database: </th>
423+
<td id="selectors_database">
424+
<a id="select-all-databases" class="selector selector-active">All</a>
425+
</td>
426+
</tr>
427+
</table>
428+
429+
<details class="selectors-container stick-left">
430+
<summary class="selector">Additional filters</summary>
431+
<table>
402432
<tr>
403433
<th>System: </th>
404434
<td id="selectors_system">
@@ -444,19 +474,8 @@ <h1>ClickBench — a Benchmark For Analytical DBMS</h1>
444474
<a id="selector-tuned-yes" class="selector selector-active">Yes</a>
445475
</td>
446476
</tr>
447-
<tr>
448-
<th>Metric: </th>
449-
<td id="selectors_run">
450-
<a class="selector" id="selector-metric-combined">Combined</a>
451-
<a class="selector" id="selector-metric-cold">Cold Run</a>
452-
<a class="selector" id="selector-metric-hot">Hot Run</a>
453-
<a class="selector" id="selector-metric-load">Load Time</a>
454-
<a class="selector" id="selector-metric-size">Storage Size</a>
455-
</td>
456-
</tr>
457-
</table>
458-
459-
<div id="nothing-selected" class="stick-left">Nothing selected</div>
477+
</table>
478+
</details>
460479

461480
<div class="stick-left comparison">
462481
<h2>Detailed Comparison</h2>
@@ -478,6 +497,7 @@ <h2>Detailed Comparison</h2>
478497
const missing_result_time = 300;
479498

480499
let selectors = {
500+
"database": {},
481501
"system": {},
482502
"type": {},
483503
"machine": {},
@@ -508,12 +528,30 @@ <h2>Detailed Comparison</h2>
508528

509529
/// Generate selectors
510530

531+
let databases = document.getElementById('selectors_database');
511532
let systems = document.getElementById('selectors_system');
512533
let types = document.getElementById('selectors_type');
513534
let machines = document.getElementById('selectors_machine');
514535
let cluster_sizes = document.getElementById('selectors_cluster_size');
515536

516-
let unique_systems = [... new Set(data.map(elem => elem.system))].sort((a, b) => a.localeCompare(b, undefined, {numeric: true, sensitivity: 'base'}));
537+
function database(system_name) {
538+
// Remove any parenthesized comments from the system name
539+
// They only contain variations of the same DB and pollute the selectors
540+
const base = system_name.replace(/\s*\([^)]*\)\s*$/, '');
541+
const aliases = {
542+
'ClickHouse ☁️': 'ClickHouse',
543+
'Timescale ☁️': 'TimescaleDB',
544+
};
545+
return aliases[base] || base;
546+
}
547+
548+
data.forEach(elem => { elem.database = database(elem.system); });
549+
additional_data_size_points.forEach(elem => { elem.database = database(elem.system); });
550+
551+
const uniqueSorted = values => [... new Set(values)].sort((a, b) => a.localeCompare(b, undefined, {numeric: true, sensitivity: 'base'}));
552+
553+
let unique_databases = uniqueSorted(data.map(elem => elem.database));
554+
let all_systems = uniqueSorted(data.map(elem => elem.system));
517555

518556
function toggle(e, elem, selectors_map) {
519557
selectors_map[elem] = !selectors_map[elem];
@@ -532,15 +570,36 @@ <h2>Detailed Comparison</h2>
532570
updateHistory();
533571
}
534572

535-
unique_systems.map(elem => {
573+
unique_databases.map(elem => {
574+
let selector = document.createElement('a');
575+
selector.className = 'selector selector-active';
576+
selector.appendChild(document.createTextNode(elem));
577+
databases.appendChild(selector);
578+
selectors.database[elem] = data.some(entry => entry.database == elem && !entry.hide);
579+
selector.addEventListener('click', e => toggle(e, elem, selectors.database));
580+
581+
/// Highlighting summary rows and table columns on hovering over the database selector.
582+
selector.addEventListener('mouseover', e => {
583+
[...document.querySelectorAll('.summary-row')].map(row => {
584+
row.className = row.dataset.database == elem ? 'summary-row summary-row-hilite' : 'summary-row' });
585+
[...document.querySelectorAll('.th-entry')].map(th => {
586+
th.className = th.dataset.database == elem ? 'th-entry th-entry-hilite' : 'th-entry' });
587+
});
588+
selector.addEventListener('mouseout', e => {
589+
[...document.querySelectorAll('.summary-row')].map(row => { row.className = 'summary-row' });
590+
[...document.querySelectorAll('.th-entry')].map(row => { row.className = 'th-entry' });
591+
});
592+
});
593+
594+
all_systems.map(elem => {
536595
let selector = document.createElement('a');
537596
selector.className = 'selector selector-active';
538597
selector.appendChild(document.createTextNode(elem));
539598
systems.appendChild(selector);
540-
selectors.system[elem] = data.some(entry => entry.system == elem && !entry.hide);
599+
selectors.system[elem] = true;
541600
selector.addEventListener('click', e => toggle(e, elem, selectors.system));
542601

543-
/// Highlighting summary rows and table columns on hovering over the system selector.
602+
/// Highlighting summary rows and table columns on hovering over the database selector.
544603
selector.addEventListener('mouseover', e => {
545604
[...document.querySelectorAll('.summary-row')].map(row => {
546605
row.className = row.dataset.system == elem ? 'summary-row summary-row-hilite' : 'summary-row' });
@@ -651,6 +710,7 @@ <h2>Detailed Comparison</h2>
651710
updateHistory();
652711
});
653712

713+
document.getElementById('select-all-databases').addEventListener('click', e => toggleAll(e, selectors.database));
654714
document.getElementById('select-all-systems').addEventListener('click', e => toggleAll(e, selectors.system));
655715
document.getElementById('select-all-types').addEventListener('click', e => toggleAll(e, selectors.type));
656716
document.getElementById('select-all-machines').addEventListener('click', e => toggleAll(e, selectors.machine));
@@ -669,7 +729,8 @@ <h2>Detailed Comparison</h2>
669729
selectors.queries = [...data[0].result.keys()].map(k => true);
670730

671731
function updateSelectors() {
672-
[...systems.childNodes].map(elem => { elem.className = selectors.system[elem.innerText] ? 'selector selector-active' : 'selector' });
732+
[...databases.childNodes].map(elem => { elem.className = selectors.database[elem.innerText] ? 'selector selector-active' : 'selector' });
733+
[...systems.childNodes].map(elem => { elem.className = selectors.system[elem.textContent] ? 'selector selector-active' : 'selector' });
673734
[...types.childNodes].map(elem => { elem.className = selectors.type[elem.innerText] ? 'selector selector-active' : 'selector' });
674735
[...machines.childNodes].map(elem => { elem.className = selectors.machine[elem.innerText] ? 'selector selector-active' : 'selector' });
675736
[...cluster_sizes.childNodes].map(elem => { elem.className = selectors.cluster_size[elem.innerText] ? 'selector selector-active' : 'selector' });
@@ -702,6 +763,7 @@ <h2>Detailed Comparison</h2>
702763
}
703764
}
704765
}
766+
process('database', databases);
705767
process('system', systems);
706768
process('tags', types);
707769
process('machine', machines);
@@ -825,6 +887,7 @@ <h2>Detailed Comparison</h2>
825887
tr.className = 'summary-row';
826888

827889
tr.dataset.system = elem.system;
890+
tr.dataset.database = elem.database;
828891

829892
let td_name = document.createElement('td');
830893
td_name.className = 'summary-name';
@@ -939,6 +1002,7 @@ <h2>Detailed Comparison</h2>
9391002
clearElement(details_body);
9401003

9411004
let filtered_data = data.filter(elem =>
1005+
selectors.database[elem.database] &&
9421006
selectors.system[elem.system] &&
9431007
selectors.machine[elem.machine] &&
9441008
selectors.cluster_size[elem.cluster_size] &&
@@ -1001,6 +1065,7 @@ <h2>Detailed Comparison</h2>
10011065
th.appendChild(document.createTextNode(`${elem.system}\n(${Number.isInteger(elem.cluster_size) && elem.cluster_size > 1 ? elem.cluster_size + '×': ''}${elem.machine})`));
10021066
th.className = 'th-entry';
10031067
th.dataset.system = elem.system;
1068+
th.dataset.database = elem.database;
10041069
details_head.appendChild(th);
10051070
});
10061071

@@ -1190,14 +1255,17 @@ <h2>Detailed Comparison</h2>
11901255
return decoded;
11911256
}
11921257

1193-
function updateHistory() {
1194-
history.pushState(selectors, '',
1195-
window.location.pathname + (window.location.search || '') + '#' + encodeState(selectors));
1196-
}
1197-
1198-
window.onpopstate = function(event) {
1199-
if (!event.state) { return; }
1200-
selectors = event.state;
1258+
function addMissingSelectors() {
1259+
if (!selectors.database) {
1260+
selectors.database = {};
1261+
if (selectors.system) {
1262+
const selected_databases = new Set(
1263+
data.filter(elem => selectors.system[elem.system]).map(elem => elem.database));
1264+
unique_databases.forEach(k => { selectors.database[k] = selected_databases.has(k) });
1265+
} else {
1266+
unique_databases.forEach(k => { selectors.database[k] = true });
1267+
}
1268+
}
12011269
if (!selectors.opensource) {
12021270
selectors.opensource = {"yes": true, "no": false};
12031271
}
@@ -1207,22 +1275,25 @@ <h2>Detailed Comparison</h2>
12071275
if (!selectors.tuned) {
12081276
selectors.tuned = {"no": true, "yes": false};
12091277
}
1278+
}
1279+
1280+
function updateHistory() {
1281+
history.pushState(selectors, '',
1282+
window.location.pathname + (window.location.search || '') + '#' + encodeState(selectors));
1283+
}
1284+
1285+
window.onpopstate = function(event) {
1286+
if (!event.state) { return; }
1287+
selectors = event.state;
1288+
addMissingSelectors();
12101289
updateSelectors();
12111290
render();
12121291
};
12131292

12141293
if (window.location.hash) {
12151294
try {
12161295
selectors = decodeState(decodeURIComponent(window.location.hash.substring(1)));
1217-
if (!selectors.opensource) {
1218-
selectors.opensource = {"yes": true, "no": false};
1219-
}
1220-
if (!selectors.hardware) {
1221-
selectors.hardware = {"cpu": true, "gpu": false};
1222-
}
1223-
if (!selectors.tuned) {
1224-
selectors.tuned = {"no": true, "yes": false};
1225-
}
1296+
addMissingSelectors();
12261297
} catch {}
12271298
}
12281299

0 commit comments

Comments
 (0)