@@ -27,12 +27,13 @@ import {
2727 InterpretedResultsSortState ,
2828 SortDirection ,
2929 ALERTS_TABLE_NAME ,
30+ GRAPH_TABLE_NAME ,
3031 RawResultsSortState ,
3132} from './pure/interface-types' ;
3233import { Logger } from './logging' ;
3334import * as messages from './pure/messages' ;
3435import { commandRunner } from './commandRunner' ;
35- import { CompletedQuery , interpretResultsSarif } from './query-results' ;
36+ import { CompletedQuery , interpretResultsSarif , interpretGraphResults } from './query-results' ;
3637import { QueryInfo , tmpDir } from './run-queries' ;
3738import { parseSarifLocation , parseSarifPlainTextMessage } from './pure/sarif-utils' ;
3839import {
@@ -87,12 +88,33 @@ function sortInterpretedResults(
8788 }
8889}
8990
90- function numPagesOfResultSet ( resultSet : RawResultSet ) : number {
91- return Math . ceil ( resultSet . schema . rows / PAGE_SIZE . getValue < number > ( ) ) ;
91+ function interpretedPageSize ( interpretation : Interpretation | undefined ) : number {
92+ if ( interpretation && interpretation . data . t == 'GraphInterpretationData' )
93+ return 1 ;
94+ return PAGE_SIZE . getValue < number > ( ) ;
95+ }
96+
97+ function numPagesOfResultSet ( resultSet : RawResultSet , interpretation ?: Interpretation ) : number {
98+ const pageSize = interpretedPageSize ( interpretation ) ;
99+
100+ const n = interpretation && interpretation . data . t == 'GraphInterpretationData'
101+ ? interpretation . data . dot . length
102+ : resultSet . schema . rows ;
103+
104+ return Math . ceil ( n / pageSize ) ;
92105}
93106
94107function numInterpretedPages ( interpretation : Interpretation | undefined ) : number {
95- return Math . ceil ( ( interpretation ?. data . runs [ 0 ] . results ?. length || 0 ) / PAGE_SIZE . getValue < number > ( ) ) ;
108+ if ( ! interpretation )
109+ return 0 ;
110+
111+ const pageSize = interpretedPageSize ( interpretation ) ;
112+
113+ const n = interpretation . data . t == 'GraphInterpretationData'
114+ ? interpretation . data . dot . length
115+ : interpretation . data . runs [ 0 ] . results ?. length || 0 ;
116+
117+ return Math . ceil ( n / pageSize ) ;
96118}
97119
98120export class InterfaceManager extends DisposableObject {
@@ -303,7 +325,7 @@ export class InterfaceManager extends DisposableObject {
303325 await this . changeInterpretedSortState ( msg . sortState ) ;
304326 break ;
305327 case 'changePage' :
306- if ( msg . selectedTable === ALERTS_TABLE_NAME ) {
328+ if ( msg . selectedTable === ALERTS_TABLE_NAME || msg . selectedTable === GRAPH_TABLE_NAME ) {
307329 await this . showPageOfInterpretedResults ( msg . pageNumber ) ;
308330 }
309331 else {
@@ -323,8 +345,8 @@ export class InterfaceManager extends DisposableObject {
323345 break ;
324346 default :
325347 assertNever ( msg ) ;
326- }
327- } catch ( e ) {
348+ }
349+ } catch ( e ) {
328350 void showAndLogErrorMessage ( e . message , {
329351 fullMessage : e . stack
330352 } ) ;
@@ -434,7 +456,7 @@ export class InterfaceManager extends DisposableObject {
434456 const parsedResultSets : ParsedResultSets = {
435457 pageNumber : 0 ,
436458 pageSize,
437- numPages : numPagesOfResultSet ( resultSet ) ,
459+ numPages : numPagesOfResultSet ( resultSet , this . _interpretation ) ,
438460 numInterpretedPages : numInterpretedPages ( this . _interpretation ) ,
439461 resultSet : { ...resultSet , t : 'RawResultSet' } ,
440462 selectedTable : undefined ,
@@ -484,7 +506,7 @@ export class InterfaceManager extends DisposableObject {
484506 metadata : this . _displayedQuery . query . metadata ,
485507 pageNumber,
486508 resultSetNames,
487- pageSize : PAGE_SIZE . getValue ( ) ,
509+ pageSize : interpretedPageSize ( this . _interpretation ) ,
488510 numPages : numInterpretedPages ( this . _interpretation ) ,
489511 queryName : this . _displayedQuery . toString ( ) ,
490512 queryPath : this . _displayedQuery . query . program . queryPath
@@ -582,30 +604,50 @@ export class InterfaceManager extends DisposableObject {
582604 sourceInfo : cli . SourceInfo | undefined ,
583605 sourceLocationPrefix : string ,
584606 sortState : InterpretedResultsSortState | undefined
585- ) : Promise < Interpretation | undefined > {
607+ ) : Promise < Interpretation | undefined > {
586608 if ( ! resultsPaths ) {
587609 void this . logger . log ( 'No results path. Cannot display interpreted results.' ) ;
588610 return undefined ;
589611 }
612+ let data ;
613+ let numTotalResults ;
614+ if ( metadata ?. kind === 'graph' )
615+ {
616+ data = await interpretGraphResults (
617+ this . cliServer ,
618+ metadata ,
619+ resultsPaths ,
620+ sourceInfo
621+ ) ;
622+ numTotalResults = data . dot . length ;
623+ }
624+ else
625+ {
626+ const sarif = await interpretResultsSarif (
627+ this . cliServer ,
628+ metadata ,
629+ resultsPaths ,
630+ sourceInfo
631+ ) ;
590632
591- const sarif = await interpretResultsSarif (
592- this . cliServer ,
593- metadata ,
594- resultsPaths ,
595- sourceInfo
596- ) ;
633+ sarif . runs . forEach ( run => {
634+ if ( run . results !== undefined ) {
635+ sortInterpretedResults ( run . results , sortState ) ;
636+ }
637+ } ) ;
597638
598- sarif . runs . forEach ( run => {
599- if ( run . results !== undefined ) {
600- sortInterpretedResults ( run . results , sortState ) ;
601- }
602- } ) ;
639+ sarif . sortState = sortState ;
640+ data = sarif ;
603641
604- const numTotalResults = sarif . runs [ 0 ] ?. results ?. length || 0 ;
642+ numTotalResults = ( ( ) => {
643+ if ( sarif . runs . length === 0 ) return 0 ;
644+ if ( sarif . runs [ 0 ] . results === undefined ) return 0 ;
645+ return sarif . runs [ 0 ] . results . length ;
646+ } ) ( ) ;
647+ }
605648
606- sarif . sortState = sortState ;
607649 const interpretation : Interpretation = {
608- data : sarif ,
650+ data,
609651 sourceLocationPrefix,
610652 numTruncatedResults : 0 ,
611653 numTotalResults
0 commit comments