Skip to content

Commit d30a62d

Browse files
committed
core: add support for string fragments
1 parent df9ddc8 commit d30a62d

File tree

6 files changed

+50
-4
lines changed

6 files changed

+50
-4
lines changed

deta-doc/deta.scrbl

+4
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,10 @@ queries.
615615
(~> (from ,table #:as t)
616616
(where (= (fragment (ast:qualified "t" column)) "bogdan")))))
617617
]
618+
619+
@history[
620+
#:changed "0.15" @elem{Added support for string fragments.}
621+
]
618622
}
619623
@defop[ilike (display (select _ (ilike "A" "%a%")))]
620624
@defop[in (display (select _ (in 5 '(1 2 3 4 5))))]

deta-lib/info.rkt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#lang info
22

33
(define license 'BSD-3-Clause)
4-
(define version "0.14")
4+
(define version "0.15")
55
(define collection "deta")
66

77
(define deps '("base"

deta-lib/private/ast.rkt

+11
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@
2525
expr?
2626
expr-terminal?
2727

28+
make-fragment
2829
(struct-out app)
2930
(struct-out as)
3031
(struct-out case-e)
3132
(struct-out column)
33+
(struct-out fragment)
3234
(struct-out ident)
3335
(struct-out placeholder)
3436
(struct-out qualified)
@@ -54,6 +56,9 @@
5456
(struct column expr (e)
5557
#:transparent)
5658

59+
(struct fragment expr (e)
60+
#:transparent)
61+
5762
(struct ident expr (name)
5863
#:transparent)
5964

@@ -72,6 +77,12 @@
7277
(struct table expr (e)
7378
#:transparent)
7479

80+
(define (make-fragment e)
81+
(cond
82+
[(string? e) (fragment e)]
83+
[(expr? e) e]
84+
[else (raise-argument-error 'fragment "(or/c string? expr?)" e)]))
85+
7586

7687
;; clauses ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7788

deta-lib/private/dialect/standard.rkt

+3
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@
6464
[(table e) (write-expr e)]
6565
[(column e) (write-expr e)]
6666

67+
[(fragment s)
68+
(write-string s)]
69+
6770
[(ident i)
6871
(write-string (ident->string i))]
6972

deta-lib/query.rkt

+2-1
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,8 @@
360360

361361
(define-syntax-class fragment-expr
362362
#:literals (fragment)
363-
(pattern (fragment node:expr) #:with e #'node))
363+
(pattern (fragment node:expr)
364+
#:with e #'(ast:make-fragment node)))
364365

365366
(define-syntax-class subquery-expr
366367
#:literals (subquery)

deta-test/deta/query.rkt

+29-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
(require db
44
deta
5+
(prefix-in ast: deta/private/ast)
56
deta/private/meta
67
gregor
78
racket/match
@@ -318,7 +319,7 @@
318319

319320
(check-true (null? all-active-users))
320321

321-
(match-define (list active-user-jim active-user-bob)
322+
(match-define (list _active-user-jim active-user-bob)
322323
(insert! (current-conn)
323324
(make-user #:username "[email protected]"
324325
#:active? #t)
@@ -422,7 +423,33 @@
422423
(test-case "can fail to look up entities"
423424
(check-false (lookup (current-conn)
424425
(~> (from user #:as u)
425-
(where #f)))))))))
426+
(where #f))))))
427+
428+
(test-suite
429+
"fragment"
430+
431+
(test-case "fragment with ast nodes"
432+
(check-equal?
433+
(with-output-to-string
434+
(lambda ()
435+
(display
436+
(~> (from user #:as u)
437+
(select u.name)
438+
(where (fragment (ast:app
439+
(ast:ident '=)
440+
(list (ast:qualified "u" "name")
441+
(ast:scalar "Bogdan")))))))))
442+
"#<query: SELECT u.name FROM users AS u WHERE u.name = 'Bogdan'>"))
443+
444+
(test-case "fragment with string"
445+
(check-equal?
446+
(with-output-to-string
447+
(lambda ()
448+
(display
449+
(~> (from user #:as u)
450+
(select u.name)
451+
(where (fragment "u.name = 'Bogdan'"))))))
452+
"#<query: SELECT u.name FROM users AS u WHERE u.name = 'Bogdan'>"))))))
426453

427454
(module+ test
428455
(require rackunit/text-ui)

0 commit comments

Comments
 (0)