[Racket] Ferti hydroponic nutrient solver, redux.
Refactor 'measured-on' to 'measurement-date'.
Changed files
db/migrations.rkt
@@ -111,9 +111,9 @@
111
111
(list (create-table #:if-not-exists nutrient_measurements
112
112
#:columns [id integer #:not-null]
113
113
;; ISO8601 date
114
Removed:
[measured_on text #:not-null]
114
Added:
[measurement_date text #:not-null]
115
115
#:constraints (primary-key id)
116
Removed:
(unique measured_on))))
116
Added:
(unique measurement_date))))
117
117
118
118
(define-migration "create table nutrient_targets"
119
119
(list (create-table #:if-not-exists nutrient_targets
db/seed.rkt
@@ -51,14 +51,14 @@
51
51
(define header (next-row))
52
52
(define (row->seed! row)
53
53
(define row-alist (map cons header row))
54
Removed:
(define measured-on (cdr (first row-alist)))
54
Added:
(define measurement-date (cdr (first row-alist)))
55
55
(define nutrient-values
56
56
(for/hash ([nm (in-list (cdr row-alist))])
57
57
(define formula (car nm))
58
58
(define n (get-nutrient #:formula formula))
59
59
(define v (string->number (cdr nm)))
60
60
(values n v)))
61
Removed:
(create-nutrient-measurement! measured-on nutrient-values))
61
Added:
(create-nutrient-measurement! measurement-date nutrient-values))
62
62
(with-tx (csv-for-each row->seed! next-row)))
63
63
64
64
(define (seed-crops!)
formlets.rkt
@@ -11,16 +11,16 @@
11
11
"models/crop-requirement.rkt")
12
12
13
13
(define (measurements-formlet)
14
Removed:
(formlet* (#%# `(div ((class "mb-3")) (h5 "Date du relevé") ,{=>* date-formlet measured-on*})
14
Added:
(formlet* (#%# `(div ((class "mb-3")) (h5 "Date du relevé") ,{=>* date-formlet measurement-date*})
15
15
`(div ((class "mb-3"))
16
16
(h5 "Valeurs du relevé")
17
17
,@(for/list ([nutrient (get-nutrients)])
18
18
{=>* (nutrient-value-formlet nutrient) nutrient-values*}))
19
19
{=>* (submit "Enregistrer le relevé" #:attributes '((class "btn btn-primary"))) _})
20
Removed:
(let ([measured-on (first measured-on*)]
20
Added:
(let ([measurement-date (first measurement-date*)]
21
21
[nutrient-values (for/hash ([nv nutrient-values*])
22
22
(values (car nv) (cdr nv)))])
23
Removed:
(values measured-on nutrient-values))))
23
Added:
(values measurement-date nutrient-values))))
24
24
25
25
(define (targets-formlet)
26
26
(formlet* (#%# `(div ((class "mb-3")) (h5 "Date ciblée") ,{=>* date-formlet effective-on*})
handlers.rkt
@@ -111,8 +111,8 @@
111
111
(render-page (new-measurement-page)))
112
112
113
113
(define (create-measurement req)
114
Removed:
(define-values (measured-on nutrient-values) (formlet-process (measurements-formlet) req))
115
Removed:
(create-nutrient-measurement! measured-on nutrient-values)
114
Added:
(define-values (measurement-date nutrient-values) (formlet-process (measurements-formlet) req))
115
Added:
(create-nutrient-measurement! measurement-date nutrient-values)
116
116
(redirect-to "/ferti/measurements"))
117
117
118
118
(define (show-measurement _ id)
models/nutrient-measurement.rkt
@@ -3,14 +3,14 @@
3
3
(provide nutrient-measurement
4
4
nutrient-measurement?
5
5
nutrient-measurement-id
6
Removed:
(rename-out [nutrient-measurement-measured-on nutrient-measurement-date]
6
Added:
(rename-out [nutrient-measurement-measurement-date nutrient-measurement-date]
7
7
[nutrient-measurement-nutrient-values nutrient-measurement-values])
8
8
(contract-out
9
9
[create-nutrient-measurement! (-> string? nutrient-value-hash/c nutrient-measurement?)]
10
10
[get-nutrient-measurements (-> (listof nutrient-measurement?))]
11
11
[get-nutrient-measurement
12
12
(->* ()
13
Removed:
(#:id exact-nonnegative-integer? #:measured-on string?)
13
Added:
(#:id exact-nonnegative-integer? #:date string?)
14
14
(or/c nutrient-measurement? #f))]
15
15
[get-nutrient-measurement-values (-> nutrient-measurement-or-id/c nutrient-value-hash/c)]
16
16
[get-nutrient-measurement-value
@@ -25,14 +25,14 @@
25
25
"../db/conn.rkt"
26
26
"nutrient.rkt")
27
27
28
Removed:
(struct nutrient-measurement (id measured-on nutrient-values)
28
Added:
(struct nutrient-measurement (id measurement-date nutrient-values)
29
29
#:transparent
30
30
#:property prop:custom-write
31
31
(λ (v out _)
32
32
(fprintf out
33
33
"Measurement #~a on ~a\n"
34
34
(nutrient-measurement-id v)
35
Removed:
(nutrient-measurement-measured-on v))
35
Added:
(nutrient-measurement-measurement-date v))
36
36
(for ([(n v) (in-hash (nutrient-measurement-nutrient-values v))])
37
37
(fprintf out
38
38
"~a ~a\n"
@@ -50,14 +50,14 @@
50
50
51
51
;; CREATE
52
52
53
Removed:
(define (create-nutrient-measurement! measured-on nutrient-values)
53
Added:
(define (create-nutrient-measurement! measurement-date nutrient-values)
54
54
(or
55
Removed:
(get-nutrient-measurement #:measured-on measured-on)
55
Added:
(get-nutrient-measurement #:date measurement-date)
56
56
(with-tx
57
Removed:
(query-exec (current-conn) (insert #:into nutrient_measurements #:set [measured_on ,measured-on]))
57
Added:
(query-exec (current-conn) (insert #:into nutrient_measurements #:set [measurement_date ,measurement-date]))
58
58
(define nm-id
59
59
(query-value (current-conn)
60
Removed:
(select id #:from nutrient_measurements #:where (= measured_on ,measured-on))))
60
Added:
(select id #:from nutrient_measurements #:where (= measurement_date ,measurement-date))))
61
61
(query-exec (current-conn)
62
62
(insert #:into nutrient_value_sets #:set [nutrient_measurement_id ,nm-id]))
63
63
(define nvs-id
@@ -69,7 +69,7 @@
69
69
#:set [value_set_id ,nvs-id]
70
70
[nutrient_id ,(nutrient-id n)]
71
71
[value_ppm ,v])))
72
Removed:
(get-nutrient-measurement #:measured-on measured-on))))
72
Added:
(get-nutrient-measurement #:date measurement-date))))
73
73
74
74
;; READ
75
75
@@ -83,38 +83,38 @@
83
83
#:on (= n.id nv.nutrient_id))))
84
84
85
85
(define (grouped-row->nutrient-measurement row)
86
Removed:
(match-define (vector nm-id measured-on residuals) row)
87
Removed:
(nutrient-measurement nm-id measured-on (residuals->nutrient-value-hash residuals)))
86
Added:
(match-define (vector nm-id measurement-date residuals) row)
87
Added:
(nutrient-measurement nm-id measurement-date (residuals->nutrient-value-hash residuals)))
88
88
89
89
(define (get-nutrient-measurements)
90
90
(define grouped-rows
91
91
(query-rows (current-conn)
92
92
(select nm.id
93
Removed:
nm.measured_on
93
Added:
nm.measurement_date
94
94
n.id
95
95
n.canonical_name
96
96
n.french_name
97
97
n.formula
98
98
nv.value_ppm
99
99
#:from (TableExpr:AST ,joined)
100
Removed:
#:order-by nm.measured_on
100
Added:
#:order-by nm.measurement_date
101
101
#:desc)
102
102
#:group '#(0 1)))
103
103
(for/list ([row grouped-rows])
104
104
(grouped-row->nutrient-measurement row)))
105
105
106
Removed:
(define (get-nutrient-measurement #:id [nm-id #f] #:measured-on [measured-on #f])
106
Added:
(define (get-nutrient-measurement #:id [nm-id #f] #:date [measurement-date #f])
107
107
(define where
108
108
(cond
109
Removed:
[(and nm-id measured-on)
110
Removed:
(scalar-expr-qq (and (= nm.id ,nm-id) (= nm.measured_on ,measured-on)))]
109
Added:
[(and nm-id measurement-date)
110
Added:
(scalar-expr-qq (and (= nm.id ,nm-id) (= nm.measurement_date ,measurement-date)))]
111
111
[nm-id (scalar-expr-qq (= nm.id ,nm-id))]
112
Removed:
[measured-on (scalar-expr-qq (= nm.measured_on ,measured-on))]
113
Removed:
[else (error 'get-nutrient-measurement "either #:id or #:measured-on must be provided")]))
112
Added:
[measurement-date (scalar-expr-qq (= nm.measurement_date ,measurement-date))]
113
Added:
[else (error 'get-nutrient-measurement "either #:id or #:date must be provided")]))
114
114
(define grouped-rows
115
115
(query-rows (current-conn)
116
116
(select nm.id
117
Removed:
nm.measured_on
117
Added:
nm.measurement_date
118
118
n.id
119
119
n.canonical_name
120
120
n.french_name
@@ -122,7 +122,7 @@
122
122
nv.value_ppm
123
123
#:from (TableExpr:AST ,joined)
124
124
#:where (ScalarExpr:AST ,where)
125
Removed:
#:order-by nm.measured_on
125
Added:
#:order-by nm.measurement_date
126
126
#:desc)
127
127
#:group '#(0 1)))
128
128
(match grouped-rows
@@ -154,7 +154,7 @@
154
154
(select value_ppm
155
155
#:from (TableExpr:AST ,joined)
156
156
#:where (= nv.nutrient_id ,(nutrient-id nutrient))
157
Removed:
#:order-by nm.measured_on
157
Added:
#:order-by nm.measurement_date
158
158
#:desc
159
159
#:limit 1)))
160
160
@@ -165,16 +165,16 @@
165
165
n.canonical_name
166
166
n.french_name
167
167
n.formula
168
Removed:
nm.measured_on
168
Added:
nm.measurement_date
169
169
nv.value_ppm
170
170
#:from (TableExpr:AST ,joined)
171
Removed:
#:order-by nm.measured_on
171
Added:
#:order-by nm.measurement_date
172
172
#:desc)
173
173
#:group '(#(0 1 2 3))))
174
174
(for/hash ([row grouped-rows])
175
175
(match-define (vector n-id n-canonical-name n-french-name n-formula residual-rows) row)
176
Removed:
;; residual-rows is a non-empty list of vectors: #(measured_on value_ppm)
177
Removed:
(match-define (vector _measured-on value-ppm) (first residual-rows))
176
Added:
;; residual-rows is a non-empty list of vectors: #(measurement_date value_ppm)
177
Added:
(match-define (vector _ value-ppm) (first residual-rows))
178
178
(values (nutrient n-id n-canonical-name n-french-name n-formula) value-ppm)))
179
179
180
180
;; UPDATE
@@ -210,15 +210,15 @@
210
210
(define phosphorus (get-nutrient #:name "Phosphorus"))
211
211
(create-nutrient-measurement! measurement-date (hash nitrogen 12.3 phosphorus 4.5))
212
212
(check-equal? (length (get-nutrient-measurements)) 1)
213
Removed:
(define nm (get-nutrient-measurement #:measured-on measurement-date))
213
Added:
(define nm (get-nutrient-measurement #:date measurement-date))
214
214
(check-true (nutrient-measurement? nm))
215
Removed:
(check-equal? (nutrient-measurement-measured-on nm) measurement-date))
215
Added:
(check-equal? (nutrient-measurement-measurement-date nm) measurement-date))
216
216
217
217
(test-case "Check all measurement values"
218
218
(define nitrogen (get-nutrient #:name "Nitrogen"))
219
219
(define phosphorus (get-nutrient #:name "Phosphorus"))
220
220
221
Removed:
(define nm (get-nutrient-measurement #:measured-on measurement-date))
221
Added:
(define nm (get-nutrient-measurement #:date measurement-date))
222
222
(check-equal? (get-nutrient-measurement-value nm nitrogen) 12.3)
223
223
(check-equal? (get-nutrient-measurement-value nm phosphorus) 4.5)
224
224
@@ -241,7 +241,7 @@
241
241
(check-equal? (get-latest-nutrient-measurement-value phosphorus) 8.9))
242
242
243
243
(test-case "Delete measurement and cascade to measurement values"
244
Removed:
(define nm (get-nutrient-measurement #:measured-on measurement-date))
244
Added:
(define nm (get-nutrient-measurement #:date measurement-date))
245
245
(delete-nutrient-measurement! nm)
246
246
(check-false (get-nutrient-measurement #:id (nutrient-measurement-id nm)))
247
247
(check-equal? (length (get-nutrient-measurements))