Untitled

 avatar
unknown
plain_text
a year ago
4.1 kB
5
Indexable
""" Check if script selects from sandbox(_analysts) schema """
import logging
import re
import yaml

from scripts.validator.linters.dwh.common_dwh_linter_factory import common_dwh_linter_factory
from simple_ddl_parser import DDLParser



path = "../../../../../dwh/dm/dm_detail_ad"

def sandbox_check(files: dict):
    # TODO: выполняется парсинг только простых(стандартных) DDL (пример сложный DDL - dm_detail_class_general)
    ddl_pars = DDLParser(files["ddl"]).run(output_mode="hql")
    # Проверка, что есть DDL
    if not ddl_pars:
        logging.error("Не удалось распарсить DDL файл")
        return False

    ddl_table_name = ddl_pars[0].get('table_name',"")
    # Проверка, что название таблицы не пусто
    if not ddl_table_name:
        logging.error("Не удалось получить название таблицы из DDL")
        return False

    yml_pars = yaml.safe_load(files["specification"])
    # Проверка, что выполняется парсинг yml
    if type(yml_pars) is not dict:
        logging.error("Не удалось распарсить YML файл")
        return False

    yml_table_name = yml_pars.get('table-name', "")
    # Проверка, что есть название таблицы
    if not yml_table_name:
        logging.error("Не удалось получить название таблицы из YML")
        return False

    if ddl_table_name != yml_table_name:
        logging.error("Наименование таблиц в DDL и YML не совпали")
        return False

    logging.info(f"Наименование таблиц совпали - {ddl_table_name}")
    # TODO: доп добавить проверку по совпадению длины (лист ddl=лист yml)
    colum_index = 0
    
    for ddl_column in ddl_pars[0]['columns']:
        #logging.info(ddl_column['name'])
        #a = ddl_column['name']
        #b = yml_pars['structure'][colum_index]['column-name']
        yml_column = yml_pars['structure'][colum_index]
        if ddl_column['name'] != yml_column['column-name']:
            logging.error(f"Наименования колонок в DDL и YML различаются в позиици {colum_index}")
            return False

        ddl_column_type = str.upper(ddl_column['type'])
        yml_column_type = str.upper(yml_column['data-type']).split('(')[0]
        if ddl_column_type != yml_column_type:
            logging.error(f"Типы колонок в DDL и YML различаются в позиици {colum_index}")
            return False

        # TODO: проверяю только с одной стороны DDL на YML (стоит учесть YML на DDL)
        if ddl_column['size'] is not None:
            ddl_column_size = ddl_column['size'] #тип int
            yml_column_size = int(re.search(r"\((.+)\)", yml_column['data-type'])[1])
            if ddl_column_size != yml_column_size:
                logging.error(f" Размерность колонок в DDL и YML различаются в {ddl_column['name']} значения: {ddl_column_size} и {yml_column_size}")

        if ddl_column['nullable'] is True:
            ddl_column_not_null = 0
        else:
            ddl_column_not_null = 1

        if yml_column['not-null'] is False:
            yml_column_not_null = 0
        elif yml_column['not-null'] is None:
            yml_column_not_null = 0
        else:
            yml_column_not_null = 1

        if ddl_column_not_null != yml_column_not_null:  # проверить, что size не пусто (и наоборот?)
            logging.error(f" Разное обозначение NOT NULL в DDL и YML в атрибуте: {ddl_column['name']}")

        colum_index += 1
        #logging.info("Данные колонок совпали")
    return True

common_check = common_dwh_linter_factory([sandbox_check])
common_check.set_path(path)
common_check.local_test()
Editor is loading...
Leave a Comment