Skip to main content

shape_ast/ast/
queries.rs

1//! Query types for Shape AST
2
3use serde::{Deserialize, Serialize};
4
5use super::expressions::Expr;
6use super::time::TimeWindow;
7use super::windows::OrderByClause;
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub enum Query {
11    Backtest(BacktestQuery),
12    Alert(AlertQuery),
13    /// Query with Common Table Expressions (CTEs)
14    With(WithQuery),
15}
16
17#[derive(Debug, Clone, Serialize, Deserialize)]
18pub struct BacktestQuery {
19    pub strategy: String,
20    pub window: TimeWindow,
21    pub parameters: Vec<(String, Expr)>,
22}
23
24#[derive(Debug, Clone, Serialize, Deserialize)]
25pub struct AlertQuery {
26    pub condition: Expr,
27    pub message: Option<String>,
28    pub webhook: Option<String>,
29}
30
31/// A Common Table Expression (CTE) - named subquery
32#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct Cte {
34    /// Name of the CTE (referenced in main query)
35    pub name: String,
36    /// Optional column names for the CTE
37    pub columns: Option<Vec<String>>,
38    /// The subquery that defines this CTE
39    pub query: Box<Query>,
40    /// Whether this CTE is recursive
41    pub recursive: bool,
42}
43
44/// Query with CTEs (WITH clause)
45#[derive(Debug, Clone, Serialize, Deserialize)]
46pub struct WithQuery {
47    /// List of CTEs defined in the WITH clause
48    pub ctes: Vec<Cte>,
49    /// The main query that uses the CTEs
50    pub query: Box<Query>,
51}
52
53/// Common query modifiers (LIMIT, ORDER BY)
54#[derive(Debug, Clone, Default, Serialize, Deserialize)]
55pub struct QueryModifiers {
56    /// Maximum number of results to return
57    pub limit: Option<usize>,
58    /// Ordering for results
59    pub order_by: Option<OrderByClause>,
60}