#[derive(Debug, Clone, PartialEq)]
pub struct TriplePattern {
pub subject: PatternElement,
pub predicate: PatternElement,
pub object: PatternElement,
}
#[derive(Debug, Clone, PartialEq)]
pub enum PatternElement {
Variable(String),
Constant(String),
}
#[derive(Debug, Clone, PartialEq)]
pub enum FilterCondition {
Equals(String, String),
NotEquals(String, String),
GreaterThan(String, String),
LessThan(String, String),
GreaterOrEqual(String, String),
LessOrEqual(String, String),
Regex(String, String),
Bound(String),
IsIri(String),
IsLiteral(String),
}
#[derive(Debug, Clone, PartialEq)]
pub enum AggregateFunction {
Count {
variable: Option<String>,
distinct: bool,
},
Sum { variable: String, distinct: bool },
Avg { variable: String, distinct: bool },
Min { variable: String },
Max { variable: String },
GroupConcat {
variable: String,
separator: Option<String>,
distinct: bool,
},
Sample { variable: String },
}
#[derive(Debug, Clone, PartialEq)]
pub enum SelectElement {
Variable(String),
Aggregate {
function: AggregateFunction,
alias: Option<String>,
},
}
#[derive(Debug, Clone, PartialEq)]
pub enum BindExpr {
Term(PatternElement),
}
#[derive(Debug, Clone, PartialEq)]
pub enum GraphPattern {
Triple(TriplePattern),
Group(Vec<GraphPattern>),
Optional(Box<GraphPattern>),
Union(Box<GraphPattern>, Box<GraphPattern>),
Filter(FilterCondition),
Bind(BindExpr, String),
Values(Vec<String>, Vec<Vec<PatternElement>>),
}
#[derive(Debug, Clone, PartialEq)]
pub enum QueryType {
Select {
projections: Vec<SelectElement>,
select_vars: Vec<String>,
distinct: bool,
},
Ask,
Describe { resources: Vec<String> },
Construct { template: Vec<TriplePattern> },
}
#[derive(Debug, Clone)]
pub struct SparqlQuery {
pub query_type: QueryType,
pub where_pattern: GraphPattern,
pub group_by: Vec<String>,
pub having: Vec<FilterCondition>,
pub limit: Option<usize>,
pub offset: Option<usize>,
pub order_by: Vec<String>,
}