use squonk::ast::generated::visit::{Visit, walk_table_factor};
use squonk::ast::{Resolver, TableFactor};
use squonk::parse;
struct TableCollector<'a> {
resolver: &'a dyn Resolver,
tables: Vec<String>,
}
impl<'a, 'ast> Visit<'ast> for TableCollector<'a> {
fn visit_table_factor(&mut self, node: &'ast TableFactor) {
if let TableFactor::Table { name, .. } = node {
let dotted: Vec<&str> = name
.0
.iter()
.map(|part| self.resolver.resolve(part.sym))
.collect();
self.tables.push(dotted.join("."));
}
walk_table_factor(self, node);
}
}
fn main() {
let parsed = parse("SELECT * FROM orders o JOIN customers c ON o.cust = c.id").expect("parses");
let mut collector = TableCollector {
resolver: parsed.resolver(),
tables: Vec::new(),
};
for statement in parsed.statements() {
collector.visit_statement(statement);
}
println!("tables: {:?}", collector.tables);
assert_eq!(collector.tables, ["orders", "customers"]);
}