Debug do fluxo ontobdc a3 --etl --source <local-path>
Pergunta
Quando o usuario digita ontobdc a3 --etl --source <local-path>, qual e a primeira coisa que acontece na arquitetura/codigo?
Resposta curta
A primeira coisa que acontece e a entrada no CLI principal, em ontobdc.cli:main.
No fluxo atual, esse main() resolve o comando via CliCommandRunAdapter.make(incoming_args). Como o primeiro token e a3, o adaptador trata a3 como logical_component, carrega os comandos do plugin a3 e tenta casar --etl.
Entao, antes de qualquer ETL de fato, o primeiro evento especifico do modulo a3 e:
- reconhecer
a3como componente logico; - carregar os comandos do plugin
a3; - instanciar
A3EtlCommandpara os argumentos--etl --source <valor>.
Ordem real do fluxo
- O executavel
ontobdcchamaontobdc.cli:main. main()normaliza os argumentos e chamaCliCommandRunAdapter.make(incoming_args).CliCommandRunAdapter.make(...)separa o primeiro argumento como componente logico:a3.- O adaptador cria
CommandLoader("a3")e percorre os comandos do plugin. - Ao encontrar correspondencia com
--etl, ele instanciaA3EtlCommand. main()chamacli_command_run.check().- Se
check()passar,main()chamaA3EtlCommand.run(). - Dentro de
run(), o primeiro passo de dominio do ETL eA3EtlStarterAdapter.start(source_value, root_path). - Dentro de
start(...), a primeira acao concreta do ETL e_IncomingResourceFactory(root_path).create(source), que resolve osourcepara um recurso local e verifica se ele existe. - Em seguida,
start(...)chama_load_raw_text(resource)para transformar o recurso de entrada em texto bruto. _load_raw_text(...)valida se o recurso e textual comresource.is_text()e le o conteudo comread_text(encoding="utf-8", errors="ignore").- Depois,
start(...)chama_get_target_dataset(resource)para descobrir em qual dataset registrado o recurso deve ser processado. _get_target_dataset(...)tenta usarresource.dataset; no caso deLocalFileResource, essa property resolve o dataset de forma lazy, consultando o storage graph e subindo pelos diretorios pai ate encontrar um dataset compativel.- De volta em
start(...), o codigo validadataset.container; se nao houver container associado, levantaValueError. - Com tudo valido, o fluxo instancia
RawTextResourceAdapter(raw_text), grava oraw.txtno dataset comraw_resource.write(dataset), calculapackage_pathe dispara_start_worker(package_path). - Dentro de
_start_worker(...), o codigo instanciaA3LogLocalDirectoryRepository()para registrar a execucao do worker. - Em seguida, cria
StateWorkerAdapter(log_repository, package_path), ligando o worker ao pacote que acabou de ser gerado. - O worker e executado em um
ThreadPoolExecutor(max_workers=1)comexecutor.submit(worker.work), e o fluxo bloqueia emfuture.result()ate obterworker_result. - Quando o worker termina sem erro,
start(...)monta umA3EtlStartResultcomstatus,source,resource_location,package_path,dataset_id,container_ideworker_result. - De volta em
A3EtlCommand.run(), o comando grava parte desses valores no contexto, monta oCommandResponsefinal e devolve a resposta de sucesso para o CLI.
O que isso significa para o refactor
Se a pergunta for "qual e a primeira coisa que acontece no sistema inteiro?", a resposta e:
- entrar em
ontobdc.cli:main.
Se a pergunta for "qual e a primeira coisa que acontece ja dentro do modulo A3 refatorado?", a resposta e:
- o
CliCommandRunAdaptercarregar o plugina3e selecionarA3EtlCommand.
Se a pergunta for "qual e a primeira coisa que acontece no ETL de dominio?", a resposta e:
_IncomingResourceFactory.create(source).
Conclusao
A resposta mais precisa para o estado atual do codigo e:
- a primeira coisa que acontece e
ontobdc.cli:mainresolver o comando pelo adaptador de comandos; - a primeira coisa especifica do
a3nesse caminho e o carregamento do plugina3e a selecao deA3EtlCommand; - a primeira coisa do ETL em si e transformar o
sourceem um recurso com_IncomingResourceFactory.create(...).