Expand description
OMG DDS Content-Filter-Expression-Parser + Evaluator.
Safety classification: SAFE (reiner Parser + Evaluator, keine Datenflüsse aus externen Netzen ohne Caller-Vermittlung).
Spec: OMG DDS 1.4 §B.2.1 “Filter expressions”. Die Syntax ist eine
SQL-92-Untermenge, erweitert um %N-Parameter-Placeholder.
§Aktueller Scope
- Literale: String (
'...'), Integer (i64), Float (f64), Boolean (TRUE/FALSE). - Identifier: dotted (
a.b.c) — für nested Field-Access. - Parameter-Placeholder:
%0,%1, … - Vergleichs-Ops:
=,!=,<>,<,<=,>,>=,LIKE. - Boolean-Ops:
AND,OR,NOT. - Klammern.
LIKE-Wildcards:%(mehrere Zeichen),_(ein Zeichen).
Nicht im MVP: BETWEEN ... AND, IN (...), IS NULL. Die folgen
in 3.7c.
§Architektur
lexer: Tokenizer. Alle Keywords case-insensitive, String- Literale'...'mit''-Escape.parser: Recursive-Descent mit Precedence-Klettern —OR<AND<NOT< vergleich < atom.ast: Datentypen fuer Expressions +Value.evaluator:Expr::evaluate(row, params)→bool;rowimplementiertRowAccess(Field-Lookup per Name).
§Verwendung
use zerodds_sql_filter::{parse, Value, RowAccess};
use std::collections::HashMap;
struct MapRow(HashMap<String, Value>);
impl RowAccess for MapRow {
fn get(&self, path: &str) -> Option<Value> {
self.0.get(path).cloned()
}
}
let expr = parse("color = %0 AND x > 10").expect("parse");
let row = MapRow(HashMap::from([
("color".into(), Value::String("RED".into())),
("x".into(), Value::Int(42)),
]));
let params = [Value::String("RED".into())];
assert_eq!(expr.evaluate(&row, ¶ms), Ok(true));Structs§
- Parse
Error - Parse-Fehler mit menschlich lesbarer Message.
Enums§
- Eval
Error - Fehler bei der Evaluation.
- Expr
- Ein Filter-Ausdruck. Rekursiver Baum, erzeugt vom
crate::parse. - Value
- Ein evaluierbarer skalarer Wert. OMG erlaubt mehr Typen (char, etc.) — wir mappen hier bewusst eng auf die häufigsten Fälle.
Traits§
- RowAccess
- Row-Abstraktion: ein Zugriff auf die Felder einer Stichprobe.
Functions§
- parse
- Parse-Einstieg. Das gesamte Input muss Teil genau eines Ausdrucks sein — Reststrings werden als Fehler gewertet.