diff options
Diffstat (limited to 'models/nutrient-target.rkt')
| -rw-r--r-- | models/nutrient-target.rkt | 73 |
1 files changed, 42 insertions, 31 deletions
diff --git a/models/nutrient-target.rkt b/models/nutrient-target.rkt index cffa657..10c0c42 100644 --- a/models/nutrient-target.rkt +++ b/models/nutrient-target.rkt @@ -5,18 +5,18 @@ nutrient-target-id (rename-out [nutrient-target-effective-on nutrient-target-date] [nutrient-target-nutrient-values nutrient-target-values]) - (contract-out [create-nutrient-target! (-> string? nutrient-value-hash/c nutrient-target?)] - [get-nutrient-targets (-> (listof nutrient-target?))] - [get-nutrient-target - (->* () - (#:id (or/c #f exact-nonnegative-integer?) - #:effective-on (or/c #f string?)) - (or/c nutrient-target? #f))] - [get-nutrient-target-values (-> nutrient-target? nutrient-value-hash/c)] - [get-nutrient-target-value (-> nutrient-target? nutrient? (or/c number? #f))] - [get-latest-nutrient-target-value (-> nutrient? (or/c number? #f))] - [get-latest-nutrient-target-hash (-> nutrient-value-hash/c)] - [delete-nutrient-target! (-> nutrient-target? void?)])) + (contract-out + [create-nutrient-target! (-> string? nutrient-value-hash/c nutrient-target?)] + [get-nutrient-targets (-> (listof nutrient-target?))] + [get-nutrient-target + (->* () + (#:id (or/c #f exact-nonnegative-integer?) #:effective-on (or/c #f string?)) + (or/c nutrient-target? #f))] + [get-nutrient-target-values (-> nutrient-target-or-id/c nutrient-value-hash/c)] + [get-nutrient-target-value (-> nutrient-target-or-id/c nutrient? (or/c number? #f))] + [get-latest-nutrient-target-value (-> nutrient? (or/c number? #f))] + [get-latest-nutrient-target-hash (-> nutrient-value-hash/c)] + [delete-nutrient-target! (-> nutrient-target-or-id/c void?)])) (require racket/contract db @@ -35,6 +35,15 @@ (~a (nutrient-canonical-name n) #:min-width 14) (~a v #:max-width 6 #:align 'right))))) +(define nutrient-target-id? exact-nonnegative-integer?) + +(define nutrient-target-or-id/c (or/c nutrient-target? nutrient-target-id?)) + +(define (->nt-id nt-or-id) + (match nt-or-id + [(? nutrient-target-id? id) id] + [(nutrient-target id _ _) id])) + ;; CREATE (define (create-nutrient-target! effective-on nutrient-values) @@ -73,19 +82,21 @@ (nutrient-target nt-id effective-on (residuals->nutrient-value-hash residuals))) (define (get-nutrient-targets) - (for/list ([grouped-row (in-query (current-conn) - (select nt.id - nt.effective_on - n.id - n.canonical_name - n.french_name - n.formula - nv.value_ppm - #:from (TableExpr:AST ,joined) - #:order-by nt.effective_on - #:desc) - #:group '#(0 1))]) - (grouped-row->nutrient-target grouped-row))) + (define grouped-rows + (query-rows (current-conn) + (select nt.id + nt.effective_on + n.id + n.canonical_name + n.french_name + n.formula + nv.value_ppm + #:from (TableExpr:AST ,joined) + #:order-by nt.effective_on + #:desc) + #:group '#(0 1))) + (for/list ([row grouped-rows]) + (grouped-row->nutrient-target row))) (define (get-nutrient-target #:id [nt-id #f] #:effective-on [effective-on #f]) (define where @@ -114,7 +125,7 @@ [(list row) (grouped-row->nutrient-target row)] [many (error 'get-nutrient-target "expected 1 nutrient target, got ~a" (length many))])) -(define (get-nutrient-target-values nutrient-target) +(define (get-nutrient-target-values nt-or-id) (for/hash ([(nutrient-id canonical-name french-name formula value_ppm) (in-query (current-conn) (select n.id @@ -123,14 +134,14 @@ n.formula nv.value_ppm #:from (TableExpr:AST ,joined) - #:where (= nt.id ,(nutrient-target-id nutrient-target))))]) + #:where (= nt.id ,(->nt-id nt-or-id))))]) (values (nutrient nutrient-id canonical-name french-name formula) value_ppm))) -(define (get-nutrient-target-value nutrient-target nutrient) +(define (get-nutrient-target-value nt-or-id nutrient) (query-maybe-value (current-conn) (select value_ppm #:from (TableExpr:AST ,joined) - #:where (and (= nt.id ,(nutrient-target-id nutrient-target)) + #:where (and (= nt.id ,(->nt-id nt-or-id)) (= nv.nutrient_id ,(nutrient-id nutrient)))))) (define (get-latest-nutrient-target-value nutrient) @@ -165,6 +176,6 @@ ;; DELETE -(define (delete-nutrient-target! nutrient-target) +(define (delete-nutrient-target! nt-or-id) (define id (nutrient-target-id nutrient-target)) - (query-exec (current-conn) (delete #:from nutrient_targets #:where (= id ,id)))) + (query-exec (current-conn) (delete #:from nutrient_targets #:where (= id ,(->nt-id nt-or-id))))) |