Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
sarus_sql / sarus_sql / translator.py
Size: Mime:
"""Module to translatior builders."""

import copy

from snsql._ast.ast import Query
from snsql.sql.parse import QueryParser

from .ast_transform import (
    BigQueryTranslator,
    DatabricksTranslator,
    MySQLTranslator,
    RedshiftTranslator,
    SqlServerTranslator,
)
from .dialects import SQLDialect

DIALECT_TO_TRANSLATOR = {
    SQLDialect.BIG_QUERY: BigQueryTranslator,
    SQLDialect.DATABRICKS: DatabricksTranslator,
    SQLDialect.MY_SQL: MySQLTranslator,
    SQLDialect.REDSHIFT: RedshiftTranslator,
    SQLDialect.SQL_SERVER: SqlServerTranslator,
}


def translate_to_postgres(query: Query, dialect: SQLDialect) -> Query:
    """It translates the query into postgres dialec (the standard in sarus):
    It changes identifiers quoting: e.g. `iden` to "iden"

    Args:
        query (Query): smartnoise Query.
        dialect (SupprtedDialect): dialect

    Returns:
        str: translated query if exist a translator otherwise return the query
        sting unchanged.
    """
    translator_obj = DIALECT_TO_TRANSLATOR.get(dialect, None)
    copied_query = copy.deepcopy(query)
    if translator_obj:
        translator = translator_obj(copied_query)
        translator.to_postgres()
        return translator.query
    return copied_query


def translate_to_dialect(query: Query, dialect: SQLDialect) -> Query:
    """It translates the query into postgres dialec (the standard in sarus):
    It changes identifiers quoting: e.g. `iden` to "iden"

    Args:
        query (Query): smartnoise Query.
        dialect (SupprtedDialect): dialect

    Returns:
        str: translated query if exist a translator otherwise return the query
        sting unchanged.
    """
    translator_obj = DIALECT_TO_TRANSLATOR.get(dialect, None)
    copied_query = copy.deepcopy(query)
    if translator_obj:
        translator = translator_obj(copied_query)
        translator.to_dialect()
        return translator.query
    return copied_query


def parse_query(
    query_str: str,
) -> Query:
    """Parses the string query and returns an ast."""
    try:
        parsed_query = QueryParser().query(query_str)
    except BaseException as err:
        raise type(err)(
            f"Query parsing failed for `{query_str}`\n with error:\n{err}"
        )
    return parsed_query