Skip to main content

graphrecords_query/operations/grouping/
mod.rs

1mod broadcast;
2mod broadcast_via;
3mod group_by;
4mod having;
5mod inspection;
6mod keys;
7mod on_bucket_error;
8mod on_key_error;
9mod ungroup;
10mod ungroup_keyed;
11
12use crate::{
13    Arity, Bare, BareValueDomain, Definite, ElementShape, Failure, IndexDomain, Indexed, Multiple,
14    OrderState, QueryResult, Single, ValueDomain, error::grouping::UnresolvedGroupKeyFailures,
15    registry::OperationManifest,
16};
17pub use broadcast::BroadcastOperation;
18pub use broadcast_via::BroadcastViaOperation;
19pub use group_by::GroupByOperation;
20pub use having::HavingOperation;
21pub use inspection::{BucketErrorsOperation, KeyErrorsOperation};
22pub use keys::KeysOperation;
23pub use on_bucket_error::{
24    BucketErrorPolicy, BucketErrorPolicyIn, BucketErrorPolicyOf, BucketErrorPolicyWithCause,
25    DropBucketErrors, DropBucketErrorsIn, DropBucketErrorsOf, DropBucketErrorsWithCause,
26    RaiseBucketErrors, RaiseBucketErrorsIn, RaiseBucketErrorsOf, RaiseBucketErrorsWithCause,
27};
28pub use on_key_error::{
29    DropKeyErrors, DropKeyErrorsIn, DropKeyErrorsOf, DropKeyErrorsWithCause, KeyErrorPolicy,
30    KeyErrorPolicyIn, KeyErrorPolicyOf, KeyErrorPolicyWithCause, RaiseKeyErrors, RaiseKeyErrorsIn,
31    RaiseKeyErrorsOf, RaiseKeyErrorsWithCause,
32};
33pub use ungroup::UngroupOperation;
34pub use ungroup_keyed::UngroupKeyedOperation;
35
36pub(super) fn operation_manifests() -> Vec<OperationManifest> {
37    vec![
38        broadcast::operation_manifest(),
39        broadcast_via::operation_manifest(),
40        group_by::operation_manifest(),
41        having::operation_manifest(),
42        keys::operation_manifest(),
43        ungroup::operation_manifest(),
44        ungroup_keyed::operation_manifest(),
45        inspection::bucket_errors::operation_manifest(),
46        inspection::key_errors::operation_manifest(),
47        on_bucket_error::drop::operation_manifest(),
48        on_bucket_error::raise::operation_manifest(),
49        on_key_error::drop::operation_manifest(),
50        on_key_error::raise::operation_manifest(),
51    ]
52}
53
54fn reject_key_failures<M: IndexDomain>(
55    key_failures: Vec<(M::Index<'_>, Box<Failure>)>,
56    label: &'static str,
57) -> QueryResult<()> {
58    if key_failures.is_empty() {
59        return Ok(());
60    }
61
62    Err(Failure::new(
63        label,
64        UnresolvedGroupKeyFailures::new(
65            key_failures
66                .into_iter()
67                .map(|key_failure| *key_failure.1)
68                .collect(),
69        ),
70    ))
71}
72
73pub trait BucketFailureArity<S: ElementShape>: Arity {
74    fn bucket_failure<'payload, 'a>(
75        payload: &'payload QueryResult<Self::Container<'a, S::Element<'a>>>,
76    ) -> Option<&'payload Failure>
77    where
78        S: 'a;
79}
80
81impl<I: IndexDomain, V: ValueDomain, O: OrderState> BucketFailureArity<Indexed<I, V>>
82    for Multiple<O>
83{
84    fn bucket_failure<'payload, 'a>(
85        payload: &'payload QueryResult<
86            Self::Container<'a, <Indexed<I, V> as ElementShape>::Element<'a>>,
87        >,
88    ) -> Option<&'payload Failure>
89    where
90        Indexed<I, V>: 'a,
91    {
92        payload.as_ref().err().map(Box::as_ref)
93    }
94}
95
96impl<V: BareValueDomain, O: OrderState> BucketFailureArity<Bare<V>> for Multiple<O> {
97    fn bucket_failure<'payload, 'a>(
98        payload: &'payload QueryResult<Self::Container<'a, <Bare<V> as ElementShape>::Element<'a>>>,
99    ) -> Option<&'payload Failure>
100    where
101        Bare<V>: 'a,
102    {
103        payload.as_ref().err().map(Box::as_ref)
104    }
105}
106
107impl<I: IndexDomain, V: ValueDomain> BucketFailureArity<Indexed<I, V>> for Single {
108    fn bucket_failure<'payload, 'a>(
109        payload: &'payload QueryResult<
110            Self::Container<'a, <Indexed<I, V> as ElementShape>::Element<'a>>,
111        >,
112    ) -> Option<&'payload Failure>
113    where
114        Indexed<I, V>: 'a,
115    {
116        match payload {
117            Err(failure) | Ok(Some((_, Err(failure)))) => Some(failure),
118            Ok(None | Some((_, Ok(_)))) => None,
119        }
120    }
121}
122
123impl<V: BareValueDomain> BucketFailureArity<Bare<V>> for Single {
124    fn bucket_failure<'payload, 'a>(
125        payload: &'payload QueryResult<Self::Container<'a, <Bare<V> as ElementShape>::Element<'a>>>,
126    ) -> Option<&'payload Failure>
127    where
128        Bare<V>: 'a,
129    {
130        match payload {
131            Err(failure) | Ok(Some(Err(failure))) => Some(failure),
132            Ok(None | Some(Ok(_))) => None,
133        }
134    }
135}
136
137impl<I: IndexDomain, V: ValueDomain> BucketFailureArity<Indexed<I, V>> for Definite {
138    fn bucket_failure<'payload, 'a>(
139        payload: &'payload QueryResult<
140            Self::Container<'a, <Indexed<I, V> as ElementShape>::Element<'a>>,
141        >,
142    ) -> Option<&'payload Failure>
143    where
144        Indexed<I, V>: 'a,
145    {
146        match payload {
147            Err(failure) | Ok((_, Err(failure))) => Some(failure),
148            Ok((_, Ok(_))) => None,
149        }
150    }
151}
152
153impl<V: BareValueDomain> BucketFailureArity<Bare<V>> for Definite {
154    fn bucket_failure<'payload, 'a>(
155        payload: &'payload QueryResult<Self::Container<'a, <Bare<V> as ElementShape>::Element<'a>>>,
156    ) -> Option<&'payload Failure>
157    where
158        Bare<V>: 'a,
159    {
160        match payload {
161            Err(failure) | Ok(Err(failure)) => Some(failure),
162            Ok(Ok(_)) => None,
163        }
164    }
165}