@@ -53,7 +53,7 @@ pub struct Keyspace {
5353 /// Empty HashMap may as well mean that the client disabled schema fetching in SessionConfig
5454 pub tables : HashMap < String , Table > ,
5555 /// Empty HashMap may as well mean that the client disabled schema fetching in SessionConfig
56- pub views : HashMap < String , Table > ,
56+ pub views : HashMap < String , MaterializedView > ,
5757 /// Empty HashMap may as well mean that the client disabled schema fetching in SessionConfig
5858 pub user_defined_types : HashMap < String , Vec < ( String , CqlType ) > > ,
5959}
@@ -66,6 +66,12 @@ pub struct Table {
6666 pub partitioner : Option < String > ,
6767}
6868
69+ #[ derive( Clone , Debug , PartialEq , Eq ) ]
70+ pub struct MaterializedView {
71+ pub view_metadata : Table ,
72+ pub base_table_name : String ,
73+ }
74+
6975#[ derive( Clone , Debug , PartialEq , Eq ) ]
7076pub struct Column {
7177 pub type_ : CqlType ,
@@ -464,16 +470,8 @@ async fn query_keyspaces(
464470 let mut result = HashMap :: with_capacity ( rows. len ( ) ) ;
465471 let ( mut all_tables, mut all_views, mut all_user_defined_types) = if fetch_schema {
466472 (
467- query_tables (
468- conn,
469- "SELECT keyspace_name, table_name FROM system_schema.tables" ,
470- )
471- . await ?,
472- query_tables (
473- conn,
474- "SELECT keyspace_name, view_name FROM system_schema.views" ,
475- )
476- . await ?,
473+ query_tables ( conn) . await ?,
474+ query_views ( conn) . await ?,
477475 query_user_defined_types ( conn) . await ?,
478476 )
479477 } else {
@@ -546,9 +544,8 @@ async fn query_user_defined_types(
546544
547545async fn query_tables (
548546 conn : & Connection ,
549- query_str : impl Into < String > ,
550547) -> Result < HashMap < String , HashMap < String , Table > > , QueryError > {
551- let mut tables_query = Query :: new ( query_str . into ( ) ) ;
548+ let mut tables_query = Query :: new ( "SELECT keyspace_name, table_name FROM system_schema.tables" ) ;
552549 tables_query. set_page_size ( 1024 ) ;
553550
554551 let rows = conn
@@ -585,6 +582,51 @@ async fn query_tables(
585582 Ok ( result)
586583}
587584
585+ async fn query_views (
586+ conn : & Connection ,
587+ ) -> Result < HashMap < String , HashMap < String , MaterializedView > > , QueryError > {
588+ let mut views_query =
589+ Query :: new ( "SELECT keyspace_name, view_name, base_table_name FROM system_schema.views" ) ;
590+ views_query. set_page_size ( 1024 ) ;
591+
592+ let rows = conn
593+ . query_all ( & views_query, & [ ] )
594+ . await ?
595+ . rows
596+ . ok_or ( QueryError :: ProtocolError (
597+ "system_schema.views query response was not Rows" ,
598+ ) ) ?;
599+
600+ let mut result = HashMap :: with_capacity ( rows. len ( ) ) ;
601+ let mut tables = query_tables_schema ( conn) . await ?;
602+
603+ for row in rows. into_typed :: < ( String , String , String ) > ( ) {
604+ let ( keyspace_name, view_name, base_table_name) = row. map_err ( |_| {
605+ QueryError :: ProtocolError ( "system_schema.views has invalid column type" )
606+ } ) ?;
607+
608+ let keyspace_and_view_name = ( keyspace_name, view_name) ;
609+
610+ let table = tables. remove ( & keyspace_and_view_name) . unwrap_or ( Table {
611+ columns : HashMap :: new ( ) ,
612+ partition_key : vec ! [ ] ,
613+ clustering_key : vec ! [ ] ,
614+ partitioner : None ,
615+ } ) ;
616+ let materialized_view = MaterializedView {
617+ view_metadata : table,
618+ base_table_name,
619+ } ;
620+
621+ result
622+ . entry ( keyspace_and_view_name. 0 )
623+ . or_insert_with ( HashMap :: new)
624+ . insert ( keyspace_and_view_name. 1 , materialized_view) ;
625+ }
626+
627+ Ok ( result)
628+ }
629+
588630async fn query_tables_schema (
589631 conn : & Connection ,
590632) -> Result < HashMap < ( String , String ) , Table > , QueryError > {
0 commit comments