Skip to content

Commit 7243c6d

Browse files
Gor027cvybhu
authored andcommitted
Add separate struct for view metadata to store more info
Added MaterlizedView struct to store base table name for a view.
1 parent 74a2e0c commit 7243c6d

File tree

2 files changed

+64
-13
lines changed

2 files changed

+64
-13
lines changed

scylla/src/transport/session_test.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2087,10 +2087,19 @@ async fn test_views_in_schema_info() {
20872087
.views
20882088
.keys()
20892089
.collect::<std::collections::HashSet<&String>>();
2090+
let views_base_table = keyspace_meta
2091+
.views
2092+
.values()
2093+
.map(|view_meta| &view_meta.base_table_name)
2094+
.collect::<std::collections::HashSet<&String>>();
20902095

20912096
assert_eq!(tables, std::collections::HashSet::from([&"t".to_string()]));
20922097
assert_eq!(
20932098
views,
20942099
std::collections::HashSet::from([&"mv1".to_string(), &"mv2".to_string()])
20952100
);
2101+
assert_eq!(
2102+
views_base_table,
2103+
std::collections::HashSet::from([&"t".to_string()])
2104+
)
20962105
}

scylla/src/transport/topology.rs

Lines changed: 55 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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)]
7076
pub 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

547545
async 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+
588630
async fn query_tables_schema(
589631
conn: &Connection,
590632
) -> Result<HashMap<(String, String), Table>, QueryError> {

0 commit comments

Comments
 (0)