@@ -8,10 +8,12 @@ use sqlparser::parser::ParserError;
88
99use crate :: binder:: { BindError , Binder , BinderContext } ;
1010use crate :: catalog:: ColumnCatalog ;
11+ use crate :: execution_v1:: physical_plan:: physical_plan_builder:: PhysicalPlanBuilder ;
12+ use crate :: execution_v1:: volcano_executor:: VolcanoExecutor ;
1113use crate :: parser:: parse_sql;
1214use crate :: planner:: LogicalPlan ;
1315use crate :: storage:: memory:: InMemoryStorage ;
14- use crate :: storage:: { Storage , StorageError } ;
16+ use crate :: storage:: { Storage , StorageError , StorageImpl } ;
1517use crate :: types:: IdGenerator ;
1618
1719#[ derive( Debug ) ]
@@ -33,7 +35,7 @@ impl Database {
3335 }
3436
3537 /// Run SQL queries.
36- pub fn run ( & mut self , sql : & str ) -> Result < ( ) > {
38+ pub async fn run ( & self , sql : & str ) -> Result < Vec < RecordBatch > > {
3739 // parse
3840 let stmts = parse_sql ( sql) ?;
3941 // bind
@@ -49,36 +51,44 @@ impl Database {
4951 /// Limit(1)
5052 /// Project(a,b)
5153 let logical_plan = binder. bind ( & stmts[ 0 ] ) ?;
52- println ! ( "logic plan {:?}" , logical_plan) ;
53-
54- // let physical_planner = PhysicalPlaner::default();
55- // let executor_builder = ExecutorBuilder::new(self.env.clone());
56-
57- // let physical_plan = physical_planner.plan(logical_plan)?;
58- // let executor = executor_builder.build(physical_plan)?;
59- // futures::executor::block_on(executor).unwrap();
60-
61- /// THE FOLLOWING CODE IS FOR TESTING ONLY
62- /// THE FINAL CODE WILL BE IN executor MODULE
63- if let LogicalPlan :: CreateTable ( plan) = logical_plan {
64- let mut columns = Vec :: new ( ) ;
65- plan. columns . iter ( ) . for_each ( |c| {
66- columns. push ( ColumnCatalog :: new ( c. 0 . clone ( ) , c. 1 . clone ( ) ) ) ;
67- } ) ;
68- let table_name = plan. table_name . clone ( ) ;
69- // columns->batch record
70- let mut data = Vec :: new ( ) ;
71-
72- columns. iter ( ) . for_each ( |c| {
73- let batch = RecordBatch :: new_empty ( Arc :: new ( Schema :: new ( vec ! [ c. to_field( ) ] ) ) ) ;
74- data. push ( batch) ;
75- } ) ;
76-
77- self . storage
78- . create_table ( IdGenerator :: build ( ) , table_name. as_str ( ) , data) ?;
79- }
80-
81- Ok ( ( ) )
54+ println ! ( "logic plan {:#?}" , logical_plan) ;
55+
56+ let mut builder = PhysicalPlanBuilder :: new ( ) ;
57+ let operator = builder. build_plan ( & logical_plan) ?;
58+
59+ let storage = StorageImpl :: InMemoryStorage ( self . storage . clone ( ) ) ;
60+ let executor = VolcanoExecutor :: new ( storage) ;
61+
62+ let mut stream = executor. build ( operator) ;
63+
64+ Ok ( VolcanoExecutor :: try_collect ( & mut stream) . await ?)
65+
66+ // // let physical_planner = PhysicalPlaner::default();
67+ // // let executor_builder = ExecutorBuilder::new(self.env.clone());
68+ //
69+ // // let physical_plan = physical_planner.plan(logical_plan)?;
70+ // // let executor = executor_builder.build(physical_plan)?;
71+ // // futures::executor::block_on(executor).unwrap();
72+ //
73+ // /// THE FOLLOWING CODE IS FOR TESTING ONLY
74+ // /// THE FINAL CODE WILL BE IN executor MODULE
75+ // if let LogicalPlan::CreateTable(plan) = logical_plan {
76+ // let mut columns = Vec::new();
77+ // plan.columns.iter().for_each(|c| {
78+ // columns.push(ColumnCatalog::new(c.0.clone(), c.1, c.2.clone()));
79+ // });
80+ // let table_name = plan.table_name.clone();
81+ // // columns->batch record
82+ // let mut data = Vec::new();
83+ //
84+ // columns.iter().for_each(|c| {
85+ // let batch = RecordBatch::new_empty(Arc::new(Schema::new(vec![c.to_field()])));
86+ // data.push(batch);
87+ // });
88+ //
89+ // self.storage
90+ // .create_table(IdGenerator::build(), table_name.as_str(), data)?;
91+ // }
8292 }
8393}
8494
@@ -113,3 +123,48 @@ pub enum DatabaseError {
113123 #[ error( "Internal error: {0}" ) ]
114124 InternalError ( String ) ,
115125}
126+
127+ #[ cfg( test) ]
128+ mod test {
129+ use std:: sync:: Arc ;
130+ use arrow:: array:: Int32Array ;
131+ use arrow:: datatypes:: Schema ;
132+ use arrow:: record_batch:: RecordBatch ;
133+ use itertools:: Itertools ;
134+ use crate :: catalog:: { ColumnCatalog , ColumnDesc } ;
135+ use crate :: db:: Database ;
136+ use crate :: execution_v1:: ExecutorError ;
137+ use crate :: storage:: { Storage , StorageError } ;
138+ use crate :: storage:: memory:: InMemoryStorage ;
139+ use crate :: types:: { IdGenerator , LogicalType , TableId } ;
140+
141+ fn build_table ( storage : & impl Storage ) -> Result < TableId , StorageError > {
142+ let fields = vec ! [
143+ ColumnCatalog :: new(
144+ "c1" . to_string( ) ,
145+ false ,
146+ ColumnDesc :: new( LogicalType :: Integer , true )
147+ ) . to_field( ) ,
148+ ] ;
149+ let batch = RecordBatch :: try_new (
150+ Arc :: new ( Schema :: new ( fields) ) ,
151+ vec ! [ Arc :: new( Int32Array :: from( vec![ 1 , 2 , 3 , 4 , 5 ] ) ) ]
152+ ) . unwrap ( ) ;
153+
154+ Ok ( storage. create_table ( "t1" , vec ! [ batch] ) ?)
155+ }
156+
157+ #[ test]
158+ fn test_run_sql ( ) -> anyhow:: Result < ( ) > {
159+ let mut database = Database :: new_on_mem ( ) ;
160+
161+ let i = build_table ( & database. storage ) ?;
162+
163+ tokio_test:: block_on ( async move {
164+ let batch = database. run ( "select * from t1" ) . await ?;
165+ println ! ( "{:#?}" , batch) ;
166+
167+ Ok ( ( ) )
168+ } )
169+ }
170+ }
0 commit comments