summaryrefslogtreecommitdiff
path: root/models/nutrient-value-set.rkt
blob: 5f3759a0e24da3a5b329c5139bce646c4315dd4a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#lang racket

(provide nutrient-value-set
         nutrient-value-set?
         nutrient-value-set-id
         ;; nutrient-value-set-nm-id
         ;; nutrient-value-set-nt-id
         ;; nutrient-value-set-cr-id
         ;; nutrient-value-set-fp-id
         ;; SQL CRUD
         (contract-out
          [create-nutrient-value-set! (-> symbol?
                                          exact-nonnegative-integer?
                                          (listof (cons/c
                                                   nutrient?
                                                   number?))
                                          void?)]
          [get-nutrient-value-set (->* ()
                                       (#:id exact-nonnegative-integer?
                                        #:nutrient-measurement-id exact-nonnegative-integer?
                                        #:nutrient-target-id exact-nonnegative-integer?
                                        #:crop-requirement-id exact-nonnegative-integer?
                                        #:fertilizer-product-id exact-nonnegative-integer?)
                                       (or/c nutrient-value-set? #f))]))

(require racket/contract
         db
         sql
         "../db/conn.rkt"
         "nutrient.rkt")

(struct nutrient-value-set (id nm-id nt-id cr-id fp-id) #:transparent)


;; CREATE

(define (create-nutrient-value-set! type id nutrient-values)
  (define nvs (case type
                [(nutrient-measurement)
                 (query-exec (current-conn)
                             (insert #:into nutrient_value_sets
                                     #:set [nutrient_measurement_id ,id]))
                 (get-nutrient-value-set #:nutrient-measurement-id id)]
                [(nutrient-target)
                 (query-exec (current-conn)
                             (insert #:into nutrient_value_sets
                                     #:set [nutrient_target_id ,id]))
                 (get-nutrient-value-set #:nutrient-target-id id)]
                [(crop-requirement)
                 (query-exec (current-conn)
                             (insert #:into nutrient_value_sets
                                     #:set [crop_requirement_id ,id]))
                 (get-nutrient-value-set #:crop-requirement-id id)]
                [(fertilizer-product)
                 (query-exec (current-conn)
                             (insert #:into nutrient_value_sets
                                     #:set [fertilizer_product_id ,id]))
                 (get-nutrient-value-set #:fertilizer-product-id id)]))
  (for ([nv nutrient-values])
    (match nv
      [(cons n v)
       (query-exec (current-conn)
                   (insert #:into nutrient_values
                           #:set
                           [value_set_id ,(nutrient-value-set-id nvs)]
                           [nutrient_id  ,(nutrient-id n)]
                           [value_ppm    ,v]))])))


;; READ

(define (get-nutrient-value-set #:id [id #f]
                                #:nutrient-measurement-id [nm #f]
                                #:nutrient-target-id [nt #f]
                                #:crop-requirement-id [cr #f]
                                #:fertilizer-product-id [fp #f])
  (define (where-expr)
    (define clauses
      (filter values
              (list
               (and id (format "id = ~e" id))
               (and nm (format "nutrient_measurement_id = ~e" nm))
               (and nt (format "nutrient_target_id = ~e" nt))
               (and cr (format "crop_requirement = ~e" cr))
               (and fp (format "fertilizer_product = ~e" fp)))))
    (cond
      [(null? clauses) ""]
      [else (format "WHERE ~a" (string-join clauses " AND "))]))
  (define query (string-join
                 `("SELECT *"
                   "FROM nutrient_value_sets"
                   ,(where-expr)
                   "ORDER BY id ASC"
                   "LIMIT 1")))
  (match (query-maybe-row (current-conn) query)
    [(vector id* nm-id* nt-id* cr-id* fp-id*)
     (nutrient-value-set id* nm-id* nt-id* cr-id* fp-id*)]
    [#f #f]))
Copyright 2019--2025 Marius PETER