From 49b4841c4e1f6745fd5a148cdeb3cf118164b70c Mon Sep 17 00:00:00 2001 From: Christopher Baines Date: Mon, 15 Jan 2024 11:18:39 +0000 Subject: Use delete-duplicates/sort! in insert-missing-data-and-return-all-ids As it's faster than delete-duplicates for large amounts of data. --- guix-data-service/model/utils.scm | 48 +++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 5 deletions(-) (limited to 'guix-data-service') diff --git a/guix-data-service/model/utils.scm b/guix-data-service/model/utils.scm index f40174a..b46e2e4 100644 --- a/guix-data-service/model/utils.scm +++ b/guix-data-service/model/utils.scm @@ -178,6 +178,44 @@ WHERE table_name = $1" (error (simple-format #f "error: unknown type for value: ~A" v))))) + (define (delete-duplicates* data) + (delete-duplicates/sort! + (list-copy data) + (lambda (full-a full-b) + (let loop ((a full-a) + (b full-b)) + (if (null? a) + #f + (let ((a-val (match (car a) + ((_ . val) val) + ((? symbol? val) (symbol->string val)) + (val val))) + (b-val (match (car b) + ((_ . val) val) + ((? symbol? val) (symbol->string val)) + (val val)))) + (cond + ((null? a-val) + (if (null? b-val) + (loop (cdr a) (cdr b)) + #t)) + ((null? b-val) + #f) + (else + (match a-val + ((? string? v) + (if (string=? a-val b-val) + (loop (cdr a) (cdr b)) + (string