Skip to content

Commit 771a0a7

Browse files
committed
Update overpass_parser_rust, multiple sql statement
1 parent f75b1d4 commit 771a0a7

6 files changed

Lines changed: 31 additions & 26 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/backend.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ pub trait Backend {
88

99
async fn init(&self) -> ();
1010

11-
fn parse_query(&self, query: &str) -> Result<String, String>;
11+
fn parse_query(&self, query: &str) -> Result<Vec<String>, String>;
1212

13-
async fn exec(&mut self, query: String) -> Vec<String>;
13+
async fn exec(&mut self, query: Vec<String>) -> Vec<String>;
1414
}
1515

1616
pub enum BackendType {
@@ -72,7 +72,7 @@ impl BackendType {
7272
}
7373
}
7474

75-
pub fn parse_query(&self, query: &str) -> Result<String, String> {
75+
pub fn parse_query(&self, query: &str) -> Result<Vec<String>, String> {
7676
match self {
7777
#[cfg(feature = "postgres")]
7878
BackendType::PostgresOsmosis(backend) => backend.parse_query(query),
@@ -81,12 +81,12 @@ impl BackendType {
8181
}
8282
}
8383

84-
pub async fn exec(&mut self, query: String) -> Vec<String> {
84+
pub async fn exec(&mut self, queries: Vec<String>) -> Vec<String> {
8585
match self {
8686
#[cfg(feature = "postgres")]
87-
BackendType::PostgresOsmosis(backend) => backend.exec(query).await,
87+
BackendType::PostgresOsmosis(backend) => backend.exec(queries).await,
8888
#[cfg(feature = "duckdb")]
89-
BackendType::DuckdbQuackosm(backend) => backend.exec(query).await,
89+
BackendType::DuckdbQuackosm(backend) => backend.exec(queries).await,
9090
}
9191
}
9292
}

src/duckdb_quackosm/mod.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,23 @@ impl Backend for DuckdbQuackosm {
4949
);
5050
}
5151

52-
fn parse_query(&self, query: &str) -> Result<String, String> {
52+
fn parse_query(&self, query: &str) -> Result<Vec<String>, String> {
5353
match parse_query(query) {
5454
Ok(request) => Ok(request.to_sql(&*self.dialect, "4326", None)),
5555
Err(e) => Err(e.to_string()),
5656
}
5757
}
5858

59-
async fn exec(&mut self, sql: String) -> Vec<String> {
60-
let mut stmt = self.con.prepare(&sql).expect("Failed to execute SQL query");
59+
async fn exec(&mut self, sqls: Vec<String>) -> Vec<String> {
60+
let mut sqls = sqls;
61+
let last_sql = sqls.pop().expect("No SQL queries to execute");
62+
self.con
63+
.execute_batch(sqls.join("\n").as_str())
64+
.expect("Failed to execute SQL query");
65+
let mut stmt = self
66+
.con
67+
.prepare(&last_sql)
68+
.expect("Failed to execute SQL query");
6169
stmt.query_map([], |row| Ok(row.get::<usize, String>(0).unwrap()))
6270
.unwrap()
6371
.map(|result| result.ok().unwrap())

src/postgres_osmosis/mod.rs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ impl Backend for PostgresOsmosis {
5151
Self::exec_sql_file(&self.con, "src/postgres_osmosis/init.sql").await;
5252
}
5353

54-
fn parse_query(&self, query: &str) -> Result<String, String> {
54+
fn parse_query(&self, query: &str) -> Result<Vec<String>, String> {
5555
match parse_query(query) {
5656
Err(e) => Err(e.to_string()),
5757
Ok(request) => {
@@ -92,18 +92,15 @@ GROUP BY
9292
}
9393
}
9494

95-
async fn exec(&mut self, sql: String) -> Vec<String> {
96-
let mut sql = sql.to_string();
97-
if sql.starts_with("SET statement_timeout") {
98-
let (timeout, s) = sql.split_once(';').unwrap();
99-
self.con
100-
.execute(&timeout.to_string(), &[])
101-
.await
102-
.expect("Failed to set statement timeout");
103-
sql = s.to_string();
104-
}
95+
async fn exec(&mut self, sqls: Vec<String>) -> Vec<String> {
96+
let mut sqls = sqls;
97+
let last_sql = sqls.pop().expect("No SQL queries to execute").to_string();
98+
self.con
99+
.batch_execute(sqls.join("\n").as_str())
100+
.await
101+
.expect("Failed to execute SQL query");
105102
self.con
106-
.query(&sql.to_string(), &[])
103+
.query(&last_sql.to_string(), &[])
107104
.await
108105
.expect("Failed to execute SQL query")
109106
.iter()

underpass-wasm/src/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ class Connection {
2424
}
2525

2626
async query(overpass: string): Promise<IterableIterator<Object>> {
27-
const sql = await underpass.query(overpass)
27+
const sqls = (await underpass.query(overpass)).join('\n');
2828
this.status(`Parsing Overpass query\n${overpass}`);
2929

30-
this.status(`SQL query\n${sql}`);
30+
this.status(`SQL query\n${sqls}`);
3131
const startTimeS = performance.now();
32-
const result = await this.connection.query(sql);
32+
const result = await this.connection.query(sqls);
3333
const endTimeS = performance.now();
3434
this.status(`Execution of SQL query in ${endTimeS - startTimeS}ms`);
3535

underpass-wasm/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ pub fn prepare(parquet: &str) -> String {
1212
}
1313

1414
#[wasm_bindgen]
15-
pub async fn query(query: &str) -> Result<String, String> {
15+
pub async fn query(query: &str) -> Result<Vec<String>, String> {
1616
match parse_query(query) {
1717
Ok(request) => Ok(request.to_sql(
1818
&Duckdb as &(dyn SqlDialect + Send + Sync),

0 commit comments

Comments
 (0)