1212// See the License for the specific language governing permissions and
1313// limitations under the License.
1414
15- use std:: ops:: ControlFlow ;
1615use std:: sync:: Arc ;
1716
18- use databend_common_ast:: Span ;
1917use databend_common_catalog:: catalog:: CATALOG_DEFAULT ;
2018use databend_common_catalog:: plan:: PushDownInfo ;
2119use databend_common_catalog:: table:: Table ;
2220use databend_common_exception:: Result ;
23- use databend_common_expression:: types:: DataType ;
2421use databend_common_expression:: types:: StringType ;
2522use databend_common_expression:: types:: TimestampType ;
26- use databend_common_expression:: visit_expr;
2723use databend_common_expression:: DataBlock ;
28- use databend_common_expression:: Expr ;
2924use databend_common_expression:: FromData ;
3025use databend_common_expression:: Scalar ;
3126use databend_common_expression:: TableDataType ;
@@ -36,15 +31,13 @@ use databend_common_meta_app::schema::ListIndexesReq;
3631use databend_common_meta_app:: schema:: TableIdent ;
3732use databend_common_meta_app:: schema:: TableInfo ;
3833use databend_common_meta_app:: schema:: TableMeta ;
39- use databend_common_storages_fuse:: index:: EqVisitor ;
40- use databend_common_storages_fuse:: index:: ResultRewrite ;
41- use databend_common_storages_fuse:: index:: Visitor ;
4234use databend_common_storages_fuse:: TableContext ;
4335use futures:: future:: try_join_all;
4436use log:: warn;
4537
4638use crate :: table:: AsyncOneBlockSystemTable ;
4739use crate :: table:: AsyncSystemTable ;
40+ use crate :: util:: find_eq_or_filter;
4841
4942const POINT_GET_TABLE_LIMIT : usize = 20 ;
5043
@@ -65,17 +58,46 @@ impl AsyncSystemTable for IndexesTable {
6558 ctx : Arc < dyn TableContext > ,
6659 push_downs : Option < PushDownInfo > ,
6760 ) -> Result < DataBlock > {
68- let mut database_names = None ;
69- let mut table_names = None ;
61+ let mut filtered_db_names = None ;
62+ let mut filtered_table_names = None ;
63+ let mut invalid_optimize = false ;
7064
7165 if let Some ( filters) = push_downs. and_then ( |info| info. filters ) {
7266 let expr = filters. filter . as_expr ( & BUILTIN_FUNCTIONS ) ;
73- let mut visitor = Visitor :: new ( TableFilterVisitor :: default ( ) ) ;
74- visit_expr ( & expr, & mut visitor) ?;
7567
76- let inner = visitor. inner ( ) ;
77- database_names = ( !inner. database_names . is_empty ( ) ) . then_some ( inner. database_names ) ;
78- table_names = ( !inner. table_names . is_empty ( ) ) . then_some ( inner. table_names ) ;
68+ let mut databases: Vec < String > = Vec :: new ( ) ;
69+ let mut tables: Vec < String > = Vec :: new ( ) ;
70+
71+ invalid_optimize = find_eq_or_filter (
72+ & expr,
73+ & mut |col_name, scalar| {
74+ if col_name == "database" {
75+ if let Scalar :: String ( database) = scalar {
76+ if !databases. contains ( database) {
77+ databases. push ( database. clone ( ) ) ;
78+ }
79+ }
80+ } else if col_name == "table" {
81+ if let Scalar :: String ( table) = scalar {
82+ if !tables. contains ( table) {
83+ tables. push ( table. clone ( ) ) ;
84+ }
85+ }
86+ }
87+ Ok ( ( ) )
88+ } ,
89+ invalid_optimize,
90+ ) ;
91+ if !databases. is_empty ( ) {
92+ filtered_db_names = Some ( databases) ;
93+ }
94+ if !tables. is_empty ( ) {
95+ filtered_table_names = Some ( tables) ;
96+ }
97+ }
98+ if invalid_optimize {
99+ filtered_db_names = None ;
100+ filtered_table_names = None ;
79101 }
80102
81103 let tenant = ctx. get_tenant ( ) ;
@@ -87,8 +109,8 @@ impl AsyncSystemTable for IndexesTable {
87109 let table_index_tables = self
88110 . list_table_index_tables (
89111 ctx. clone ( ) ,
90- database_names . as_deref ( ) ,
91- table_names . as_deref ( ) ,
112+ filtered_db_names . as_deref ( ) ,
113+ filtered_table_names . as_deref ( ) ,
92114 )
93115 . await ?;
94116
@@ -294,48 +316,3 @@ impl IndexesTable {
294316 Ok ( index_tables)
295317 }
296318}
297-
298- #[ derive( Debug , Default ) ]
299- struct TableFilterVisitor {
300- database_names : Vec < String > ,
301- table_names : Vec < String > ,
302- }
303-
304- impl EqVisitor for TableFilterVisitor {
305- fn enter_target (
306- & mut self ,
307- _: Span ,
308- col_name : & str ,
309- scalar : & Scalar ,
310- _: & DataType ,
311- _: & DataType ,
312- is_like : bool ,
313- ) -> ResultRewrite {
314- if is_like {
315- return Ok ( ControlFlow :: Break ( None ) ) ;
316- }
317- let Some ( name) = scalar. as_string ( ) else {
318- return Ok ( ControlFlow :: Break ( None ) ) ;
319- } ;
320- match col_name {
321- "table" => & mut self . table_names ,
322- "database" => & mut self . database_names ,
323- _ => return Ok ( ControlFlow :: Break ( None ) ) ,
324- }
325- . push ( name. clone ( ) ) ;
326-
327- Ok ( ControlFlow :: Break ( None ) )
328- }
329-
330- fn enter_map_column (
331- & mut self ,
332- _: Span ,
333- _: & [ Expr < String > ] ,
334- _: & Scalar ,
335- _: & DataType ,
336- _: & DataType ,
337- _: bool ,
338- ) -> ResultRewrite {
339- Ok ( ControlFlow :: Continue ( None ) )
340- }
341- }
0 commit comments