Encode a PK value into sortable bytes. Uses big-endian XOR encoding for signed integers (preserves sort order), raw UTF-8 for strings, raw bytes for UUIDs.
(value: &nodedb_types::value::Value)
| 169 | /// Uses big-endian XOR encoding for signed integers (preserves sort order), |
| 170 | /// raw UTF-8 for strings, raw bytes for UUIDs. |
| 171 | pub fn encode_pk(value: &nodedb_types::value::Value) -> Vec<u8> { |
| 172 | use nodedb_types::value::Value; |
| 173 | match value { |
| 174 | Value::Integer(v) => { |
| 175 | let sortable = (*v as u64) ^ (1u64 << 63); |
| 176 | sortable.to_be_bytes().to_vec() |
| 177 | } |
| 178 | Value::String(s) => s.as_bytes().to_vec(), |
| 179 | Value::Uuid(s) => s.as_bytes().to_vec(), |
| 180 | Value::Decimal(d) => d.serialize().to_vec(), |
| 181 | Value::DateTime(dt) => { |
| 182 | let sortable = (dt.micros as u64) ^ (1u64 << 63); |
| 183 | sortable.to_be_bytes().to_vec() |
| 184 | } |
| 185 | _ => format!("{value:?}").into_bytes(), |
| 186 | } |
| 187 | } |
| 188 | |
| 189 | /// Encode a composite PK from multiple values. |
| 190 | pub fn encode_composite_pk(values: &[&nodedb_types::value::Value]) -> Vec<u8> { |