Argumentos variáveis ​​korma / campos de solução alternativa

Korma é uma das bibliotecas Clojure SQL mais populares.

Quando comecei a refatorar partes repetidas de meus modelos de dados no próprio namespace models.helpers, encontrei uma fraqueza de seu DSL – [korma.core/fields](https://github.com/korma/Korma/blob/v0.3.2/src/korma/core.clj#L202)usa argumentos variados para o nome do campo, o que torna impossível usá-lo em funções de alto nível ou compor com macros de threading ( ->, – >> ).

Portanto, escrevi uma pequena macro, que contém uma lista de nomes de campos e aliases em korma.core/fieldsargumentos variados.


;; helper macro
(defmacro only-fields
[query fields]
`(let [field-list# (list* ~fields)
fargs# (cons ~query field-list#)]

(apply korma.core/fields fargs#)))


;; helper function

(defn get-rows

;; this function returns all fields

([tbl-entity row-selectors]

(korma/select tbl-entity

(korma/where row-selectors)))


;; this one accepts field selector as 3rd argument

([tbl-entity row-selectors fields]

(korma/select tbl-entity

(only-fields fields)

(korma/where row-selectors))))


;;usage

(defentity users)

(get-rows users [:firstname :lastname :gender [:lang :language]])

(get-rows users ["*"])

PS: eu recomendo usar Yesql como biblioteca Clojure SQL, porque Korma parece estar se aposentando e o próprio SQL já é DSL, S-EXPR apenas adiciona ruído extra.