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}