summaryrefslogtreecommitdiff
path: root/models/nutrient-target.rkt
diff options
context:
space:
mode:
Diffstat (limited to 'models/nutrient-target.rkt')
-rw-r--r--models/nutrient-target.rkt73
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)))))
Copyright 2019--2026 Marius PETER