Skip to content

Commit c26aa7d

Browse files
committed
Merge branch 'sg-monomorph-query-builder'
2 parents 224a8f1 + 52842fd commit c26aa7d

39 files changed

Lines changed: 300 additions & 192 deletions

diesel/src/backend.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
use query_builder::QueryBuilder;
2+
use query_builder::pg::PgQueryBuilder;
3+
use query_builder::debug::DebugQueryBuilder;
4+
5+
pub trait Backend {
6+
type QueryBuilder: QueryBuilder;
7+
}
8+
9+
pub struct Debug;
10+
11+
impl Backend for Debug {
12+
type QueryBuilder = DebugQueryBuilder;
13+
}
14+
15+
pub struct Pg;
16+
17+
impl Backend for Pg {
18+
type QueryBuilder = PgQueryBuilder;
19+
}

diesel/src/connection/mod.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use std::ffi::{CString, CStr};
99
use std::rc::Rc;
1010
use std::ptr;
1111

12+
use backend::Pg;
1213
use db_result::DbResult;
1314
use expression::{AsExpression, Expression, NonAggregate};
1415
use expression::expression_methods::*;
@@ -114,7 +115,7 @@ impl Connection {
114115
#[doc(hidden)]
115116
pub fn query_one<T, U>(&self, source: T) -> QueryResult<U> where
116117
T: AsQuery,
117-
T::Query: QueryFragment,
118+
T::Query: QueryFragment<Pg>,
118119
U: Queryable<T::SqlType>,
119120
{
120121
self.query_all(source)
@@ -124,7 +125,7 @@ impl Connection {
124125
#[doc(hidden)]
125126
pub fn query_all<'a, T, U: 'a>(&self, source: T) -> QueryResult<Box<Iterator<Item=U> + 'a>> where
126127
T: AsQuery,
127-
T::Query: QueryFragment,
128+
T::Query: QueryFragment<Pg>,
128129
U: Queryable<T::SqlType>,
129130
{
130131
let (sql, params, types) = self.prepare_query(&source.as_query());
@@ -191,7 +192,7 @@ impl Connection {
191192
pub fn find<T, U, PK>(&self, source: T, id: PK) -> QueryResult<U> where
192193
T: Table + FilterDsl<FindPredicate<T, PK>>,
193194
FindBy<T, T::PrimaryKey, PK>: LimitDsl,
194-
Limit<FindBy<T, T::PrimaryKey, PK>>: QueryFragment,
195+
Limit<FindBy<T, T::PrimaryKey, PK>>: QueryFragment<Pg>,
195196
U: Queryable<<Limit<FindBy<T, T::PrimaryKey, PK>> as Query>::SqlType>,
196197
PK: AsExpression<PkType<T>>,
197198
AsExpr<PK, T::PrimaryKey>: NonAggregate,
@@ -202,14 +203,14 @@ impl Connection {
202203

203204
#[doc(hidden)]
204205
pub fn execute_returning_count<T>(&self, source: &T) -> QueryResult<usize> where
205-
T: QueryFragment,
206+
T: QueryFragment<Pg>,
206207
{
207208
let (sql, params, param_types) = self.prepare_query(source);
208209
self.exec_sql_params(&sql, &params, &Some(param_types))
209210
.map(|r| r.rows_affected())
210211
}
211212

212-
fn prepare_query<T: QueryFragment>(&self, source: &T)
213+
fn prepare_query<T: QueryFragment<Pg>>(&self, source: &T)
213214
-> (String, Vec<Option<Vec<u8>>>, Vec<u32>)
214215
{
215216
let mut query_builder = PgQueryBuilder::new(&self.raw_connection);

diesel/src/doctest_setup.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
extern crate dotenv;
22

33
use diesel::prelude::*;
4+
use diesel::backend;
45
use self::dotenv::dotenv;
56

67
fn connection_no_data() -> diesel::Connection {

diesel/src/expression/aliased.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use backend::Backend;
12
use expression::{Expression, NonAggregate, SelectableExpression};
23
use query_builder::*;
34
use query_builder::nodes::{Identifier, InfixNode};
@@ -26,10 +27,11 @@ impl<'a, T> Expression for Aliased<'a, T> where
2627
type SqlType = T::SqlType;
2728
}
2829

29-
impl<'a, T> QueryFragment for Aliased<'a, T> where
30-
T: QueryFragment,
30+
impl<'a, T, DB> QueryFragment<DB> for Aliased<'a, T> where
31+
DB: Backend,
32+
T: QueryFragment<DB>,
3133
{
32-
fn to_sql(&self, out: &mut QueryBuilder) -> BuildQueryResult {
34+
fn to_sql(&self, out: &mut DB::QueryBuilder) -> BuildQueryResult {
3335
out.push_identifier(&self.alias)
3436
}
3537
}

diesel/src/expression/array_comparison.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::marker::PhantomData;
22

3+
use backend::Backend;
34
use query_builder::*;
45
use super::{AsExpression, Expression, SelectableExpression, NonAggregate};
56
use types::{Array, NativeSqlType};
@@ -63,10 +64,11 @@ impl<Expr, ST> Expression for Any<Expr, ST> where
6364
type SqlType = ST;
6465
}
6566

66-
impl<Expr, ST> QueryFragment for Any<Expr, ST> where
67-
Expr: QueryFragment,
67+
impl<Expr, ST, DB> QueryFragment<DB> for Any<Expr, ST> where
68+
DB: Backend,
69+
Expr: QueryFragment<DB>,
6870
{
69-
fn to_sql(&self, out: &mut QueryBuilder) -> BuildQueryResult {
71+
fn to_sql(&self, out: &mut DB::QueryBuilder) -> BuildQueryResult {
7072
out.push_sql("ANY(");
7173
try!(self.expr.to_sql(out));
7274
out.push_sql(")");

diesel/src/expression/bound.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use backend::Backend;
12
use query_builder::*;
23
use super::{Expression, SelectableExpression, NonAggregate};
34
use types::{NativeSqlType, ToSql, IsNull};
@@ -20,11 +21,12 @@ impl<T, U> Expression for Bound<T, U> where
2021
type SqlType = T;
2122
}
2223

23-
impl<T, U> QueryFragment for Bound<T, U> where
24+
impl<T, U, DB> QueryFragment<DB> for Bound<T, U> where
25+
DB: Backend,
2426
T: NativeSqlType,
2527
U: ToSql<T>,
2628
{
27-
fn to_sql(&self, out: &mut QueryBuilder) -> BuildQueryResult {
29+
fn to_sql(&self, out: &mut DB::QueryBuilder) -> BuildQueryResult {
2830
let mut bytes = Vec::new();
2931
match try!(self.item.to_sql(&mut bytes)) {
3032
IsNull::Yes => {

diesel/src/expression/count.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use backend::Backend;
12
use query_builder::*;
23
use super::{Expression, SelectableExpression};
34
use types::BigInt;
@@ -54,8 +55,8 @@ impl<T: Expression> Expression for Count<T> {
5455
type SqlType = BigInt;
5556
}
5657

57-
impl<T: QueryFragment> QueryFragment for Count<T> {
58-
fn to_sql(&self, out: &mut QueryBuilder) -> BuildQueryResult {
58+
impl<T: QueryFragment<DB>, DB: Backend> QueryFragment<DB> for Count<T> {
59+
fn to_sql(&self, out: &mut DB::QueryBuilder) -> BuildQueryResult {
5960
out.push_sql("COUNT(");
6061
try!(self.target.to_sql(out));
6162
out.push_sql(")");
@@ -74,8 +75,8 @@ impl Expression for CountStar {
7475
type SqlType = BigInt;
7576
}
7677

77-
impl QueryFragment for CountStar {
78-
fn to_sql(&self, out: &mut QueryBuilder) -> BuildQueryResult {
78+
impl<DB: Backend> QueryFragment<DB> for CountStar {
79+
fn to_sql(&self, out: &mut DB::QueryBuilder) -> BuildQueryResult {
7980
out.push_sql("COUNT(*)");
8081
Ok(())
8182
}

diesel/src/expression/date_and_time.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use backend::Backend;
12
use expression::{Expression, SelectableExpression};
23
use query_builder::*;
34
use types::{Timestamp, VarChar};
@@ -24,11 +25,12 @@ impl<Ts, Tz> Expression for AtTimeZone<Ts, Tz> where
2425
type SqlType = Timestamp;
2526
}
2627

27-
impl<Ts, Tz> QueryFragment for AtTimeZone<Ts, Tz> where
28-
Ts: QueryFragment,
29-
Tz: QueryFragment,
28+
impl<Ts, Tz, DB> QueryFragment<DB> for AtTimeZone<Ts, Tz> where
29+
DB: Backend,
30+
Ts: QueryFragment<DB>,
31+
Tz: QueryFragment<DB>,
3032
{
31-
fn to_sql(&self, out: &mut QueryBuilder) -> BuildQueryResult {
33+
fn to_sql(&self, out: &mut DB::QueryBuilder) -> BuildQueryResult {
3234
try!(self.timestamp.to_sql(out));
3335
out.push_sql(" AT TIME ZONE ");
3436
self.timezone.to_sql(out)

diesel/src/expression/expression_methods/global_expression_methods.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ pub trait ExpressionMethods: Expression + Sized {
237237
/// # fn main() {
238238
/// # use self::users::dsl::*;
239239
/// # let order = "name";
240-
/// let ordering: Box<BoxableExpression<users, (), SqlType=()>> =
240+
/// let ordering: Box<BoxableExpression<users, (), backend::Pg, SqlType=()>> =
241241
/// if order == "name" {
242242
/// Box::new(name.desc())
243243
/// } else {

diesel/src/expression/functions/aggregate_ordering.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use backend::Backend;
12
use expression::{Expression, SelectableExpression};
23
use query_builder::*;
34
use types::{SqlOrd, NativeSqlType};
@@ -23,8 +24,8 @@ macro_rules! ord_function {
2324
type SqlType = T::SqlType;
2425
}
2526

26-
impl<T: QueryFragment> QueryFragment for $type_name<T> {
27-
fn to_sql(&self, out: &mut QueryBuilder) -> BuildQueryResult {
27+
impl<T: QueryFragment<DB>, DB: Backend> QueryFragment<DB> for $type_name<T> {
28+
fn to_sql(&self, out: &mut DB::QueryBuilder) -> BuildQueryResult {
2829
out.push_sql(concat!($operator, "("));
2930
try!(self.target.to_sql(out));
3031
out.push_sql(")");

0 commit comments

Comments
 (0)