From 16fb640d2f98d1c1854b97274c9af33388b92902 Mon Sep 17 00:00:00 2001 From: Karchnu Date: Wed, 12 Oct 2022 16:10:21 +0200 Subject: [PATCH] Search is okay-ish. --- src/dodb.cl | 62 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 43 insertions(+), 19 deletions(-) diff --git a/src/dodb.cl b/src/dodb.cl index 22947c0..f1df700 100644 --- a/src/dodb.cl +++ b/src/dodb.cl @@ -20,9 +20,9 @@ (defun to-upper-case (some-string) (format nil "~@:(~a~)" some-string)) -; Example: 18 -> 000000000000018.data +; Example: 18 -> 000000000000018 (defun number->filename (number) - (format nil "~15,'0D.data" number)) + (format nil "~15,'0D" number)) ; Example: "vehicle" "color" object -> (vehicle-color object) -> "Red" (defun get-object-attribute (struct-name attribute-name object) @@ -46,7 +46,7 @@ (ensure-directories-exist (concatenate 'string path "/data/")) (make-db :struct-name struct-name :path path)) -; Example: ./storage/cars 18 -> ./storage/cars/data/000000000000018.data +; Example: ./storage/cars 18 -> ./storage/cars/data/000000000000018 ; USAGE: when dealing with hash keys from the in-memory db. ; The hash key is the number used to build the filename. (defun db/data-filepath (dbpath number) @@ -70,9 +70,9 @@ (db/index/get-directory-path database index-name) (db/index/get-filename database index-name object))) -; Example: database "name" object "0000000015.data" +; Example: database "name" object "0000000015" ; -> (ln "./storage/cars/indexes/by_name/Corvet" -; :target "../../data/0000000015.data" +; :target "../../data/0000000015" ; :hard nil) (defun db/index/new (database index-name object file-name) (let ((symlink-path (db/index/get-symlink-path database index-name object))) @@ -84,18 +84,18 @@ )) ; Example: database "color" object -; -> "./storage/cars/partitions/by_color/Red/0000000015.data". +; -> "./storage/cars/partitions/by_color/Red/0000000015". (defun db/partition/get-symlink-path (database partition-name object file-name) (concatenate 'string (db/partition/get-directory-path database partition-name ; example: "Red" (get-object-attribute (db-struct-name database) partition-name object)) - ; example: "0000000015.data" + ; example: "0000000015" file-name)) -; Example: database "color" object "0000000015.data" -; -> (ln "./storage/cars/partitions/by_color/Red/0000000015.data" -; :target "../../../data/0000000015.data" +; Example: database "color" object "0000000015" +; -> (ln "./storage/cars/partitions/by_color/Red/0000000015" +; :target "../../../data/0000000015" ; :hard nil) (defun db/partition/new (database partition-name object file-name) (let ((symlink-path @@ -136,11 +136,11 @@ (db/partition/new database attribute-name element (number->filename number))) (db-data database))) -; Example: database -> "000000000000018.data". +; Example: database -> "000000000000018". (defun db/add/new-data-filename (database) (number->filename (db-current-index database))) -; Example: {db-path}/data/000000000000018.data +; Example: {db-path}/data/000000000000018 (defun db/add/new-data-filepath (database file-name) (concatenate 'string (db-path database) "/data/" file-name)) @@ -165,14 +165,38 @@ ; database.data[database.current-index] = object (setf (gethash (db-current-index database) (db-data database)) object)) -; TODO: should we search for the data from the FS or in-memory? -(defun db/get-by-index (database index-name value) - (util:read-object-from-file (concatenate 'string - (db/index/get-directory-path database index-name) "/" value))) +(alias basename pathname-name) -(defun db/get-by-partition (database name value) - (loop for car in (ls (db/partition/get-directory-path database name value)) - collect (util:read-object-from-file car))) +; Search for the data from the FS. +; TODO: get the hash index, too. +(defun db/search/fs/get-by-index (database index-name value) + (parse-integer + (basename + (osicat:read-link + (concatenate 'string + (db/index/get-directory-path database index-name) "/" value))))) +; (util:read-object-from-file (concatenate 'string +; (db/index/get-directory-path database index-name) "/" value))) + +; Search for the data from the FS. +(defun db/search/fs/get-by-partition (database name value) + (loop for filename in (ls (db/partition/get-directory-path database name value)) + collect (parse-integer (basename filename)))) + +;; Search for the data from the in-memory data. +;; TODO: get the hash index, too. +; +;(defun db/search/mem/get-by-index (database index-name value) +; (util:read-object-from-file (concatenate 'string +; (db/index/get-directory-path database index-name) "/" value))) +; +;(defun db/search/mem/get-by-partition (database name value) +; (loop for car in (ls (db/partition/get-directory-path database name value)) +; collect (util:read-object-from-file car))) + +; By default, search on the FS. +(alias db/get-by-index db/search/fs/get-by-index) +(alias db/get-by-partition db/search/fs/get-by-partition) ; ; TEST SCENARIO