1use crate::{AttrId, EntityId, TxId, Value, encoding::Encodable};
4
5#[derive(Clone, Debug, Eq, PartialEq)]
7pub struct Datom {
8 pub e: EntityId,
10 pub a: AttrId,
12 pub v: Value,
14 pub tx: TxId,
16 pub added: bool,
18}
19
20#[derive(Clone, Copy, Debug, Eq, PartialEq)]
22pub enum IndexOrder {
23 Eavt,
25 Aevt,
27 Avet,
29 Vaet,
31}
32
33impl Datom {
34 #[must_use]
36 pub fn key(&self, order: IndexOrder) -> Vec<u8> {
37 let mut out = Vec::new();
38 match order {
39 IndexOrder::Eavt => {
40 self.e.encode_into(&mut out);
41 self.a.encode_into(&mut out);
42 self.v.encode_into(&mut out);
43 }
44 IndexOrder::Aevt => {
45 self.a.encode_into(&mut out);
46 self.e.encode_into(&mut out);
47 self.v.encode_into(&mut out);
48 }
49 IndexOrder::Avet => {
50 self.a.encode_into(&mut out);
51 self.v.encode_into(&mut out);
52 self.e.encode_into(&mut out);
53 }
54 IndexOrder::Vaet => {
55 self.v.encode_into(&mut out);
56 self.a.encode_into(&mut out);
57 self.e.encode_into(&mut out);
58 }
59 }
60 encode_tx_added(self.tx, self.added, &mut out);
61 out
62 }
63}
64
65fn encode_tx_added(tx: TxId, added: bool, out: &mut Vec<u8>) {
66 ((tx.raw() << 1) | u64::from(added)).encode_into(out);
67}