diff --git a/.gitignore b/.gitignore index 821f893..ce45468 100644 --- a/.gitignore +++ b/.gitignore @@ -14,8 +14,5 @@ trabalho-pratico/obj trabalho-pratico/programa-principal trabalho-pratico/programa-testes -# To be removed when reports need to be published. -trabalho-pratico/relatorio-fase2.pdf - # Output results trabalho-pratico/Resultados diff --git a/trabalho-pratico/relatorio-fase2.pdf b/trabalho-pratico/relatorio-fase2.pdf new file mode 100644 index 0000000..5035f9b Binary files /dev/null and b/trabalho-pratico/relatorio-fase2.pdf differ diff --git a/trabalho-pratico/reports/relatorio-fase2.tex b/trabalho-pratico/reports/relatorio-fase2.tex index 1f7a88f..34eff19 100644 --- a/trabalho-pratico/reports/relatorio-fase2.tex +++ b/trabalho-pratico/reports/relatorio-fase2.tex @@ -9,9 +9,13 @@ \usepackage[dvipsnames]{xcolor} \usepackage{float} \usepackage{footnote} +\usepackage{chngpage} \chardef\_=`_ +\onehalfspacing +\makesavenoteenv{tabular} + \title{\textbf{LI3 - Relatório da Fase II - Grupo 12}} \author{ Humberto Gomes (A104348) \\ @@ -20,40 +24,37 @@ } \date{janeiro de 2024} -\makesavenoteenv{tabular} \begin{document} \maketitle -\onehalfspacing \setlength{\parskip}{\baselineskip} \setlength{\parindent}{0pt} -\pagebreak \begin{abstract} Após a entrega da primeira fase deste trabalho, procurámos implementar as funcionalidades em falta para a conclusão do desenvolvimento desta aplicação: as restantes quatro \emph{queries}, um modo de uso interativo (uma interface TUI), testes funcionais e de desempenho, e suporte para um \emph{dataset} de maior dimensão, mantendo um desempenho aceitável. Adicionalmente, - procurámos também melhorar o encapsulamento e a modularidade no nosso projeto. + procurámos também corrigir alguns aspetos do encapsulamento e da modularidade no nosso projeto. \end{abstract} \section{Estrutura do trabalho} Nesta secção, procuramos descrever as diferenças entre a nossa arquitetura atual e a que tínhamos na primeira fase do projeto. Devido ao elevado número de módulos, dividimos a aplicação em -subsistemas, que são descritos e esquematizados um a um. Nesses esquemas, para reduzir a -complexidade visual, não incluímos todas as relações de dependência, mas apenas as mais relevantes. -Segue-se a nossa convenção gráfica: +subsistemas, que são descritos e esquematizados um a um, apresentados apenas com as relações de +dependência mais relevantes. Segue-se a nossa convenção gráfica: \begin{itemize} - \item Um retângulo com cantos arredondados representa uma estrutura de dados (entidades, - gestores, \ldots); + \item Um retângulo com cantos arredondados representa uma estrutura de dados (entidade, + gestor, alocador, \ldots); \item Um retângulo sem cantos arredondados representa um módulo cuja tarefa principal é a execução de código. Mesmo assim, alguns destes módulos podem conter estruturas de dados auxiliares (por exemplo, uma gramática definida no módulo de um \emph{parser}); \item $A \rightarrow B$ significa que o módulo $A$ depende do módulo $B$. - \item Qualquer módulo ou relação de dependência representado(a) a {\color{ForestGreen}verde} - indica que o(a) mesmo(a) é uma adição nesta segunda fase, ausente na entrega anterior. + \item Nos subsistemas já existentes na primeira fase, um módulo ou relação de dependência + representado(a) a {\color{ForestGreen}verde} indica que o(a) mesmo(a) estava ausente na + entrega anterior. \end{itemize} \subsection{\emph{Parsing}} @@ -61,7 +62,7 @@ \subsection{\emph{Parsing}} \begin{figure}[ht] \centering - \includegraphics[scale=0.17]{res-fase2/parsing.png} + \includegraphics[scale=0.16]{res-fase2/parsing.png} \caption{Diagrama de dependências do subsistema de \emph{parsing}} \label{fig:parsing} \end{figure} @@ -69,25 +70,24 @@ \subsection{\emph{Parsing}} Nesta fase do projeto, separámos em diferentes módulos as funcionalidades de \emph{input} de dados e \emph{output} de erros num \emph{dataset}, antes concentradas no \texttt{dataset\_loader}. Agora, este módulo apenas gere duas estruturas de dados formadas por \emph{handles} de ficheiros, -\texttt{dataset\_input} e \texttt{dataset\_error\_output}. Ademais, adicionámos o módulo +\texttt{dataset\_input} e \texttt{dataset\_error\_output}. Além disso, adicionámos o módulo \texttt{path\_utils}, para manipulação de caminhos para ficheiros. \subsection{Entidades} \label{sec:entities} -\begin{figure}[ht] +\begin{figure}[H] \centering - \includegraphics[scale=0.2]{res-fase2/entities.png} + \includegraphics[scale=0.16]{res-fase2/entities.png} \caption{Diagrama de dependências das entidades da aplicação} \label{fig:entities} \end{figure} -Nas entidades, criámos módulos para os identificadores de voos, reservas e hotéis. Estes são -armazenados como inteiros, logo exigindo \emph{parsing} e uma forma de serem apresentados -textualmente, código que antes se encontrava em duplicado em vários locais da aplicação. Ademais, -passaram a ser os \emph{setters} das entidades a validar se os valores providenciados para os seus -campos são válidos. Anteriormente, este era o trabalho dos módulos \texttt{*\_loader}, sendo -possível ao programador, usando \emph{setters}, criar uma entidade inválida. +Nas entidades, criámos módulos para os identificadores de voos, reservas e hotéis, de modo a remover +código de \emph{parsing} e \emph{display} previamente duplicado em vários locais da \emph{codebase}. +Ademais, passaram a ser os \emph{setters} das entidades a validar se os valores providenciados para +os seus campos são válidos. Este antes era o trabalho dos módulos \texttt{*\_loader}, sendo possível +ao programador, usando \emph{setters}, criar uma entidade inválida. \subsection{Catálogos} \label{sec:catalogs} @@ -104,8 +104,8 @@ \subsection{Catálogos} hotéis e de companhias aéreas. Quanto às novas relações de dependência, removemos muito código duplicado ao adaptar a -\texttt{pool}, para com ela ser possível implementar a \texttt{string\_pool}. Ademais, as entidades -passam a depender dos alocadores, por motivos explicados em +\texttt{pool}, para com ela ser possível implementar a \texttt{string\_pool}. Por último, as +entidades passam a depender dos alocadores, por motivos explicados em \nameref{sec:allocator-conciliation}. \subsection{\emph{Queries}} @@ -113,76 +113,75 @@ \subsection{\emph{Queries}} \begin{figure}[ht] \centering - \includegraphics[scale=0.17]{res-fase2/queries.png} + \includegraphics[scale=0.15]{res-fase2/queries.png} \caption{Diagrama de dependências do subsistema de \emph{queries}} \label{fig:queries} \end{figure} -Como todas as \emph{queries} apresentam a mesma formatação de \emph{output}, adicionámos a estrutura -\texttt{query\_writer}, que formata o \emph{output} de uma \emph{query} automaticamente, e o -escreve para um ficheiro (modo \emph{batch}) ou para um conjunto de linhas em memória (modo -interativo). Segue-se a descrição do funcionamento das \emph{queries} novas e das que sofreram -mudanças significativas: +Como todas as \emph{queries} apresentam a mesma formatação de \emph{output}, adicionámos o +\texttt{query\_writer}, uma estrutura que formata o \emph{output} de uma \emph{query} +automaticamente, e o escreve para um ficheiro (modo \emph{batch}) ou para um conjunto de linhas em +memória (modo interativo). Os módulos \texttt{GConstPtrArray} e \texttt{GConstKeyHashTable} são +explicados em \nameref{sec:glib-conciliation}. Segue-se a descrição do funcionamento das +\emph{queries} novas e das que sofreram mudanças significativas: \begin{itemize} \item \textbf{Q05} - Listagem dos voos com origem num dado aeroporto entre duas datas. Com uma única iteração pelos voos para todas as \emph{queries} deste tipo, verifica-se se cada voo cumpre as condições para ser parte da resposta a uma \emph{query}. Em caso afirmativo, adiciona-se esse voo a um - \emph{array}, associado à \emph{query} através de uma tabela de - \emph{hash}. A execução de cada \emph{query} passa apenas pela ordenação e - apresentação do seu \emph{array} correspondente. + \emph{array} associado à \emph{query}. A execução de cada \emph{query} + passa apenas pela ordenação e apresentação do seu \emph{array} + correspondente. \item \textbf{Q07} - Listagem dos aeroportos com maior mediana de atrasos. Com uma única iteração pelos voos para todas as \emph{queries} deste tipo, gera-se uma tabela de \emph{hash} que associa aeroportos a \emph{arrays} de atrasos. - Depois, calcula-se a mediana para cada \emph{array} (ordenação seguida do - ponto médio), gerando-se outra tabela de \emph{hash}, entre aeroportos e - medianas de atrasos. Executar cada \emph{query} consiste na consulta direta - desta tabela. + Depois, calcula-se a mediana para cada \emph{array}, gerando-se outra + \emph{hash table}, entre aeroportos e medianas. Executar cada \emph{query} + consiste na consulta direta desta tabela. \item \textbf{Q08} - Cálculo da receita de um hotel entre duas datas. Com uma única iteração pelas reservas para todas as \emph{queries} deste tipo, gera-se uma tabela - de \emph{hash} que associa pares hotel + intervalo de datas às suas - receitas. Interseta-se, para cada reserva, o intervalo de noites dormidas - com o pedido na \emph{query}, para o cálculo do número de noites e da - receita total. Executar cada \emph{query} consiste simplesmente na consulta - da tabela gerada. + de \emph{hash} que associa \emph{queries} a receitas. Interseta-se, para + cada reserva, o intervalo de noites dormidas com o intervalo pedido em cada + \emph{query}, para o cálculo do número de noites e da receita total. + Executar cada \emph{query} consiste simplesmente na consulta da tabela + gerada. \item \textbf{Q09} - Listagem de todos os utilizadores cujo nome comece com um dado prefixo. A nova implementação desta \emph{query} é muito semelhante à da \textbf{Q05}, mas iterando pelos utilizadores em vez dos voos. Esta solução é significativamente mais veloz que a anterior, que fazia uma iteração pelos - utilizadores por \emph{query}. Considerámos a possibilidade - de gerar um índice de pesquisa usando \emph{tries}, mas optámos por não - tornar o nosso código muito complexo para otimizar algo responsável por uma - fração mínima do tempo total do programa. - - \item \textbf{Q10} - {\color{red}Ainda tenho de otimizar isto} + utilizadores por \emph{query}. + + \item \textbf{Q10} - Cálculo de várias métricas gerais da aplicação. Com uma única iteração pela + totalidade dos catálogos para todas as \emph{queries} deste tipo, + verifica-se se cada entidade deve ou não ser contada para a resposta a cada + \emph{query}. Como o acesso aos passageiros é feito utilizador a + utilizador, torna-se possível, usando uma \emph{bitmask}, facilmente + discernir os passageiros únicos. A execução de cada \emph{query} torna-se + uma simples pesquisa pelas respostas previamente geradas. \end{itemize} \subsection{Modo interativo} \label{sec:interactive-mode} -\begin{figure}[ht] +\begin{figure}[H] \centering - \includegraphics[scale=0.17]{res-fase2/interactive.png} + \includegraphics[scale=0.16]{res-fase2/interactive.png} \caption{Diagrama de dependências do modo interativo} \label{fig:interactive} \end{figure} -O modo interativo revolve à volta do conceito de atividade (\texttt{activity}), que gere o -\emph{loop} de eventos de uma interface \texttt{curses}, chamando os \emph{callbacks} com os quais -é definida para responder a esses eventos. Imagens das atividades implementadas podem ser -encontradas em \nameref{sec:interactive-screenshots}. \texttt{screen\_loading\_dataset} não responde -a eventos, mas desenha no ecrã que a aplicação se encontra a ler um \emph{dataset}. O módulo -\texttt{interactive\_mode} é responsável por controlar a troca entre atividades, formando a -aplicação final. - -Para maior facilidade de uso, incluímos instruções em todas as interfaces, e desenvolvemos um -navegador de ficheiros para o utilizador não ter de digitar o caminho para um \emph{dataset}. -Ademais, temos excelente suporte para Unicode, que tem em conta que diferentes caracteres podem ter -diferentes dimensões (para o \emph{layout} de interfaces). +O modo interativo revolve à volta do conceito de atividade (\texttt{activity}), uma estrutura +polimórfica que gere o \emph{loop} de eventos de uma interface \texttt{curses}. Imagens das +atividades implementadas podem ser encontradas em \nameref{sec:interactive-screenshots}. +\texttt{screen\_loading\_dataset} não responde a eventos, mas desenha no ecrã que a aplicação se +encontra a ler um \emph{dataset}. O módulo \texttt{interactive\_mode} é responsável por controlar a +troca entre atividades, formando a aplicação final. Neste subsistema, destaca-se a facilidade de +uso (instruções em todas as interfaces, explorador de ficheiros para escolher um \emph{dataset}, +\dots) e o suporte para Unicode no \emph{layout} das atividades. \subsection{Subsistema de testes} \label{sec:testing-subsystem} @@ -197,14 +196,14 @@ \subsection{Subsistema de testes} Os testes de desempenho baseiam-se num \texttt{performance\_event}, uma medição do tempo e da diferença do uso de memória entre dois instantes. \texttt{performance\_metrics} são um conjunto de eventos de desempenho, produzidos ao longo do decorrer da aplicação, e mostrados ao utilizador no -final da sua execução (\texttt{performance\_metrics\_output}). Este módulo apresentada várias -tabelas (\texttt{table}), relativas ao uso de recursos computacionais na leitura de cada parte do -\emph{dataset} e na execução de cada \emph{query} (tempo individual, estatístico e amortizado). +final da sua execução (\texttt{performance\_metrics\_output}). Este módulo apresenta várias tabelas +(\texttt{table}), relativas ao uso de recursos computacionais na leitura de cada parte do +\emph{dataset} e na execução de cada \emph{query}. Os testes funcionais são implementados por \texttt{test\_diff}, que calcula as diferenças entre -duas diretorias (ficheiros em falta, em excesso, e diferenças entre ficheiros), que são depois -apresentadas ao utilizador por \texttt{test\_diff\_output}. Imagens dos resultados de ambos os tipos -de teste encontram-se em \nameref{sec:testing-screenshots}. +duas diretorias (resultados esperados \emph{vs} obtidos), que são depois apresentadas ao utilizador +por \texttt{test\_diff\_output}. Imagens dos resultados de ambos os tipos de teste encontram-se +em \nameref{sec:testing-screenshots}. \section{Modularidade e encapsulamento} \label{sec:modularity-and-encapsulation} @@ -212,10 +211,26 @@ \section{Modularidade e encapsulamento} \subsection{Modularidade} \label{sec:modularity} -No relatório da primeira fase, afirmámos estar satisfeitos com o nível de modularidade conseguido. -No entanto, tínhamos noção de que havia alguns aspetos a melhorar: separar os módulos de I/O e os -identificadores das entidades. Não só corrigimos estes problemas, como planeámos as novas partes da -aplicação tendo em conta as anteriores falhas na estrutura do programa. +Nesta fase, no âmbito da modularidade, procurámos separar os módulos de I/O e reduzir a duplicação +de código relativa aos identificadores das entidades. Ademais, escrevemos um \emph{script} que +automaticamente gera um grafo de dependências com todos os módulos. Este permitiu-nos corrigir erros +nos diagramas nos relatórios, e encontrar dependências circulares, que prontamente resolvemos. + +\begin{figure}[ht] + \centering + \includegraphics[scale=0.115]{res-fase2/io.png} + \caption{Transferência e armazenamento de dados pelos \textbf{principais} módulos da aplicação. + Observam-se os novos módulos de I/O.} + \label{fig:io} +\end{figure} + +\begin{figure}[ht] + \centering + \includegraphics[scale=0.09]{res-fase2/global_dependencies.png} + \caption{Grafo de dependências de toda a aplicação. Foi gerado automaticamente e não há + distinção entre tipos de módulos.} + \label{fig:global-dependencies} +\end{figure} \subsection{Encapsulamento} \label{sec:encapsulation} @@ -228,10 +243,10 @@ \subsubsection{\emph{The great refactoring}} devolviam apontadores mutáveis para dados no interior das estruturas. Como nunca escrevíamos para estes apontadores, torná-los constantes provou-se a melhor solução para o encapsulamento. -Este processo de aplicar a \emph{keyword const} aos argumentos dos métodos e aos seus valores -devolvidos provou-se moroso: a cada \emph{const} adicionado, vários módulos deixavam de compilar -devido a erros de tipos, causando uma reação em cadeia de mudanças necessárias. No processo de -encapsulamento, adicionámos também métodos de cópia profunda (semelhantes aos \emph{copy +Este processo de aplicar a \emph{keyword} \texttt{const} aos argumentos dos métodos e aos seus +valores devolvidos provou-se moroso: a cada \texttt{const} adicionado, vários módulos deixavam de +compilar devido a erros de tipos, causando uma reação em cadeia de mudanças necessárias. No processo +de encapsulamento, adicionámos também métodos de cópia profunda (semelhantes aos \emph{copy constructors} de C++) à maioria das estruturas de dados da aplicação. \footnote{Com exceção de alocadores (\emph{pools}) e estruturas que contêm \texttt{FILE *}.} @@ -243,14 +258,14 @@ \subsubsection{Conciliação com alocadores} \label{sec:allocator-conciliation} As únicas estruturas de dados que expõem memória do seu interior são os alocadores \texttt{pool} e -\texttt{string\_pool}. Não encaramos isto como um problema no encapsulamento, pois é algo que +\texttt{string\_pool}. Não encaramos isto como um problema para o encapsulamento, pois é algo que qualquer alocador tem de fazer (por exemplo, o método \texttt{malloc} expõe memória da arena com que é implementado). Previamente, durante uma inserção na base de dados, as entidades e os seus campos eram alocados -pelos \emph{managers} nas \emph{pools}, e não pelas entidades em si. Resolvemos este problema no -encapsulamento usando uma estratégia semelhante à utilizada na linguagem Zig: se um método precisa -de alocar memória na \emph{heap}, então leva um alocador como argumento: +pelos \emph{managers} nas \emph{pools}, e não pelas entidades em si. Resolvemos este problema usando +uma estratégia semelhante à utilizada na linguagem Zig: se um método precisa de alocar memória, +então leva um alocador como argumento: \begin{center} \texttt{fn validate(allocator: Allocator, s: []const u8) Allocator.Error!bool} @@ -260,29 +275,32 @@ \subsubsection{Conciliação com alocadores} C, é dada a possibilidade de se usar uma \emph{pool}, ou de se passar o valor \texttt{NULL} ao argumento do alocador, para o uso de \texttt{malloc}: -\begin{center} - \begin{tabular}{rl} - \texttt{user\_t *user\_clone(}&\hspace{-3mm}\texttt{pool\_t *allocator,} \\ - &\hspace{-3mm}\texttt{string\_pool\_t *string\_allocator,} \\ - &\hspace{-3mm}\texttt{const user\_t *user);} - \end{tabular} -\end{center} +\bgroup + \setlength\tabcolsep{0.5mm} + \begin{center} + \begin{tabular}{rll} + \texttt{user\_t *user\_clone\char"0028} & \texttt{pool\_t} & \texttt{*allocator,} \\ + & \texttt{string\_pool\_t} \hspace{1mm} & \texttt{*string\_allocator,} \\ + & \texttt{const user\_t} & \texttt{*user\char"0029;} + \end{tabular} + \end{center} +\egroup \subsubsection{Conciliação com a \texttt{glib}} \label{sec:glib-conciliation} -O uso de \emph{const} é um contrato de que um módulo não irá modificar um objeto. A documentação das -estruturas genéricas da \texttt{glib} assegura isto.\footnote{Há algumas exceções (como uma função -\texttt{GDestroyNotify} ser providenciada), mas garantimos que a nossa solução para este problema -não permite nenhuma destas.} No entanto, estas utilizam \texttt{void *} sem \texttt{const}, dado -que os programadores podem querer utilizá-las para armazenar dados não constantes. +O uso de \texttt{const} trata-se de um contrato de que um método não irá modificar um objeto. A +documentação das estruturas genéricas da \texttt{glib} assegura isto.\footnote{Há algumas exceções +(como uma função \texttt{GDestroyNotify} ser providenciada), mas garantimos que a nossa solução para +este problema não permite nenhuma destas.} No entanto, estas utilizam \texttt{void *} sem o +\emph{qualifier} \texttt{const}, dado que os programadores podem querer usá-las para armazenar dados +mutáveis. A documentação da \texttt{glib} incentiva os programadores a usarem apontadores constantes +nas suas estruturas, desde que usem o tipo correto quando os reivindiquem. -Para podermos usar a \texttt{glib} para armazenar apontadores constantes, criámos \emph{wrappers} -que os aceitam e lhes tiram o \emph{modifier const} antes de interagirem com uma estrutura da -\texttt{glib}, algo que podemos que podemos fazer com o aval da documentação. Estes \emph{wrappers} -são preferíveis a usar as estruturas da \texttt{glib} diretamente e fazer \emph{casts} quando -necessário, pois reduzimos o potencial de erro do programador a pequenos excertos de código, em -vez de toda a aplicação, de um modo semelhante a conceito de \texttt{unsafe} em Rust. +No entanto, isto é altamente suscetível a erros, pelo que criámos \emph{wrappers} das estruturas da +\texttt{glib} para apontadores constantes, que lhes retiram o \emph{qualifier} nas inserções, e o +reinserem nas consultas. Isto reduz o potencial de erro do programa todo para pequenos métodos +facilmente validáveis, de um modo semelhante a conceito de \texttt{unsafe} em Rust. \section{Desempenho} \label{sec:performance} @@ -290,88 +308,107 @@ \section{Desempenho} \subsection{Melhorias} \label{sec:performance-improvements} -Apesar do desempenho excelente que a nossa aplicação apresentou quando os \emph{datasets} de maior -dimensão foram adicionados à plataforma de testes, procurámos mesmo assim continuar a otimizar o -nosso programa. +Quando os \emph{datasets} de maior dimensão foram adicionados à plataforma de testes, já a nossa +aplicação apresentava um desempenho excelente. Mesmo assim, procurámos continuar a otimizar o nosso +programa. Para reduzir ainda mais o uso de memória, introduzimos a \texttt{string\_pool\_no\_duplicates}, que evita armazenar \emph{strings} repetidas. Ademais, reordenamos os campos nas estruturas de dados das entidades, de modo a reduzir o \emph{padding} e o número de \emph{bytes} ocupados por cada uma. A maioria do tempo de execução é gasto no \emph{parsing} do \emph{dataset}, onde apenas conseguimos -alcançar micro-otimizações nos métodos mais chamados, determinados com recurso ao -\texttt{callgrind}. A única melhoria significativa que obtivemos resultou da substituição do -\texttt{strsep} por um novo método, que considera apenas um delimitador. +alcançar micro-otimizações nos métodos mais chamados (\texttt{strsep} e +\texttt{int\_utils\_parse\_positive}), determinados com recurso ao \texttt{callgrind}. As +\emph{queries} são praticamente instantâneas para um utilizador do modo interativo, e responsáveis +por apenas uma pequena fração do tempo de execução da aplicação. Logo, procurámos simplificar +as suas implementações, em vez de nos focarmos no seu desempenho. -Ademais, como a execução das \emph{queries} já era muito veloz, o nosso foco foi o de simplificar -o código, e não o de o otimizar com melhores estruturas de dados. Várias vezes as estruturas simples -se provaram mais rápidas do que outras mais complexas, uma lembrança de que a complexidade -algorítmica é assintótica. Foi importante garantir que os catálogos usavam as -melhores estruturas para acelerar as \emph{queries}, mas tal não se provou tão relevante para dados -auxiliares usados durante a execução das mesmas. +\hspace{1cm}\parbox{15cm}{\small + The real problem is that programmers have spent far too much time worrying about efficiency in + the wrong places and at the wrong times; premature optimization is the root of all evil (or at + least most of it) in programming. -\subsection{\emph{Benchmarking}} -\label{sec:benchmarking} + \begin{flushright} + Knuth, D. E. (1974). Computer programming as an art. \\ + \emph{Association for Computing Machinery (ACM), 17}(12), 671. \\ + \url{https://doi.org/10.1145/361604.361612} + \end{flushright} +} -Para testar o desempenho do programa, corremos, nos seguintes sistemas, 500 \emph{queries} no -\emph{dataset} grande com erros: +Várias vezes se verificou um melhor desempenho utilizando estruturas de dados mais simples, com pior +complexidade assintótica, mas melhor localidade de memória. Foi importante garantir que os +catálogos, onde o número de entidades é muito elevado, usavam as estruturas com melhor comportamento +assintótico, mas tal não se provou tão relevante para dados auxiliares durante a execução das +\emph{queries}. -\begin{center} - \begin{tabular}{|l|c|c|c|c|} - \hline - & Desktop & Laptop & Mac & Tablet \\ - \hline - CPU & Intel i3-7100 & Ryzen & M1 & Mediatek Helio P22T \\ - \hline - Frequência\footnote{Em sistemas heterogéneos, a frequência do \emph{cluster} de maior - desempenho, dado que o nosso programa apenas usa um núcleo.} & - 3.9 GHz & ? & ? & 2.3 GHz \\ - \hline - Memória & DDR4 2400 MT/s & ? & ? & LPDDR4X 4266 MT/s \\ - \hline - Linux & 6.6.11 (chroot) & ? & ? & ? \\ - \hline - Compilador & gcc 12.2.0 & ? & ? & ? \\ - \hline - \end{tabular} -\end{center} +\subsection{\emph{Benchmarking}} +\label{sec:benchmarking} -A aplicação foi executada 10 vezes, com as execuções mais rápida e a mais lenta removidas. A partir -das 8 restantes, calculam-se as seguintes médias de tempo, em segundos: +Para testar o desempenho do programa, utilizámos a versão mais recente da aplicação nos seguintes +sistemas: + +\begin{adjustwidth}{-1.5cm}{-1.5cm} + \begin{center} + \begin{tabular}{|l|c|c|c|c|} + \hline + & Desktop & Laptop & Mac & Tablet \\ + \hline + CPU & Intel i3-7100 & Ryzen 7 5800H & Apple M1 Pro & Mediatek Helio P22T \\ + \hline + Frequência\footnote{Em sistemas heterogéneos, a frequência do \emph{cluster} de maior + desempenho, dado que o nosso programa apenas usa um núcleo.} & + 3.9 GHz & 4.4 GHz & 3.2 GHz & 2.3 GHz \\ + \hline + Memória & DDR4 2400 MT/s & DDR4 3200 MT/s & LPDDR5 6400 MT/s & LPDDR4X 4266 MT/s \\ + \hline + Linux & 6.6.11 (chroot) & 5.15.91 & 5.15.73 (VM) & 4.9.190 \\ + \hline + Compilador & GCC 12.2.0 & GCC 9.4.0 & GCC 11.4.0 & Clang 17.0.6 \\ + \hline + \end{tabular} + \end{center} +\end{adjustwidth} + +O número de variáveis entre sistemas é elevadíssimo, pelo que apenas estamos interessados em +procurar padrões no desempenho do nosso programa comuns a todos os computadores, e não faremos +comparações entre eles. + +A aplicação foi executada 10 vezes, com 500 \emph{queries} no \emph{dataset} grande com erros. As +execuções mais rápida e a mais lenta foram removidas. A partir das 8 restantes, calculam-se as +seguintes médias de tempo e uso de memória: \begin{center} \begin{tabular}{|l|c|c|c|c|} \hline & Desktop & Laptop & Mac & Tablet \\ \hline - Utilizadores & ? & ? & ? & ? \\ + Utilizadores (s) & 0.81 & 0.63 & 0.89 & 5.07 \\ \hline - Voos & ? & ? & ? & ? \\ + Voos (s) & 0.17 & 0.13 & 0.19 & 0.98 \\ \hline - Reservas & ? & ? & ? & ? \\ + Reservas (s) & 5.41 & 5.51 & 7.11 & 46.1 \\ \hline - Passageiros & ? & ? & ? & ? \\ + Passageiros (s) & 4.98 & 4.55 & 6.08 & 36.9 \\ \hline - Q10 & ? & ? & ? & ? \\ + \emph{Queries} (s) & 3.74 & 2.73 & 3.41 & 28.2 \\ \hline - Restantes \emph{queries} & ? & ? & ? & ? \\ + Tempo total (s) & 15.3 & 13.6 & 17.6 & 117.8 \\ \hline - Total & ? & ? & ? & ? \\ + Pico de memória (MiB) & 935.1 & 935.7 & 935.0 & 945.2 \\ \hline \end{tabular} \end{center} - % TODO - benchmarking \subsection{Possíveis melhorias} \label{sec:possible-performance-improvements} -A parte mais lenta do nosso programa é a leitura de um dataset. Como as estruturas de dados -presentes nos catálogos apresentam tempo de inserção amortizado $\Theta(1)$ e já otimizámos a -localidade de memória o mais que pudemos (alocadores customizados), não vemos mais otimizações que -não sacrifiquem a modularidade e encapsulamento que não a paralelização da leitura do -\emph{dataset}: +Como mencionado acima, não vemos as \emph{queries} como um potencial local onde procurar +otimizações. A parte mais lenta do nosso programa é a leitura de um \emph{dataset}, onde já +otimizámos a localidade de memória e a complexidade algorítmica de inserção o mais que fomos +capazes. Sem sacrifício da modularidade e do encapsulamento, não vemos mais otimizações viáveis +que não a paralelização da leitura do \emph{dataset}: \begin{figure}[h] \centering @@ -381,30 +418,24 @@ \subsection{Possíveis melhorias} \label{fig:threading} \end{figure} -Usando a distribuição de tarefas acima, que garante a condição das reservas e passageiros serem -lidos após os utilizadores, conseguimos reduzir o tempo de \emph{parsing} de 16 s para um mínimo -teórico 8.6 s! A única dependência de dados que encontrámos, um alocador, é facilmente resolúvel -com o uso de dois alocadores distintos para as relações utilizador -- voo / reserva. - -Acreditamos que o desempenho das \emph{query} 10 ainda pode ser melhorado. Quanto às restantes, -não vemos muito interesse na sua otimização, mesmo que possível, dado que constituem uma fração de -tempo muito pequena no modo \emph{batch} e são quase instantâneas para um utilizador do modo -interativo. - -\hspace{1cm}\parbox{15cm}{\small - The real problem is that programmers have spent far too much time worrying about efficiency in - the wrong places and at the wrong times; premature optimization is the root of all evil (or at - least most of it) in programming. - - \begin{flushright} - -- Donald Knuth, Computer Programming as an Art, p. 671 - \end{flushright} -} +A distribuição de tarefas acima cumpre as condições necessárias para assegurar as relações de +dependência de dados (reservas depois dos utilizadores, passageiros depois dos utilizadores e dos +voos) e consegue reduzir o tempo de \emph{parsing} de 16 s para um mínimo teórico de 8.6 s! A única +dependência de dados que encontrámos, um alocador, é facilmente resolúvel com o uso de dois +alocadores distintos para as relações utilizador -- voo / reserva. \section{Conclusão} \label{sec:conclusion} -{\color{red} TODO} +Estamos bastante satisfeitos com o resultado final deste trabalho, onde pudemos aplicar +conhecimentos de várias UCs. Pensamos que a maior conclusão a tirar deste projeto seja a importância +de se pensar bastante antes de se escrever qualquer programa. Esta filosofia aplica-se ao +desenvolvimento de aplicações modulares e encapsuladas, à escolha da \emph{schema} de uma base de +dados para o melhor desempenho, à arquitetura global de um programa para este ser facilmente +extensível, \emph{etc.} O desenvolvimento destes 75 módulos permitiu-nos aprofundar o nosso +conhecimento em C, o que por sua vez nos capacitou para implementar conceitos de outras linguagens e +paradigmas, para suprir certas lacunas de C: polimorfismo, tipos genéricos, alocadores customizados, +\emph{etc.} \pagebreak \section{Anexos} @@ -453,7 +484,7 @@ \subsection{\emph{Screenshots} do modo interativo} \begin{figure}[H] \centering \includegraphics[scale=0.25]{res-fase2/interactive_screenshots/license.png} - \caption{Licença da aplicação (\texttt{activity\_license})} + \caption{Licença da aplicação (\texttt{activity\_license})} \label{fig:license} \end{figure} diff --git a/trabalho-pratico/reports/res-fase2/global_dependencies.png b/trabalho-pratico/reports/res-fase2/global_dependencies.png new file mode 100644 index 0000000..c31c6da Binary files /dev/null and b/trabalho-pratico/reports/res-fase2/global_dependencies.png differ diff --git a/trabalho-pratico/reports/res-fase2/io.excalidraw b/trabalho-pratico/reports/res-fase2/io.excalidraw new file mode 100644 index 0000000..d8e6e16 --- /dev/null +++ b/trabalho-pratico/reports/res-fase2/io.excalidraw @@ -0,0 +1,2241 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "id": "rIK5wfJCl5cVb_lonc_5b", + "type": "rectangle", + "x": 544.5518434273561, + "y": 217, + "width": 904.2704311568799, + "height": 453.32196920559664, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 745781594, + "version": 358, + "versionNonce": 2060343258, + "isDeleted": false, + "boundElements": [ + { + "id": "u5HcTNYHLdBCZtomN5enE", + "type": "arrow" + }, + { + "id": "LSBya3kKhghvnDAbpfwxr", + "type": "arrow" + }, + { + "id": "HXpIOyf_4w2XGFh2BGUvV", + "type": "arrow" + }, + { + "id": "o_pp75i6u_iNqcCtHKYql", + "type": "arrow" + }, + { + "id": "BzujGgbfzg68G50vuotGH", + "type": "arrow" + }, + { + "id": "9UgaROcxqxm9N3BjXmoiG", + "type": "arrow" + } + ], + "updated": 1706063570005, + "link": null, + "locked": false + }, + { + "id": "Jqpmng4flbaBFkjhjRzTI", + "type": "line", + "x": 607.866589609183, + "y": 218.37993552703622, + "width": 2.3581551883827387, + "height": 453.0634795238425, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1391790810, + "version": 142, + "versionNonce": 564808858, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 2.3581551883827387, + 453.0634795238425 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "i1ncAaJ3VYLKI72IWe_UJ", + "type": "text", + "x": 499.70284259752475, + "y": 302.30312667528085, + "width": 152.31666564941406, + "height": 24, + "angle": 1.56801714174152, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1786935622, + "version": 127, + "versionNonce": 447326554, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "text": "dataset_input", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 20, + "containerId": null, + "originalText": "dataset_input", + "lineHeight": 1.2 + }, + { + "id": "0AePgiwMAaxYV-zCviBxL", + "type": "line", + "x": 544.238099540024, + "y": 409.6676175863515, + "width": 64.33584643524387, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 893347930, + "version": 85, + "versionNonce": 2099491142, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 64.33584643524387, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "W_8GU8kA3l_osTc4azZKj", + "type": "text", + "x": 459.8025465477265, + "y": 529.4221948833119, + "width": 234.3333282470703, + "height": 24, + "angle": 1.565548890912316, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1414016346, + "version": 130, + "versionNonce": 488599066, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "text": "dataset_error_output", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 20, + "containerId": null, + "originalText": "dataset_error_output", + "lineHeight": 1.2 + }, + { + "id": "u5HcTNYHLdBCZtomN5enE", + "type": "arrow", + "x": 492.31405018169573, + "y": 316.5311263410639, + "width": 51.237793245660214, + "height": 0.5239941861918851, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1779469658, + "version": 653, + "versionNonce": 1500092550, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 51.237793245660214, + 0.5239941861918851 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "mwJuTaXWt9Zg__7SJVO40", + "gap": 10.272976663882218, + "focus": 0.07948901120958686 + }, + "endBinding": { + "elementId": "rIK5wfJCl5cVb_lonc_5b", + "gap": 1, + "focus": 0.5273660809572484 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "mwJuTaXWt9Zg__7SJVO40", + "type": "text", + "x": 423.4577414560459, + "y": 303.1484966274099, + "width": 58.58333206176758, + "height": 24, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1588970438, + "version": 47, + "versionNonce": 2113837786, + "isDeleted": false, + "boundElements": [ + { + "id": "u5HcTNYHLdBCZtomN5enE", + "type": "arrow" + } + ], + "updated": 1706063570005, + "link": null, + "locked": false, + "text": "*.csv", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 20, + "containerId": null, + "originalText": "*.csv", + "lineHeight": 1.2 + }, + { + "type": "arrow", + "version": 955, + "versionNonce": 1525716934, + "isDeleted": false, + "id": "LSBya3kKhghvnDAbpfwxr", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 543.5518434273558, + "y": 539.4217227474923, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 50.77894360447249, + "height": 0.238672707669366, + "seed": 966447834, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1706063570005, + "link": null, + "locked": false, + "startBinding": { + "elementId": "rIK5wfJCl5cVb_lonc_5b", + "gap": 1, + "focus": -0.42786573791762594 + }, + "endBinding": { + "elementId": "P73IkFv2ooPZ2aHXbA7hQ", + "gap": 3.4889669743984655, + "focus": 0.11298055764577111 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -50.77894360447249, + -0.238672707669366 + ] + ] + }, + { + "type": "text", + "version": 103, + "versionNonce": 2077896602, + "isDeleted": false, + "id": "P73IkFv2ooPZ2aHXbA7hQ", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 348.68392674496926, + "y": 525.44312649338, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 140.60000610351562, + "height": 24, + "seed": 1386780102, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "LSBya3kKhghvnDAbpfwxr", + "type": "arrow" + }, + { + "id": "9UgaROcxqxm9N3BjXmoiG", + "type": "arrow" + } + ], + "updated": 1706063570005, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": "*_errors.csv", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "*_errors.csv", + "lineHeight": 1.2, + "baseline": 20 + }, + { + "id": "_SzgrG015s8Ucq_urDK_i", + "type": "line", + "x": 665.903978133231, + "y": 218.0526852166496, + "width": 2.0086109836763626, + "height": 450.59839733807337, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 491321542, + "version": 76, + "versionNonce": 1775611654, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 2.0086109836763626, + 450.59839733807337 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "6bDae7oAHV9Po_n0eQ3Tb", + "type": "text", + "x": 591.993479721772, + "y": 599.219091329511, + "width": 93.73332977294922, + "height": 24, + "angle": 1.5613422112879691, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1012014298, + "version": 366, + "versionNonce": 182791258, + "isDeleted": false, + "boundElements": [], + "updated": 1706063570005, + "link": null, + "locked": false, + "text": "*_loader", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 20, + "containerId": null, + "originalText": "*_loader", + "lineHeight": 1.2 + }, + { + "id": "k-3slD-QgaS7Y8VazONpq", + "type": "line", + "x": 730.8183979103409, + "y": 616.6130332622656, + "width": 530.138494820866, + "height": 0.5265691417650942, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 852175622, + "version": 323, + "versionNonce": 1653988934, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 530.138494820866, + -0.5265691417650942 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "mx118mZrXNgWmDt620zUl", + "type": "line", + "x": 731.2931600610888, + "y": 506.86536550184275, + "width": 0.27041224016977594, + "height": 162.4898463552509, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 957231834, + "version": 212, + "versionNonce": 552767770, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.27041224016977594, + 162.4898463552509 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "XU2GiDr2LHfY0iN26X5Fm", + "type": "text", + "x": 744.4277351857977, + "y": 632.4075057380293, + "width": 58.58333206176758, + "height": 24, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 2120395546, + "version": 183, + "versionNonce": 168699270, + "isDeleted": false, + "boundElements": [ + { + "id": "HXpIOyf_4w2XGFh2BGUvV", + "type": "arrow" + } + ], + "updated": 1706063570005, + "link": null, + "locked": false, + "text": "table", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 20, + "containerId": null, + "originalText": "table", + "lineHeight": 1.2 + }, + { + "id": "zyntRo0FO2UezUz6-4kXC", + "type": "text", + "x": 738.6882947477959, + "y": 576.1761141376554, + "width": 304.6333312988281, + "height": 24, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 759838874, + "version": 72, + "versionNonce": 24872134, + "isDeleted": false, + "boundElements": [], + "updated": 1706063570005, + "link": null, + "locked": false, + "text": "performance_metrics_output", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 20, + "containerId": null, + "originalText": "performance_metrics_output", + "lineHeight": 1.2 + }, + { + "id": "VsIqXDDLosDiqfVm4COhI", + "type": "text", + "x": 729.5899631213321, + "y": 713.4163203225622, + "width": 70.30000305175781, + "height": 24, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1587851462, + "version": 444, + "versionNonce": 981138438, + "isDeleted": false, + "boundElements": [ + { + "id": "HXpIOyf_4w2XGFh2BGUvV", + "type": "arrow" + } + ], + "updated": 1706063570005, + "link": null, + "locked": false, + "text": "stdout", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 20, + "containerId": null, + "originalText": "stdout", + "lineHeight": 1.2 + }, + { + "id": "5H-io6zm_I7LC98wiwz9M", + "type": "line", + "x": 731.6463878875859, + "y": 560.0007140945435, + "width": 717.297870735694, + "height": 3.0559238349585485, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1098829018, + "version": 241, + "versionNonce": 2076651354, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 717.297870735694, + -3.0559238349585485 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "2WVMuLhKhTPu9Dc8jqt3u", + "type": "line", + "x": 1050.4817838089143, + "y": 616.001668226392, + "width": 0.8951446686596682, + "height": 109.50518824004752, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 794474586, + "version": 165, + "versionNonce": 1795787590, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.8951446686596682, + -109.50518824004752 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "nf6PQLKbydgjYSxeyX1uv", + "type": "text", + "x": 1061.422080616552, + "y": 576.5762139270846, + "width": 187.46665954589844, + "height": 24, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 706487770, + "version": 83, + "versionNonce": 1285305370, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "text": "test_diff_output", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 20, + "containerId": null, + "originalText": "test_diff_output", + "lineHeight": 1.2 + }, + { + "id": "HXpIOyf_4w2XGFh2BGUvV", + "type": "arrow", + "x": 767.2585100512483, + "y": 670.3211259251424, + "width": 0.4274765378219172, + "height": 34.56483752726058, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1152804742, + "version": 483, + "versionNonce": 25440902, + "isDeleted": false, + "boundElements": [], + "updated": 1706063570005, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.4274765378219172, + 34.56483752726058 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "XU2GiDr2LHfY0iN26X5Fm", + "focus": 0.20857309689174525, + "gap": 13.91362018711311 + }, + "endBinding": { + "elementId": "VsIqXDDLosDiqfVm4COhI", + "focus": 0.052046596478838095, + "gap": 8.530356870159267 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "LHZT5I5Yt6CQS8iAA7qYJ", + "type": "line", + "x": 1261.1375061806134, + "y": 559.1489669459486, + "width": 0.30168280991256324, + "height": 109.81254280816506, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1444152902, + "version": 97, + "versionNonce": 413659590, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.30168280991256324, + 109.81254280816506 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "lJIwjHu2TWinAQCbnasN1", + "type": "text", + "x": 1302.5386961308573, + "y": 600.0968006037849, + "width": 105.44999694824219, + "height": 24, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1301487898, + "version": 61, + "versionNonce": 459109786, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "text": "test_diff", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 20, + "containerId": null, + "originalText": "test_diff", + "lineHeight": 1.2 + }, + { + "id": "o_pp75i6u_iNqcCtHKYql", + "type": "arrow", + "x": 1355.6214389698123, + "y": 702.7725466772845, + "width": 0.14671404261525822, + "height": 32.81494982930735, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1804572250, + "version": 458, + "versionNonce": 1804716294, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.14671404261525822, + -32.81494982930735 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "OnsmWR5wJu18YffChXlXi", + "focus": -0.01617894472870011, + "gap": 9.887206559751348 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "type": "text", + "version": 503, + "versionNonce": 638562906, + "isDeleted": false, + "id": "OnsmWR5wJu18YffChXlXi", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1298.1391674963093, + "y": 712.6597532370358, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 117.16666412353516, + "height": 48, + "seed": 288932358, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "o_pp75i6u_iNqcCtHKYql", + "type": "arrow" + } + ], + "updated": 1706063570005, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": "Resultados\nesperados", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Resultados\nesperados", + "lineHeight": 1.2, + "baseline": 44 + }, + { + "id": "-jZ0OqNmQmXDfLSrDirk-", + "type": "rectangle", + "x": 1229.8060191399281, + "y": 437.00983092719684, + "width": 217.81577579327495, + "height": 53.049687514121445, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 2108677638, + "version": 140, + "versionNonce": 1237235782, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "7vZgAHy6hUNjmhS0l5gWa" + }, + { + "id": "RhcpQgnXMm7NPLi9SmQI6", + "type": "arrow" + }, + { + "id": "bN1k48Co-yrvqCnVR1ifx", + "type": "arrow" + }, + { + "id": "k9iNJInBDbs8568a6bnvq", + "type": "arrow" + }, + { + "id": "G4EL84T085NY9nIfIk1Bi", + "type": "arrow" + } + ], + "updated": 1706063570005, + "link": null, + "locked": false + }, + { + "id": "7vZgAHy6hUNjmhS0l5gWa", + "type": "text", + "x": 1268.4139039848078, + "y": 451.5346746842576, + "width": 140.60000610351562, + "height": 24, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 60030598, + "version": 111, + "versionNonce": 1088182042, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "text": "query_writer", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 20, + "containerId": "-jZ0OqNmQmXDfLSrDirk-", + "originalText": "query_writer", + "lineHeight": 1.2 + }, + { + "type": "rectangle", + "version": 183, + "versionNonce": 185319302, + "isDeleted": false, + "id": "ueQ_zHiWfBl9INaiVJDu2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1229.7983293829873, + "y": 383.64808642769816, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 217.81577579327495, + "height": 53.049687514121445, + "seed": 822818118, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "4ggd25UtxweADB41kGxoN" + }, + { + "id": "k9iNJInBDbs8568a6bnvq", + "type": "arrow" + }, + { + "id": "Mk1jFxHyuSTpErSKWvPlL", + "type": "arrow" + }, + { + "id": "QzelVaUvjGtNzTCuEL2ph", + "type": "arrow" + } + ], + "updated": 1706063570005, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 156, + "versionNonce": 1278632922, + "isDeleted": false, + "id": "4ggd25UtxweADB41kGxoN", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1239.1145501043318, + "y": 398.17293018475885, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 199.18333435058594, + "height": 24, + "seed": 767597702, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1706063570005, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": "query_file_parser", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ueQ_zHiWfBl9INaiVJDu2", + "originalText": "query_file_parser", + "lineHeight": 1.2, + "baseline": 20 + }, + { + "id": "RhcpQgnXMm7NPLi9SmQI6", + "type": "arrow", + "x": 1448.621794933203, + "y": 465.6760965051799, + "width": 68.71608894581732, + "height": 49.99825504142177, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1652422150, + "version": 133, + "versionNonce": 1973980550, + "isDeleted": false, + "boundElements": null, + "updated": 1706063583505, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 68.71608894581732, + 49.99825504142177 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "-jZ0OqNmQmXDfLSrDirk-", + "focus": -0.7368185109491728, + "gap": 1 + }, + "endBinding": { + "elementId": "gcVbvzHA3t9sFnZ6WamCk", + "focus": -0.2556099027872434, + "gap": 7.045213417865625 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "gcVbvzHA3t9sFnZ6WamCk", + "type": "text", + "x": 1464.8718573247447, + "y": 522.7195649644673, + "width": 222.61666870117188, + "height": 24, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1297700678, + "version": 76, + "versionNonce": 573626522, + "isDeleted": false, + "boundElements": [ + { + "id": "RhcpQgnXMm7NPLi9SmQI6", + "type": "arrow" + }, + { + "id": "BzujGgbfzg68G50vuotGH", + "type": "arrow" + } + ], + "updated": 1706063570005, + "link": null, + "locked": false, + "text": "command*_output.txt", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "center", + "verticalAlign": "top", + "baseline": 20, + "containerId": null, + "originalText": "command*_output.txt", + "lineHeight": 1.2 + }, + { + "id": "BzujGgbfzg68G50vuotGH", + "type": "arrow", + "x": 1515.7396765641674, + "y": 552.0128207545401, + "width": 64.87801532408548, + "height": 65.35173625320192, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 962281754, + "version": 102, + "versionNonce": 2019169798, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -64.87801532408548, + 65.35173625320192 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "gcVbvzHA3t9sFnZ6WamCk", + "focus": 0.35117789952796086, + "gap": 5.2932557900728625 + }, + "endBinding": { + "elementId": "rIK5wfJCl5cVb_lonc_5b", + "focus": 0.9253726486877868, + "gap": 2.0393866558461013 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "type": "arrow", + "version": 320, + "versionNonce": 1224951706, + "isDeleted": false, + "id": "bN1k48Co-yrvqCnVR1ifx", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1450.718735611249, + "y": 463.88826603566, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 59.979489244774186, + "height": 1.149846174948891, + "seed": 1576818586, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1706063580789, + "link": null, + "locked": false, + "startBinding": { + "elementId": "-jZ0OqNmQmXDfLSrDirk-", + "focus": -0.06268601049475082, + "gap": 3.0969406780459394 + }, + "endBinding": { + "elementId": "VDsOWKld4h0y1jKisR1S3", + "focus": -0.6727431638036065, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 59.979489244774186, + 1.149846174948891 + ] + ] + }, + { + "type": "arrow", + "version": 473, + "versionNonce": 1174826970, + "isDeleted": false, + "id": "k9iNJInBDbs8568a6bnvq", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1509.749969686315, + "y": 411.9243137928438, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 60.24597317563939, + "height": 1.2360204455752637, + "seed": 1704052698, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1706063577722, + "link": null, + "locked": false, + "startBinding": { + "elementId": "VDsOWKld4h0y1jKisR1S3", + "gap": 1.2897635220255097, + "focus": 0.6034270543897301 + }, + "endBinding": { + "elementId": "ueQ_zHiWfBl9INaiVJDu2", + "gap": 1.889891334413278, + "focus": 0.18291721846413064 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -60.24597317563939, + 1.2360204455752637 + ] + ] + }, + { + "id": "Mk1jFxHyuSTpErSKWvPlL", + "type": "arrow", + "x": 1506.5853565423777, + "y": 360.1841829347396, + "width": 57.38313557246556, + "height": 52.26220404656283, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1663444506, + "version": 200, + "versionNonce": 1143106630, + "isDeleted": false, + "boundElements": null, + "updated": 1706063574772, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -57.38313557246556, + 52.26220404656283 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "8tJDOxTp--xTHTJnE_vDj", + "focus": 0.9080141120557463, + "gap": 10.848847522654978 + }, + "endBinding": { + "elementId": "ueQ_zHiWfBl9INaiVJDu2", + "focus": 0.8185957418701747, + "gap": 1.5881157936498767 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "VDsOWKld4h0y1jKisR1S3", + "type": "rectangle", + "x": 1511.0397332083403, + "y": 394.09618307384596, + "width": 204.19552633235605, + "height": 85.5947419246059, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1912764442, + "version": 96, + "versionNonce": 1373949062, + "isDeleted": false, + "boundElements": [ + { + "id": "bN1k48Co-yrvqCnVR1ifx", + "type": "arrow" + }, + { + "id": "k9iNJInBDbs8568a6bnvq", + "type": "arrow" + }, + { + "type": "text", + "id": "Ppk5J0cnbkZWHtIzhlScc" + } + ], + "updated": 1706063570005, + "link": null, + "locked": false + }, + { + "id": "Ppk5J0cnbkZWHtIzhlScc", + "type": "text", + "x": 1519.4041666015692, + "y": 424.8935540361489, + "width": 187.46665954589844, + "height": 24, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1904564102, + "version": 92, + "versionNonce": 1157670618, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "text": "interactive_mode", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 20, + "containerId": "VDsOWKld4h0y1jKisR1S3", + "originalText": "interactive_mode", + "lineHeight": 1.2 + }, + { + "id": "8tJDOxTp--xTHTJnE_vDj", + "type": "text", + "x": 1517.4342040650326, + "y": 344.78252671743974, + "width": 105.44999694824219, + "height": 24, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 861094746, + "version": 132, + "versionNonce": 783989658, + "isDeleted": false, + "boundElements": [ + { + "id": "Mk1jFxHyuSTpErSKWvPlL", + "type": "arrow" + } + ], + "updated": 1706063570005, + "link": null, + "locked": false, + "text": "input.txt", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "center", + "verticalAlign": "top", + "baseline": 20, + "containerId": null, + "originalText": "input.txt", + "lineHeight": 1.2 + }, + { + "id": "9UgaROcxqxm9N3BjXmoiG", + "type": "arrow", + "x": 397.19181348063466, + "y": 556.4967063730917, + "width": 1082.8015744761153, + "height": 228.956484024975, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1272202138, + "version": 594, + "versionNonce": 1007936262, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.0561681458233352, + 228.84375938818232 + ], + [ + 1081.8857485400151, + 228.956484024975 + ], + [ + 1082.8015744761153, + 61.360337718693245 + ], + [ + 1053.4951445209183, + 62.38140828002406 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "P73IkFv2ooPZ2aHXbA7hQ", + "focus": 0.3109932924352756, + "gap": 7.0535798797117195 + }, + "endBinding": { + "elementId": "rIK5wfJCl5cVb_lonc_5b", + "focus": 0.788053057187115, + "gap": 1.86468341731711 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "FGr5w2hOUDjqwHrqHE3LH", + "type": "rectangle", + "x": 928.0146398957709, + "y": 412.65406884888193, + "width": 235.6910856774298, + "height": 53.04968808768338, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 532549658, + "version": 175, + "versionNonce": 701773914, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "PGgAlz0rqNmt9Pt7HSSYc" + }, + { + "id": "QzelVaUvjGtNzTCuEL2ph", + "type": "arrow" + }, + { + "id": "G4EL84T085NY9nIfIk1Bi", + "type": "arrow" + }, + { + "id": "09ouQZPS6_rdnrUNuRzym", + "type": "arrow" + } + ], + "updated": 1706063570005, + "link": null, + "locked": false + }, + { + "id": "PGgAlz0rqNmt9Pt7HSSYc", + "type": "text", + "x": 952.1268529615365, + "y": 427.17891289272364, + "width": 187.46665954589844, + "height": 24, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 336172806, + "version": 133, + "versionNonce": 921539142, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "text": "query_dispatcher", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 20, + "containerId": "FGr5w2hOUDjqwHrqHE3LH", + "originalText": "query_dispatcher", + "lineHeight": 1.2 + }, + { + "id": "QzelVaUvjGtNzTCuEL2ph", + "type": "arrow", + "x": 1228.7983293829873, + "y": 414.1761197380829, + "width": 63.905888642796754, + "height": 23.654352355182937, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1401608794, + "version": 72, + "versionNonce": 1632590214, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -63.905888642796754, + 23.654352355182937 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "ueQ_zHiWfBl9INaiVJDu2", + "focus": 0.5451910574603461, + "gap": 1 + }, + "endBinding": { + "elementId": "FGr5w2hOUDjqwHrqHE3LH", + "focus": 0.6088932657462133, + "gap": 1.1867151669898703 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "G4EL84T085NY9nIfIk1Bi", + "type": "arrow", + "x": 1164.7057255732007, + "y": 438.4539064732885, + "width": 64.10029356672749, + "height": 26.228860574490284, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 286176666, + "version": 142, + "versionNonce": 554789338, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 64.10029356672749, + 26.228860574490284 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "FGr5w2hOUDjqwHrqHE3LH", + "focus": -0.6593098643288775, + "gap": 1 + }, + "endBinding": { + "elementId": "-jZ0OqNmQmXDfLSrDirk-", + "focus": -0.6487808659041128, + "gap": 1 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "2TvSzkLDFsZGwWleSenAL", + "type": "arrow", + "x": 667.5905623406181, + "y": 533.7102212220219, + "width": 62.79353731127435, + "height": 0.25520599854496595, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1518521030, + "version": 180, + "versionNonce": 1115044038, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 62.79353731127435, + -0.25520599854496595 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "09ouQZPS6_rdnrUNuRzym", + "type": "arrow", + "x": 948.5754990350238, + "y": 466.3363519748741, + "width": 0.30554131210078594, + "height": 38.75958017145945, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1381711066, + "version": 290, + "versionNonce": 1908088474, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.30554131210078594, + 38.75958017145945 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "FGr5w2hOUDjqwHrqHE3LH", + "focus": 0.8258783155764208, + "gap": 1 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "-EPQfqdVS1_fFH2QMaay5", + "type": "line", + "x": 731.7307920659318, + "y": 506.3632618138555, + "width": 316.98419781378334, + "height": 0.9512261221697145, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1710482842, + "version": 84, + "versionNonce": 1912549382, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 316.98419781378334, + -0.9512261221697145 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "XPH4psSAJ0WNI54cpUapH", + "type": "text", + "x": 776.5865410270294, + "y": 521.3972353091398, + "width": 222.61666870117188, + "height": 24, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 745555526, + "version": 69, + "versionNonce": 349191002, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "text": "performance_metrics", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "center", + "verticalAlign": "top", + "baseline": 20, + "containerId": null, + "originalText": "performance_metrics", + "lineHeight": 1.2 + }, + { + "id": "Gx9svz-4wUcj3Mn3N86BT", + "type": "rectangle", + "x": 956.1150413636017, + "y": 252.9298950882432, + "width": 185.19989641428924, + "height": 130.71819091175672, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 1246752154, + "version": 205, + "versionNonce": 199704390, + "isDeleted": false, + "boundElements": [ + { + "id": "3TRB4xHiLCsrFDb1SZeKP", + "type": "arrow" + } + ], + "updated": 1706063570005, + "link": null, + "locked": false + }, + { + "id": "AP2Op6A1NKSlVqaTBk47P", + "type": "text", + "x": 1003.5638777199568, + "y": 267.4185820019646, + "width": 93.73332977294922, + "height": 24, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1410622854, + "version": 193, + "versionNonce": 2023997466, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "text": "database", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "center", + "verticalAlign": "top", + "baseline": 20, + "containerId": null, + "originalText": "database", + "lineHeight": 1.2 + }, + { + "id": "um0XKaA1OOw92bcir48Wr", + "type": "rectangle", + "x": 969.6602092566806, + "y": 310.6332826476912, + "width": 157.4249809237183, + "height": 55.561757973076965, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 1354733466, + "version": 128, + "versionNonce": 613115526, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "DG-JUZ9jWrjFnKTLWKNu9" + }, + { + "id": "XkrRFfHbQ9iCfrw58GIvE", + "type": "arrow" + } + ], + "updated": 1706063570005, + "link": null, + "locked": false + }, + { + "id": "DG-JUZ9jWrjFnKTLWKNu9", + "type": "text", + "x": 995.6477012444186, + "y": 326.4141616342297, + "width": 105.44999694824219, + "height": 24, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1396972166, + "version": 66, + "versionNonce": 1227402458, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "text": "*_manager", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 20, + "containerId": "um0XKaA1OOw92bcir48Wr", + "originalText": "*_manager", + "lineHeight": 1.2 + }, + { + "id": "XkrRFfHbQ9iCfrw58GIvE", + "type": "arrow", + "x": 665.8541112045114, + "y": 318.6002116702782, + "width": 288.30033282705085, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 51027802, + "version": 72, + "versionNonce": 1017685446, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 288.30033282705085, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "um0XKaA1OOw92bcir48Wr", + "focus": 0.7132225720270597, + "gap": 15.505765225118296 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "3TRB4xHiLCsrFDb1SZeKP", + "type": "arrow", + "x": 1047.6220978352271, + "y": 383.5892426502679, + "width": 0.15570488914545422, + "height": 28.53239568939921, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1286286470, + "version": 74, + "versionNonce": 1005715866, + "isDeleted": false, + "boundElements": null, + "updated": 1706063570005, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.15570488914545422, + 28.53239568939921 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "Gx9svz-4wUcj3Mn3N86BT", + "focus": -0.015590535105459437, + "gap": 28.47355233966718 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/trabalho-pratico/reports/res-fase2/io.png b/trabalho-pratico/reports/res-fase2/io.png new file mode 100644 index 0000000..a8be7ee Binary files /dev/null and b/trabalho-pratico/reports/res-fase2/io.png differ diff --git a/trabalho-pratico/reports/res-fase2/queries.excalidraw b/trabalho-pratico/reports/res-fase2/queries.excalidraw index 725dc4b..ed6b778 100644 --- a/trabalho-pratico/reports/res-fase2/queries.excalidraw +++ b/trabalho-pratico/reports/res-fase2/queries.excalidraw @@ -3,46 +3,10 @@ "version": 2, "source": "https://excalidraw.com", "elements": [ - { - "type": "text", - "version": 290, - "versionNonce": 907915257, - "isDeleted": false, - "id": "LXCwjcacBfnYMnqv7Tq_5", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 497, - "y": 351, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 187.46665954589844, - "height": 24, - "seed": 1228440171, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1704824655027, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 3, - "text": "query_dispatcher", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "query_dispatcher", - "lineHeight": 1.2, - "baseline": 20 - }, { "type": "rectangle", - "version": 265, - "versionNonce": 1141312153, + "version": 504, + "versionNonce": 1573016431, "isDeleted": false, "id": "-n9RFhkJT7z7TCYZHYHN_", "fillStyle": "solid", @@ -51,11 +15,11 @@ "roughness": 0, "opacity": 100, "angle": 0, - "x": 460.5, - "y": 336, + "x": 1041.9145763219165, + "y": 334.321452, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", - "width": 258.99999999999994, + "width": 259.6789076780835, "height": 54, "seed": 1945786123, "groupIds": [], @@ -63,54 +27,62 @@ "roundness": null, "boundElements": [ { - "id": "AKGq8oWVlxYRE4FwzIoHm", + "type": "text", + "id": "0DCR4B1LYp47NpchUJlow" + }, + { + "id": "M_pftuBWPG_r_9ObbavK0", + "type": "arrow" + }, + { + "id": "MldNUMrKkt-li8BuOkcxH", "type": "arrow" } ], - "updated": 1704824798230, + "updated": 1706058818360, "link": null, "locked": false }, { + "id": "0DCR4B1LYp47NpchUJlow", "type": "text", - "version": 272, - "versionNonce": 985090265, - "isDeleted": false, - "id": "8ZS-8ELn1a104zJUdLHww", + "x": 1078.020700388009, + "y": 349.321452, + "width": 187.46665954589844, + "height": 24, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, - "angle": 0, - "x": 478, - "y": 462, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 222.61666870117188, - "height": 24, - "seed": 490363915, "groupIds": [], "frameId": null, "roundness": null, - "boundElements": [], - "updated": 1704824655027, + "seed": 354263297, + "version": 171, + "versionNonce": 1615275617, + "isDeleted": false, + "boundElements": null, + "updated": 1706058813010, "link": null, "locked": false, + "text": "query_dispatcher", "fontSize": 20, "fontFamily": 3, - "text": "query_instance_list", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "query_instance_list", - "lineHeight": 1.2, - "baseline": 20 + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 20, + "containerId": "-n9RFhkJT7z7TCYZHYHN_", + "originalText": "query_dispatcher", + "lineHeight": 1.2 }, { "type": "rectangle", - "version": 404, - "versionNonce": 1709247799, + "version": 490, + "versionNonce": 853902849, "isDeleted": false, "id": "vwD6d9zVLJZQXyZH9MyNN", "fillStyle": "solid", @@ -119,11 +91,11 @@ "roughness": 0, "opacity": 100, "angle": 0, - "x": 460.5, - "y": 447, + "x": 1042.9145760000001, + "y": 445.839728, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", - "width": 259.00000000000006, + "width": 258.6789079999999, "height": 54, "seed": 1467011499, "groupIds": [], @@ -133,62 +105,62 @@ }, "boundElements": [ { - "id": "AKGq8oWVlxYRE4FwzIoHm", + "id": "o_K0G9He4ZkgorwJzvq1U", "type": "arrow" }, { - "id": "eCwQFKrhbHcDibbsNR9Ik", - "type": "arrow" + "type": "text", + "id": "LzCyisfEJd1pQuU0C2oHZ" }, { - "id": "o_K0G9He4ZkgorwJzvq1U", + "id": "MldNUMrKkt-li8BuOkcxH", "type": "arrow" } ], - "updated": 1704824655027, + "updated": 1706058385718, "link": null, "locked": false }, { + "id": "LzCyisfEJd1pQuU0C2oHZ", "type": "text", - "version": 331, - "versionNonce": 778749369, - "isDeleted": false, - "id": "PpdHlEyMMcLjjkU_34qZM", + "x": 1060.9456956494141, + "y": 460.839728, + "width": 222.61666870117188, + "height": 24, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, - "angle": 0, - "x": 508, - "y": 575, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 164.03334045410156, - "height": 24, - "seed": 2062875333, "groupIds": [], "frameId": null, "roundness": null, - "boundElements": [], - "updated": 1704824655027, + "seed": 1457589551, + "version": 21, + "versionNonce": 1764955919, + "isDeleted": false, + "boundElements": null, + "updated": 1706058165030, "link": null, "locked": false, + "text": "query_instance_list", "fontSize": 20, "fontFamily": 3, - "text": "query_instance", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "query_instance", - "lineHeight": 1.2, - "baseline": 20 + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 20, + "containerId": "vwD6d9zVLJZQXyZH9MyNN", + "originalText": "query_instance_list", + "lineHeight": 1.2 }, { "type": "rectangle", - "version": 445, - "versionNonce": 1937357431, + "version": 676, + "versionNonce": 1576410593, "isDeleted": false, "id": "0GFMS1CS-wNoXBC2gMBaI", "fillStyle": "solid", @@ -197,12 +169,12 @@ "roughness": 0, "opacity": 100, "angle": 0, - "x": 460.5, - "y": 560, + "x": 1333.1713362577163, + "y": 445.839728, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", - "width": 259, - "height": 54, + "width": 258.6789080000001, + "height": 55.000000487971654, "seed": 1939273189, "groupIds": [], "frameId": null, @@ -211,26 +183,62 @@ }, "boundElements": [ { - "id": "eCwQFKrhbHcDibbsNR9Ik", - "type": "arrow" + "type": "text", + "id": "VGVYIFdeKg4dLJLApk2lD" }, { - "id": "geBnkCPO9OHV5uRygyJLE", + "id": "Xoshipa7mpkS32UfkHWpA", "type": "arrow" }, { - "id": "Hv0MwFYBwY8T7sG2zKbFi", + "id": "Y17bM2MxNy5jDt9f0uPWu", "type": "arrow" } ], - "updated": 1704824805714, + "updated": 1706058738475, "link": null, "locked": false }, { + "id": "VGVYIFdeKg4dLJLApk2lD", "type": "text", - "version": 400, - "versionNonce": 1549510297, + "x": 1380.4941200306657, + "y": 461.3397282439858, + "width": 164.03334045410156, + "height": 24, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 2064894049, + "version": 191, + "versionNonce": 1311623361, + "isDeleted": false, + "boundElements": null, + "updated": 1706058584355, + "link": null, + "locked": false, + "text": "query_instance", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 20, + "containerId": "0GFMS1CS-wNoXBC2gMBaI", + "originalText": "query_instance", + "lineHeight": 1.2 + }, + { + "type": "text", + "version": 475, + "versionNonce": 1175838543, "isDeleted": false, "id": "gWa0TTqfocvfshn03Z4bN", "fillStyle": "solid", @@ -239,8 +247,8 @@ "roughness": 0, "opacity": 100, "angle": 0, - "x": 822, - "y": 462, + "x": 785.5688664737121, + "y": 460.8397279999999, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", "width": 199.18333435058594, @@ -255,7 +263,7 @@ "type": "arrow" } ], - "updated": 1704824655027, + "updated": 1706058165030, "link": null, "locked": false, "fontSize": 20, @@ -270,8 +278,8 @@ }, { "type": "rectangle", - "version": 607, - "versionNonce": 1703570295, + "version": 681, + "versionNonce": 909492513, "isDeleted": false, "id": "c1bN2x75MV_XQH_uhfQ6c", "fillStyle": "solid", @@ -280,8 +288,8 @@ "roughness": 0, "opacity": 100, "angle": 0, - "x": 802.5, - "y": 447, + "x": 766.0688664737121, + "y": 445.8397279999999, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", "width": 238.00000000000006, @@ -300,14 +308,14 @@ "type": "arrow" } ], - "updated": 1704824655027, + "updated": 1706058165030, "link": null, "locked": false }, { "type": "text", - "version": 271, - "versionNonce": 1597860729, + "version": 340, + "versionNonce": 1104878959, "isDeleted": false, "id": "V77ndk4pktilOW1ITAaX3", "fillStyle": "solid", @@ -316,8 +324,8 @@ "roughness": 0, "opacity": 100, "angle": 0, - "x": 852, - "y": 575, + "x": 815.5688664737121, + "y": 573.8397279999999, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", "width": 140.60000610351562, @@ -326,13 +334,8 @@ "groupIds": [], "frameId": null, "roundness": null, - "boundElements": [ - { - "id": "bzOPl-uGzpTckodDhMVJe", - "type": "arrow" - } - ], - "updated": 1704824655027, + "boundElements": [], + "updated": 1706058165030, "link": null, "locked": false, "fontSize": 20, @@ -347,8 +350,8 @@ }, { "type": "rectangle", - "version": 778, - "versionNonce": 920525913, + "version": 850, + "versionNonce": 1637465089, "isDeleted": false, "id": "MQXKucGrfLLHDTgwnQTFL", "fillStyle": "solid", @@ -357,8 +360,8 @@ "roughness": 0, "opacity": 100, "angle": 0, - "x": 802.7608171637362, - "y": 560, + "x": 766.3296836374483, + "y": 558.8397279999999, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", "width": 238.00000000000006, @@ -373,58 +376,22 @@ "type": "arrow" }, { - "id": "CohihhUCwYSvQVd19rEGP", + "id": "v9YLGBTNi1ne1WAzlNgaf", "type": "arrow" }, { - "id": "Hv0MwFYBwY8T7sG2zKbFi", + "id": "CohihhUCwYSvQVd19rEGP", "type": "arrow" } ], - "updated": 1704824839864, + "updated": 1706059432472, "link": null, "locked": false }, - { - "type": "text", - "version": 346, - "versionNonce": 1352743351, - "isDeleted": false, - "id": "hwu-XgQNyls7MkxY_mF3b", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 0, - "opacity": 100, - "angle": 0, - "x": 835, - "y": 688, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 175.75, - "height": 24, - "seed": 606559531, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1704824655027, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 3, - "text": "query_tokenizer", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "query_tokenizer", - "lineHeight": 1.2, - "baseline": 20 - }, { "type": "rectangle", - "version": 1010, - "versionNonce": 1110570391, + "version": 1294, + "versionNonce": 919171009, "isDeleted": false, "id": "RecBjuTm3MuMcq1kURE98", "fillStyle": "solid", @@ -433,8 +400,8 @@ "roughness": 0, "opacity": 100, "angle": 0, - "x": 802.5, - "y": 673, + "x": 768.0458771388312, + "y": 671.8397280761267, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", "width": 237.9999999999999, @@ -445,58 +412,62 @@ "roundness": null, "boundElements": [ { - "id": "CohihhUCwYSvQVd19rEGP", - "type": "arrow" + "type": "text", + "id": "BdTUa2wROWQ4q72vF5r3n" }, { "id": "IodTsozPdLNX3Zkvjcmbk", "type": "arrow" + }, + { + "id": "CohihhUCwYSvQVd19rEGP", + "type": "arrow" } ], - "updated": 1704824660411, + "updated": 1706059432472, "link": null, "locked": false }, { + "id": "BdTUa2wROWQ4q72vF5r3n", "type": "text", - "version": 276, - "versionNonce": 1105128151, - "isDeleted": false, - "id": "03foxPU5BIiiFooEgstVc", + "x": 799.1708771388312, + "y": 686.8397280761267, + "width": 175.75, + "height": 24, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, - "angle": 0, - "x": 502, - "y": 688, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 175.75, - "height": 24, - "seed": 1704694635, "groupIds": [], "frameId": null, "roundness": null, - "boundElements": [], - "updated": 1704824655027, + "seed": 1074779727, + "version": 209, + "versionNonce": 1987562927, + "isDeleted": false, + "boundElements": null, + "updated": 1706058165030, "link": null, "locked": false, + "text": "query_tokenizer", "fontSize": 20, "fontFamily": 3, - "text": "query_type_list", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "query_type_list", - "lineHeight": 1.2, - "baseline": 20 + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 20, + "containerId": "RecBjuTm3MuMcq1kURE98", + "originalText": "query_tokenizer", + "lineHeight": 1.2 }, { "type": "rectangle", - "version": 551, - "versionNonce": 896215353, + "version": 828, + "versionNonce": 1040822049, "isDeleted": false, "id": "_YAzOEI7IAu-kUSSpgAdJ", "fillStyle": "solid", @@ -505,8 +476,8 @@ "roughness": 0, "opacity": 100, "angle": 0, - "x": 460.5, - "y": 673, + "x": 1042.593484122795, + "y": 558.8397281490159, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", "width": 258.99999999999994, @@ -519,58 +490,58 @@ }, "boundElements": [ { - "id": "geBnkCPO9OHV5uRygyJLE", - "type": "arrow" + "type": "text", + "id": "wyKU9-ELQXZz3zOfgS-Tc" }, { - "id": "lxHpxJvECb-202qNetwCQ", + "id": "Uy2vxPrkvYhVkZRU3-kln", "type": "arrow" } ], - "updated": 1704824839864, + "updated": 1706058373185, "link": null, "locked": false }, { + "id": "wyKU9-ELQXZz3zOfgS-Tc", "type": "text", - "version": 325, - "versionNonce": 1586067447, - "isDeleted": false, - "id": "PfRlxf5TLY6EUapIRMatE", + "x": 1084.218484122795, + "y": 573.8397281490159, + "width": 175.75, + "height": 24, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, - "angle": 0, - "x": 530, - "y": 800, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 117.16666412353516, - "height": 24, - "seed": 973829125, "groupIds": [], "frameId": null, "roundness": null, - "boundElements": [], - "updated": 1704824655027, + "seed": 1091077007, + "version": 244, + "versionNonce": 290433185, + "isDeleted": false, + "boundElements": null, + "updated": 1706058165030, "link": null, "locked": false, + "text": "query_type_list", "fontSize": 20, "fontFamily": 3, - "text": "query_type", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "query_type", - "lineHeight": 1.2, - "baseline": 20 + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 20, + "containerId": "_YAzOEI7IAu-kUSSpgAdJ", + "originalText": "query_type_list", + "lineHeight": 1.2 }, { "type": "rectangle", - "version": 743, - "versionNonce": 1823836057, + "version": 1017, + "versionNonce": 1682601647, "isDeleted": false, "id": "h3l7USTA_De6xOefyyG98", "fillStyle": "solid", @@ -579,12 +550,12 @@ "roughness": 0, "opacity": 100, "angle": 0, - "x": 460.5, - "y": 785, + "x": 1386.0178498343146, + "y": 559.8326865192755, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", - "width": 259, - "height": 54, + "width": 172.5099911656854, + "height": 55.43383034106524, "seed": 1988198635, "groupIds": [], "frameId": null, @@ -593,15 +564,11 @@ }, "boundElements": [ { - "id": "lxHpxJvECb-202qNetwCQ", - "type": "arrow" - }, - { - "id": "56OqTuo3OHyQhPOmlaZet", - "type": "arrow" + "type": "text", + "id": "HfhnnJq1qR21BZylGeAim" }, { - "id": "giXJbDgv_QIls8d8Du1tm", + "id": "Y17bM2MxNy5jDt9f0uPWu", "type": "arrow" }, { @@ -609,114 +576,50 @@ "type": "arrow" } ], - "updated": 1704825347375, + "updated": 1706058778076, "link": null, "locked": false }, { - "type": "arrow", - "version": 176, - "versionNonce": 612271065, - "isDeleted": false, - "id": "AKGq8oWVlxYRE4FwzIoHm", + "id": "HfhnnJq1qR21BZylGeAim", + "type": "text", + "x": 1413.6895133553896, + "y": 575.5496016898081, + "width": 117.16666412353516, + "height": 24, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, - "angle": 0, - "x": 589.5654699602876, - "y": 391, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 0.2879415925805233, - "height": 55, - "seed": 1222557989, "groupIds": [], "frameId": null, "roundness": null, - "boundElements": [], - "updated": 1704824798230, + "seed": 1408736449, + "version": 175, + "versionNonce": 1938657985, + "isDeleted": false, + "boundElements": null, + "updated": 1706058757892, "link": null, "locked": false, - "startBinding": { - "elementId": "-n9RFhkJT7z7TCYZHYHN_", - "gap": 1, - "focus": 0.004524886877828055 - }, - "endBinding": { - "elementId": "vwD6d9zVLJZQXyZH9MyNN", - "gap": 1, - "focus": 0 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - 0.2879415925805233, - 55 - ] - ] - }, - { - "type": "arrow", - "version": 1227, - "versionNonce": 795932919, - "isDeleted": false, - "id": "eCwQFKrhbHcDibbsNR9Ik", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 0, - "opacity": 100, - "angle": 0, - "x": 590.0013667349742, - "y": 502, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 0.0009004371595437988, - "height": 56, - "seed": 1964441067, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1704824805830, - "link": null, - "locked": false, - "startBinding": { - "elementId": "vwD6d9zVLJZQXyZH9MyNN", - "gap": 1, - "focus": 0 - }, - "endBinding": { - "elementId": "0GFMS1CS-wNoXBC2gMBaI", - "gap": 2, - "focus": 0 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - -0.0009004371595437988, - 56 - ] - ] + "text": "query_type", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 20, + "containerId": "h3l7USTA_De6xOefyyG98", + "originalText": "query_type", + "lineHeight": 1.2 }, { "type": "arrow", - "version": 103, - "versionNonce": 1034364471, + "version": 576, + "versionNonce": 418905647, "isDeleted": false, "id": "o_K0G9He4ZkgorwJzvq1U", "fillStyle": "solid", @@ -725,29 +628,29 @@ "roughness": 0, "opacity": 100, "angle": 0, - "x": 802, - "y": 474, + "x": 1005.0688664737122, + "y": 472.8397280000004, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", - "width": 82, - "height": 0, + "width": 36.84570952628792, + "height": 1.1368683772161603e-13, "seed": 72730373, "groupIds": [], "frameId": null, "roundness": null, "boundElements": [], - "updated": 1704824655027, + "updated": 1706058165030, "link": null, "locked": false, "startBinding": { "elementId": "c1bN2x75MV_XQH_uhfQ6c", - "focus": 0, - "gap": 1 + "gap": 1, + "focus": 0 }, "endBinding": { "elementId": "vwD6d9zVLJZQXyZH9MyNN", - "focus": 0, - "gap": 1 + "gap": 1, + "focus": 0 }, "lastCommittedPoint": null, "startArrowhead": null, @@ -758,15 +661,15 @@ 0 ], [ - -82, - 0 + 36.84570952628792, + -1.1368683772161603e-13 ] ] }, { "type": "arrow", - "version": 1348, - "versionNonce": 994437559, + "version": 1660, + "versionNonce": 1231169857, "isDeleted": false, "id": "DPkdADPveH_G2ovyXF_5-", "fillStyle": "solid", @@ -775,8 +678,8 @@ "roughness": 0, "opacity": 100, "angle": 0, - "x": 922.1309168319187, - "y": 502, + "x": 886.4764632522957, + "y": 500.8397279999999, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", "width": 0.0217997492828772, @@ -786,17 +689,17 @@ "frameId": null, "roundness": null, "boundElements": [], - "updated": 1704824675594, + "updated": 1706059423922, "link": null, "locked": false, "startBinding": { "elementId": "c1bN2x75MV_XQH_uhfQ6c", - "focus": -0.0053912750318341265, + "focus": -0.011917431396586235, "gap": 1 }, "endBinding": { "elementId": "MQXKucGrfLLHDTgwnQTFL", - "focus": 0.002836862661576829, + "focus": 0.009363019026328937, "gap": 1 }, "lastCommittedPoint": null, @@ -815,8 +718,8 @@ }, { "type": "arrow", - "version": 1782, - "versionNonce": 1383743319, + "version": 2660, + "versionNonce": 1472919105, "isDeleted": false, "id": "CohihhUCwYSvQVd19rEGP", "fillStyle": "solid", @@ -825,29 +728,29 @@ "roughness": 0, "opacity": 100, "angle": 0, - "x": 921.2489058076192, - "y": 615, + "x": 885.5878961526909, + "y": 613.7968287749246, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", - "width": 0.2917593269198733, - "height": 56, + "width": 0.0614142299436935, + "height": 56.776680022791766, "seed": 1280053733, "groupIds": [], "frameId": null, "roundness": null, "boundElements": [], - "updated": 1704824845198, + "updated": 1706059435789, "link": null, "locked": false, "startBinding": { "elementId": "MQXKucGrfLLHDTgwnQTFL", - "focus": 0.0030722648584576725, + "focus": -0.002423381440009263, "gap": 1 }, "endBinding": { "elementId": "RecBjuTm3MuMcq1kURE98", - "focus": -0.0058245700031026295, - "gap": 2 + "focus": -0.013021764117112927, + "gap": 1.26621927841029 }, "lastCommittedPoint": null, "startArrowhead": null, @@ -858,65 +761,15 @@ 0 ], [ - -0.2917593269198733, - 56 + -0.0614142299436935, + 56.776680022791766 ] ] }, { "type": "arrow", - "version": 1800, - "versionNonce": 1783790073, - "isDeleted": false, - "id": "geBnkCPO9OHV5uRygyJLE", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 0, - "opacity": 100, - "angle": 0, - "x": 589.9999999716886, - "y": 615, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 1.8652258404472377e-8, - "height": 56, - "seed": 341299845, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1704824811364, - "link": null, - "locked": false, - "startBinding": { - "elementId": "0GFMS1CS-wNoXBC2gMBaI", - "gap": 1, - "focus": 0 - }, - "endBinding": { - "elementId": "_YAzOEI7IAu-kUSSpgAdJ", - "gap": 2, - "focus": 0 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - 1.8652258404472377e-8, - 56 - ] - ] - }, - { - "type": "arrow", - "version": 1703, - "versionNonce": 1247657879, + "version": 3416, + "versionNonce": 1455861167, "isDeleted": false, "id": "IodTsozPdLNX3Zkvjcmbk", "fillStyle": "solid", @@ -925,29 +778,29 @@ "roughness": 0, "opacity": 100, "angle": 0, - "x": 921.175693384321, - "y": 728, + "x": 833.3746732947006, + "y": 727.1283532761275, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", - "width": 0.15036735247394972, - "height": 55.36516797282684, + "width": 0.6441463085377563, + "height": 53.42395151204812, "seed": 1774909003, "groupIds": [], "frameId": null, "roundness": null, "boundElements": [], - "updated": 1704824681228, + "updated": 1706059404772, "link": null, "locked": false, "startBinding": { "elementId": "RecBjuTm3MuMcq1kURE98", - "focus": 0.0020849409634723128, - "gap": 1 + "focus": 0.45264646930265834, + "gap": 1.2886252000008653 }, "endBinding": { "elementId": "L1frT79iJ9G2qMmEDf0ZB", - "focus": -0.061424759493420106, - "gap": 3.634832027173161 + "focus": 0.0814238471418986, + "gap": 7.924230807019285 }, "lastCommittedPoint": null, "startArrowhead": null, @@ -958,15 +811,15 @@ 0 ], [ - -0.15036735247394972, - 55.36516797282684 + 0.6441463085377563, + 53.42395151204812 ] ] }, { "type": "text", - "version": 193, - "versionNonce": 1273995897, + "version": 544, + "versionNonce": 1283034095, "isDeleted": false, "id": "L1frT79iJ9G2qMmEDf0ZB", "fillStyle": "solid", @@ -975,8 +828,8 @@ "roughness": 0, "opacity": 100, "angle": 0, - "x": 866, - "y": 787, + "x": 770.8938578572651, + "y": 788.476535595195, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", "width": 117.16666412353516, @@ -987,15 +840,15 @@ "roundness": null, "boundElements": [ { - "id": "IodTsozPdLNX3Zkvjcmbk", + "id": "lxHpxJvECb-202qNetwCQ", "type": "arrow" }, { - "id": "lxHpxJvECb-202qNetwCQ", + "id": "IodTsozPdLNX3Zkvjcmbk", "type": "arrow" } ], - "updated": 1704824655027, + "updated": 1706059397572, "link": null, "locked": false, "fontSize": 20, @@ -1009,131 +862,223 @@ "baseline": 20 }, { - "type": "arrow", - "version": 600, - "versionNonce": 829392249, + "type": "rectangle", + "version": 636, + "versionNonce": 844450735, "isDeleted": false, - "id": "56OqTuo3OHyQhPOmlaZet", + "id": "fQF1BjWKFrbNVoeBUkB-P", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0, - "x": 459, - "y": 813, + "x": 1221.5301250184787, + "y": 670.209014, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", - "width": 32.2166748046875, - "height": 0, - "seed": 994336363, + "width": 59.00000000000005, + "height": 54.00000020792754, + "seed": 801379925, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "MUDLo78FzHZrhRmVSeg85" + } + ], + "updated": 1706058613439, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 147, + "versionNonce": 749031151, + "isDeleted": false, + "id": "MUDLo78FzHZrhRmVSeg85", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1233.430124637009, + "y": 685.2090141039638, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 35.20000076293945, + "height": 24, + "seed": 1927276635, "groupIds": [], "frameId": null, "roundness": null, "boundElements": [], - "updated": 1704824820114, + "updated": 1706058165030, "link": null, "locked": false, - "startBinding": { - "elementId": "h3l7USTA_De6xOefyyG98", - "gap": 1.5, - "focus": -0.037037037037037035 - }, - "endBinding": { - "elementId": "7Ita79LcpYkSjgfvgOmI3", - "gap": 4.4666595458984375, - "focus": 0.08333333333333331 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - -32.2166748046875, - 0 - ] - ] + "fontSize": 20, + "fontFamily": 3, + "text": "q10", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "fQF1BjWKFrbNVoeBUkB-P", + "originalText": "q10", + "lineHeight": 1.2, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 602, + "versionNonce": 1447992193, + "isDeleted": false, + "id": "3v_hPCQD_rFtQ-1-mjUby", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1063.6568427638583, + "y": 671.839728, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 59.00000000000005, + "height": 53.60362150836635, + "seed": 1485862517, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "1OuZ98PcRI9-YMsAiJXR-" + } + ], + "updated": 1706058165030, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 134, + "versionNonce": 1880856847, + "isDeleted": false, + "id": "1OuZ98PcRI9-YMsAiJXR-", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1075.5568423823886, + "y": 686.6415387541832, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 35.20000076293945, + "height": 24, + "seed": 1861018389, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1706058165030, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": "q01", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "3v_hPCQD_rFtQ-1-mjUby", + "originalText": "q01", + "lineHeight": 1.2, + "baseline": 19 }, { "type": "text", - "version": 223, - "versionNonce": 1453779801, + "version": 354, + "versionNonce": 1674675041, "isDeleted": false, - "id": "7Ita79LcpYkSjgfvgOmI3", + "id": "suFq9CDaZs6yv2Z--phOU", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0, - "x": 270, - "y": 800, + "x": 1142.8018181061798, + "y": 686.6415386914572, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", - "width": 152.31666564941406, + "width": 58.58333206176758, "height": 24, - "seed": 2146737803, + "seed": 1429680853, "groupIds": [], "frameId": null, "roundness": null, "boundElements": [ { - "id": "56OqTuo3OHyQhPOmlaZet", + "id": "Uy2vxPrkvYhVkZRU3-kln", + "type": "arrow" + }, + { + "id": "Xoshipa7mpkS32UfkHWpA", "type": "arrow" } ], - "updated": 1704824655027, + "updated": 1706058165030, "link": null, "locked": false, "fontSize": 20, "fontFamily": 3, - "text": "database, ...", + "text": "(...)", "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "database, ...", + "originalText": "(...)", "lineHeight": 1.2, "baseline": 20 }, { "type": "arrow", - "version": 2174, - "versionNonce": 746282937, + "version": 565, + "versionNonce": 1021274447, "isDeleted": false, - "id": "lxHpxJvECb-202qNetwCQ", + "id": "yNn8BAN_ejbVzAGdq-mqW", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0, - "x": 590.6253076507527, - "y": 728, - "strokeColor": "#1e1e1e", + "x": 1471.213549090466, + "y": 616.3314961427304, + "strokeColor": "#2f9e44", "backgroundColor": "transparent", - "width": 1.2287768069218146, - "height": 55.000000000000114, - "seed": 1831379365, + "width": 0.5702807770032905, + "height": 52.512353216782344, + "seed": 1289065879, "groupIds": [], "frameId": null, - "roundness": null, + "roundness": { + "type": 2 + }, "boundElements": [], - "updated": 1704824820114, + "updated": 1706058778276, "link": null, "locked": false, "startBinding": { - "elementId": "_YAzOEI7IAu-kUSSpgAdJ", - "gap": 1, - "focus": 0 + "elementId": "h3l7USTA_De6xOefyyG98", + "focus": 0.015849459961419128, + "gap": 1.064979282389686 }, "endBinding": { - "elementId": "h3l7USTA_De6xOefyyG98", - "gap": 2, - "focus": 0.01923076923076923 + "elementId": "NGsczIcVlLTuPcm8GKk1f", + "focus": -0.0020909895572543916, + "gap": 1.3651646404873077 }, "lastCommittedPoint": null, "startArrowhead": null, @@ -1144,98 +1089,305 @@ 0 ], [ - 1.2287768069218146, - 55.000000000000114 + 0.5702807770032905, + 52.512353216782344 ] ] }, { - "type": "arrow", - "version": 502, - "versionNonce": 1207780727, + "type": "rectangle", + "version": 394, + "versionNonce": 8732513, "isDeleted": false, - "id": "Hv0MwFYBwY8T7sG2zKbFi", + "id": "NGsczIcVlLTuPcm8GKk1f", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0, - "x": 801.7608171637362, - "y": 587, - "strokeColor": "#1e1e1e", + "x": 1386.0178496219444, + "y": 670.209014, + "strokeColor": "#2f9e44", "backgroundColor": "transparent", - "width": 80.26594120506616, - "height": 0, - "seed": 1674141285, + "width": 172.50999103834465, + "height": 53.99999992726485, + "seed": 1806904441, "groupIds": [], "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1704824805830, - "link": null, - "locked": false, - "startBinding": { - "elementId": "MQXKucGrfLLHDTgwnQTFL", - "gap": 1, - "focus": 0 + "roundness": { + "type": 3 }, - "endBinding": { - "elementId": "0GFMS1CS-wNoXBC2gMBaI", - "gap": 1.9948759586700362, - "focus": 0 + "boundElements": [ + { + "type": "text", + "id": "Go6eT1rIEfC9qFdj5TilR" + }, + { + "id": "yNn8BAN_ejbVzAGdq-mqW", + "type": "arrow" + } + ], + "updated": 1706058776159, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 380, + "versionNonce": 1663614671, + "isDeleted": false, + "id": "Go6eT1rIEfC9qFdj5TilR", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1401.972842089359, + "y": 685.2090139636324, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "width": 140.60000610351562, + "height": 24, + "seed": 1117405145, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1706058771176, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": "query_writer", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "NGsczIcVlLTuPcm8GKk1f", + "originalText": "query_writer", + "lineHeight": 1.2, + "baseline": 20 + }, + { + "id": "Vg8N_HEyjkbW_eCUCXFoq", + "type": "text", + "x": 1356.7365967405772, + "y": 349.3214518293695, + "width": 222.61666870117188, + "height": 24, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1767458593, + "version": 453, + "versionNonce": 1195604929, + "isDeleted": false, + "boundElements": [ + { + "id": "M_pftuBWPG_r_9ObbavK0", + "type": "arrow" + } + ], + "updated": 1706058793260, + "link": null, + "locked": false, + "text": "performance_metrics", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 20, + "containerId": null, + "originalText": "performance_metrics", + "lineHeight": 1.2 + }, + { + "id": "v9YLGBTNi1ne1WAzlNgaf", + "type": "arrow", + "x": 1004.8637145208365, + "y": 586.7545121881114, + "width": 38.05086176363125, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 }, + "seed": 2032239599, + "version": 96, + "versionNonce": 1372524463, + "isDeleted": false, + "boundElements": null, + "updated": 1706058165030, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 38.05086176363125, + 0 + ] + ], "lastCommittedPoint": null, + "startBinding": { + "elementId": "MQXKucGrfLLHDTgwnQTFL", + "focus": 0.033880895855982425, + "gap": 1 + }, + "endBinding": null, "startArrowhead": null, - "endArrowhead": "arrow", + "endArrowhead": "arrow" + }, + { + "id": "Uy2vxPrkvYhVkZRU3-kln", + "type": "arrow", + "x": 1171.0617512608014, + "y": 613.5446531238935, + "width": 0.5117455012957635, + "height": 61.30752889137625, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1809282625, + "version": 121, + "versionNonce": 1841684673, + "isDeleted": false, + "boundElements": null, + "updated": 1706059014014, + "link": null, + "locked": false, "points": [ [ 0, 0 ], [ - -80.26594120506616, + 0.5117455012957635, + 61.30752889137625 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "_YAzOEI7IAu-kUSSpgAdJ", + "focus": 0.009735883226589514, + "gap": 1 + }, + "endBinding": { + "elementId": "suFq9CDaZs6yv2Z--phOU", + "focus": -0.010935457403168588, + "gap": 11.78935667618748 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "M_pftuBWPG_r_9ObbavK0", + "type": "arrow", + "x": 1302.5934840000002, + "y": 362.25393467230674, + "width": 43.345035757882215, + "height": 0.23575612558397552, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 2031803297, + "version": 608, + "versionNonce": 1987953761, + "isDeleted": false, + "boundElements": null, + "updated": 1706058813277, + "link": null, + "locked": false, + "points": [ + [ + 0, 0 + ], + [ + 43.345035757882215, + 0.23575612558397552 ] - ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "-n9RFhkJT7z7TCYZHYHN_", + "gap": 1, + "focus": 0.007968779029604084 + }, + "endBinding": { + "elementId": "Vg8N_HEyjkbW_eCUCXFoq", + "gap": 10.798076982694738, + "focus": -0.14536475750020914 + }, + "startArrowhead": null, + "endArrowhead": "arrow" }, { "type": "arrow", - "version": 454, - "versionNonce": 476396345, + "version": 1015, + "versionNonce": 1951018351, "isDeleted": false, - "id": "giXJbDgv_QIls8d8Du1tm", + "id": "Xoshipa7mpkS32UfkHWpA", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "angle": 0, - "x": 589.410375442506, - "y": 897, + "x": 1171.558153323915, + "y": 757.7581187794079, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", - "width": 0.9540120581301608, - "height": 57, - "seed": 1557782059, + "width": 185.9870629924551, + "height": 255.73542463827346, + "seed": 121325665, "groupIds": [], "frameId": null, - "roundness": { - "type": 2 - }, + "roundness": null, "boundElements": [], - "updated": 1704824820114, + "updated": 1706058706158, "link": null, "locked": false, - "startBinding": { - "elementId": "suFq9CDaZs6yv2Z--phOU", - "gap": 15.167280810953002, - "focus": -0.01564480614228256 - }, + "startBinding": null, "endBinding": { - "elementId": "h3l7USTA_De6xOefyyG98", - "gap": 1, - "focus": -0.006410256410256409 + "elementId": "0GFMS1CS-wNoXBC2gMBaI", + "focus": 0.8182190714788494, + "gap": 1.182965653162853 }, "lastCommittedPoint": null, "startArrowhead": null, @@ -1246,195 +1398,252 @@ 0 ], [ - 0.9540120581301608, - -57 + 185.9870629924551, + -0.5908452383351914 + ], + [ + 185.14503071892295, + -255.73542463827346 ] ] }, { - "type": "rectangle", - "version": 506, - "versionNonce": 1967267321, - "isDeleted": false, - "id": "fQF1BjWKFrbNVoeBUkB-P", + "id": "MldNUMrKkt-li8BuOkcxH", + "type": "arrow", + "x": 1170.3436296426464, + "y": 389.96593860493624, + "width": 0.4277530550177744, + "height": 53.885625906265545, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, - "angle": 0, - "x": 641.0908222666366, - "y": 897.0999213274233, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 59.00000000000005, - "height": 54, - "seed": 801379925, "groupIds": [], "frameId": null, "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "MUDLo78FzHZrhRmVSeg85" - } - ], - "updated": 1704824655027, + "seed": 1749893039, + "version": 180, + "versionNonce": 1763390927, + "isDeleted": false, + "boundElements": null, + "updated": 1706058818643, "link": null, - "locked": false + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.4277530550177744, + 53.885625906265545 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "-n9RFhkJT7z7TCYZHYHN_", + "focus": 0.012593137697522407, + "gap": 1.644486604936219 + }, + "endBinding": { + "elementId": "vwD6d9zVLJZQXyZH9MyNN", + "focus": -0.009668065253824498, + "gap": 1.9881634887981932 + }, + "startArrowhead": null, + "endArrowhead": "arrow" }, { - "type": "text", - "version": 19, - "versionNonce": 233937431, - "isDeleted": false, - "id": "MUDLo78FzHZrhRmVSeg85", + "id": "5hvnFh6LFo62zyCtNrnQS", + "type": "line", + "x": 1171.3699963497022, + "y": 715.045846097613, + "width": 0.2993290229926515, + "height": 42.40539221284632, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, - "angle": 0, - "x": 652.9908218851668, - "y": 912.0999213274233, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 35.20000076293945, - "height": 24, - "seed": 1927276635, "groupIds": [], "frameId": null, "roundness": null, - "boundElements": [], - "updated": 1704824655027, + "seed": 999866913, + "version": 89, + "versionNonce": 2026269551, + "isDeleted": false, + "boundElements": null, + "updated": 1706058702358, "link": null, "locked": false, - "fontSize": 20, - "fontFamily": 3, - "text": "q10", - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "fQF1BjWKFrbNVoeBUkB-P", - "originalText": "q10", - "lineHeight": 1.2, - "baseline": 20 + "points": [ + [ + 0, + 0 + ], + [ + 0.2993290229926515, + 42.40539221284632 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null }, { - "type": "rectangle", - "version": 486, - "versionNonce": 924710617, - "isDeleted": false, - "id": "3v_hPCQD_rFtQ-1-mjUby", + "id": "Y17bM2MxNy5jDt9f0uPWu", + "type": "arrow", + "x": 1470.4496027668881, + "y": 501.5924437933188, + "width": 0.1843655572965872, + "height": 57.240242725956705, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, - "angle": 0, - "x": 479.9915470120161, - "y": 896.7035426278621, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 59.00000000000005, - "height": 54, - "seed": 1485862517, "groupIds": [], "frameId": null, "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "1OuZ98PcRI9-YMsAiJXR-" - } - ], - "updated": 1704824655027, + "seed": 1594200655, + "version": 144, + "versionNonce": 1382303151, + "isDeleted": false, + "boundElements": null, + "updated": 1706058762892, "link": null, - "locked": false + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.1843655572965872, + 57.240242725956705 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "0GFMS1CS-wNoXBC2gMBaI", + "focus": -0.06063457176330225, + "gap": 1 + }, + "endBinding": { + "elementId": "h3l7USTA_De6xOefyyG98", + "focus": -0.01790949838811968, + "gap": 1 + }, + "startArrowhead": null, + "endArrowhead": "arrow" }, { - "type": "text", - "version": 18, - "versionNonce": 1258569527, - "isDeleted": false, - "id": "1OuZ98PcRI9-YMsAiJXR-", + "id": "7UmUFdMZ-IgBzpVcvk-RJ", + "type": "arrow", + "x": 1301.3393432242951, + "y": 473.0788081135289, + "width": 32.41547680592771, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, - "angle": 0, - "x": 491.8915466305464, - "y": 911.7035426278621, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 35.20000076293945, - "height": 24, - "seed": 1861018389, "groupIds": [], "frameId": null, "roundness": null, - "boundElements": [], - "updated": 1704824655027, + "seed": 626923137, + "version": 127, + "versionNonce": 1450415023, + "isDeleted": false, + "boundElements": null, + "updated": 1706058837644, "link": null, "locked": false, - "fontSize": 20, - "fontFamily": 3, - "text": "q01", - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "3v_hPCQD_rFtQ-1-mjUby", - "originalText": "q01", - "lineHeight": 1.2, - "baseline": 20 + "points": [ + [ + 0, + 0 + ], + [ + 32.41547680592771, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" }, { - "type": "text", - "version": 225, - "versionNonce": 97235897, - "isDeleted": false, - "id": "suFq9CDaZs6yv2Z--phOU", + "id": "Zf8deRzrIRUOdgcE3btY4", + "type": "arrow", + "x": 1170.8496353578414, + "y": 757.9703611853881, + "width": 59.23293389478772, + "height": 35.11143688137929, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, - "angle": 0, - "x": 560.1255803543374, - "y": 912.167280810953, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "width": 58.58333206176758, - "height": 24, - "seed": 1429680853, "groupIds": [], "frameId": null, "roundness": null, - "boundElements": [ - { - "id": "giXJbDgv_QIls8d8Du1tm", - "type": "arrow" - } - ], - "updated": 1704824655027, + "seed": 1933211119, + "version": 285, + "versionNonce": 365102753, + "isDeleted": false, + "boundElements": null, + "updated": 1706059384338, "link": null, "locked": false, - "fontSize": 20, - "fontFamily": 3, - "text": "(...)", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "(...)", - "lineHeight": 1.2, - "baseline": 20 + "points": [ + [ + 0, + 0 + ], + [ + -59.23293389478772, + 35.11143688137929 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "pHdyRWQum3IkB9Bry-f1Q", + "focus": 0.07950101683757245, + "gap": 1.2142154783059596 + }, + "startArrowhead": null, + "endArrowhead": "arrow" }, { - "id": "yNn8BAN_ejbVzAGdq-mqW", + "id": "E5mWMhQORGZXMvWFysbwE", "type": "arrow", - "x": 720.903081870572, - "y": 811.8101695215928, - "width": 200.86083792429986, - "height": 84.7739658159594, + "x": 1172.2432682691035, + "y": 757.7556437871165, + "width": 54.02916867657473, + "height": 35.54037032377505, "angle": 0, "strokeColor": "#2f9e44", "backgroundColor": "transparent", @@ -1445,15 +1654,13 @@ "opacity": 100, "groupIds": [], "frameId": null, - "roundness": { - "type": 2 - }, - "seed": 1289065879, - "version": 154, - "versionNonce": 801877913, + "roundness": null, + "seed": 1689308143, + "version": 197, + "versionNonce": 118772719, "isDeleted": false, "boundElements": null, - "updated": 1704825374675, + "updated": 1706059193068, "link": null, "locked": false, "points": [ @@ -1462,97 +1669,167 @@ 0 ], [ - 200.86083792429986, - 84.7739658159594 + 54.02916867657473, + 35.54037032377505 ] ], "lastCommittedPoint": null, - "startBinding": { - "elementId": "h3l7USTA_De6xOefyyG98", - "focus": -0.6789209798819398, - "gap": 1.4030818705720094 - }, + "startBinding": null, "endBinding": { - "elementId": "NGsczIcVlLTuPcm8GKk1f", - "focus": 0.35427655402047364, - "gap": 1 + "elementId": "B3H20N61yZDGQb9p2SPLy", + "gap": 1, + "focus": -0.23385841106560296 }, "startArrowhead": null, "endArrowhead": "arrow" }, { - "id": "NGsczIcVlLTuPcm8GKk1f", "type": "rectangle", - "x": 802.5, - "y": 896.703543, - "width": 238, - "height": 54.39637800000001, - "angle": 0, - "strokeColor": "#2f9e44", - "backgroundColor": "transparent", + "version": 1109, + "versionNonce": 141214561, + "isDeleted": false, + "id": "pHdyRWQum3IkB9Bry-f1Q", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, + "angle": 0, + "x": 963.7605819699174, + "y": 794.2960135450734, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "width": 179.04123599162702, + "height": 54, + "seed": 655053601, "groupIds": [], "frameId": null, "roundness": { "type": 3 }, - "seed": 1806904441, - "version": 143, - "versionNonce": 2064451127, - "isDeleted": false, "boundElements": [ { - "id": "yNn8BAN_ejbVzAGdq-mqW", - "type": "arrow" + "type": "text", + "id": "0U07lzJG3SbJPPCi4Qkhh" }, { - "type": "text", - "id": "Go6eT1rIEfC9qFdj5TilR" + "id": "Zf8deRzrIRUOdgcE3btY4", + "type": "arrow" } ], - "updated": 1704825378658, + "updated": 1706059384138, "link": null, "locked": false }, { - "id": "Go6eT1rIEfC9qFdj5TilR", "type": "text", - "x": 851.1999969482422, - "y": 911.9017319999999, - "width": 140.60000610351562, + "version": 584, + "versionNonce": 1943908161, + "isDeleted": false, + "id": "0U07lzJG3SbJPPCi4Qkhh", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 971.2645297386802, + "y": 809.2960135450734, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "width": 164.03334045410156, "height": 24, + "seed": 1465272065, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1706059384138, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": "GConstPtrArray", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "pHdyRWQum3IkB9Bry-f1Q", + "originalText": "GConstPtrArray", + "lineHeight": 1.2, + "baseline": 20 + }, + { + "type": "rectangle", + "version": 1128, + "versionNonce": 1284564175, + "isDeleted": false, + "id": "B3H20N61yZDGQb9p2SPLy", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, "angle": 0, + "x": 1182.9126136453467, + "y": 794.2960141108915, "strokeColor": "#2f9e44", "backgroundColor": "transparent", + "width": 249.36620161064525, + "height": 54, + "seed": 518776335, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "FbnOzzf52ou3DqZ1iLDJs" + }, + { + "id": "E5mWMhQORGZXMvWFysbwE", + "type": "arrow" + } + ], + "updated": 1706059183901, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 617, + "versionNonce": 135316847, + "isDeleted": false, + "id": "FbnOzzf52ou3DqZ1iLDJs", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, + "angle": 0, + "x": 1202.145717502427, + "y": 809.2960141108915, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "width": 210.89999389648438, + "height": 24, + "seed": 130173999, "groupIds": [], "frameId": null, "roundness": null, - "seed": 1117405145, - "version": 28, - "versionNonce": 1117564631, - "isDeleted": false, - "boundElements": null, - "updated": 1704825386292, + "boundElements": [], + "updated": 1706059196034, "link": null, "locked": false, - "text": "query_writer", "fontSize": 20, "fontFamily": 3, + "text": "GConstKeyHashTable", "textAlign": "center", "verticalAlign": "middle", - "baseline": 20, - "containerId": "NGsczIcVlLTuPcm8GKk1f", - "originalText": "query_writer", - "lineHeight": 1.2 + "containerId": "B3H20N61yZDGQb9p2SPLy", + "originalText": "GConstKeyHashTable", + "lineHeight": 1.2, + "baseline": 20 } ], "appState": { diff --git a/trabalho-pratico/reports/res-fase2/queries.png b/trabalho-pratico/reports/res-fase2/queries.png index 507bd51..cbb0fb9 100644 Binary files a/trabalho-pratico/reports/res-fase2/queries.png and b/trabalho-pratico/reports/res-fase2/queries.png differ diff --git a/trabalho-pratico/scripts/diagram.sh b/trabalho-pratico/scripts/diagram.sh new file mode 100755 index 0000000..47a2f77 --- /dev/null +++ b/trabalho-pratico/scripts/diagram.sh @@ -0,0 +1,54 @@ +#!/bin/sh + +# This script generates a dependency diagram for the application. Unlike in the +# report, there is no distinction between data and function modules. This script +# serves merely as an helper for drawing those diagrams manually without +# mistakes. +# + +# Copyright 2023 Humberto Gomes, José Lopes, José Matos +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +. "$(dirname "$0")/utils.sh" + +assert_installed_command dot +assert_installed_command tred + +{ +echo "digraph {" +echo "node[fontname = \"monospace\" shape=rect];" + +# Exclude main and test. Those are not modules. +sources="$(find src -type f -name '*.c' | sed '/main.c$/d ; /test.c$/d ;' )" + +for source in $sources; do + source_name="$(basename "$source" | sed 's/.c$//')" + header_path="$(echo "$source" | sed 's/^src\//include\// ; s/.c$/.h/')" + + # List include dependencies. This method is not as accurate as when this is + # done by compilers, but this doesn't make a difference in our project. + source_dependencies="$(grep '^#include "' "$source" | \ + sed 's/^#include "// ; s/.h"$//')" + header_dependencies="$(grep '^#include "' "$header_path" | \ + sed 's/^#include "// ; s/.h"$//')" + + for dependency in $source_dependencies $header_dependencies; do + dependency_name="$(basename "$dependency" | sed 's/.h$//')" + if [ "$source_name" != "$dependency_name" ]; then + echo "$source_name -> $dependency_name" + fi + done +done +echo "}" +} | tred | dot -Txlib