This commit is contained in:
Chris Tsang 2021-06-19 16:49:37 +08:00
parent f9ba6eeb1f
commit 041d28aa26
6 changed files with 41 additions and 76 deletions

View File

@ -1,7 +1,7 @@
use crate::{ExecErr, ExecResult, MockDatabaseConnection, QueryErr, QueryResult, Statement}; use crate::{ExecErr, ExecResult, MockDatabaseConnection, QueryErr, QueryResult, Statement};
use sea_query::{ use sea_query::{
DeleteStatement, InsertStatement, MysqlQueryBuilder, PostgresQueryBuilder, SelectStatement, DeleteStatement, InsertStatement, MysqlQueryBuilder, PostgresQueryBuilder,
UpdateStatement, QueryStatementBuilder, SelectStatement, UpdateStatement,
}; };
use std::{error::Error, fmt}; use std::{error::Error, fmt};
@ -102,31 +102,10 @@ impl DatabaseConnection {
} }
impl QueryBuilderBackend { impl QueryBuilderBackend {
pub fn build_select_statement(&self, statement: &SelectStatement) -> Statement { pub fn build<S>(&self, statement: &S) -> Statement
match self { where
Self::MySql => statement.build(MysqlQueryBuilder), S: QueryStatementBuilder,
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 {
match self { match self {
Self::MySql => statement.build(MysqlQueryBuilder), Self::MySql => statement.build(MysqlQueryBuilder),
Self::Postgres => statement.build(PostgresQueryBuilder), Self::Postgres => statement.build(PostgresQueryBuilder),

View File

@ -1,7 +1,4 @@
use crate::{ use crate::{ActiveModelTrait, Database, DeleteMany, DeleteOne, EntityTrait, ExecErr, Statement};
ActiveModelTrait, Database, DeleteMany, DeleteOne, EntityTrait, ExecErr, QueryBuilderBackend,
Statement,
};
use sea_query::DeleteStatement; use sea_query::DeleteStatement;
use std::future::Future; use std::future::Future;
@ -46,13 +43,9 @@ impl Deleter {
Self { query } Self { query }
} }
pub fn build(&self, builder: QueryBuilderBackend) -> Statement {
builder.build_delete_statement(&self.query)
}
pub fn exec(self, db: &Database) -> impl Future<Output = Result<DeleteResult, ExecErr>> + '_ { pub fn exec(self, db: &Database) -> impl Future<Output = Result<DeleteResult, ExecErr>> + '_ {
let builder = db.get_query_builder_backend(); let builder = db.get_query_builder_backend();
exec_delete(self.build(builder), db) exec_delete(builder.build(&self.query), db)
} }
} }

View File

@ -1,6 +1,4 @@
use crate::{ use crate::{ActiveModelTrait, Database, ExecErr, Insert, QueryTrait, Statement};
ActiveModelTrait, Database, ExecErr, Insert, QueryBuilderBackend, QueryTrait, Statement,
};
use sea_query::InsertStatement; use sea_query::InsertStatement;
use std::future::Future; use std::future::Future;
@ -29,13 +27,9 @@ impl Inserter {
Self { query } Self { query }
} }
pub fn build(&self, builder: QueryBuilderBackend) -> Statement {
builder.build_insert_statement(&self.query)
}
pub fn exec(self, db: &Database) -> impl Future<Output = Result<InsertResult, ExecErr>> + '_ { pub fn exec(self, db: &Database) -> impl Future<Output = Result<InsertResult, ExecErr>> + '_ {
let builder = db.get_query_builder_backend(); let builder = db.get_query_builder_backend();
exec_insert(self.build(builder), db) exec_insert(builder.build(&self.query), db)
} }
} }

View File

