cbaines pushed a commit to branch master
in repository data-service.
commit c949deb9d43c67f00089cb2e5949e46bff6cd88e
Author: Christopher Baines <[email protected]>
AuthorDate: Fri Nov 29 13:48:47 2024 +0000
Memoize field-can-be-null?
---
guix-data-service/model/utils.scm | 49 ++++++++++++++++++++++++---------------
1 file changed, 30 insertions(+), 19 deletions(-)
diff --git a/guix-data-service/model/utils.scm
b/guix-data-service/model/utils.scm
index c05f20d..8721c52 100644
--- a/guix-data-service/model/utils.scm
+++ b/guix-data-service/model/utils.scm
@@ -145,6 +145,34 @@ WHERE table_name = $1"
(string=? is_nullable "YES"))))
results))))
+(define %field-can-be-null-cache
+ (make-hash-table))
+
+(define (field-can-be-null? conn table-name field)
+ (let ((cache-key (cons table-name field)))
+ (match (hash-get-handle %field-can-be-null-cache
+ cache-key)
+ ((_ . res) res)
+ (#f
+ (let ((schema-details
+ (table-schema conn table-name)))
+ (match (find (lambda (column-data)
+ (string=? field
+ (car column-data)))
+ schema-details)
+ ((column-name data-type is-nullable?)
+ (hash-set! %field-can-be-null-cache
+ cache-key
+ is-nullable?)
+ is-nullable?)
+ (#f
+ (simple-format
+ (current-error-port)
+ "error: couldn't find data for ~A in ~A\n"
+ field
+ schema-details)
+ (error "error: field-can-be-null?"))))))))
+
(define* (insert-missing-data-and-return-all-ids
conn
table-name
@@ -216,23 +244,6 @@ WHERE table_name = $1"
(loop (cdr a) (cdr b))
a-val)))))))))))
- (define schema-details
- (table-schema conn table-name))
-
- (define (field-can-be-null? field)
- (match (find (lambda (column-data)
- (string=? field
- (car column-data)))
- schema-details)
- ((column-name data-type is-nullable?) is-nullable?)
- (#f
- (simple-format
- (current-error-port)
- "error: couldn't find data for ~A in ~A\n"
- field
- schema-details)
- (error "error: field-can-be-null?"))))
-
(define (select-query data)
(string-append
"SELECT id,\n"
@@ -258,7 +269,7 @@ WHERE table_name = $1"
(string-concatenate
`("("
,table-name "." ,field " = vals." ,field
- ,@(if (field-can-be-null? field)
+ ,@(if (field-can-be-null? conn table-name field)
`(" OR (" ,table-name "." ,field " IS NULL AND"
" vals." ,field " IS NULL"
")")
@@ -282,7 +293,7 @@ WHERE table_name = $1"
(string-concatenate
`("("
,table-name "." ,field " = " ,temp-table-name "." ,field
- ,@(if (field-can-be-null? field)
+ ,@(if (field-can-be-null? conn table-name field)
`(" OR ("
,table-name "." ,field " IS NULL"
" AND "