Skip to main content

rushdb_types/
model.rs

1use serde::{Deserialize, Serialize};
2use std::fmt;
3
4/// The canonical scalar domain stored in postings and occurrences.
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
6pub enum LogicalType {
7    /// Boolean value.
8    Boolean,
9    /// Signed 64-bit integer.
10    Int64,
11    /// IEEE-754 double-precision float.
12    Float64,
13    /// UTF-8 string.
14    Utf8,
15    /// UTC epoch milliseconds.
16    DateTime,
17}
18
19impl fmt::Display for LogicalType {
20    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
21        let name = match self {
22            LogicalType::Boolean => "boolean",
23            LogicalType::Int64 => "int64",
24            LogicalType::Float64 => "float64",
25            LogicalType::Utf8 => "utf8",
26            LogicalType::DateTime => "datetime",
27        };
28        f.write_str(name)
29    }
30}
31
32/// Catalog state: definitions are Unresolved until type evidence exists.
33#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
34pub enum TypeState {
35    /// No value has been observed yet, so no type is committed.
36    Unresolved,
37    /// A concrete logical type has been observed.
38    Known(LogicalType),
39}
40
41/// How many values a property may hold.
42#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
43pub enum Cardinality {
44    /// Exactly one value per owner.
45    Single,
46    /// Multiple values whose order is significant.
47    OrderedMany,
48    /// Multiple values treated as an unordered set.
49    UnorderedMany,
50}
51
52/// Whether a property may be absent or explicitly null.
53#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
54pub enum Nullability {
55    /// No nullability evidence has been recorded.
56    Unspecified,
57    /// Explicit nulls are permitted.
58    Nullable,
59    /// Nulls are rejected.
60    NotNull,
61}