11import * as vscode from 'vscode' ;
22import { Disposable } from './dispose' ;
33import { getNonce } from './util' ;
4+ import { BackToFrontMessage , FrontToBackMessage , DescribeColumn } from './shared/messages' ;
45import { parse , extname } from "path"
56import * as duckdb from 'duckdb' ;
67
78const CSV_EXTENSIONS = [ ".csv" ] ;
89const PARQUET_EXTENSIONS = [ ".pq" , ".parq" , ".parquet" ] ;
910
10- type IMessage = {
11- type : 'query' | 'more' ;
12- success : boolean ;
13- message ?: string ;
14- results ?: duckdb . TableData ;
15- describe ?: duckdb . TableData ;
16- } | { type : 'config' , autoQuery : boolean } | { type : 'reloadBaseView' } ;
1711
1812/**
1913 * Define the document (the data model) used for table files.
@@ -106,7 +100,7 @@ class ParquetDocument extends Disposable implements vscode.CustomDocument {
106100 return results ;
107101 }
108102
109- runQuery ( sql : string , limit : number , callback : ( msg : IMessage ) => void ) : void {
103+ runQuery ( sql : string , limit : number , callback : ( msg : BackToFrontMessage ) => void ) : void {
110104 // Fetch resulting column names and types
111105 this . db . all (
112106 `DESCRIBE (${ sql . replace ( ';' , '' ) } );` ,
@@ -124,14 +118,19 @@ class ParquetDocument extends Disposable implements vscode.CustomDocument {
124118 callback ( { type : 'query' , success : false , message : err . message } ) ;
125119 return ;
126120 }
127- callback ( { type : 'query' , success : true , results : this . cleanResults ( res ) , describe : descRes } ) ;
121+ callback ( {
122+ type : 'query' ,
123+ success : true ,
124+ results : this . cleanResults ( res ) ,
125+ describe : translateDescribe ( descRes )
126+ } ) ;
128127 }
129128 ) ;
130129 }
131130 ) ;
132131 }
133132
134- fetchMore ( sql : string , limit : number , offset : number , callback : ( msg : IMessage ) => void ) : void {
133+ fetchMore ( sql : string , limit : number , offset : number , callback : ( msg : BackToFrontMessage ) => void ) : void {
135134 this . db . all (
136135 this . formatSql ( sql , limit , offset ) ,
137136 ( err , res ) => {
@@ -149,6 +148,12 @@ class ParquetDocument extends Disposable implements vscode.CustomDocument {
149148 }
150149}
151150
151+ function translateDescribe ( descRes : duckdb . TableData ) : DescribeColumn [ ] {
152+ return descRes . map ( row => ( {
153+ column_name : String ( row . column_name ) ,
154+ column_type : String ( row . column_type ) ,
155+ } ) ) ;
156+ }
152157
153158export class ParquetDocumentProvider implements vscode . CustomReadonlyEditorProvider < ParquetDocument > {
154159
@@ -219,9 +224,10 @@ export class ParquetDocumentProvider implements vscode.CustomReadonlyEditorProvi
219224 * Get the static HTML used for in our editor's webviews.
220225 */
221226 private getHtmlForWebview ( webview : vscode . Webview , uri : vscode . Uri ) : string {
222- // Local path to script and css for the webview
227+ // Local path to script and css for the webview.
223228 const jsUri = webview . asWebviewUri ( vscode . Uri . joinPath (
224- this . _context . extensionUri , 'out' , 'media' , 'flatFileExplorer.js' ) ) ;
229+ // Compiled from `src/webview/webview.ts`.
230+ this . _context . extensionUri , 'out' , 'webview.js' ) ) ;
225231
226232 const cssUri = webview . asWebviewUri ( vscode . Uri . joinPath (
227233 this . _context . extensionUri , 'media' , 'flatFileExplorer.css' ) ) ;
@@ -335,18 +341,24 @@ export class ParquetDocumentProvider implements vscode.CustomReadonlyEditorProvi
335341 }
336342
337343
338- private postMessage ( panel : vscode . WebviewPanel , message : IMessage ) : void {
344+ private postMessage ( panel : vscode . WebviewPanel , message : BackToFrontMessage ) : void {
339345 panel . webview . postMessage ( message ) ;
340346 }
341347
342348 /** Handle incoming message. */
343- private onMessage ( document : ParquetDocument , panel : vscode . WebviewPanel , message : any ) {
349+ private onMessage ( document : ParquetDocument , panel : vscode . WebviewPanel , message : FrontToBackMessage ) {
344350 switch ( message . type ) {
345351 case 'query' :
346- document . runQuery ( message . sql , message . limit , ( msg : IMessage ) => this . postMessage ( panel , msg ) ) ;
352+ document . runQuery (
353+ message . sql , message . limit ,
354+ ( msg : BackToFrontMessage ) => this . postMessage ( panel , msg )
355+ ) ;
347356 return ;
348357 case 'more' :
349- document . fetchMore ( message . sql , message . limit , message . offset , ( msg : IMessage ) => this . postMessage ( panel , msg ) ) ;
358+ document . fetchMore (
359+ message . sql , message . limit , message . offset ,
360+ ( msg : BackToFrontMessage ) => this . postMessage ( panel , msg )
361+ ) ;
350362 return ;
351363 case 'copy' :
352364 let fullQuery = `${ document . createViewSql } \n\n${ message . sql . trim ( ) } ` ;
0 commit comments