Oi pessoal, meu nome é Ronaldo Lanielas e nessa aula eu vou mostrar para vocês como usar o Cacique ODB para criar um filtro baseado num tópico que a gente já tem. Então, se vocês bem lembraram, nas aulas passadas a gente criou um Kafka Connect Source que lê do Postgre e grava num tópico, um tópico de cliente. E o que a gente vai fazer agora é, com o Cacique ODB, criar um streaming, que primeiro vai streamar essas informações, então ele vai começar a pegar qualquer evento que chega desse novo cliente, e aí a gente vai criar uma view materializada para mostrar quantas vezes aquele cliente foi criado com o mesmo nome e qual é o último ID. Então imagina, por exemplo, que a gente tem para o cliente Ronaldo o ID 1, 2, 3 e 4. Então a gente vai mostrar nessa VIO matrizada que ele foi criado quatro vezes para o nome Ronaldo. Aí se você for criar um outro, tipo o Mike com ID 5, ele vai mostrar que o Mike foi criado quatro vezes para o nome Ronaldo. Aí se você for criar um outro, tipo Mike, com ID 5, ele vai mostrar que o Mike foi criado uma vez e o ID dele foi 5. Então a gente vai fazer um count para mostrar quantas vezes cada cliente está sendo repetido com aquele nome. Então vamos lá. A primeira coisa que eu vou fazer, eu vou abrir o Docker Compose que a gente já tem, que tem um banco de dados, tem o Kafka Connect, etc. E o que eu vou fazer aqui é adicionar uma seção do Cacico. Então eu copiei aqui o que eu já tinha. Essa seção do Cacico tem um server, então o Cacico é um servidor separado do Kafka e o CLI, o CLI, para eu poder acessar e realizar os comandos que eu preciso para criar streaming, fazer describe, etc. Bom, primeiro eu preciso mudar essa porta aqui, a nossa porta do broker, que começa com Doge na frente. Certo? E o resto está correto. Então eu vou dar um docker-compose-app. E assim que estiver de pé, a gente já vai acessar o Cacico. Perfeito. Vamos só conferir se o nosso PlayState Cache Connect está funcionando. Ainda não. Esperar ele funcionar aqui. funcionando, né? Ainda não. Esperar ele funcionar aqui. Só lembrando que a gente precisa ter criado o nosso conector JDBC, tá? Que vai ler lá do Postgre e gravar nesse tópico. Então, se você não tem criado ainda, aconselho você voltar um pouco e olhar a seção de carta Connect e você vai ver como criar o conector JDBC que a gente tinha instalado nas aulas passadas. eu vou aqui só criar o meu jdbc source de novo e como eu criei o cluster de zero eu vou recriar ele aqui. Certo? E agora o que a gente vai fazer é o seguinte, eu tenho aqui a minha base de dados e ela tem vários clientes criados já. Então, na verdade eu já tinha trancado, então eu vou só criar minha tabela aqui, dá um select, está vazio, beleza? E agora a gente vai começar a ver as coisas funcionando. Então aqui eu tenho meu khq, vocês olharam que está vazio, não tem nenhum tópico. Eu vou só mandar uma mensagem, vou dar um insert aqui na minha base, o cliente chamado Paul, só para a gente ver que está funcionando o nosso Kafka Connect. Está aqui, então, ficou aqui a informação do cliente Paul, certinho, e agora a gente vai começar a brincar um pouco com o Cacico. Então a primeira coisa que eu vou fazer. Eu vou criar um streaming. Deixa eu primeiro conectar na verdade. Se você olhar a gente tem um container aqui. Que é o... Cadê? Cadê? Será que eu subi o certo? Eu não estou vendo aqui o cacique. É, eu acho que eu não salvei. É, não salvei. Então, eu vou só dar um docker-compose-app de novo e vai criar só os serviços que não existem, que no caso é o Cacico e o Clip. Isso é bem rápido. Pronto. Se vocês perceberem, eu tenho aqui esse CLI, então eu vou acessar ele docker exec mzit e o que ele pede? Ele pede o comando cacicle e aí eu vou conectar no meu server de Cacique que está nesse host nessa porta tá ele tá rodando aqui ó, 8088 ok se a gente dá um show stream aqui só pra ficar claro a gente não tem nada tá, então tá vazio, primeira coisa que eu vou fazer é vou criar um streaming então é create streaming, vou chamar de clients created ok esse cara ele vai ter o id ele vai ter o name vou achar with e aí ele pede o tópico ele vai ler do lanielas.client e o value format vai ser JSON. Ok? Então eu estou criando aqui um streaming client created, ID nome do tópico lanielas.client Ok. Criado. Ok. meu streaming está criado. Se eu quisesse agora ver se ele está funcionando, eu podia usar as minhas queries. Então eu tenho duas queries, eu tenho o push e o pull. O push é aquela query que vai ficar plugada no meu streaming e vai me ficar me notificando de eventos novos. Então posso ir aqui em select from clients created, emit changes. Então quando a gente falar com emit changes no final, ele vai me notificar de qualquer novo cliente que chegar. Então vou mandar um cliente novo aqui, vou dar um insert na minha base para o mesmo carinho, é o Paul. Acabei de enviar, chegou o ID 2 do Paul, vou mandar mais um aqui do Paul. Pegou o ID 3 do Paul e posso mandar um Ronaldo aqui, por exemplo. Mas isso não me ajuda muito. Se eu, por exemplo, quiser usar um, sem ser o push, o pull query, eu posso simplesmente, ClientCreated, não colocar o emitChanges. Então quando eu não coloco o emitChanges, ele retorna tudo que tem naquele meu streaming. Mas até agora a gente não fez nada de muito diferente que eu poderia fazer se eu fosse olhar um tópico direto. Começa a ficar interessante quando eu, por exemplo, crio minha tabela, que é baseada em uma streaming. Eu posso pegar, por exemplo, os últimos registros que chegar vou chamar de Last Clients. Essa tabela vai ter um as, certo? Eu vou dar um select. Aqui eu vou botar minhas colunas. From Clients Created. Ok. Group By, vou também já fazer. Ok. Group by. Vou também já fazer. Emit changes. Então o que acontece? Eu estou criando uma tabela que vai ter N colunas de uma streaming com emit changes. Então toda vez que chegar um registro novo, ele vai notificar essa view materializada que vai colocar um tópico para mim onde eu consiga fazer esse count por cliente. Sabendo que eu tenho duas colunas de nome e eu quero saber a quantidade de vezes que aquele nome foi repetido, o meu groupby vai ser pelo nome. Então a minha chave é o nome. E aí compartilhar aqui com vocês o CACICO tem N funções de agregação. Então quando você está usando o VIO materializado você precisa usar uma função de agregação para poder pegar o registro mais recente ou manter só um dado que você está trabalhando com streaming. Então você tem lá um streaming que é historicamente todos os dados que você tem e você quer pegar só um dado daquele. Então você tem aqui latest, você tem vou botar o id então eu quero sempre o último id eu vou colocar aqui as id eu quero o nome também do client o nome eu vou colocar porque ele vai na chave. Mas eu vou colocar aqui o count. Vou chamar de quantidade. Então o que vai acontecer? Ele vai criar um tópico para mim chamado last clients. Esse last client vai ter como chave o nome, porque é o que eu quero agrupar. E no payload, de cada mensagem, de esse tópico, vai ter o último ID. Então, por exemplo, se o Ronaldo tiver no ID 10, ele tem 1, 2, 3, 4, até o 10, ele vai mostrar o 10 lá. E a quantidade de vezes que aquele nome está sendo repetido na minha tabela então eu vou criar aqui key missing select profile create table as, está certinho create table as group by name meet change o que eu errei aqui query is to be announced for the group ah tá claro né preciso do nome aqui também ok Claro, preciso do nome aqui também. Ok. Ok. Então, se a gente for agora no AKHQ, ele criou para mim esse tópico last clients e percebe que ele criou também um consumidor daquele meu lanielas.client. Então, o lanielas.client agora tem um consumidor que, enfim, está sendo streamado e vai ser transformado em uma view materializada que no final é um top. Eu vou fazer mais um insert agora. E aí, só para lembrar, como é que a gente está agora? Se eu dar um select aqui no clients created, e aí eu estou usando aqui um pool query, a gente tem três Pauls, três Pauls, e um Ronaldo. O Ronaldo está na ID 4, o Paul está na ID 3. Certo? Então vamos mandar aqui mais um Ronaldo. Mandei. Esse é down select de novo. Olha só. Chegou mais um Ronaldo aqui. Eu vou deixar com push query pra gente acompanhar acompanhar. Mas eu tenho agora mais um Ronaldo. O que acontece no tópico? Vamos dar uma olhada aqui. Esse cara está me dizendo que o último ID do Ronaldo é o 5, e a quantidade é 1. Mas não deveriam ser dois? Deveria, mas como eu comecei a minha tabela a partir de agora, ele só vai começar a contar a partir de agora. E aí a gente pode fazer algumas alterações para ele contar do início, mas vamos deixar assim por enquanto. Então eu vou mandar mais uma vez o Ronaldo. E aí vai chegar um Ronaldo 6 aqui, né? Ok. E agora eu vou no topo, que você deve imaginar que o last head vai virar 6 e a quantidade vai virar 2, né? Exatamente. Então o last head é 6 e a quantidade é 2, tá? E aí se eu mandar um pro Paul, vai ser a mesma coisa. Ele vai pegar para o Paul o 7, mas ele vai entender que o Paul só foi gravado uma vez, porque a gente começou a contar de agora. Então mandei o Paul aqui. 7. Se eu der um refresh aqui no tópico, ele mostra aqui que o poll quantidade é 1. Legal. A gente pode fazer n tipos de streaming e tables com filtros, upper keys, para poder aplicar, por exemplo, eu poderia fazer um table desde ler de um table. Então, esse meu last client aqui, que retorna o último client, a quantidade de vezes, eu poderia fazer uma outra table, que ler desta table, para gerar, por exemplo, todos os nomes a perquise, se eu quisesse. A doc do Cacico, ela é bem rica, ela é bem completa, e aqui tem todos os tipos de fun a doc do Cacico é bem rica ela é bem completa e aqui tem todos os tipos de funções que você pode utilizar funções de tabela e etc então enfim aí você fica à vontade para dar uma olhada com mais calma em como funciona cada tipo de função e o que você pode fazer e aplicar só para fechar aqui, para você ver que foi tudo criado, você pode dar um show tables aqui, as tabelas foram criadas e um show streamings para ver quais streamings você tem criado. Espero que vocês tenham gostado e até a próxima.