athena_cli/commands/database/
tables.rs

1use 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    // Determine which database to use (command arg takes precedence)
11    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    // Apply limit
25    request = request.max_results(args.limit);
26
27    // No server-side filtering - we'll filter client-side instead
28
29    let result = request.send().await.context("Failed to list tables")?;
30
31    let tables = result.table_metadata_list();
32
33    // Debug: Print all tables from server
34    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    // Apply filter if specified
48    let filtered_tables = if let Some(filter_pattern) = &args.filter {
49        println!("DEBUG: Applying filter pattern: '{}'", filter_pattern);
50
51        // Use filter_items from the utils module
52        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    // Display tables
73    println!(
74        "Tables in database: {} (filtered: {})",
75        database,
76        args.filter.as_deref().unwrap_or("none")
77    );
78
79    // Create a pretty table using our display struct
80    let table = TableMetadataDisplay::create_table_metadata_table(&filtered_tables);
81    table.printstd();
82
83    Ok(())
84}