Skip to content

Commit 7586cb2

Browse files
committed
Add support for arbitrary filters
1 parent 0e65778 commit 7586cb2

2 files changed

Lines changed: 29 additions & 13 deletions

File tree

README.org

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,16 @@ which will be parsed in pairs, and reformated into a where clause.
6262
Note that if you wish to inject quotes (of any kind, single or double),
6363
you must do so by wrapping them in additional quotes like so:
6464
#+begin_src bash
65-
beer-me record column_name "'single quotes example'"
66-
beer-me record column_name "\"double quotes example\""
65+
beer-me record column_name "'single quotes example'"
66+
beer-me record column_name "\"double quotes example\""
6767
#+end_src
6868

69-
NOTE:
70-
Due to current constraints, filters can only be created that use ~=~ comparisons.
69+
*** Injecting arbitrary filters
70+
If a filter other than a simple equality check is required,
71+
the entirety of the desired filter can be injected using quotes.
72+
73+
Note that for the parser to recognize an already complete filter, it /must/ contain
74+
*at least one* whitespace.
75+
#+begin_src bash
76+
beer-me record "column_name ilike '%match-string%'"
77+
#+end_src

beer-me.ros

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ exec ros -Q -- $0 "$@"
66

77
(progn ;;init forms
88
(ros:ensure-asdf)
9-
#+quicklisp(ql:quickload '("str" "split-sequence") :silent t)
9+
#+quicklisp(ql:quickload '("str" "split-sequence" "cl-ppcre") :silent t)
1010
)
1111

1212

@@ -43,17 +43,26 @@ is replaced with replacement."
4343
:if-does-not-exist :create)
4444
(write-sequence "DEFAULT \"psql -h localhost -d database -U postgres -p 5432\"" f))))
4545

46+
(defun get-filter-strs (filter-list &optional acc)
47+
(let ((whitespacep (ppcre:create-scanner "\s"))
48+
(first (car filter-list))
49+
(snd (cadr filter-list)))
50+
51+
(if (= 0 (length filter-list))
52+
acc
53+
(if (ppcre:scan whitespacep first) ; Whitespace indicates an existing filter that should be preserved
54+
(get-filter-strs (cdr filter-list)
55+
(append acc (list first)))
56+
57+
(get-filter-strs (cddr filter-list)
58+
(append acc
59+
(list (format nil "~A = ~A" first snd))))))))
4660

4761
(defun get-filters (filter-list)
48-
(let ((filter-pairs (loop :for filter :on filter-list :by #'cddr
49-
:collect (cons (car filter) (cadr filter)))))
50-
(if (= 0 (length filter-pairs))
62+
(let ((filter-strs (get-filter-strs filter-list)))
63+
(if (= 0 (length filter-strs))
5164
""
52-
(format nil "WHERE~{ ~A~^ AND~& ~}"
53-
(loop :for filter-pair :in filter-pairs
54-
:collect (format nil "~A = ~A"
55-
(car filter-pair)
56-
(cdr filter-pair)))))))
65+
(format nil "WHERE~{ ~A~^ AND~& ~}" filter-strs))))
5766

5867
(defun print-usage ()
5968
(format t "USAGE: beer-me [environment] <resource> [filters]"))

0 commit comments

Comments
 (0)