Skip to content

Commit

Permalink
QUERY: optimize serialize
Browse files Browse the repository at this point in the history
  • Loading branch information
dark-flames committed Jan 10, 2022
1 parent 111c8e8 commit b3a594e
Show file tree
Hide file tree
Showing 23 changed files with 409 additions and 411 deletions.
14 changes: 9 additions & 5 deletions core/src/query/delete.rs
@@ -1,10 +1,12 @@
use std::marker::PhantomData;

use query_builder::{DeleteQuery, OrderByItem, Query, SelectFrom};
use sqlx::Database;

use query_builder::{DeleteQuery, OrderByItem, Query, ResultRow, SelectFrom};

use crate::operator::SortResult;
use crate::query::{Executable, MultiRows, Sort};
use crate::view::{EntityView, EntityWithView, ExprViewBox, TagsOfValueView, Value};
use crate::view::{EntityView, EntityWithView, ExprViewBox, TagsOfValueView, Value, ValueCountOf};

pub struct DeleteQueryResult<E: EntityWithView> {
query: DeleteQuery,
Expand Down Expand Up @@ -51,10 +53,12 @@ impl<E: EntityWithView> Sort<E::View> for DeleteQueryResult<E> {
}
}

impl<E: EntityWithView> Executable<(), TagsOfValueView<()>> for DeleteQueryResult<E> {
impl<E: EntityWithView, DB: Database> Executable<(), TagsOfValueView<()>, DB> for DeleteQueryResult<E>
where DeleteQuery: Query<DB, ResultRow<ValueCountOf<()>>> {
type ResultType = MultiRows;
type Query = DeleteQuery;

fn generate_query(self) -> (Query, ExprViewBox<()>) {
(Query::Delete(self.query), ().view())
fn generate_query(self) -> (Self::Query, ExprViewBox<()>) {
(self.query, ().view())
}
}
24 changes: 13 additions & 11 deletions core/src/query/exec.rs
Expand Up @@ -3,9 +3,7 @@ use generic_array::ArrayLength;
use sqlx::{Database, Error, Executor, FromRow, MySql, query_as};
use sqlx::query::QueryAs;

use query_builder::{
AppendToArgs, BindArgs, DatabaseValue, Query, QueryBuildState, ResultRow, ToSql,
};
use query_builder::{AppendToArgs, BindArgs, DatabaseValue, Query, QueryBuildState, ResultRow, ToSql};

use crate::view::{ExprViewBoxWithTag, TagList, Value, ValueCountOf};

Expand All @@ -16,17 +14,21 @@ pub struct MultiRows;

pub trait ExecuteResultType: Clone {}

pub trait Executable<T: Value, TTags: TagList> {
pub trait Executable<T: Value, TTags: TagList, DB: Database> {
type ResultType: ExecuteResultType;
type Query: Query<DB, ResultRow<ValueCountOf<T>>>;

fn generate_query(self) -> (Query, ExprViewBoxWithTag<T, TTags>);
fn generate_query(self) -> (Self::Query, ExprViewBoxWithTag<T, TTags>);
}

impl ExecuteResultType for SingleRow {}
impl ExecuteResultType for MultiRows {}

#[async_trait]
pub trait FetchOne<T: Value, TTags: TagList>: Executable<T, TTags, ResultType = SingleRow> {
pub trait FetchOne<
T: Value,
TTags: TagList
>: Executable<T, TTags, MySql, ResultType = SingleRow> {
async fn exec<'c, 'e, E: 'e + Executor<'c, Database = MySql>>(
self,
executor: E,
Expand All @@ -35,7 +37,7 @@ pub trait FetchOne<T: Value, TTags: TagList>: Executable<T, TTags, ResultType =
Self: Sized,
DatabaseValue: for<'q> AppendToArgs<'q, MySql>,
<ValueCountOf<T> as ArrayLength<DatabaseValue>>::ArrayType: Unpin,
ResultRow<ValueCountOf<T>>: for<'r> FromRow<'r, <MySql as Database>::Row>,
ResultRow<ValueCountOf<T>>: for<'r> FromRow<'r, <MySql as Database>::Row>
{
let (query, view) = self.generate_query();
let mut state = QueryBuildState::default();
Expand All @@ -52,7 +54,7 @@ pub trait FetchOne<T: Value, TTags: TagList>: Executable<T, TTags, ResultType =

#[async_trait]
pub trait FetchMulti<T: Value, TTags: TagList>:
Executable<T, TTags, ResultType = MultiRows>
Executable<T, TTags, MySql, ResultType = MultiRows>
{
async fn exec<'c, 'e, E: 'e + Executor<'c, Database = MySql>>(
self,
Expand All @@ -62,7 +64,7 @@ pub trait FetchMulti<T: Value, TTags: TagList>:
Self: Sized,
DatabaseValue: for<'q> AppendToArgs<'q, MySql>,
<ValueCountOf<T> as ArrayLength<DatabaseValue>>::ArrayType: Unpin,
ResultRow<ValueCountOf<T>>: for<'r> FromRow<'r, <MySql as Database>::Row>,
ResultRow<ValueCountOf<T>>: for<'r> FromRow<'r, <MySql as Database>::Row>
{
let (query, view) = self.generate_query();
let mut state = QueryBuildState::default();
Expand All @@ -81,11 +83,11 @@ pub trait FetchMulti<T: Value, TTags: TagList>:
}
}

impl<T: Value, TTags: TagList, E: Executable<T, TTags, ResultType = SingleRow>> FetchOne<T, TTags>
impl<T: Value, TTags: TagList, E: Executable<T, TTags, MySql, ResultType = SingleRow>> FetchOne<T, TTags>
for E
{
}
impl<T: Value, TTags: TagList, E: Executable<T, TTags, ResultType = MultiRows>> FetchMulti<T, TTags>
impl<T: Value, TTags: TagList, E: Executable<T, TTags, MySql, ResultType = MultiRows>> FetchMulti<T, TTags>
for E
{
}
32 changes: 16 additions & 16 deletions core/src/query/filter.rs
@@ -1,22 +1,18 @@
use std::hash::Hash;
use std::marker::PhantomData;

use sqlx::Database;

use interface::{Association, FieldMarker, WithPrimaryKey};
use query_builder::{
Alias, Expr, IntoSelectSource, OrderByItem, Query, Select, SelectFrom, SelectItem, SelectQuery
};
use query_builder::{Alias, Expr, IntoSelectSource, OrderByItem, Query, ResultRow, Select, SelectFrom, SelectItem, SelectQuery};

use crate::operator::{In, SortResult};
use crate::query::{
AliasGenerator, AssociationBuilder, Delete, DeleteQueryResult, Executable, Fold,
FoldQueryResult, FoldResult, GroupBy, GroupedQueryResult, GroupResult, Map, MultiRows,
QueryResultMap, Sort, Update, UpdateQueryResult,
};
use crate::view::{
AssociatedView, EntityView, EntityWithView, ExprBoxOfAssociatedView, ExprView,
ExprViewBoxWithTag, FieldMarkerWithView, TagList, TagOfMarker, TagsOfEntity, TypeOfMarker,
Value, ViewWithPrimaryKey,
};
use crate::view::{AssociatedView, EntityView, EntityWithView, ExprBoxOfAssociatedView, ExprView, ExprViewBoxWithTag, FieldMarkerWithView, TagList, TagOfMarker, TagsOfEntity, TypeOfMarker, Value, ValueCountOf, ViewWithPrimaryKey};

pub struct QueryResultFilter<E: EntityWithView> {
query: SelectFrom,
Expand Down Expand Up @@ -118,21 +114,23 @@ impl<E: EntityWithView> Sort<E::View> for QueryResultFilter<E> {
}
}

impl<E: EntityWithView> Executable<E, TagsOfEntity<E>> for QueryResultFilter<E> {
impl<E: EntityWithView, DB: Database> Executable<E, TagsOfEntity<E>, DB> for QueryResultFilter<E>
where SelectQuery: Query<DB, ResultRow<ValueCountOf<E>>>{
type ResultType = MultiRows;
type Query = SelectQuery;

fn generate_query(self) -> (Query, ExprViewBoxWithTag<E, TagsOfEntity<E>>) {
fn generate_query(self) -> (Self::Query, ExprViewBoxWithTag<E, TagsOfEntity<E>>) {
let view = E::View::pure(&self.root_alias);

(
Query::Select(SelectQuery::create(
SelectQuery::create(
self.query.source(),
self.alias_generator
.generate_select_list(view.collect_expr().into_iter(), true),
vec![],
None,
0,
)),
),
Box::new(view),
)
}
Expand Down Expand Up @@ -198,22 +196,24 @@ impl<E: EntityWithView> Map<E::View> for SortedQueryResultFilter<E> {
}
}

impl<E: EntityWithView> Executable<E, TagsOfEntity<E>> for SortedQueryResultFilter<E> {
impl<E: EntityWithView, DB: Database> Executable<E, TagsOfEntity<E>, DB> for SortedQueryResultFilter<E>
where SelectQuery: Query<DB, ResultRow<ValueCountOf<E>>> {
type ResultType = MultiRows;
type Query = SelectQuery;

fn generate_query(self) -> (Query, ExprViewBoxWithTag<E, TagsOfEntity<E>>) {
fn generate_query(self) -> (Self::Query, ExprViewBoxWithTag<E, TagsOfEntity<E>>) {
let view = E::View::pure(&self.nested.root_alias);

(
Query::Select(SelectQuery::create(
SelectQuery::create(
self.nested.query.source(),
self.nested
.alias_generator
.generate_select_list(view.collect_expr(), true),
vec![],
None,
0,
)),
),
Box::new(view),
)
}
Expand Down
13 changes: 8 additions & 5 deletions core/src/query/fold.rs
Expand Up @@ -2,8 +2,9 @@ use std::ops::{Add, Sub};

use generic_array::{arr, GenericArray};
use generic_array::typenum::U1;
use sqlx::Database;

use query_builder::{DatabaseValue, Expr, Query, SelectQuery, SelectSource};
use query_builder::{DatabaseValue, Expr, Query, ResultRow, SelectQuery, SelectSource};

use crate::err::{RuntimeResult, YukinoError};
use crate::query::{AliasGenerator, Executable, Map, QueryResultMap};
Expand Down Expand Up @@ -51,19 +52,21 @@ impl<View: FoldResult> Map<View> for FoldQueryResult<View> {
}
}

impl<View: FoldResult> Executable<View::Value, View::Tags> for FoldQueryResult<View> {
impl<View: FoldResult, DB: Database> Executable<View::Value, View::Tags, DB> for FoldQueryResult<View>
where SelectQuery: Query<DB, ResultRow<ValueCountOf<View::Value>>> {
type ResultType = SingleRow;
type Query = SelectQuery;

fn generate_query(self) -> (Query, ExprViewBoxWithTag<View::Value, View::Tags>) {
fn generate_query(self) -> (Self::Query, ExprViewBoxWithTag<View::Value, View::Tags>) {
(
Query::Select(SelectQuery::create(
SelectQuery::create(
self.query,
self.alias_generator
.generate_select_list(self.view.collect_fold_expr_vec(), true),
vec![],
None,
0,
)),
),
self.view.expr_box(),
)
}
Expand Down
51 changes: 32 additions & 19 deletions core/src/query/group.rs
@@ -1,7 +1,9 @@
use std::marker::PhantomData;
use std::ops::{Add, Sub};

use query_builder::{Alias, Expr, GroupSelect, IntoSelectSource, OrderByItem, Query, SelectQuery};
use sqlx::Database;

use query_builder::{Alias, Expr, GroupSelect, IntoSelectSource, OrderByItem, Query, ResultRow, SelectQuery};

use crate::operator::SortResult;
use crate::query::{
Expand Down Expand Up @@ -191,21 +193,24 @@ impl<View: GroupResult, E: EntityWithView> Sort<View> for GroupedQueryResult<Vie
}
}

impl<View: GroupResult, E: EntityWithView> Executable<View::Value, View::Tags>
impl<View: GroupResult, E: EntityWithView, DB: Database> Executable<View::Value, View::Tags, DB>
for GroupedQueryResult<View, (), E>
where SelectQuery: Query<DB, ResultRow<ValueCountOf<View::Value>>>
{
type ResultType = MultiRows;
type Query = SelectQuery;


fn generate_query(self) -> (Query, ExprViewBoxWithTag<View::Value, View::Tags>) {
fn generate_query(self) -> (Self::Query, ExprViewBoxWithTag<View::Value, View::Tags>) {
(
Query::Select(SelectQuery::create(
SelectQuery::create(
self.query.source(),
self.alias_generator
.generate_select_list(self.view.collect_expr_vec(), true),
vec![],
None,
0,
)),
),
self.view.expr_box(),
)
}
Expand All @@ -219,10 +224,11 @@ type ValueOfFoldResult<A> = <A as FoldResult>::Value;
type ConcretedTags<G, A> = ConcreteList<TagOfGroupResult<G>, TagOfFoldResult<A>>;
type ResultExprViewBox<G, A> = ExprViewBoxWithTag<ValueTuple<G, A>, ConcretedTags<G, A>>;

impl<View: GroupResult, AggregateView: FoldResult, E: EntityWithView>
Executable<ValueTuple<View, AggregateView>, ConcretedTags<View, AggregateView>>
impl<View: GroupResult, AggregateView: FoldResult, E: EntityWithView, DB: Database>
Executable<ValueTuple<View, AggregateView>, ConcretedTags<View, AggregateView>, DB>
for GroupedQueryResult<View, AggregateView, E>
where
SelectQuery: Query<DB, ResultRow<ValueCountOf<ValueTuple<View, AggregateView>>>>,
ValueTuple<View, AggregateView>: Value,
TagsOfValueView<View::Value>: MergeList<TagsOfValueView<AggregateView::Value>>,
TagOfGroupResult<View>: MergeList<TagOfFoldResult<AggregateView>>,
Expand All @@ -234,10 +240,12 @@ where
Sub<ValueCountOf<View::Value>, Output = ValueCountOf<AggregateView::Value>>,
{
type ResultType = MultiRows;
type Query = SelectQuery;

fn generate_query(self) -> (Query, ResultExprViewBox<View, AggregateView>) {

fn generate_query(self) -> (Self::Query, ResultExprViewBox<View, AggregateView>) {
(
Query::Select(SelectQuery::create(
SelectQuery::create(
self.query.source(),
self.alias_generator.generate_select_list(
self.view
Expand All @@ -249,7 +257,7 @@ where
vec![],
None,
0,
)),
),
(self.view.expr_box(), self.aggregate.expr_box()).into(),
)
}
Expand Down Expand Up @@ -315,31 +323,34 @@ impl<View: GroupResult, E: EntityWithView> Map<View> for SortedGroupedQueryResul
}
}

impl<View: GroupResult, E: EntityWithView> Executable<View::Value, View::Tags>
impl<View: GroupResult, E: EntityWithView, DB: Database> Executable<View::Value, View::Tags, DB>
for SortedGroupedQueryResult<View, (), E>
where SelectQuery: Query<DB, ResultRow<ValueCountOf<View::Value>>>
{
type ResultType = MultiRows;
type Query = SelectQuery;

fn generate_query(self) -> (Query, ExprViewBoxWithTag<View::Value, View::Tags>) {
fn generate_query(self) -> (Self::Query, ExprViewBoxWithTag<View::Value, View::Tags>) {
(
Query::Select(SelectQuery::create(
SelectQuery::create(
self.nested.query.source(),
self.nested
.alias_generator
.generate_select_list(self.nested.view.collect_expr_vec(), true),
self.order_by,
None,
0,
)),
),
self.nested.view.expr_box(),
)
}
}

impl<View: GroupResult, AggregateView: FoldResult, E: EntityWithView>
Executable<ValueTuple<View, AggregateView>, ConcretedTags<View, AggregateView>>
impl<View: GroupResult, AggregateView: FoldResult, E: EntityWithView, DB: Database>
Executable<ValueTuple<View, AggregateView>, ConcretedTags<View, AggregateView>, DB>
for SortedGroupedQueryResult<View, AggregateView, E>
where
SelectQuery: Query<DB, ResultRow<ValueCountOf<ValueTuple<View, AggregateView>>>>,
ValueTuple<View, AggregateView>: Value,
TagsOfValueView<View::Value>: MergeList<TagsOfValueView<AggregateView::Value>>,
TagOfGroupResult<View>: MergeList<TagOfFoldResult<AggregateView>>,
Expand All @@ -351,10 +362,12 @@ where
Sub<ValueCountOf<View::Value>, Output = ValueCountOf<AggregateView::Value>>,
{
type ResultType = MultiRows;
type Query = SelectQuery;


fn generate_query(self) -> (Query, ResultExprViewBox<View, AggregateView>) {
fn generate_query(self) -> (Self::Query, ResultExprViewBox<View, AggregateView>) {
(
Query::Select(SelectQuery::create(
SelectQuery::create(
self.nested.query.source(),
self.nested.alias_generator.generate_select_list(
self.nested
Expand All @@ -367,7 +380,7 @@ where
vec![],
None,
0,
)),
),
(
self.nested.view.expr_box(),
self.nested.aggregate.expr_box(),
Expand Down

0 comments on commit b3a594e

Please sign in to comment.