11use std:: { collections:: BTreeMap , pin:: Pin , sync:: Arc } ;
22
3- use arrow:: {
4- array:: { ArrayRef , RecordBatch , StringArray } ,
5- compute:: concat_batches,
6- datatypes:: { DataType , Field , SchemaBuilder , SchemaRef } ,
7- error:: ArrowError ,
8- ipc:: {
9- reader:: StreamReader ,
10- writer:: { IpcWriteOptions , StreamWriter } ,
11- } ,
12- } ;
133use arrow_flight:: {
144 decode:: { DecodedPayload , FlightDataDecoder } ,
155 sql:: {
@@ -35,6 +25,16 @@ use arrow_flight::{
3525 Action , FlightDescriptor , FlightEndpoint , FlightInfo , HandshakeRequest , HandshakeResponse ,
3626 IpcMessage , SchemaAsIpc , Ticket ,
3727} ;
28+ use datafusion:: arrow:: {
29+ array:: { ArrayRef , RecordBatch , StringArray } ,
30+ compute:: concat_batches,
31+ datatypes:: { DataType , Field , SchemaBuilder , SchemaRef } ,
32+ error:: ArrowError ,
33+ ipc:: {
34+ reader:: StreamReader ,
35+ writer:: { IpcWriteOptions , StreamWriter } ,
36+ } ,
37+ } ;
3838use datafusion:: {
3939 common:: { arrow:: datatypes:: Schema , ParamValues } ,
4040 dataframe:: DataFrame ,
@@ -115,6 +115,21 @@ impl FlightSqlService {
115115 Ok ( Server :: builder ( ) . add_service ( svc) . serve ( addr) . await ?)
116116 }
117117
118+ pub async fn serve_with_listener (
119+ self ,
120+ listener : std:: net:: TcpListener ,
121+ ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
122+ info ! ( "Listening on {}" , listener. local_addr( ) ?) ;
123+
124+ let svc = FlightServiceServer :: new ( self ) ;
125+ let listener = tokio:: net:: TcpListener :: from_std ( listener) ?;
126+
127+ Ok ( Server :: builder ( )
128+ . add_service ( svc)
129+ . serve_with_incoming ( tokio_stream:: wrappers:: TcpListenerStream :: new ( listener) )
130+ . await ?)
131+ }
132+
118133 async fn new_context < T > (
119134 & self ,
120135 request : Request < T > ,
@@ -1051,7 +1066,7 @@ fn get_schema_for_plan(logical_plan: &LogicalPlan, with_metadata: bool) -> Schem
10511066 df_schema. as_ref ( ) . metadata ( ) . clone ( ) ,
10521067 ) )
10531068 } else {
1054- Arc :: new ( Schema :: from ( logical_plan. schema ( ) . as_ref ( ) ) )
1069+ Arc :: new ( logical_plan. schema ( ) . as_arrow ( ) . clone ( ) )
10551070 } ;
10561071
10571072 // Use an empty FlightDataEncoder to determine the schema of the encoded flight data.
@@ -1126,9 +1141,7 @@ async fn decode_schema(decoder: &mut FlightDataDecoder) -> Result<SchemaRef, Sta
11261141}
11271142
11281143// Decode parameter ipc stream as ParamValues
1129- fn decode_param_values (
1130- parameters : Option < & [ u8 ] > ,
1131- ) -> Result < Option < ParamValues > , arrow:: error:: ArrowError > {
1144+ fn decode_param_values ( parameters : Option < & [ u8 ] > ) -> Result < Option < ParamValues > , ArrowError > {
11321145 parameters
11331146 . map ( |parameters| {
11341147 let decoder = StreamReader :: try_new ( parameters, None ) ?;
0 commit comments