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 {
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>
478497const missing_result_time = 300 ;
479498
480499let 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' ) ;
511532let systems = document . getElementById ( 'selectors_system' ) ;
512533let types = document . getElementById ( 'selectors_type' ) ;
513534let machines = document . getElementById ( 'selectors_machine' ) ;
514535let 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
518556function 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 ) ) ;
654714document . getElementById ( 'select-all-systems' ) . addEventListener ( 'click' , e => toggleAll ( e , selectors . system ) ) ;
655715document . getElementById ( 'select-all-types' ) . addEventListener ( 'click' , e => toggleAll ( e , selectors . type ) ) ;
656716document . getElementById ( 'select-all-machines' ) . addEventListener ( 'click' , e => toggleAll ( e , selectors . machine ) ) ;
@@ -669,7 +729,8 @@ <h2>Detailed Comparison</h2>
669729selectors . queries = [ ...data [ 0 ] . result . keys ( ) ] . map ( k => true ) ;
670730
671731function 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
12141293if ( 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