1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
use std::cmp::Ordering;

use versatile_data::{
    Data
    ,Activity
    ,Term
    ,KeyValue
    ,Operation
};

pub struct Collection{
    pub(crate) data:Data
    ,id:i32
    ,name:String
}
impl Collection{
    pub fn new(data:Data,id:i32,name:impl Into<String>)->Collection{
        Collection{
            data
            ,id
            ,name:name.into()
        }
    }
    pub fn id(&self)->i32{
        self.id
    }
    pub fn name(&self)->&str{
        &self.name
    }
    pub fn activity(&self,row:u32)->Activity{
        self.data.activity(row)
    }
    pub fn serial(&self,row:u32)->u32{
        self.data.serial(row)
    }
    pub fn uuid_str(&self,row:u32)->String{
        self.data.uuid_str(row)
    }
    pub fn last_updated(&self,row:u32)->i64{
        self.data.last_updated(row)
    }
    pub fn term_begin(&self,row:u32)->i64{
        self.data.term_begin(row)
    }
    pub fn term_end(&self,row:u32)->i64{
        self.data.term_end(row)
    }
    pub fn field_str(&self,row:u32,field_name:&str)->&str{
        self.data.field_str(row,field_name)
    }
    pub fn field_num(&self,row:u32,field_name:&str)->f64{
        self.data.field_num(row,field_name)
    }
    pub fn create_row(&mut self,activity:&Activity,term_begin:&Term,term_end:&Term,fields:&Vec<KeyValue>)->u32{
        self.data.create_row(
            activity
            ,term_begin
            ,term_end
            ,fields
        )
    }
    pub fn update_row(&mut self,collection_row:u32,activity:&Activity,term_begin:&Term,term_end:&Term,fields:&Vec<KeyValue>){
        self.data.update_row(
            collection_row
            ,&activity
            ,&term_begin
            ,&term_end
            ,&fields
        );
    }
    pub fn update(&mut self,operation:&Operation)->u32{
        self.data.update(operation)
    }
}

#[derive(Clone,Copy,Default,Debug)]
pub struct CollectionRow{
    collection_id:i32
    ,row:u32
}
impl PartialOrd for CollectionRow {
    fn partial_cmp(&self, other: &CollectionRow) -> Option<Ordering> {
        Some(self.cmp(other))
    }
}
impl Ord for CollectionRow{
    fn cmp(&self,other:&CollectionRow)->Ordering{
        if self.collection_id==other.collection_id{
            if self.row==other.row{
                Ordering::Equal
            }else if self.row>other.row{
                Ordering::Greater
            }else{
                Ordering::Less
            }
        }else if self.collection_id>other.collection_id{
            Ordering::Greater
        }else{
            Ordering::Less
        }
    }
}
impl PartialEq for CollectionRow {
    fn eq(&self, other: &CollectionRow) -> bool {
        self.collection_id == other.collection_id && self.row == other.row
    }
}
impl Eq for CollectionRow {}

impl CollectionRow{
    pub fn new(
        collection_id:i32
        ,row:u32
    )->CollectionRow{
        CollectionRow{
            collection_id
            ,row
        }
    }
    pub fn collection_id(&self)->i32{
        self.collection_id
    }
    pub fn row(&self)->u32{
        self.row
    }
}