from patch.include import *
from tqdm import tqdm


@app_context(commit=True)
def reindex_all():
    """
    Для тестирования патча: ( cd /opt/eva-app; python3 -m patch.202510131342_reindex_all )
    Здесь можно работать с моделями через models.CmfTask и т.д.
    Для прогрессбара используйте:
    for task in tqdm(models.CmfTask.list()):
        ...
    """
    print('Запуск патча reindex_all')
    # В этой версии:
    # - добавлии ml_text, пробуем его проинициализировать
    # kwargs['text_prefix'] = f'{self.name} {company_name or ""} {project_name or ""} {tmp_breadcrumbs}'.strip()
    # ml_text = prefix + obj_key_phrases + text + addon_fields + tags + 20 comments + verbose_name

    # Отклчюения индексов итп - не делаем, т.к. в тесте на 153192 записей update занял 2 минуты. Скорости достаточно
    #  ~10-20 мин на 1млн документов

    print('Process ml_text: ', end='', flush=True)
    while True:
        sql = '''
            WITH cte AS (
            SELECT
                id as id,
                (
                    SUBSTRING(COALESCE(obj_name, '') FROM 0 FOR 300) || ' ' ||
                    SUBSTRING(COALESCE(obj_text, '') FROM 0 FOR 200000) || ' ' ||
                    SUBSTRING(COALESCE(obj_tags, '') FROM 0 FOR 1000) || ' ' ||
                    SUBSTRING(COALESCE(obj_comments, '') FROM 0 FOR 4000)
                ) as new_ml_text
            FROM   cmf_full_search
            WHERE  obj_ml_text is null AND part_no=0
            LIMIT  1000
            FOR UPDATE SKIP LOCKED
            )
            UPDATE cmf_full_search s
            SET
                obj_ml_text = COALESCE(cte.new_ml_text, ''), -- Сохраняем не null
                ml_text_tsvector = to_tsvector('russian', COALESCE(cte.new_ml_text, ''))
            FROM   cte
            WHERE  cte.id = s.id
            RETURNING s.id;
        '''
        res = models.CmfPerson.dp.data_driver.Session().execute(sql)
        res = list(res)
        models.CmfPerson.dp.data_driver.commit()
        if len(res):
            print('.', end='', flush=True)
        else:
            break

    models.CmfFullSearch.run_force_reindex(from_patch=True, i_do_manual_migration=True)

if __name__ == "__main__":
    reindex_all()
