mirror of
https://github.com/tursodatabase/limbo.git
synced 2025-08-04 18:18:03 +00:00
update properties to add extensional interactions between them
This commit is contained in:
parent
82fcc27a58
commit
13442808dd
5 changed files with 189 additions and 25 deletions
|
@ -20,6 +20,26 @@ impl Predicate {
|
|||
pub(crate) fn false_() -> Self {
|
||||
Self::Or(vec![])
|
||||
}
|
||||
|
||||
pub(crate) fn test(&self, row: &[Value], table: &Table) -> bool {
|
||||
let get_value = |name: &str| {
|
||||
table
|
||||
.columns
|
||||
.iter()
|
||||
.zip(row.iter())
|
||||
.find(|(column, _)| column.name == name)
|
||||
.map(|(_, value)| value)
|
||||
};
|
||||
|
||||
match self {
|
||||
Predicate::And(vec) => vec.iter().all(|p| p.test(row, table)),
|
||||
Predicate::Or(vec) => vec.iter().any(|p| p.test(row, table)),
|
||||
Predicate::Eq(column, value) => get_value(column) == Some(value),
|
||||
Predicate::Neq(column, value) => get_value(column) != Some(value),
|
||||
Predicate::Gt(column, value) => get_value(column).map(|v| v > value).unwrap_or(false),
|
||||
Predicate::Lt(column, value) => get_value(column).map(|v| v < value).unwrap_or(false),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Display for Predicate {
|
||||
|
|
|
@ -53,6 +53,22 @@ pub(crate) enum Value {
|
|||
Blob(Vec<u8>),
|
||||
}
|
||||
|
||||
impl PartialOrd for Value {
|
||||
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
|
||||
match (self, other) {
|
||||
(Self::Null, Self::Null) => Some(std::cmp::Ordering::Equal),
|
||||
(Self::Null, _) => Some(std::cmp::Ordering::Less),
|
||||
(_, Self::Null) => Some(std::cmp::Ordering::Greater),
|
||||
(Self::Integer(i1), Self::Integer(i2)) => i1.partial_cmp(i2),
|
||||
(Self::Float(f1), Self::Float(f2)) => f1.partial_cmp(f2),
|
||||
(Self::Text(t1), Self::Text(t2)) => t1.partial_cmp(t2),
|
||||
(Self::Blob(b1), Self::Blob(b2)) => b1.partial_cmp(b2),
|
||||
// todo: add type coercions here
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn to_sqlite_blob(bytes: &[u8]) -> String {
|
||||
format!(
|
||||
"X'{}'",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue