Function: emacsql--generate-op-lookup-defun

emacsql--generate-op-lookup-defun is a macro defined in emacsql-compiler.el.

Signature

(emacsql--generate-op-lookup-defun NAME OPERATOR-PRECEDENCE-GROUPS)

Documentation

Generate function to look up predefined SQL operator metadata.

The generated function is bound to NAME and accepts two arguments, OPERATOR-NAME and OPERATOR-ARGUMENT-COUNT. OPERATOR-PRECEDENCE-GROUPS should be a number of lists containing operators grouped by operator precedence (in order of precedence from highest to lowest). A single operator is represented by a list of at least two elements: operator name (symbol) and operator arity (:unary or :binary). Optionally a custom expression can be included, which defines how the operator is expanded into an SQL expression (there are two defaults, one for
:unary and one for :binary operators).

An example for OPERATOR-PRECEDENCE-GROUPS:
(((+ :unary ("+" :operand)) (- :unary ("-" :operand)))
 ((+ :binary) (- :binary)))

Source Code

;; Defined in ~/.emacs.d/elpa/emacsql-20260401.1220/emacsql-compiler.el
(defmacro emacsql--generate-op-lookup-defun (name operator-precedence-groups)
  "Generate function to look up predefined SQL operator metadata.

The generated function is bound to NAME and accepts two
arguments, OPERATOR-NAME and OPERATOR-ARGUMENT-COUNT.
OPERATOR-PRECEDENCE-GROUPS should be a number of lists containing
operators grouped by operator precedence (in order of precedence
from highest to lowest).  A single operator is represented by a
list of at least two elements: operator name (symbol) and
operator arity (:unary or :binary).  Optionally a custom
expression can be included, which defines how the operator is
expanded into an SQL expression (there are two defaults, one for
:unary and one for :binary operators).

An example for OPERATOR-PRECEDENCE-GROUPS:
\(((+ :unary (\"+\" :operand)) (- :unary (\"-\" :operand)))
 ((+ :binary) (- :binary)))"
  `(defun ,name (operator-name operator-argument-count)
     "Look up predefined SQL operator metadata.
See `emacsql--generate-op-lookup-defun' for details."
     (cond
      ,@(cl-loop
         for precedence-value from 1
         for precedence-group in (reverse operator-precedence-groups)
         append (cl-loop
                 for (op-name arity custom-expr) in precedence-group
                 for sql-name = (upcase (symbol-name op-name))
                 for sql-expr =
                 (or custom-expr
                     (pcase arity
                       (:unary `(,sql-name " " :operand))
                       (:binary `(:operand " " ,sql-name " " :operand))))

                 collect (list `(and (eq operator-name
                                         (quote ,op-name))
                                     ,(if (eq arity :unary)
                                          `(eql operator-argument-count 1)
                                        `(>= operator-argument-count 2)))
                               `(list ',sql-expr ,arity ,precedence-value))))
      (t (list nil nil nil)))))