use hyperdb_api::{
escape_name, Catalog, ColumnMapping, Connection, CreateMode, HyperProcess, Inserter, Result,
SqlType, TableDefinition,
};
fn extract_table() -> TableDefinition {
TableDefinition::new("Extract")
.with_schema("Extract")
.add_required_column("Name", SqlType::text())
.add_required_column("Location", SqlType::tabgeography())
}
fn inserter_definition() -> TableDefinition {
TableDefinition::new("_inserter_input")
.add_required_column("Name", SqlType::text())
.add_required_column("Location_as_text", SqlType::text())
}
fn run_insert_spatial_data_to_a_hyper_file() -> Result<()> {
println!("EXAMPLE - Insert geospatial data into a single table within a new Hyper file");
std::fs::create_dir_all("test_results")?;
let path_to_database = "test_results/insert_geospatial_data_to_a_hyper_file.hyper";
{
use hyperdb_api::Parameters;
let mut params = Parameters::new();
params.set("log_dir", "test_results");
let hyper = HyperProcess::new(None, Some(¶ms))?;
{
let connection =
Connection::new(&hyper, path_to_database, CreateMode::CreateAndReplace)?;
let catalog = Catalog::new(&connection);
let extract_def = extract_table();
catalog.create_schema("Extract")?;
catalog.create_table(&extract_def)?;
let text_to_geography_cast_expression = format!(
"CAST({} AS TABLEAU.TABGEOGRAPHY)",
escape_name("Location_as_text")?
);
let column_mappings = vec![
ColumnMapping::new("Name"),
ColumnMapping::with_expression("Location", text_to_geography_cast_expression),
];
let inserter_def = inserter_definition();
{
let mut inserter = Inserter::with_column_mappings(
&connection,
&inserter_def,
extract_def.qualified_name(),
&column_mappings,
)?;
inserter.add_row(&[&"Seattle", &"point(-122.338083 47.647528)"])?;
inserter.add_row(&[&"Munich", &"point(11.584329 48.139257)"])?;
inserter.execute()?;
}
let row_count: Option<i64> = connection.execute_scalar_query(&format!(
"SELECT COUNT(*) FROM {}",
extract_def.qualified_name()
))?;
println!(
"The number of rows in table {} is {}.",
extract_def.qualified_name(),
row_count.unwrap_or(0)
);
}
println!("\nThe connection to the Hyper file has been closed.");
}
println!("The Hyper Process has been shut down.");
Ok(())
}
fn main() {
match run_insert_spatial_data_to_a_hyper_file() {
Ok(()) => {}
Err(e) => {
eprintln!("{e}");
std::process::exit(1);
}
}
}