Search is okay-ish.
parent
3f1e8edf95
commit
16fb640d2f
62
src/dodb.cl
62
src/dodb.cl
|
@ -20,9 +20,9 @@
|
||||||
(defun to-upper-case (some-string)
|
(defun to-upper-case (some-string)
|
||||||
(format nil "~@:(~a~)" some-string))
|
(format nil "~@:(~a~)" some-string))
|
||||||
|
|
||||||
; Example: 18 -> 000000000000018.data
|
; Example: 18 -> 000000000000018
|
||||||
(defun number->filename (number)
|
(defun number->filename (number)
|
||||||
(format nil "~15,'0D.data" number))
|
(format nil "~15,'0D" number))
|
||||||
|
|
||||||
; Example: "vehicle" "color" object -> (vehicle-color object) -> "Red"
|
; Example: "vehicle" "color" object -> (vehicle-color object) -> "Red"
|
||||||
(defun get-object-attribute (struct-name attribute-name object)
|
(defun get-object-attribute (struct-name attribute-name object)
|
||||||
|
@ -46,7 +46,7 @@
|
||||||
(ensure-directories-exist (concatenate 'string path "/data/"))
|
(ensure-directories-exist (concatenate 'string path "/data/"))
|
||||||
(make-db :struct-name struct-name :path path))
|
(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.
|
; USAGE: when dealing with hash keys from the in-memory db.
|
||||||
; The hash key is the number used to build the filename.
|
; The hash key is the number used to build the filename.
|
||||||
(defun db/data-filepath (dbpath number)
|
(defun db/data-filepath (dbpath number)
|
||||||
|
@ -70,9 +70,9 @@
|
||||||
(db/index/get-directory-path database index-name)
|
(db/index/get-directory-path database index-name)
|
||||||
(db/index/get-filename database index-name object)))
|
(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"
|
; -> (ln "./storage/cars/indexes/by_name/Corvet"
|
||||||
; :target "../../data/0000000015.data"
|
; :target "../../data/0000000015"
|
||||||
; :hard nil)
|
; :hard nil)
|
||||||
(defun db/index/new (database index-name object file-name)
|
(defun db/index/new (database index-name object file-name)
|
||||||
(let ((symlink-path (db/index/get-symlink-path database index-name object)))
|
(let ((symlink-path (db/index/get-symlink-path database index-name object)))
|
||||||
|
@ -84,18 +84,18 @@
|
||||||
))
|
))
|
||||||
|
|
||||||
; Example: database "color" object
|
; 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)
|
(defun db/partition/get-symlink-path (database partition-name object file-name)
|
||||||
(concatenate 'string
|
(concatenate 'string
|
||||||
(db/partition/get-directory-path database partition-name
|
(db/partition/get-directory-path database partition-name
|
||||||
; example: "Red"
|
; example: "Red"
|
||||||
(get-object-attribute (db-struct-name database) partition-name object))
|
(get-object-attribute (db-struct-name database) partition-name object))
|
||||||
; example: "0000000015.data"
|
; example: "0000000015"
|
||||||
file-name))
|
file-name))
|
||||||
|
|
||||||
; Example: database "color" object "0000000015.data"
|
; Example: database "color" object "0000000015"
|
||||||
; -> (ln "./storage/cars/partitions/by_color/Red/0000000015.data"
|
; -> (ln "./storage/cars/partitions/by_color/Red/0000000015"
|
||||||
; :target "../../../data/0000000015.data"
|
; :target "../../../data/0000000015"
|
||||||
; :hard nil)
|
; :hard nil)
|
||||||
(defun db/partition/new (database partition-name object file-name)
|
(defun db/partition/new (database partition-name object file-name)
|
||||||
(let ((symlink-path
|
(let ((symlink-path
|
||||||
|
@ -136,11 +136,11 @@
|
||||||
(db/partition/new database attribute-name element (number->filename number)))
|
(db/partition/new database attribute-name element (number->filename number)))
|
||||||
(db-data database)))
|
(db-data database)))
|
||||||
|
|
||||||
; Example: database -> "000000000000018.data".
|
; Example: database -> "000000000000018".
|
||||||
(defun db/add/new-data-filename (database)
|
(defun db/add/new-data-filename (database)
|
||||||
(number->filename (db-current-index 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)
|
(defun db/add/new-data-filepath (database file-name)
|
||||||
(concatenate 'string (db-path database) "/data/" file-name))
|
(concatenate 'string (db-path database) "/data/" file-name))
|
||||||
|
|
||||||
|
@ -165,14 +165,38 @@
|
||||||
; database.data[database.current-index] = object
|
; database.data[database.current-index] = object
|
||||||
(setf (gethash (db-current-index database) (db-data database)) object))
|
(setf (gethash (db-current-index database) (db-data database)) object))
|
||||||
|
|
||||||
; TODO: should we search for the data from the FS or in-memory?
|
(alias basename pathname-name)
|
||||||
(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)))
|
|
||||||
|
|
||||||
(defun db/get-by-partition (database name value)
|
; Search for the data from the FS.
|
||||||
(loop for car in (ls (db/partition/get-directory-path database name value))
|
; TODO: get the hash index, too.
|
||||||
collect (util:read-object-from-file car)))
|
(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
|
; TEST SCENARIO
|
||||||
|
|
Loading…
Reference in New Issue