@ -31,7 +31,7 @@ where
.offset((self.page_size * page) as u64) .offset((self.page_size * page) as u64)
.to_owned(); .to_owned();
let builder = self.db.get_query_builder_backend(); 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 rows = self.db.get_connection().query_all(stmt).await?;
let mut buffer = Vec::with_capacity(rows.len()); let mut buffer = Vec::with_capacity(rows.len());
for row in rows.into_iter() { for row in rows.into_iter() {
@ -49,7 +49,7 @@ where
/// Get the total number of pages /// Get the total number of pages
pub async fn num_pages(&self) -> Result<usize, QueryErr> { pub async fn num_pages(&self) -> Result<usize, QueryErr> {
let builder = self.db.get_query_builder_backend(); let builder = self.db.get_query_builder_backend();
let stmt = builder.build_select_statement( let stmt = builder.build(
SelectStatement::new() SelectStatement::new()
.expr(Expr::cust("COUNT(*) AS num_rows")) .expr(Expr::cust("COUNT(*) AS num_rows"))
.from_subquery( .from_subquery(
@ -170,10 +170,11 @@ mod tests {
let query_builder = db.get_query_builder_backend(); let query_builder = db.get_query_builder_backend();
let stmts = vec![ let stmts = vec![
query_builder.build_select_statement(select.clone().offset(0).limit(2)), query_builder.build(select.clone().offset(0).limit(2)),
query_builder.build_select_statement(select.clone().offset(2).limit(2)), query_builder.build(select.clone().offset(2).limit(2)),
query_builder.build_select_statement(select.offset(4).limit(2)), query_builder.build(select.offset(4).limit(2)),
]; ];
let mut mocker = db let mut mocker = db
.get_connection() .get_connection()
.as_mock_connection() .as_mock_connection()
@ -210,10 +211,11 @@ mod tests {
let query_builder = db.get_query_builder_backend(); let query_builder = db.get_query_builder_backend();
let stmts = vec![ let stmts = vec![
query_builder.build_select_statement(select.clone().offset(0).limit(2)), query_builder.build(select.clone().offset(0).limit(2)),
query_builder.build_select_statement(select.clone().offset(2).limit(2)), query_builder.build(select.clone().offset(2).limit(2)),
query_builder.build_select_statement(select.offset(4).limit(2)), query_builder.build(select.offset(4).limit(2)),
]; ];
let mut mocker = db let mut mocker = db
.get_connection() .get_connection()
.as_mock_connection() .as_mock_connection()
@ -251,7 +253,7 @@ mod tests {
.to_owned(); .to_owned();
let query_builder = db.get_query_builder_backend(); 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 let mut mocker = db
.get_connection() .get_connection()
.as_mock_connection() .as_mock_connection()
@ -305,10 +307,11 @@ mod tests {
let query_builder = db.get_query_builder_backend(); let query_builder = db.get_query_builder_backend();
let stmts = vec![ let stmts = vec![
query_builder.build_select_statement(select.clone().offset(0).limit(2)), query_builder.build(select.clone().offset(0).limit(2)),
query_builder.build_select_statement(select.clone().offset(2).limit(2)), query_builder.build(select.clone().offset(2).limit(2)),
query_builder.build_select_statement(select.offset(4).limit(2)), query_builder.build(select.offset(4).limit(2)),
]; ];
let mut mocker = db let mut mocker = db
.get_connection() .get_connection()
.as_mock_connection() .as_mock_connection()
@ -343,10 +346,11 @@ mod tests {
let query_builder = db.get_query_builder_backend(); let query_builder = db.get_query_builder_backend();
let stmts = vec![ let stmts = vec![
query_builder.build_select_statement(select.clone().offset(0).limit(2)), query_builder.build(select.clone().offset(0).limit(2)),
query_builder.build_select_statement(select.clone().offset(2).limit(2)), query_builder.build(select.clone().offset(2).limit(2)),
query_builder.build_select_statement(select.offset(4).limit(2)), query_builder.build(select.offset(4).limit(2)),
]; ];
let mut mocker = db let mut mocker = db
.get_connection() .get_connection()
.as_mock_connection() .as_mock_connection()

View File

@ -1,6 +1,6 @@
use crate::{ use crate::{
query::combine, Database, EntityTrait, FromQueryResult, JsonValue, Paginator, query::combine, Database, EntityTrait, FromQueryResult, JsonValue, Paginator, QueryErr,
QueryBuilderBackend, QueryErr, QueryResult, Select, SelectTwo, Statement, TypeErr, QueryResult, Select, SelectTwo, TypeErr,
}; };
use sea_query::SelectStatement; use sea_query::SelectStatement;
use std::marker::PhantomData; use std::marker::PhantomData;
@ -134,14 +134,13 @@ impl<S> Selector<S>
where where
S: SelectorTrait, S: SelectorTrait,
{ {
pub fn build(&self, builder: QueryBuilderBackend) -> Statement {
builder.build_select_statement(&self.query)
}
pub async fn one(mut self, db: &Database) -> Result<Option<S::Item>, QueryErr> { pub async fn one(mut self, db: &Database) -> Result<Option<S::Item>, QueryErr> {
let builder = db.get_query_builder_backend(); let builder = db.get_query_builder_backend();
self.query.limit(1); 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 { match row {
Some(row) => Ok(Some(S::from_raw_query_result(row)?)), Some(row) => Ok(Some(S::from_raw_query_result(row)?)),
None => Ok(None), None => Ok(None),
@ -150,7 +149,10 @@ where
pub async fn all(self, db: &Database) -> Result<Vec<S::Item>, QueryErr> { pub async fn all(self, db: &Database) -> Result<Vec<S::Item>, QueryErr> {
let builder = db.get_query_builder_backend(); 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(); let mut models = Vec::new();
for row in rows.into_iter() { for row in rows.into_iter() {
models.push(S::from_raw_query_result(row)?); models.push(S::from_raw_query_result(row)?);

View File

@ -1,7 +1,4 @@
use crate::{ use crate::{ActiveModelTrait, Database, EntityTrait, ExecErr, Statement, UpdateMany, UpdateOne};
ActiveModelTrait, Database, EntityTrait, ExecErr, QueryBuilderBackend, Statement, UpdateMany,
UpdateOne,
};
use sea_query::UpdateStatement; use sea_query::UpdateStatement;
use std::future::Future; use std::future::Future;
@ -43,13 +40,9 @@ impl Updater {
Self { query } Self { query }
} }
pub fn build(&self, builder: QueryBuilderBackend) -> Statement {
builder.build_update_statement(&self.query)
}
pub fn exec(self, db: &Database) -> impl Future<Output = Result<UpdateResult, ExecErr>> + '_ { pub fn exec(self, db: &Database) -> impl Future<Output = Result<UpdateResult, ExecErr>> + '_ {
let builder = db.get_query_builder_backend(); let builder = db.get_query_builder_backend();
exec_update(self.build(builder), db) exec_update(builder.build(&self.query), db)
} }
} }