From c86cf077aecc83040ae90d8c8bc91c16104d23fd Mon Sep 17 00:00:00 2001 From: Billy Chan Date: Wed, 19 Jan 2022 15:45:56 +0800 Subject: [PATCH] Tweaks --- src/backend/query_builder.rs | 48 ++++++++++++++---------------------- src/query/insert.rs | 36 ++------------------------- 2 files changed, 21 insertions(+), 63 deletions(-) diff --git a/src/backend/query_builder.rs b/src/backend/query_builder.rs index bb8a66373..7389293b2 100644 --- a/src/backend/query_builder.rs +++ b/src/backend/query_builder.rs @@ -1,4 +1,3 @@ -use crate::backend::query_builder::InsertValueSource; use crate::*; use std::ops::Deref; @@ -35,41 +34,32 @@ pub trait QueryBuilder: QuotedBuilder { if let Some(source) = &insert.source { write!(sql, " ").unwrap(); - self.prepare_insert_value_source(source, sql, collector); - } - - self.prepare_returning(&insert.returning, sql, collector); - } - - fn prepare_insert_value_source( - &self, - source: &InsertValueSource, - sql: &mut SqlWriter, - collector: &mut dyn FnMut(Value), - ) { - match source { - InsertValueSource::Values(values) => { - write!(sql, "VALUES ").unwrap(); - values.iter().fold(true, |first, row| { - if !first { - write!(sql, ", ").unwrap() - } - write!(sql, "(").unwrap(); - row.iter().fold(true, |first, col| { + match source { + InsertValueSource::Values(values) => { + write!(sql, "VALUES ").unwrap(); + values.iter().fold(true, |first, row| { if !first { write!(sql, ", ").unwrap() } - self.prepare_simple_expr(col, sql, collector); + write!(sql, "(").unwrap(); + row.iter().fold(true, |first, col| { + if !first { + write!(sql, ", ").unwrap() + } + self.prepare_simple_expr(col, sql, collector); + false + }); + write!(sql, ")").unwrap(); false }); - write!(sql, ")").unwrap(); - false - }); - } - InsertValueSource::Select(select_query) => { - self.prepare_select_statement(select_query.deref(), sql, collector); + } + InsertValueSource::Select(select_query) => { + self.prepare_select_statement(select_query.deref(), sql, collector); + } } } + + self.prepare_returning(&insert.returning, sql, collector); } /// Translate [`SelectStatement`] into SQL statement. diff --git a/src/query/insert.rs b/src/query/insert.rs index 26c6d4f5d..1de694aa6 100644 --- a/src/query/insert.rs +++ b/src/query/insert.rs @@ -8,7 +8,7 @@ use crate::{ /// [`InsertValueSource`] is a node in the expression tree and can represent a raw value set /// ('VALUES') or a select query. #[derive(Debug, Clone)] -enum InsertValueSource { +pub(crate) enum InsertValueSource { Values(Vec>), Select(Box), } @@ -190,39 +190,7 @@ impl InsertStatement { } /// Specify the value source of the insert. - /// - /// # Examples - /// - /// ``` - /// use sea_query::{tests_cfg::*, *}; - /// - /// let query = Query::insert() - /// .into_table(Glyph::Table) - /// .columns(vec![Glyph::Aspect, Glyph::Image]) - /// .value_source(InsertValueSource::Select(Box::new(Query::select() - /// .column(Glyph::Aspect) - /// .column(Glyph::Image) - /// .from(Glyph::Table) - /// .and_where(Expr::col(Glyph::Image).like("0%")) - /// .to_owned())) - /// ) - /// .unwrap() - /// .to_owned(); - /// - /// assert_eq!( - /// query.to_string(MysqlQueryBuilder), - /// r#"INSERT INTO `glyph` (`aspect`, `image`) SELECT `aspect`, `image` FROM `glyph` WHERE `image` LIKE '0%'"# - /// ); - /// assert_eq!( - /// query.to_string(PostgresQueryBuilder), - /// r#"INSERT INTO "glyph" ("aspect", "image") SELECT "aspect", "image" FROM "glyph" WHERE "image" LIKE '0%'"# - /// ); - /// assert_eq!( - /// query.to_string(SqliteQueryBuilder), - /// r#"INSERT INTO "glyph" ("aspect", "image") SELECT "aspect", "image" FROM "glyph" WHERE "image" LIKE '0%'"# - /// ); - /// ``` - fn value_source(&mut self, source: S) -> Result<&mut InsertStatement> + fn value_source(&mut self, source: S) -> Result<&mut Self> where S: Into, {