1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
use super::join::JoinSelect; use super::Queryable; use crate::table::{Table, TableQuery}; use crate::ToSql; pub trait Selectable { type Table: Table + ?Sized; type Fields: Default; fn write_join(&self, sql: &mut String); } impl<T: Table + ?Sized> Selectable for TableQuery<T> { type Table = T; type Fields = T::Fields; fn write_join(&self, _sql: &mut String) {} } impl<J: JoinSelect> Selectable for J { type Table = J::Table; type Fields = J::Fields; fn write_join(&self, sql: &mut String) { self.write_join_select(sql); } } #[derive(Clone, Copy)] pub struct SelectStatement<S, Q> { from: S, query: Q, } impl<S: Selectable, Q> SelectStatement<S, Q> { pub fn new(from: S, query: Q) -> Self { Self { from, query } } } impl<S, Q> ToSql for SelectStatement<S, Q> where S: Selectable, Q: Queryable, { fn write_sql(&self, sql: &mut String) { sql.push_str("SELECT "); self.query.write_query(sql); sql.push_str(" FROM "); sql.push_str(S::Table::NAME); self.from.write_join(sql); } }