Expand description
§Google AIP-160 Filter Parser with SeaORM Support
This crate provides a parser for Google AIP-160 filtering expressions and converts them to SeaORM conditions for database queries.
§Features
- Parse Google AIP-160 filter expressions
- Convert filters to SeaORM conditions
- Support for logical operators (AND, OR, NOT)
- Support for comparison operators (=, !=, <, <=, >, >=, :)
- Support for strings, numbers, booleans, and null values
§Usage
§Parsing a Filter
use aip_160::parse_filter;
let filter = parse_filter("name = \"John\" AND age > 18").unwrap();
println!("{}", filter);§Converting to SeaORM Condition
ⓘ
use sea_orm::entity::prelude::*;
use aip_160::{parse_filter, sea_orm::{FieldMapper, ToSeaOrmCondition}};
// Define your entity
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
#[sea_orm(table_name = "users")]
pub struct Model {
#[sea_orm(primary_key)]
pub id: i32,
pub name: String,
pub email: String,
pub age: i32,
pub active: bool,
}
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {}
impl ActiveModelBehavior for ActiveModel {}
// Implement the FieldMapper trait
impl FieldMapper for Entity {
fn map_field(&self, field: &str) -> aip_160::error::Result<sea_orm::sea_query::SimpleExpr> {
match field {
"id" => Ok(Column::Id.into_simple_expr()),
"name" => Ok(Column::Name.into_simple_expr()),
"email" => Ok(Column::Email.into_simple_expr()),
"age" => Ok(Column::Age.into_simple_expr()),
"active" => Ok(Column::Active.into_simple_expr()),
_ => Err(aip_160::error::FilterError::InvalidField(field.to_string())),
}
}
}
// Use in your query
async fn find_users(db: &DatabaseConnection, filter_str: &str) -> Result<Vec<Model>, DbErr> {
let filter = parse_filter(filter_str).unwrap();
let condition = filter.to_condition(&Entity).unwrap();
Entity::find()
.filter(condition)
.all(db)
.await
}§Supported Filter Syntax
§Basic Comparisons
name = "John"- Equalityage > 18- Greater thanage >= 18- Greater than or equalage < 65- Less thanage <= 65- Less than or equalstatus != "inactive"- Not equaltags : "important"- Contains/has (for substring matching)
§Logical Operators
name = "John" AND age > 18- ANDstatus = "active" OR status = "pending"- ORNOT deleted = true- NOT(status = "active" OR status = "pending") AND age > 18- Grouped expressions
§Value Types
- Strings:
"value"or'value' - Numbers:
42,3.14,-10,1e5 - Booleans:
true,false(case insensitive) - Null:
null(case insensitive)
§Example Filters
name = "John Doe"
age > 18 AND active = true
(status = "active" OR status = "pending") AND created > "2024-01-01"
NOT deleted = true
tags : "important"
price >= 100 AND price <= 1000
email : "@example.com" AND verified = trueRe-exports§
pub use ast::Comparator;pub use ast::Expression;pub use ast::Filter;pub use ast::Restriction;pub use ast::Value;pub use error::FilterError;pub use error::Result;pub use parser::parse_filter;