[Racket] Ferti hydroponic nutrient solver, redux.
Added crop accessors for the crop requirement entity.
models/crop-requirement.rkt
@@ -4,32 +4,22 @@
4
4
;; Struct definitions
5
5
crop-requirement
6
6
crop-requirement?
7
Removed:
crop-requirement-id crop-requirement-profile
7
Added:
crop-requirement-id crop-requirement-profile crop-requirement-crop-id
8
8
;; SQL CRUD
9
9
(contract-out
10
10
[create-crop-requirement! (->* (string?
11
Removed:
(listof (cons/c
12
Removed:
nutrient?
13
Removed:
number?)))
11
Added:
(listof (cons/c nutrient? number?)))
14
12
((or/c #f crop?))
15
13
crop-requirement?)]
16
14
[get-crop-requirements (-> (listof crop-requirement?))]
17
15
[get-crop-requirement (->* ()
18
Removed:
(#:id
19
Removed:
(or/c #f exact-nonnegative-integer?)
20
Removed:
#:profile
21
Removed:
(or/c #f string?))
16
Added:
(#:id (or/c #f exact-nonnegative-integer?)
17
Added:
#:profile (or/c #f string?))
22
18
(or/c crop-requirement? #f))]
23
Removed:
[get-crop-requirement-values (-> crop-requirement?
24
Removed:
(listof (cons/c
25
Removed:
nutrient?
26
Removed:
number?)))]
27
Removed:
[get-crop-requirement-value (-> crop-requirement?
28
Removed:
nutrient?
29
Removed:
number?)]
19
Added:
[get-crop-requirement-values (-> crop-requirement? (listof (cons/c nutrient? number?)))]
20
Added:
[get-crop-requirement-value (-> crop-requirement? nutrient? number?)]
30
21
[get-latest-crop-requirement-value (-> nutrient? number?)]
31
Removed:
[delete-crop-requirement! (-> crop-requirement?
32
Removed:
void?)]))
22
Added:
[delete-crop-requirement! (-> crop-requirement? void?)]))
33
23
34
24
(require racket/contract
35
25
db
@@ -39,7 +29,7 @@
39
29
"crop.rkt")
40
30
41
31
;; Instances of this struct are persisted in the crop_requirements table.
42
Removed:
(struct crop-requirement (id profile) #:transparent)
32
Added:
(struct crop-requirement (id profile crop-id) #:transparent)
43
33
44
34
45
35
;; CREATE
@@ -79,33 +69,35 @@
79
69
;; READ
80
70
81
71
(define (get-crop-requirements)
82
Removed:
(for/list ([(id* profile*)
72
Added:
(for/list ([(id* profile* crop-id*)
83
73
(in-query (current-conn)
84
Removed:
(select id profile
74
Added:
(select id profile crop_id
85
75
#:from crop_requirements
86
76
#:order-by id #:asc))])
87
Removed:
(crop-requirement id* profile*)))
77
Added:
(crop-requirement id* profile* (if (sql-null? crop-id*) #f crop-id*))))
88
78
89
79
(define (get-crop-requirement #:id [id #f]
90
Removed:
#:profile [profile #f])
80
Added:
#:profile [profile #f]
81
Added:
#:crop [crop #f])
91
82
(define (where-expr)
92
83
(define clauses
93
84
(filter values
94
85
(list
95
86
(and id (format "id = ~e" id))
96
Removed:
(and profile (format "profile = ~e" profile)))))
87
Added:
(and profile (format "profile = ~e" profile))
88
Added:
(and crop (format "crop_id = ~e" (crop-id crop))))))
97
89
(cond
98
90
[(null? clauses) ""]
99
91
[else (format "WHERE ~a" (string-join clauses " AND "))]))
100
92
(define query (string-join
101
Removed:
`("SELECT id, profile"
93
Added:
`("SELECT id, profile, crop_id"
102
94
"FROM crop_requirements"
103
95
,(where-expr)
104
96
"ORDER BY id ASC"
105
97
"LIMIT 1")))
106
98
(match (query-maybe-row (current-conn) query)
107
Removed:
[(vector id* profile*)
108
Removed:
(crop-requirement id* profile*)]
99
Added:
[(vector id* profile* crop-id*)
100
Added:
(crop-requirement id* profile* crop-id*)]
109
101
[#f #f]))
110
102
111
103
(define (get-crop-requirement-values crop-requirement)