athena_cli/commands/database/
tables.rs1use super::utils::TableMetadataDisplay;
2use crate::cli::TableArgs;
3use crate::context::Context;
4use crate::utils::filter;
5use anyhow::{Context as _, Result};
6
7pub async fn list_tables(ctx: &Context, args: &TableArgs) -> Result<()> {
8 let client = ctx.create_athena_client();
9
10 let database = if let Some(db) = &args.db {
12 db.clone()
13 } else if let Some(db) = ctx.database() {
14 db
15 } else {
16 anyhow::bail!("No database specified. Use --db or set a default database in config")
17 };
18
19 let mut request = client
20 .list_table_metadata()
21 .catalog_name(ctx.catalog())
22 .database_name(&database);
23
24 request = request.max_results(args.limit);
26
27 let result = request.send().await.context("Failed to list tables")?;
30
31 let tables = result.table_metadata_list();
32
33 println!("DEBUG: Received {} tables from server", tables.len());
35 if !tables.is_empty() {
36 println!("DEBUG: First few table names:");
37 for (i, table) in tables.iter().take(5).enumerate() {
38 println!(" {}. {}", i + 1, table.name());
39 }
40 }
41
42 if tables.is_empty() {
43 println!("No tables found in database: {}", database);
44 return Ok(());
45 }
46
47 let filtered_tables = if let Some(filter_pattern) = &args.filter {
49 println!("DEBUG: Applying filter pattern: '{}'", filter_pattern);
50
51 let filtered = filter::filter_items(tables, Some(filter_pattern), |table| table.name());
53
54 println!(
55 "DEBUG: Filter reduced tables from {} to {}",
56 tables.len(),
57 filtered.len()
58 );
59 filtered
60 } else {
61 tables.iter().collect()
62 };
63
64 if filtered_tables.is_empty() {
65 println!(
66 "No tables found matching filter: {}",
67 args.filter.as_ref().unwrap()
68 );
69 return Ok(());
70 }
71
72 println!(
74 "Tables in database: {} (filtered: {})",
75 database,
76 args.filter.as_deref().unwrap_or("none")
77 );
78
79 let table = TableMetadataDisplay::create_table_metadata_table(&filtered_tables);
81 table.printstd();
82
83 Ok(())
84}