graphrecords_query/operations/grouping/
mod.rs1mod 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}