semilattice_database/search/
condition.rs1use std::sync::Arc;
2
3use async_recursion::async_recursion;
4use futures::future;
5
6use versatile_data::{
7 search::{Field, Number, Term},
8 Activity, Condition as VersatileDataCondition, FieldName, RowSet,
9};
10
11use crate::{Collection, CollectionRow, RelationIndex, Search};
12
13#[derive(Debug, Clone, PartialEq)]
14pub enum Condition {
15 Activity(Activity),
16 Term(Term),
17 Row(Number),
18 Uuid(Vec<u128>),
19 LastUpdated(Number),
20 Field(FieldName, Field),
21 Narrow(Vec<Condition>),
22 Wide(Vec<Condition>),
23 Depend(Option<Arc<String>>, CollectionRow),
24}
25impl Condition {
26 #[async_recursion(?Send)]
27 pub(crate) async fn result(&self, collection: &Collection, relation: &RelationIndex) -> RowSet {
28 match self {
29 Self::Activity(c) => {
30 collection
31 .data()
32 .result_condition(&VersatileDataCondition::Activity(*c))
33 .await
34 }
35 Self::Term(c) => {
36 collection
37 .data()
38 .result_condition(&VersatileDataCondition::Term(c.clone()))
39 .await
40 }
41 Self::Row(c) => {
42 collection
43 .data()
44 .result_condition(&VersatileDataCondition::Row(c))
45 .await
46 }
47 Self::Uuid(c) => {
48 collection
49 .data()
50 .result_condition(&VersatileDataCondition::Uuid(c))
51 .await
52 }
53 Self::LastUpdated(c) => {
54 collection
55 .data()
56 .result_condition(&VersatileDataCondition::LastUpdated(c))
57 .await
58 }
59 Self::Field(name, condition) => {
60 collection
61 .data()
62 .result_condition(&VersatileDataCondition::Field(Arc::clone(name), condition))
63 .await
64 }
65 Self::Depend(key, collection_row) => {
66 let collection_id = collection.id();
67 relation
68 .pends(key.clone(), collection_row, Some(collection_id))
69 .into_iter()
70 .map(|r| r.row())
71 .collect()
72 }
73 Self::Narrow(conditions) => {
74 Search::result_conditions(collection, conditions, relation).await
75 }
76 Self::Wide(conditions) => future::join_all(
77 conditions
78 .into_iter()
79 .map(|c| c.result(collection, relation)),
80 )
81 .await
82 .into_iter()
83 .flatten()
84 .collect(),
85 }
86 }
87}