use std::fmt;
use sqlparser::ast::Query as SpQuery;
use sqlparser_derive::{Visit, VisitMut};
use crate::error::Error;
#[derive(Debug, Clone, PartialEq, Eq, Visit, VisitMut)]
pub struct Query {
pub inner: SpQuery,
}
impl TryFrom<SpQuery> for Query {
type Error = Error;
fn try_from(q: SpQuery) -> Result<Self, Self::Error> {
Ok(Query { inner: q })
}
}
impl TryFrom<Query> for SpQuery {
type Error = Error;
fn try_from(value: Query) -> Result<Self, Self::Error> {
Ok(value.inner)
}
}
impl fmt::Display for Query {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.inner)?;
Ok(())
}
}
#[cfg(test)]
mod test {
use super::Query;
use crate::dialect::GreptimeDbDialect;
use crate::parser::{ParseOptions, ParserContext};
use crate::statements::statement::Statement;
fn create_query(sql: &str) -> Option<Box<Query>> {
match ParserContext::create_with_dialect(
sql,
&GreptimeDbDialect {},
ParseOptions::default(),
)
.unwrap()
.remove(0)
{
Statement::Query(query) => Some(query),
_ => None,
}
}
#[test]
fn test_query_display() {
assert_eq!(
create_query("select * from abc where x = 1 and y = 7")
.unwrap()
.to_string(),
"SELECT * FROM abc WHERE x = 1 AND y = 7"
);
assert_eq!(
create_query(
"select * from abc left join bcd where abc.a = 1 and bcd.d = 7 and abc.id = bcd.id"
)
.unwrap()
.to_string(),
"SELECT * FROM abc LEFT JOIN bcd WHERE abc.a = 1 AND bcd.d = 7 AND abc.id = bcd.id"
);
}
}