semilattice_database/
search.rs1mod condition;
2mod join;
3mod result;
4
5pub use self::join::SearchJoin;
6pub use condition::Condition;
7pub use result::SearchResult;
8
9pub use versatile_data::search::{Field, Number, Term};
10
11use crate::Database;
12
13use std::{num::NonZeroI32, sync::Arc};
14
15use hashbrown::HashMap;
16
17use versatile_data::{Activity, FieldName};
18
19#[derive(Debug, Clone, PartialEq)]
20pub struct Search {
21    collection_id: NonZeroI32,
22    conditions: Vec<Condition>,
23    join: HashMap<Arc<String>, SearchJoin>,
24}
25
26impl Search {
27    pub fn new(
28        collection_id: NonZeroI32,
29        conditions: Vec<Condition>,
30        join: HashMap<Arc<String>, SearchJoin>,
31    ) -> Self {
32        Self {
33            collection_id,
34            conditions,
35            join,
36        }
37    }
38
39    pub fn collection_id(&self) -> NonZeroI32 {
40        self.collection_id
41    }
42
43    pub fn conditions(&self) -> &Vec<Condition> {
44        &self.conditions
45    }
46
47    pub fn search(mut self, condition: Condition) -> Self {
48        self.conditions.push(condition);
49        self
50    }
51
52    pub fn default(mut self) -> Self {
53        self.conditions.push(Condition::Term(Term::default()));
54        self.conditions.push(Condition::Activity(Activity::Active));
55        self
56    }
57
58    pub fn search_field(self, field_name: FieldName, condition: Field) -> Self {
59        self.search(Condition::Field(field_name, condition))
60    }
61
62    pub fn search_row(self, condition: Number) -> Self {
63        self.search(Condition::Row(condition))
64    }
65
66    pub fn search_activity(self, condition: Activity) -> Self {
67        self.search(Condition::Activity(condition))
68    }
69}
70
71impl Database {
72    pub fn search(&self, colletion_id: NonZeroI32) -> Search {
73        Search::new(colletion_id, vec![], HashMap::new())
74    }
75}