use std::any::type_name;
use std::marker::PhantomData;
use std::sync::Arc;
use crate::argvalue::ArgValue;
use crate::relations::{Backref, BackrefRef, ManyToMany, ManyToManyRef};
use super::expr::{Expr, ExprNode, ValueNode};
use super::handles::{ModelTable, Var, VarData, VarId};
use super::output::{HasOutputCols, OutputSource};
use super::scope::QueryScope;
use super::source::SourceMeta;
use super::traits::{HasCols, IntoSourceMeta, IntoTableSource};
pub fn var<T>() -> Var<T> {
Var {
data: Arc::new(VarData {
id: VarId::next(),
name: None,
rust_type: type_name::<T>(),
}),
_marker: PhantomData,
}
}
pub fn val<T>(value: T) -> Expr<T>
where
T: Clone
+ for<'q> sqlx::Encode<'q, crate::commons::Database>
+ sqlx::Type<crate::commons::Database>
+ Send
+ Sync
+ 'static,
{
Expr::new(ExprNode::Value(ValueNode::Val {
name: None,
rust_type: type_name::<T>(),
value: ArgValue::new(value),
}))
}
pub fn from<S>(source: S) -> QueryScope
where
S: IntoTableSource,
{
QueryScope::new(source.into_table_source())
}
pub fn meta<S>(source: S) -> SourceMeta
where
S: IntoSourceMeta,
{
source.source_meta()
}
pub fn out<R>() -> <R as HasOutputCols>::OutputColumns
where
R: HasOutputCols,
{
R::output_columns(OutputSource::new::<R>())
}
pub fn backref<R>(source: &ModelTable<R::From>) -> BackrefRef<R>
where
R: Backref,
R::From: HasCols,
{
BackrefRef::new(source)
}
pub fn many_to_many<R>(source: &ModelTable<R::From>) -> ManyToManyRef<R>
where
R: ManyToMany,
R::From: HasCols,
{
ManyToManyRef::new(source)
}
#[doc(hidden)]
pub mod __private {
use std::sync::Arc;
pub use super::super::expr::{ColumnRef, IntoSourceColumn, in_list};
pub use super::super::handles::{Column, ModelTable, Reference, Table, Var};
pub use super::super::output::{HasOutputCols, OutputColumn, OutputSource};
pub use super::super::source::{ProjectedColumn, ProjectionSource};
pub use super::super::traits::HasCols;
pub use super::super::traits::{IntoColumnRef, IntoTableSource, Projectable};
pub fn table(name: &str) -> Table {
Table::new(None, name)
}
pub fn table_schema(schema: &str, name: &str) -> Table {
Table::new(Some(schema), name)
}
pub fn reference(name: &str) -> Reference {
Reference {
name: Arc::from(name),
}
}
}