semilattice_database/search/
condition.rs

1use 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}