[Racket] Ferti hydroponic nutrient solver, redux.
raco fmt.
Changed files
models/crop-requirement.rkt
@@ -1,6 +1,5 @@
1
1
#lang racket
2
2
3
Removed:
;; Model struct
4
3
(provide crop-requirement
5
4
crop-requirement?
6
5
crop-requirement-id
@@ -8,7 +7,6 @@
8
7
crop-requirement-crop-id
9
8
(rename-out [crop-requirement-nutrient-values crop-requirement-values])
10
9
(contract-out
11
Removed:
;; SQL CRUD
12
10
[create-crop-requirement!
13
11
(->* (string? (listof nutrient-value-pair/c)) ((or/c #f crop?)) crop-requirement?)]
14
12
[get-crop-requirements (-> (listof crop-requirement?))]
@@ -18,9 +16,7 @@
18
16
(or/c crop-requirement? #f))]
19
17
[get-crop-requirement-values (-> crop-requirement? (listof nutrient-value-pair/c))]
20
18
[get-crop-requirement-value (-> crop-requirement? nutrient? number?)]
21
Removed:
[get-latest-crop-requirement-value (-> nutrient? number?)]
22
19
[delete-crop-requirement! (-> crop-requirement? void?)]
23
Removed:
;; Helpers
24
20
[average-crop-requirement-nutrient-values
25
21
(-> (listof (cons/c crop-requirement? (and/c real? (>=/c 0) (<=/c 100))))
26
22
(listof nutrient-value-pair/c))]))
@@ -39,27 +35,28 @@
39
35
;; CREATE
40
36
41
37
(define (create-crop-requirement! profile nutrient-values [crop #f])
42
Removed:
(or (get-crop-requirement #:profile profile)
43
Removed:
(with-tx
44
Removed:
(query-exec
45
Removed:
(current-conn)
46
Removed:
(if crop
47
Removed:
(insert #:into crop_requirements #:set [crop_id ,(crop-id crop)] [profile ,profile])
48
Removed:
(insert #:into crop_requirements #:set [profile ,profile])))
49
Removed:
(define cr-id (crop-requirement-id (get-crop-requirement #:profile profile)))
50
Removed:
(query-exec (current-conn)
51
Removed:
(insert #:into nutrient_value_sets #:set [crop_requirement_id ,cr-id]))
52
Removed:
(define nvs-id
53
Removed:
(query-value (current-conn)
54
Removed:
(select id #:from nutrient_value_sets #:where (= crop_requirement_id ,cr-id))))
55
Removed:
(for ([nv nutrient-values])
56
Removed:
(match-define (cons n v) nv)
57
Removed:
(query-exec (current-conn)
58
Removed:
(insert #:into nutrient_values
59
Removed:
#:set [value_set_id ,nvs-id]
60
Removed:
[nutrient_id ,(nutrient-id n)]
61
Removed:
[value_ppm ,v])))
62
Removed:
(get-crop-requirement #:profile profile))))
38
Added:
(or
39
Added:
(get-crop-requirement #:profile profile)
40
Added:
(with-tx
41
Added:
(query-exec
42
Added:
(current-conn)
43
Added:
(if crop
44
Added:
(insert #:into crop_requirements #:set [crop_id ,(crop-id crop)] [profile ,profile])
45
Added:
(insert #:into crop_requirements #:set [profile ,profile])))
46
Added:
(define cr-id
47
Added:
(query-value (current-conn) (select id #:from crop_requirements #:where (= profile ,profile))))
48
Added:
(query-exec (current-conn) (insert #:into nutrient_value_sets #:set [crop_requirement_id ,cr-id]))
49
Added:
(define nvs-id
50
Added:
(query-value (current-conn)
51
Added:
(select id #:from nutrient_value_sets #:where (= crop_requirement_id ,cr-id))))
52
Added:
(for ([nv nutrient-values])
53
Added:
(match-define (cons n v) nv)
54
Added:
(query-exec (current-conn)
55
Added:
(insert #:into nutrient_values
56
Added:
#:set [value_set_id ,nvs-id]
57
Added:
[nutrient_id ,(nutrient-id n)]
58
Added:
[value_ppm ,v])))
59
Added:
(get-crop-requirement #:profile profile))))
63
60
64
61
;; READ
65
62
models/crop.rkt
@@ -1,11 +1,9 @@
1
1
#lang racket
2
2
3
Removed:
;; Model struct
4
3
(provide crop
5
4
crop?
6
5
crop-id
7
6
crop-name
8
Removed:
;; SQL CRUD
9
7
(contract-out [create-crop! (-> string? crop?)]
10
8
[get-crops (-> (listof crop?))]
11
9
[get-crop
models/fertilizer-product.rkt
@@ -1,6 +1,5 @@
1
1
#lang racket
2
2
3
Removed:
;; Model struct
4
3
(provide fertilizer-product
5
4
fertilizer-product?
6
5
fertilizer-product-id
@@ -8,7 +7,6 @@
8
7
[fertilizer-product-nutrient-values fertilizer-product-values]
9
8
[fertilizer-product-brand-name fertilizer-brand-name])
10
9
(contract-out
11
Removed:
;; SQL CRUD
12
10
[create-fertilizer-product!
13
11
(->* (string? (listof nutrient-value-pair/c)) (string?) fertilizer-product?)]
14
12
[get-fertilizer-products (-> (listof fertilizer-product?))]
@@ -26,7 +24,6 @@
26
24
"../db/conn.rkt"
27
25
"nutrient.rkt")
28
26
29
Removed:
;; Instances of this struct are persisted in the fertilizer_products table.
30
27
(struct fertilizer-product (id canonical-name nutrient-values brand-name)
31
28
#:transparent
32
29
#:guard (λ (id canonical-name nutrient-values brand-name _)
@@ -161,14 +158,14 @@
161
158
n.formula
162
159
nv.value_ppm
163
160
#:from (TableExpr:AST ,joined)
164
Removed:
#:where (= nm.id ,(fertilizer-product-id fertilizer-product))))])
161
Added:
#:where (= fp.id ,(fertilizer-product-id fertilizer-product))))])
165
162
(cons (nutrient nutrient-id name formula) value_ppm)))
166
163
167
164
(define (get-fertilizer-product-value fertilizer-product nutrient)
168
165
(query-maybe-value (current-conn)
169
166
(select value_ppm
170
167
#:from (TableExpr:AST ,joined)
171
Removed:
#:where (and (= nm.id ,(fertilizer-product-id fertilizer-product))
168
Added:
#:where (and (= fp.id ,(fertilizer-product-id fertilizer-product))
172
169
(= nv.nutrient_id ,(nutrient-id nutrient))))))
173
170
174
171
;; UPDATE
models/nutrient-measurement.rkt
@@ -1,28 +1,23 @@
1
1
#lang racket
2
2
3
Removed:
(provide
4
Removed:
;; Model struct
5
Removed:
nutrient-measurement
6
Removed:
nutrient-measurement?
7
Removed:
nutrient-measurement-id
8
Removed:
(rename-out
9
Removed:
[nutrient-measurement-measured-on nutrient-measurement-date]
10
Removed:
[nutrient-measurement-nutrient-values nutrient-measurement-values])
11
Removed:
(contract-out
12
Removed:
;; SQL CRUD
13
Removed:
[create-nutrient-measurement! (-> string?
14
Removed:
(listof nutrient-value-pair/c)
15
Removed:
nutrient-measurement?)]
16
Removed:
[get-nutrient-measurements (-> (listof nutrient-measurement?))]
17
Removed:
[get-nutrient-measurement (->* ()
18
Removed:
(#:id (or/c #f exact-nonnegative-integer?)
19
Removed:
#:measured-on (or/c #f string?))
20
Removed:
(or/c nutrient-measurement? #f))]
21
Removed:
[get-nutrient-measurement-values (-> nutrient-measurement?
22
Removed:
(listof nutrient-value-pair/c))]
23
Removed:
[get-nutrient-measurement-value (-> nutrient-measurement? nutrient? number?)]
24
Removed:
[get-latest-nutrient-measurement-value (-> nutrient? (or/c number? #f))]
25
Removed:
[delete-nutrient-measurement! (-> nutrient-measurement? void?)]))
3
Added:
(provide nutrient-measurement
4
Added:
nutrient-measurement?
5
Added:
nutrient-measurement-id
6
Added:
(rename-out [nutrient-measurement-measured-on nutrient-measurement-date]
7
Added:
[nutrient-measurement-nutrient-values nutrient-measurement-values])
8
Added:
(contract-out
9
Added:
[create-nutrient-measurement!
10
Added:
(-> string? (listof nutrient-value-pair/c) nutrient-measurement?)]
11
Added:
[get-nutrient-measurements (-> (listof nutrient-measurement?))]
12
Added:
[get-nutrient-measurement
13
Added:
(->* ()
14
Added:
(#:id (or/c #f exact-nonnegative-integer?) #:measured-on (or/c #f string?))
15
Added:
(or/c nutrient-measurement? #f))]
16
Added:
[get-nutrient-measurement-values (-> nutrient-measurement? (listof nutrient-value-pair/c))]
17
Added:
[get-nutrient-measurement-value (-> nutrient-measurement? nutrient? number?)]
18
Added:
[get-latest-nutrient-measurement-value (-> nutrient? (or/c number? #f))]
19
Added:
[get-latest-nutrient-measurement-hash (-> (hash/c nutrient? number?))]
20
Added:
[delete-nutrient-measurement! (-> nutrient-measurement? void?)]))
26
21
27
22
(require racket/contract
28
23
db
@@ -30,7 +25,6 @@
30
25
"../db/conn.rkt"
31
26
"nutrient.rkt")
32
27
33
Removed:
;; Instances of this struct are persisted in the nutrient_measurements table.
34
28
(struct nutrient-measurement (id measured-on nutrient-values)
35
29
#:transparent
36
30
#:property prop:custom-write
models/nutrient-target.rkt
@@ -1,27 +1,22 @@
1
1
#lang racket
2
2
3
Removed:
(provide
4
Removed:
;; Model struct
5
Removed:
nutrient-target
6
Removed:
nutrient-target?
7
Removed:
nutrient-target-id
8
Removed:
(rename-out
9
Removed:
[nutrient-target-effective-on nutrient-target-date]
10
Removed:
[nutrient-target-nutrient-values nutrient-target-values])
11
Removed:
(contract-out
12
Removed:
;; SQL CRUD
13
Removed:
[create-nutrient-target! (-> string?
14
Removed:
(listof nutrient-value-pair/c)
15
Removed:
nutrient-target?)]
16
Removed:
[get-nutrient-targets (-> (listof nutrient-target?))]
17
Removed:
[get-nutrient-target (->* ()
18
Removed:
(#:id (or/c #f exact-nonnegative-integer?)
19
Removed:
#:effective-on (or/c #f string?))
20
Removed:
(or/c nutrient-target? #f))]
21
Removed:
[get-nutrient-target-values (-> nutrient-target? (listof nutrient-value-pair/c))]
22
Removed:
[get-nutrient-target-value (-> nutrient-target? nutrient? number?)]
23
Removed:
[get-latest-nutrient-target-value (-> nutrient? (or/c number? #f))]
24
Removed:
[delete-nutrient-target! (-> nutrient-target? void?)]))
3
Added:
(provide nutrient-target
4
Added:
nutrient-target?
5
Added:
nutrient-target-id
6
Added:
(rename-out [nutrient-target-effective-on nutrient-target-date]
7
Added:
[nutrient-target-nutrient-values nutrient-target-values])
8
Added:
(contract-out
9
Added:
[create-nutrient-target! (-> string? (listof nutrient-value-pair/c) nutrient-target?)]
10
Added:
[get-nutrient-targets (-> (listof nutrient-target?))]
11
Added:
[get-nutrient-target
12
Added:
(->* ()
13
Added:
(#:id (or/c #f exact-nonnegative-integer?) #:effective-on (or/c #f string?))
14
Added:
(or/c nutrient-target? #f))]
15
Added:
[get-nutrient-target-values (-> nutrient-target? (listof nutrient-value-pair/c))]
16
Added:
[get-nutrient-target-value (-> nutrient-target? nutrient? number?)]
17
Added:
[get-latest-nutrient-target-value (-> nutrient? (or/c number? #f))]
18
Added:
[get-latest-nutrient-target-hash (-> (hash/c nutrient? number?))]
19
Added:
[delete-nutrient-target! (-> nutrient-target? void?)]))
25
20
26
21
(require racket/contract
27
22
db
@@ -29,7 +24,6 @@
29
24
"../db/conn.rkt"
30
25
"nutrient.rkt")
31
26
32
Removed:
;; Instances of this struct are persisted in the nutrient_targets table.
33
27
(struct nutrient-target (id effective-on nutrient-values)
34
28
#:transparent
35
29
#:property prop:custom-write
@@ -143,14 +137,14 @@
143
137
n.formula
144
138
nv.value_ppm
145
139
#:from (TableExpr:AST ,joined)
146
Removed:
#:where (= nm.id ,(nutrient-target-id nutrient-target))))])
140
Added:
#:where (= nt.id ,(nutrient-target-id nutrient-target))))])
147
141
(cons (nutrient nutrient-id name formula) value_ppm)))
148
142
149
143
(define (get-nutrient-target-value nutrient-target nutrient)
150
144
(query-maybe-value (current-conn)
151
145
(select value_ppm
152
146
#:from (TableExpr:AST ,joined)
153
Removed:
#:where (and (= nm.id ,(nutrient-target-id nutrient-target))
147
Added:
#:where (and (= nt.id ,(nutrient-target-id nutrient-target))
154
148
(= nv.nutrient_id ,(nutrient-id nutrient))))))
155
149
156
150
(define (get-latest-nutrient-target-value nutrient)
models/nutrient.rkt
@@ -1,14 +1,11 @@
1
1
#lang racket
2
2
3
Removed:
;; Model struct
4
3
(provide nutrient
5
4
nutrient?
6
5
nutrient-id
7
6
nutrient-name
8
7
nutrient-formula
9
Removed:
;; Contracts
10
8
nutrient-value-pair/c
11
Removed:
;; SQL CRUD
12
9
(contract-out [create-nutrient! (-> string? string? nutrient?)]
13
10
[get-nutrients (-> (listof nutrient?))]
14
11
[get-nutrient
models/user.rkt
@@ -1,13 +1,11 @@
1
1
#lang racket
2
2
3
Removed:
;; Model struct
4
3
(provide user
5
4
user?
6
5
user-id
7
6
user-name
8
7
user-role
9
Removed:
;; SQL CRUD
10
Removed:
(contract-out [get-current-user (-> (or/c user? #f))] #;[delete-user! (-> user? void?)]))
8
Added:
(contract-out [get-current-user (-> (or/c user? #f))]))
11
9
12
10
(require racket/contract
13
11
db
views.rkt
@@ -116,22 +116,24 @@
116
116
(define latest-measurement (get-latest-nutrient-measurement-value n))
117
117
(define delta-percentage
118
118
(cond
119
Removed:
[(false? latest-target)
120
Removed:
#f]
121
Removed:
[(zero? latest-target)
122
Removed:
-100]
123
Removed:
[(zero? latest-measurement)
124
Removed:
100]
119
Added:
[(false? latest-target) #f]
120
Added:
[(zero? latest-target) -100]
121
Added:
[(zero? latest-measurement) 100]
125
122
[(number? latest-target)
126
Removed:
(* 100
127
Removed:
(/ (- latest-target latest-measurement)
128
Removed:
latest-measurement))]))
123
Added:
(* 100 (/ (- latest-target latest-measurement) latest-measurement))]))
129
124
`(tr (td ,(nutrient-name n))
130
Removed:
(td ([class "text-end font-monospace"]) ,(if latest-measurement (round 2 latest-measurement) "—"))
131
Removed:
(td ([class "text-end font-monospace"]) ,(if latest-target (round 2 latest-target) "—"))
132
Removed:
(td ([class "text-end font-monospace"]) ,(if delta-percentage (round 1 delta-percentage) "—")))))
133
Removed:
134
Removed:
125
Added:
(td ((class "text-end font-monospace"))
126
Added:
,(if latest-measurement
127
Added:
(round 2 latest-measurement)
128
Added:
"—"))
129
Added:
(td ((class "text-end font-monospace"))
130
Added:
,(if latest-target
131
Added:
(round 2 latest-target)
132
Added:
"—"))
133
Added:
(td ((class "text-end font-monospace"))
134
Added:
,(if delta-percentage
135
Added:
(round 1 delta-percentage)
136
Added:
"—")))))
135
137
;;;;;;;;;;
136
138
;; Relevés
137
139
;;;;;;;;;;