Skip to main content

kernel/config/
filter.rs

1use serde::{Deserialize, Serialize};
2
3use crate::common;
4
5/// A condition on which rows a join or aggregate sees. Either a structured
6/// comparison ([`NullCheckFilter`], [`ValueOpFilter`]) or a [`RawFilter`] of
7/// verbatim SQL for cases the structured forms don't cover.
8#[derive(Debug, Clone, Hash, Serialize, Deserialize)]
9#[serde(rename_all = "snake_case")]
10pub enum Filter {
11    Raw(RawFilter),
12    NullCheck(NullCheckFilter),
13    ValueOp(ValueOpFilter),
14}
15
16#[derive(Debug, Clone, Hash, Serialize, Deserialize)]
17pub struct RawFilter {
18    pub raw: common::RawFilterValue,
19}
20
21/// `is_null` / `is_not_null` — no value operand.
22#[derive(Debug, Clone, Hash, Serialize, Deserialize)]
23pub struct NullCheckFilter {
24    pub column: common::ColumnName,
25    pub op: NullOp,
26}
27
28/// All other filter ops — value operand matches the operator's arity.
29#[derive(Debug, Clone, Hash, Serialize, Deserialize)]
30pub struct ValueOpFilter {
31    pub column: common::ColumnName,
32    pub op: FilterOp,
33    pub value: FilterValue,
34}
35
36/// Typed filter value — arity matches the operator.
37/// `In`/`NotIn` → `List`, `Between` → `Range`, everything else → `Single`.
38#[derive(Debug, Clone, Hash, Serialize, Deserialize)]
39#[serde(rename_all = "snake_case")]
40pub enum FilterValue {
41    Single(String),
42    List(Vec<String>),
43    Range(String, String),
44}
45
46#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)]
47#[serde(rename_all = "snake_case")]
48pub enum NullOp {
49    IsNull,
50    IsNotNull,
51}
52
53#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)]
54#[serde(rename_all = "snake_case")]
55pub enum FilterOp {
56    Eq,
57    Neq,
58    Lt,
59    Lte,
60    Gt,
61    Gte,
62    In,
63    NotIn,
64    Like,
65    Ilike,
66    Between,
67}