@@ -3,6 +3,7 @@ use crate::{
33 engine:: df:: scan:: { CubeScanNode , DataType , MemberField , WrappedSelectNode } ,
44 rewrite:: WrappedSelectType ,
55 } ,
6+ config:: ConfigObj ,
67 sql:: AuthContextRef ,
78 transport:: {
89 AliasedColumn , LoadRequestMeta , MetaContext , SpanId , SqlGenerator , SqlTemplates ,
@@ -107,6 +108,7 @@ pub struct CubeScanWrapperNode {
107108 pub request : Option < V1LoadRequestQuery > ,
108109 pub member_fields : Option < Vec < MemberField > > ,
109110 pub span_id : Option < Arc < SpanId > > ,
111+ pub config_obj : Arc < dyn ConfigObj > ,
110112}
111113
112114impl CubeScanWrapperNode {
@@ -115,6 +117,7 @@ impl CubeScanWrapperNode {
115117 meta : Arc < MetaContext > ,
116118 auth_context : AuthContextRef ,
117119 span_id : Option < Arc < SpanId > > ,
120+ config_obj : Arc < dyn ConfigObj > ,
118121 ) -> Self {
119122 Self {
120123 wrapped_plan,
@@ -124,6 +127,7 @@ impl CubeScanWrapperNode {
124127 request : None ,
125128 member_fields : None ,
126129 span_id,
130+ config_obj,
127131 }
128132 }
129133
@@ -141,6 +145,7 @@ impl CubeScanWrapperNode {
141145 request : Some ( request) ,
142146 member_fields : Some ( member_fields) ,
143147 span_id : self . span_id . clone ( ) ,
148+ config_obj : self . config_obj . clone ( ) ,
144149 }
145150 }
146151}
@@ -214,11 +219,12 @@ impl CubeScanWrapperNode {
214219 load_request_meta : Arc < LoadRequestMeta > ,
215220 ) -> result:: Result < Self , CubeError > {
216221 let schema = self . schema ( ) ;
222+ let wrapped_plan = self . wrapped_plan . clone ( ) ;
217223 let ( sql, request, member_fields) = Self :: generate_sql_for_node (
218224 Arc :: new ( self . clone ( ) ) ,
219225 transport,
220226 load_request_meta,
221- self . wrapped_plan . clone ( ) ,
227+ self . clone ( ) . set_max_limit_for_node ( wrapped_plan ) ,
222228 true ,
223229 )
224230 . await
@@ -256,6 +262,45 @@ impl CubeScanWrapperNode {
256262 Ok ( self . with_sql_and_request ( sql, request, member_fields) )
257263 }
258264
265+ pub fn set_max_limit_for_node ( self , node : Arc < LogicalPlan > ) -> Arc < LogicalPlan > {
266+ let stream_mode = self . config_obj . stream_mode ( ) ;
267+ if stream_mode {
268+ return node;
269+ }
270+
271+ let query_limit = self . config_obj . non_streaming_query_max_row_limit ( ) ;
272+ match node. as_ref ( ) {
273+ LogicalPlan :: Extension ( Extension {
274+ node : extension_node,
275+ } ) => {
276+ let cube_scan_node = extension_node
277+ . as_any ( )
278+ . downcast_ref :: < CubeScanNode > ( )
279+ . cloned ( ) ;
280+ let wrapped_select_node = extension_node
281+ . as_any ( )
282+ . downcast_ref :: < WrappedSelectNode > ( )
283+ . cloned ( ) ;
284+ if let Some ( node) = cube_scan_node {
285+ let mut new_node = node. clone ( ) ;
286+ new_node. request . limit = Some ( query_limit) ;
287+ Arc :: new ( LogicalPlan :: Extension ( Extension {
288+ node : Arc :: new ( new_node) ,
289+ } ) )
290+ } else if let Some ( node) = wrapped_select_node {
291+ let mut new_node = node. clone ( ) ;
292+ new_node. limit = Some ( query_limit as usize ) ;
293+ Arc :: new ( LogicalPlan :: Extension ( Extension {
294+ node : Arc :: new ( new_node) ,
295+ } ) )
296+ } else {
297+ node. clone ( )
298+ }
299+ }
300+ _ => node. clone ( ) ,
301+ }
302+ }
303+
259304 pub fn generate_sql_for_node (
260305 plan : Arc < Self > ,
261306 transport : Arc < dyn TransportService > ,
@@ -1787,6 +1832,7 @@ impl UserDefinedLogicalNode for CubeScanWrapperNode {
17871832 request : self . request . clone ( ) ,
17881833 member_fields : self . member_fields . clone ( ) ,
17891834 span_id : self . span_id . clone ( ) ,
1835+ config_obj : self . config_obj . clone ( ) ,
17901836 } )
17911837 }
17921838}
0 commit comments