Na minha opinião a implementação é muito elegante, inteligente e eficiente, ao mesmo tempo que é bastante simples. E mostra como SQL é uma ferramenta extramamente poderosa.
Eu não sei se concordo. E digo "não sei" porque o meu raso conhecimento de SQL não me permite ter uma opinião muito embasada a respeito. Não me parece elegante uma query de quase duas centenas de linhas chumbada no código como string, e com esse monte de JOINS, UNIONS etc também fico me perguntando se é realmente eficiente como você citou ou se essa regra de negócio poderia ter sido quebrada pra melhorar a legibilidade, manutenabilidade e até performance (o que talvez dependesse de outra modelagem do banco).
Eu posso estar (e provavelmente estou) enganado a esse respeito, e gostaria muito que alguém discorresse a respeito dessa abordagem que o Filipe escolheu. Melhor ainda se fosse o próprio Filipe. Não é crítica, são dúvidas honestas de alguém que quer aprender.
Jois fazem parte do SQL não há como fugir, apenas tens falta de familiaridade com eles. A abordagem de escrita é sim boa, já que, ele segregou varias partes em CTE. Se fosse mal feito seria uma série de subselects dentro da query principal. Por exemplo, ao ler a query temos: latest_published_child_contents: Uma CTE que seleciona os IDs e caminhos dos conteúdos mais recentes que foram publicados nas últimas 24 horas e têm um parent_id não nulo (ou seja, são filhos de outros conteúdos). latest_interacted_root_contents:
- Uma CTE que combina duas seleções
- A primeira parte seleciona os conteúdos raiz (não têm parent_id) que foram publicados nas últimas 7 dias e têm um saldo positivo de "tabcoins"
- A segunda parte seleciona os conteúdos raiz que estão associados aos conteúdos da CTE latest_published_child_contents, garantindo que não tenham o mesmo owner_id. Isso inclui novamente o cálculo de saldo de "tabcoins" ranked_published_root_contents: Uma CTE que seleciona conteúdos raiz da CTE latest_interacted_root_contents que possuem um saldo positivo de "tabcoins". Calcula um "score" para cada conteúdo com base em uma fórmula envolvendo o saldo de "tabcoins" e o número de proprietários únicos dos conteúdos que possuem uma relação hierárquica com o conteúdo atual. group_1 a group_5: CTEs que dividem os conteúdos da CTE ranked_published_root_contents em grupos com base em critérios específicos de tempo e pontuação. Os grupos são definidos por intervalos de tempo e pontuações mínimas. Cada grupo é ordenado e limitado a um número máximo de resultados. ranked Uma CTE final que une os resultados das CTEs group_1 a group_5 e os classifica novamente com base em um critério de classificação mais amplo. A consulta final também inclui informações detalhadas sobre os conteúdos, como IDs, proprietários, títulos, pontuações, etc. Os resultados finais são ordenados por grupo, pontuação e data de publicação.
Ou seja, se tu quebrar as partes fica bem fácil de entender, e na área em que trabalho (engenharia de dados/bi) a gente acaba precisando escrever querys muito mais complexas, então creio que seja familiaridade mesmo.
Sim a implementação é bastante eficiente e isso pode ser medido de clara e empirica, é objetivo. Isso é um fato, assim como é um fato que qualquer implementacao deste mesmo algortimo usando JavaScript seria infinitamente mais lenta e complexa. Isso explica o motivo de ter uma query de 200 linhas jogados no meio de um sistema feito todo com um ORM de ultima geracao.
regra de negócio poderia ter sido quebrada pra melhorar a legibilidade, manutenabilidade
Isso comcerteza poderia ser, a query poderia por exemplo se utilizar de views e funcoes criadas no postgres abstrair parte da complexidade e aumentar a legibilidade e manutenabilidade, mas como tudo na computacao sao tradeoffs e com meu sql enferrujado consegui entender esta query em menos de 5 minutos, entao por isso acho que nenhum esforço foi feito nesse sentido.
gostaria muito que alguém discorresse a respeito dessa abordagem que o Filipe escolheu. Melhor ainda se fosse o próprio Filipe. Não é crítica, são dúvidas honestas de alguém que quer aprender.
Obrigado por seus questionamentos inteligentes, não posso responder pelo Filipe, porque essa abordagem foi escolhida, mas espero que tenha esclarecido suas dúvias e acredito que os links referencidos em minhas outras respostas são um execelente material para quem quer aprender.
Entenda o desempenho do sua query Todo o poder dos dados em suas aplicações