Verified Commit ec3227b8 authored by Jean-Gabriel Doyon PTO until 2024-04-17's avatar Jean-Gabriel Doyon PTO until 2024-04-17 Committed by GitLab
Browse files

refactor(indexer): extract llqm_v1 module from sdlc plan

parent 0e58a2b2
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ pub mod engine;
pub(crate) mod env;
pub mod handler;
pub mod health;
pub mod llqm_v1;
pub mod locking;
pub mod metrics;
pub mod modules;
+12 −0
Original line number Diff line number Diff line
@@ -187,3 +187,15 @@ impl TableRef {
        }
    }
}

#[derive(Debug, Clone, PartialEq)]
pub struct Insert {
    pub table: String,
    pub columns: Vec<String>,
}

#[derive(Debug, Clone, PartialEq)]
pub struct InsertSelect {
    pub insert: Insert,
    pub query: Query,
}
+78 −2
Original line number Diff line number Diff line
use super::ast::{Expr, OrderExpr, Query, SelectExpr, TableRef};
use super::ast::{Expr, InsertSelect, OrderExpr, Query, SelectExpr, TableRef};

pub fn emit_insert_select(statement: &InsertSelect) -> String {
    let mut sql = String::with_capacity(512);

    sql.push_str("INSERT INTO ");
    sql.push_str(&statement.insert.table);

    if !statement.insert.columns.is_empty() {
        sql.push_str(" (");
        sql.push_str(&statement.insert.columns.join(", "));
        sql.push(')');
    }

    sql.push_str(" SELECT ");
    emit_select_list(&mut sql, &statement.query.select);

    sql.push_str(" FROM ");
    emit_table_ref(&mut sql, &statement.query.from);

    if let Some(where_clause) = &statement.query.where_clause {
        sql.push_str(" WHERE ");
        emit_expr(&mut sql, where_clause);
    }

    sql
}

pub fn emit_sql(query: &Query) -> String {
    let mut sql = String::with_capacity(256);
@@ -118,7 +144,7 @@ fn emit_order_by(sql: &mut String, order_by: &[OrderExpr]) {
#[cfg(test)]
mod tests {
    use super::*;
    use crate::modules::sdlc::plan::ast::Op;
    use crate::llqm_v1::ast::{Insert, InsertSelect, Op};

    #[test]
    fn simple_select_from() {
@@ -274,6 +300,56 @@ mod tests {
        );
    }

    #[test]
    fn insert_select_with_where() {
        let statement = InsertSelect {
            insert: Insert {
                table: "gl_project".to_string(),
                columns: vec![
                    "id".to_string(),
                    "name".to_string(),
                    "_deleted".to_string(),
                    "_version".to_string(),
                ],
            },
            query: Query {
                select: vec![
                    SelectExpr::bare(Expr::col("", "id")),
                    SelectExpr::bare(Expr::col("", "name")),
                    SelectExpr::bare(Expr::raw("true")),
                    SelectExpr::bare(Expr::raw("now64(6)")),
                ],
                from: TableRef::scan("gl_project", None),
                where_clause: Some(Expr::binary(
                    Op::And,
                    Expr::func(
                        "startsWith",
                        vec![
                            Expr::col("", "traversal_path"),
                            Expr::param("traversal_path", "String"),
                        ],
                    ),
                    Expr::binary(Op::Eq, Expr::col("", "_deleted"), Expr::raw("false")),
                )),
                order_by: vec![],
                limit: None,
            },
        };

        let sql = emit_insert_select(&statement);

        assert!(
            sql.starts_with("INSERT INTO gl_project (id, name, _deleted, _version) SELECT "),
            "sql: {sql}"
        );
        assert!(sql.contains(", true, now64(6)"), "sql: {sql}");
        assert!(
            sql.contains("startsWith(traversal_path, {traversal_path:String})"),
            "sql: {sql}"
        );
        assert!(sql.contains("(_deleted = false)"), "sql: {sql}");
    }

    #[test]
    fn param_placeholder() {
        let query = Query {
+2 −0
Original line number Diff line number Diff line
pub mod ast;
pub mod codegen;
+3 −2
Original line number Diff line number Diff line
pub(crate) mod ast;
pub(crate) mod codegen;
pub(crate) mod input;
pub(crate) mod lower;

pub(crate) use crate::llqm_v1::ast;
pub(crate) use crate::llqm_v1::codegen;

pub(in crate::modules::sdlc) const SOURCE_DATA_TABLE: &str = "source_data";

use arrow::array::Array;