|
@@ -1,15 +1,16 @@
|
|
|
use super::build::{DerivedQuery, QueryComponent, QueryPart, StaticVersion};
|
|
|
use super::{Filterable, Resolvable};
|
|
|
use crate::{Entity, Error, QueryInterface};
|
|
|
+use crate::entity::{EntityColumn, EntityColumnType};
|
|
|
use std::hash::{Hash, Hasher};
|
|
|
use std::marker::PhantomData;
|
|
|
|
|
|
-pub struct Select<'r, 'q, T: Entity> {
|
|
|
+pub struct SelectEntire<'r, 'q, T: Entity> {
|
|
|
qi: &'r QueryInterface<'q>,
|
|
|
_ghost: PhantomData<T>,
|
|
|
}
|
|
|
|
|
|
-impl<'r, 'q, T: Entity> Select<'r, 'q, T> {
|
|
|
+impl<'r, 'q, T: Entity> SelectEntire<'r, 'q, T> {
|
|
|
pub fn new(qi: &'r QueryInterface<'q>) -> Self {
|
|
|
Self {
|
|
|
qi,
|
|
@@ -18,20 +19,22 @@ impl<'r, 'q, T: Entity> Select<'r, 'q, T> {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-impl<'r, 'q, T: Entity> StaticVersion for Select<'r, 'q, T> {
|
|
|
- type Is = Select<'static, 'static, T>;
|
|
|
+impl<'r, 'q, T: Entity> StaticVersion for SelectEntire<'r, 'q, T> {
|
|
|
+ type Is = SelectEntire<'static, 'static, T>;
|
|
|
}
|
|
|
|
|
|
-impl<'r, 'q, T: Entity> QueryComponent for Select<'r, 'q, T> {
|
|
|
+impl<'r, 'q, T: Entity> QueryComponent for SelectEntire<'r, 'q, T> {
|
|
|
fn derive(&self) -> DerivedQuery {
|
|
|
DerivedQuery::new().add(
|
|
|
QueryPart::Root,
|
|
|
- format!("SELECT * FROM `{}`", T::table_name()),
|
|
|
+ "SELECT".to_string() // * FROM `{}`", T::table_name()),
|
|
|
)
|
|
|
+ .add(QueryPart::Columns, "*".to_string())
|
|
|
+ .add(QueryPart::From, format!("`{}`", T::table_name()))
|
|
|
}
|
|
|
|
|
|
fn contribute<H: Hasher>(&self, hasher: &mut H) {
|
|
|
- "select".hash(hasher);
|
|
|
+ "select_entire".hash(hasher);
|
|
|
std::any::TypeId::of::<T>().hash(hasher);
|
|
|
}
|
|
|
|
|
@@ -41,12 +44,91 @@ impl<'r, 'q, T: Entity> QueryComponent for Select<'r, 'q, T> {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-impl<'r, 'q, T: Entity> Filterable<'r, 'q> for Select<'r, 'q, T> {
|
|
|
+impl<'r, 'q, T: Entity> Filterable<'r, 'q> for SelectEntire<'r, 'q, T> {
|
|
|
type Table = T;
|
|
|
}
|
|
|
|
|
|
-impl<'r, 'q, T: Entity> Resolvable<'r, 'q, T> for Select<'r, 'q, T> {
|
|
|
+impl<'r, 'q, T: Entity> Resolvable<'r, 'q, T> for SelectEntire<'r, 'q, T> {
|
|
|
fn qi(&self) -> &'r QueryInterface<'q> {
|
|
|
self.qi
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+pub struct SelectSingle<'r, 'q> {
|
|
|
+ qi: &'r QueryInterface<'q>,
|
|
|
+}
|
|
|
+
|
|
|
+impl<'r, 'q> SelectSingle<'r, 'q> {
|
|
|
+ pub fn new(qi: &'r QueryInterface<'q>) -> Self {
|
|
|
+ Self { qi }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+impl<'r, 'q> StaticVersion for SelectSingle<'r, 'q> {
|
|
|
+ type Is = SelectSingle<'static, 'static>;
|
|
|
+}
|
|
|
+
|
|
|
+impl<'r, 'q> QueryComponent for SelectSingle<'r, 'q> {
|
|
|
+ fn derive(&self) -> DerivedQuery {
|
|
|
+ DerivedQuery::new().add(
|
|
|
+ QueryPart::Root,
|
|
|
+ format!("SELECT"),
|
|
|
+ )
|
|
|
+ }
|
|
|
+
|
|
|
+ fn contribute<H: Hasher>(&self, hasher: &mut H) {
|
|
|
+ "select_single".hash(hasher);
|
|
|
+ }
|
|
|
+
|
|
|
+ fn bind(&self, _stmt: &mut sqlite::Statement<'_>) -> Result<usize, Error> {
|
|
|
+ todo!()
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+pub trait SelectSingleTrait<'r, 'q>: QueryComponent + StaticVersion {
|
|
|
+ type RType;
|
|
|
+
|
|
|
+ fn col<C: EntityColumn>(self, _col: C) -> SingleColumn<'r, 'q, Self, C> where Self: Sized {
|
|
|
+ SingleColumn { parent: self, _ghost: Default::default() }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+impl<'r, 'q> SelectSingleTrait<'r, 'q> for SelectSingle<'r, 'q> {
|
|
|
+ type RType = ();
|
|
|
+}
|
|
|
+
|
|
|
+pub struct SingleColumn<'r, 'q, P: SelectSingleTrait<'r, 'q>, C: EntityColumn> {
|
|
|
+ parent: P,
|
|
|
+ _ghost: std::marker::PhantomData<(C, &'r (), &'q ())>
|
|
|
+}
|
|
|
+
|
|
|
+impl<'r, 'q, P: SelectSingleTrait<'r, 'q>, C: EntityColumn> StaticVersion for SingleColumn<'r, 'q, P, C>
|
|
|
+ where P::Is: SelectSingleTrait<'static, 'static> {
|
|
|
+ type Is = SingleColumn<'static, 'static, <P as StaticVersion>::Is, C>;
|
|
|
+}
|
|
|
+
|
|
|
+impl<'r, 'q, P: SelectSingleTrait<'r, 'q>, C: EntityColumn + EntityColumnType> SelectSingleTrait<'r, 'q> for SingleColumn<'r, 'q, P, C>
|
|
|
+ where P::Is: SelectSingleTrait<'static, 'static>
|
|
|
+{
|
|
|
+ type RType = (P::RType, <C as EntityColumnType>::DataType);
|
|
|
+}
|
|
|
+
|
|
|
+impl<'r, 'q, P: SelectSingleTrait<'r, 'q> + StaticVersion, C: EntityColumn> QueryComponent for SingleColumn<'r, 'q, P, C>
|
|
|
+ where P::Is: SelectSingleTrait<'static, 'static> {
|
|
|
+
|
|
|
+ fn derive(&self) -> DerivedQuery {
|
|
|
+ self.parent.derive().add(
|
|
|
+ QueryPart::Columns,
|
|
|
+ format!("`{}.{}`", C::Entity::table_name(), C::static_name())
|
|
|
+ )
|
|
|
+ }
|
|
|
+
|
|
|
+ fn contribute<H: Hasher>(&self, hasher: &mut H) {
|
|
|
+ "single_column".hash(hasher);
|
|
|
+ std::any::TypeId::of::<C>().hash(hasher);
|
|
|
+ }
|
|
|
+
|
|
|
+ fn bind(&self, _stmt: &mut sqlite::Statement<'_>) -> Result<usize, Error> {
|
|
|
+ todo!()
|
|
|
+ }
|
|
|
+}
|