Skip to content

Commit

Permalink
Select from schema.table
Browse files Browse the repository at this point in the history
  • Loading branch information
tyt2y3 committed Mar 14, 2021
1 parent 43b619d commit 0ada2c8
Show file tree
Hide file tree
Showing 5 changed files with 112 additions and 0 deletions.
12 changes: 12 additions & 0 deletions src/backend/mysql/query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -318,11 +318,23 @@ impl QueryBuilder for MysqlQueryBuilder {
TableRef::Table(iden) => {
iden.prepare(sql, '`');
},
TableRef::SchemaTable(schema, table) => {
schema.prepare(sql, '`');
write!(sql, ".").unwrap();
table.prepare(sql, '`');
},
TableRef::TableAlias(iden, alias) => {
iden.prepare(sql, '`');
write!(sql, " AS ").unwrap();
alias.prepare(sql, '`');
},
TableRef::SchemaTableAlias(schema, table, alias) => {
schema.prepare(sql, '`');
write!(sql, ".").unwrap();
table.prepare(sql, '`');
write!(sql, " AS ").unwrap();
alias.prepare(sql, '`');
},
TableRef::SubQuery(query, alias) => {
write!(sql, "(").unwrap();
self.prepare_select_statement(query, sql, collector);
Expand Down
12 changes: 12 additions & 0 deletions src/backend/postgres/query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -318,11 +318,23 @@ impl QueryBuilder for PostgresQueryBuilder {
TableRef::Table(iden) => {
iden.prepare(sql, '"');
},
TableRef::SchemaTable(schema, table) => {
schema.prepare(sql, '"');
write!(sql, ".").unwrap();
table.prepare(sql, '"');
},
TableRef::TableAlias(iden, alias) => {
iden.prepare(sql, '"');
write!(sql, " AS ").unwrap();
alias.prepare(sql, '"');
},
TableRef::SchemaTableAlias(schema, table, alias) => {
schema.prepare(sql, '"');
write!(sql, ".").unwrap();
table.prepare(sql, '"');
write!(sql, " AS ").unwrap();
alias.prepare(sql, '"');
},
TableRef::SubQuery(query, alias) => {
write!(sql, "(").unwrap();
self.prepare_select_statement(query, sql, collector);
Expand Down
12 changes: 12 additions & 0 deletions src/backend/sqlite/query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -318,11 +318,23 @@ impl QueryBuilder for SqliteQueryBuilder {
TableRef::Table(iden) => {
iden.prepare(sql, '`');
},
TableRef::SchemaTable(schema, table) => {
schema.prepare(sql, '`');
write!(sql, ".").unwrap();
table.prepare(sql, '`');
},
TableRef::TableAlias(iden, alias) => {
iden.prepare(sql, '`');
write!(sql, " AS ").unwrap();
alias.prepare(sql, '`');
},
TableRef::SchemaTableAlias(schema, table, alias) => {
schema.prepare(sql, '`');
write!(sql, ".").unwrap();
table.prepare(sql, '`');
write!(sql, " AS ").unwrap();
alias.prepare(sql, '`');
},
TableRef::SubQuery(query, alias) => {
write!(sql, "(").unwrap();
self.prepare_select_statement(query, sql, collector);
Expand Down
74 changes: 74 additions & 0 deletions src/query/select.rs
Original file line number Diff line number Diff line change
Expand Up @@ -552,6 +552,42 @@ impl SelectStatement {
self
}

/// From schema.table.
///
/// # Examples
///
/// ```
/// use sea_query::{*, tests_cfg::*};
///
/// let query = Query::select()
/// .from_schema(Char::Table, Glyph::Table)
/// .column(Char::FontSize)
/// .to_owned();
///
/// assert_eq!(
/// query.to_string(MysqlQueryBuilder),
/// r#"SELECT `font_size` FROM `character`.`glyph`"#
/// );
/// assert_eq!(
/// query.to_string(PostgresQueryBuilder),
/// r#"SELECT "font_size" FROM "character"."glyph""#
/// );
/// assert_eq!(
/// query.to_string(SqliteQueryBuilder),
/// r#"SELECT `font_size` FROM `character`.`glyph`"#
/// );
/// ```
pub fn from_schema<S: 'static, T: 'static>(&mut self, schema: S, table: T) -> &mut Self
where S: Iden, T: Iden {
self.from_schema_dyn(Rc::new(schema), Rc::new(table))
}

/// From schema.table, variation of [`SelectStatement::from_schema`].
pub fn from_schema_dyn(&mut self, schema: Rc<dyn Iden>, table: Rc<dyn Iden>) -> &mut Self {
self.from_from(TableRef::SchemaTable(schema, table));
self
}

/// From table with alias.
///
/// # Examples
Expand Down Expand Up @@ -599,6 +635,44 @@ impl SelectStatement {
self
}

/// From schema.table with alias.
///
/// # Examples
///
/// ```
/// use sea_query::{*, tests_cfg::*};
///
/// let table_as = Alias::new("alias");
///
/// let query = Query::select()
/// .from_schema_as(Font::Table, Char::Table, table_as.clone())
/// .table_column(table_as, Char::Character)
/// .to_owned();
///
/// assert_eq!(
/// query.to_string(MysqlQueryBuilder),
/// r#"SELECT `alias`.`character` FROM `font`.`character` AS `alias`"#
/// );
/// assert_eq!(
/// query.to_string(PostgresQueryBuilder),
/// r#"SELECT "alias"."character" FROM "font"."character" AS "alias""#
/// );
/// assert_eq!(
/// query.to_string(SqliteQueryBuilder),
/// r#"SELECT `alias`.`character` FROM `font`.`character` AS `alias`"#
/// );
/// ```
pub fn from_schema_as<S: 'static, T: 'static, A: 'static>(&mut self, schema: S, table: T, alias: A) -> &mut Self
where S: Iden, T: Iden, A: Iden {
self.from_schema_as_dyn(Rc::new(schema), Rc::new(table), Rc::new(alias))
}

/// From table with alias, variation of [`SelectStatement::from_schema_as`].
pub fn from_schema_as_dyn(&mut self, schema: Rc<dyn Iden>, table: Rc<dyn Iden>, alias: Rc<dyn Iden>) -> &mut Self {
self.from_from(TableRef::SchemaTableAlias(schema, table, alias));
self
}

/// From sub-query.
///
/// # Examples
Expand Down
2 changes: 2 additions & 0 deletions src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ pub trait Iden {
#[derive(Clone)]
pub enum TableRef {
Table(Rc<dyn Iden>),
SchemaTable(Rc<dyn Iden>, Rc<dyn Iden>),
TableAlias(Rc<dyn Iden>, Rc<dyn Iden>),
SchemaTableAlias(Rc<dyn Iden>, Rc<dyn Iden>, Rc<dyn Iden>),
SubQuery(SelectStatement, Rc<dyn Iden>),
}

Expand Down

0 comments on commit 0ada2c8

Please sign in to comment.