Este projeto implementa um construtor de queries SQL em Clojure utilizando programação funcional. O objetivo é criar queries SQL de forma programática, segura e legível, aproveitando os recursos da linguagem funcional.
Demonstrar conceitos de programação funcional em Clojure, incluindo:
- Funções de alta ordem (higher-order functions)
- Closures
- Redução e composição de funções
- Aplicação parcial de funções
- Imutabilidade
A função busca_tabela retorna uma função que pode ser chamada de diferentes formas:
;; Selecionar todos os campos
((busca_tabela "usuario"))
;; Resultado: "SELECT * FROM usuario"
;; Com filtros
((busca_tabela "usuario") "idade > 18")
;; Resultado: "SELECT * FROM usuario WHERE idade > 18"
;; Com campos específicos e filtros
((busca_tabela "usuario") "nome, email" "idade > 18")
;; Resultado: "SELECT nome, email FROM usuario WHERE idade > 18"A função campos recebe uma lista de campos e os formata para SQL:
(campos ["abc", "xyz"])
;; Resultado: "abc, xyz"A função filtros aceita diferentes operadores através de mapas:
:igual_a→=:diferente_de→<>:maior_que→>:menor_que→<:em→IN (...):valor→=(padrão)
{:campo "idade", :maior_que 20}
;; Resultado: "idade > 20"
{:campo "id", :em [10, 20, 30]}
;; Resultado: "id IN (10, 20, 30)"Combina múltiplas condições com o operador AND:
(e_s [
{:campo "nome", :igual_a "José"},
{:campo "idade", :maior_que 20}
])
;; Resultado: "nome = "José" AND idade > 20"Combina múltiplas condições com o operador OR:
(ou_s [
{:campo "camiseta", :valor "verde"},
{:campo "camiseta", :valor "azul"}
])
;; Resultado: "(camiseta = "azul" OR camiseta = "verde")"((busca_tabela "usuario")
(campos ["abc", "xyz"])
(filtros
(e_s [
{:campo "nome", :igual_a "José"},
{:campo "idade", :maior_que 20},
{:campo "id", :em [10, 20, 30]},
{:campo "status", :igual_a true},
(ou_s [
{:campo "camiseta", :valor "verde"},
{:campo "camiseta", :valor "azul"}
])
])
)
)Resultado:
SELECT abc, xyz FROM usuario WHERE nome = "José" AND idade > 20 AND id IN (10, 20, 30) AND status = true AND ((camiseta = "verde" OR camiseta = "azul"))| Função | Descrição |
|---|---|
busca_tabela |
Cria uma closure que gera queries SELECT |
campos |
Formata uma lista de campos para SQL |
filtros |
Processa filtros (aceita string ou mapa) |
e_s |
Combina filtros com operador AND |
ou_s |
Combina filtros com operador OR |
| Função | Descrição |
|---|---|
aux_juntar_campos |
Concatena campos com vírgula |
formatar_valor |
Formata valores conforme o tipo (string, boolean, número) |
aux_operador_sql |
Converte operadores do mapa para SQL |
aux_juntar_campo_valor |
Combina campo e operador |
aux_adiciona_and |
Adiciona AND entre condições |
aux_adiciona_or |
Adiciona OR entre condições |
- Closures:
busca_tabelaretorna uma função que "lembra" o nome da tabela - Aplicação Parcial:
(def e_s (partial reduce aux_adiciona_and "")) - Funções de Alta Ordem:
reduce,map, funções que retornam funções - Imutabilidade: Todas as operações retornam novos valores sem alterar os originais
- Composição: Funções podem ser encadeadas para criar queries complexas
- Adicionar suporte para JOIN
- Implementar ORDER BY e GROUP BY
- Adicionar validação de SQL injection
- Suportar agregações (COUNT, SUM, AVG, etc.)
- Implementar INSERT, UPDATE e DELETE
Disciplina: Paradigmas de Programação Instituição: Centro Universitário Senac Autor: Phelipe Pereira Data: 06/10/2025