diff --git a/src/database/connection.rs b/src/database/connection.rs index a4231181..a5d72dd5 100644 --- a/src/database/connection.rs +++ b/src/database/connection.rs @@ -1,7 +1,7 @@ use crate::{ExecErr, ExecResult, MockDatabaseConnection, QueryErr, QueryResult, Statement}; use sea_query::{ - DeleteStatement, InsertStatement, MysqlQueryBuilder, PostgresQueryBuilder, SelectStatement, - UpdateStatement, + DeleteStatement, InsertStatement, MysqlQueryBuilder, PostgresQueryBuilder, + QueryStatementBuilder, SelectStatement, UpdateStatement, }; use std::{error::Error, fmt}; @@ -102,31 +102,10 @@ impl DatabaseConnection { } impl QueryBuilderBackend { - pub fn build_select_statement(&self, statement: &SelectStatement) -> Statement { - match self { - Self::MySql => statement.build(MysqlQueryBuilder), - Self::Postgres => statement.build(PostgresQueryBuilder), - } - .into() - } - - pub fn build_insert_statement(&self, statement: &InsertStatement) -> Statement { - match self { - Self::MySql => statement.build(MysqlQueryBuilder), - Self::Postgres => statement.build(PostgresQueryBuilder), - } - .into() - } - - pub fn build_update_statement(&self, statement: &UpdateStatement) -> Statement { - match self { - Self::MySql => statement.build(MysqlQueryBuilder), - Self::Postgres => statement.build(PostgresQueryBuilder), - } - .into() - } - - pub fn build_delete_statement(&self, statement: &DeleteStatement) -> Statement { + pub fn build(&self, statement: &S) -> Statement + where + S: QueryStatementBuilder, + { match self { Self::MySql => statement.build(MysqlQueryBuilder), Self::Postgres => statement.build(PostgresQueryBuilder), diff --git a/src/executor/delete.rs b/src/executor/delete.rs index 388f4a8c..fa6ae551 100644 --- a/src/executor/delete.rs +++ b/src/executor/delete.rs @@ -1,7 +1,4 @@ -use crate::{ - ActiveModelTrait, Database, DeleteMany, DeleteOne, EntityTrait, ExecErr, QueryBuilderBackend, - Statement, -}; +use crate::{ActiveModelTrait, Database, DeleteMany, DeleteOne, EntityTrait, ExecErr, Statement}; use sea_query::DeleteStatement; use std::future::Future; @@ -46,13 +43,9 @@ impl Deleter { Self { query } } - pub fn build(&self, builder: QueryBuilderBackend) -> Statement { - builder.build_delete_statement(&self.query) - } - pub fn exec(self, db: &Database) -> impl Future> + '_ { let builder = db.get_query_builder_backend(); - exec_delete(self.build(builder), db) + exec_delete(builder.build(&self.query), db) } } diff --git a/src/executor/insert.rs b/src/executor/insert.rs index 79a65970..6b02e358 100644 --- a/src/executor/insert.rs +++ b/src/executor/insert.rs @@ -1,6 +1,4 @@ -use crate::{ - ActiveModelTrait, Database, ExecErr, Insert, QueryBuilderBackend, QueryTrait, Statement, -}; +use crate::{ActiveModelTrait, Database, ExecErr, Insert, QueryTrait, Statement}; use sea_query::InsertStatement; use std::future::Future; @@ -29,13 +27,9 @@ impl Inserter { Self { query } } - pub fn build(&self, builder: QueryBuilderBackend) -> Statement { - builder.build_insert_statement(&self.query) - } - pub fn exec(self, db: &Database) -> impl Future> + '_ { let builder = db.get_query_builder_backend(); - exec_insert(self.build(builder), db) + exec_insert(builder.build(&self.query), db) } } diff --git a/src/executor/paginator.rs b/src/executor/paginator.rs index 172ea2d6..53d11d45 100644 --- a/src/executor/paginator.rs +++ b/src/executor/paginator.rs @@ -31,7 +31,7 @@ where .offset((self.page_size * page) as u64) .to_owned(); let builder = self.db.get_query_builder_backend(); - let stmt = builder.build_select_statement(&query); + let stmt = builder.build(&query); let rows = self.db.get_connection().query_all(stmt).await?; let mut buffer = Vec::with_capacity(rows.len()); for row in rows.into_iter() { @@ -49,7 +49,7 @@ where /// Get the total number of pages pub async fn num_pages(&self) -> Result { let builder = self.db.get_query_builder_backend(); - let stmt = builder.build_select_statement( + let stmt = builder.build( SelectStatement::new() .expr(Expr::cust("COUNT(*) AS num_rows")) .from_subquery( @@ -170,10 +170,11 @@ mod tests { let query_builder = db.get_query_builder_backend(); let stmts = vec![ - query_builder.build_select_statement(select.clone().offset(0).limit(2)), - query_builder.build_select_statement(select.clone().offset(2).limit(2)), - query_builder.build_select_statement(select.offset(4).limit(2)), + query_builder.build(select.clone().offset(0).limit(2)), + query_builder.build(select.clone().offset(2).limit(2)), + query_builder.build(select.offset(4).limit(2)), ]; + let mut mocker = db .get_connection() .as_mock_connection() @@ -210,10 +211,11 @@ mod tests { let query_builder = db.get_query_builder_backend(); let stmts = vec![ - query_builder.build_select_statement(select.clone().offset(0).limit(2)), - query_builder.build_select_statement(select.clone().offset(2).limit(2)), - query_builder.build_select_statement(select.offset(4).limit(2)), + query_builder.build(select.clone().offset(0).limit(2)), + query_builder.build(select.clone().offset(2).limit(2)), + query_builder.build(select.offset(4).limit(2)), ]; + let mut mocker = db .get_connection() .as_mock_connection() @@ -251,7 +253,7 @@ mod tests { .to_owned(); let query_builder = db.get_query_builder_backend(); - let stmts = vec![query_builder.build_select_statement(&select)]; + let stmts = vec![query_builder.build(&select)]; let mut mocker = db .get_connection() .as_mock_connection() @@ -305,10 +307,11 @@ mod tests { let query_builder = db.get_query_builder_backend(); let stmts = vec![ - query_builder.build_select_statement(select.clone().offset(0).limit(2)), - query_builder.build_select_statement(select.clone().offset(2).limit(2)), - query_builder.build_select_statement(select.offset(4).limit(2)), + query_builder.build(select.clone().offset(0).limit(2)), + query_builder.build(select.clone().offset(2).limit(2)), + query_builder.build(select.offset(4).limit(2)), ]; + let mut mocker = db .get_connection() .as_mock_connection() @@ -343,10 +346,11 @@ mod tests { let query_builder = db.get_query_builder_backend(); let stmts = vec![ - query_builder.build_select_statement(select.clone().offset(0).limit(2)), - query_builder.build_select_statement(select.clone().offset(2).limit(2)), - query_builder.build_select_statement(select.offset(4).limit(2)), + query_builder.build(select.clone().offset(0).limit(2)), + query_builder.build(select.clone().offset(2).limit(2)), + query_builder.build(select.offset(4).limit(2)), ]; + let mut mocker = db .get_connection() .as_mock_connection() diff --git a/src/executor/select.rs b/src/executor/select.rs index d89a92b6..0c344340 100644 --- a/src/executor/select.rs +++ b/src/executor/select.rs @@ -1,6 +1,6 @@ use crate::{ - query::combine, Database, EntityTrait, FromQueryResult, JsonValue, Paginator, - QueryBuilderBackend, QueryErr, QueryResult, Select, SelectTwo, Statement, TypeErr, + query::combine, Database, EntityTrait, FromQueryResult, JsonValue, Paginator, QueryErr, + QueryResult, Select, SelectTwo, TypeErr, }; use sea_query::SelectStatement; use std::marker::PhantomData; @@ -134,14 +134,13 @@ impl Selector where S: SelectorTrait, { - pub fn build(&self, builder: QueryBuilderBackend) -> Statement { - builder.build_select_statement(&self.query) - } - pub async fn one(mut self, db: &Database) -> Result, QueryErr> { let builder = db.get_query_builder_backend(); self.query.limit(1); - let row = db.get_connection().query_one(self.build(builder)).await?; + let row = db + .get_connection() + .query_one(builder.build(&self.query)) + .await?; match row { Some(row) => Ok(Some(S::from_raw_query_result(row)?)), None => Ok(None), @@ -150,7 +149,10 @@ where pub async fn all(self, db: &Database) -> Result, QueryErr> { let builder = db.get_query_builder_backend(); - let rows = db.get_connection().query_all(self.build(builder)).await?; + let rows = db + .get_connection() + .query_all(builder.build(&self.query)) + .await?; let mut models = Vec::new(); for row in rows.into_iter() { models.push(S::from_raw_query_result(row)?); diff --git a/src/executor/update.rs b/src/executor/update.rs index 28773534..b2eebcbf 100644 --- a/src/executor/update.rs +++ b/src/executor/update.rs @@ -1,7 +1,4 @@ -use crate::{ - ActiveModelTrait, Database, EntityTrait, ExecErr, QueryBuilderBackend, Statement, UpdateMany, - UpdateOne, -}; +use crate::{ActiveModelTrait, Database, EntityTrait, ExecErr, Statement, UpdateMany, UpdateOne}; use sea_query::UpdateStatement; use std::future::Future; @@ -43,13 +40,9 @@ impl Updater { Self { query } } - pub fn build(&self, builder: QueryBuilderBackend) -> Statement { - builder.build_update_statement(&self.query) - } - pub fn exec(self, db: &Database) -> impl Future> + '_ { let builder = db.get_query_builder_backend(); - exec_update(self.build(builder), db) + exec_update(builder.build(&self.query), db) } }