hamelin_legacy 0.4.4

Legacy AST translation code for Hamelin (to be deprecated)
Documentation
use crate::ast::expression::HamelinExpression;
use crate::ast::pipeline::HamelinPipeline;
use crate::env::Environment;
use crate::translation::projection_builder::{ProjectionBuilder, ProjectionBuilderExt};
use crate::translation::sql_query_helpers::prepend_projections;
use crate::translation::PendingQueryResult;
use hamelin_lib::antlr::hamelinparser::{
    AssignmentContextAttrs, LetCommandContext, LetCommandContextAttrs,
};
use hamelin_lib::err::TranslationError;
use hamelin_lib::sql::expression::identifier::HamelinIdentifier;

pub fn translate(
    ctx: &LetCommandContext<'static>,
    pipeline: &HamelinPipeline,
    pending_query_result: &mut PendingQueryResult,
) {
    let mut new_projections = ProjectionBuilder::default();
    for (identifier_ctx, expression_ctx) in
        ctx.assignment_all().into_iter().flat_map(|assignment| {
            assignment
                .identifier()
                .and_then(|i| assignment.expression().map(|e| (i, e)))
        })
    {
        let identifier = pending_query_result
            .errors
            .consume_errors(HamelinIdentifier::new(identifier_ctx).to_sql());
        let expr_ctx = pipeline
            .context
            .default_expression_translation_context(&pending_query_result.translation.env);
        let expression = HamelinExpression::new(expression_ctx, expr_ctx);
        let expression_translation = pending_query_result
            .errors
            .consume_errors(expression.translate());

        if let Some((identifier, expression_translation)) = identifier.zip(expression_translation) {
            new_projections.intialize_struct_reference_then_bind(
                identifier,
                expression_translation.sql,
                expression_translation.typ,
                &pending_query_result.translation.env,
            );
        }
    }

    let env = Environment::new(new_projections.clone().build_hamelin_type());
    pending_query_result.translation.env =
        pending_query_result.translation.env.prepend_overwrite(&env);

    if let Some(projections) = pending_query_result.errors.consume_errors(
        new_projections
            .build_projections()
            .map_err(|e| TranslationError::wrap_box(ctx, e.into()).single()),
    ) {
        pending_query_result.translation.query = prepend_projections(
            &pending_query_result.translation.query,
            projections,
            &pending_query_result.translation.env,
        );
    }
}