changeset 44: |
99d4ab4f8d53 |
parent: |
1ef551e24009
|
author: |
Richard Westhaver <ellis@rwest.io> |
date: |
Sun, 11 Aug 2024 01:50:18 -0400 |
permissions: |
-rw-r--r-- |
description: |
update |
1 ;;; examples/db/tao.lisp --- Common Lisp implementation of the TAO data model 3 ;; https://research.facebook.com/publications/tao-facebooks-distributed-data-store-for-the-social-graph/ 5 ;; a minimal Lisp implementation of TAO. 8 (defpackage :examples/tao 9 (:use :cl :std :rdb :log :obj/db :obj/graph :obj/id) 12 (in-package :examples/tao) 16 (defvar *tao-directory* "/tmp/tao/") 18 (defvar *tao-log-dir*) 21 (vector (make-rdb-cf "nodes") 22 (make-rdb-cf "edges"))) 24 (defun tao-path (path &optional (root *tao-directory*)) 25 (merge-pathnames path root)) 27 (defclass tao-node (id) 30 (defclass tao-edge (edge) ()) 32 (defclass tao-graph (graph) ()) 34 (defclass tao-db (database) 37 (defclass tao (tao-db tao-graph) 38 ((dir :initarg :dir))) 40 (defun ensure-tao-directories (&optional (root *tao-directory*)) 41 (setf *tao-log-dir* (ensure-directories-exist (tao-path "log/" root) :verbose t)) 44 (defun init-tao-db (&optional (root *tao-directory*)) 45 (let ((db-dir (tao-path "db/" root))) 46 (setf *tao-db-dir* db-dir) 47 (create-db db-dir :cfs *tao-cfs*))) 49 (defun make-tao (&key (dir *tao-directory*)) 51 :dir (setf *tao-directory* (ensure-tao-directories dir)) 52 :db (init-tao-db dir))) 55 (let ((opts (default-rdb-opts))) ;; configure database options 56 (set-opt opts "error-if-exists" 0) 57 (set-opt opts "db-log-dir" "/tmp/log") 59 (let ((db (create-db "tao" 61 ;; :cfs (vector (make-rdb-cf "nodes") 62 ;; (make-rdb-cf "edges")) 66 (let ((metadata (get-metadata db))) 68 (rdb::rocksdb-column-family-metadata-get-name metadata) 69 (rdb::rocksdb-column-family-metadata-get-size metadata) 70 (rdb::rocksdb-column-family-metadata-get-file-count metadata) 71 (rdb::rocksdb-column-family-metadata-get-level-count metadata)) 72 (let ((lmeta (rdb::rocksdb-column-family-metadata-get-level-metadata metadata 0))) 74 (rdb::rocksdb-level-metadata-get-level lmeta) 75 (rdb::rocksdb-level-metadata-get-size lmeta) 76 (rdb::rocksdb-level-metadata-get-file-count lmeta)) 77 ;; TODO: requires file-count > 0 78 ;; (let ((smeta (rdb::rocksdb-level-metadata-get-sst-file-metadata lmeta 0))) 80 ;; (rdb::rocksdb-sst-file-metadata-get-directory smeta) 81 ;; (rdb::rocksdb-sst-file-metadata-get-relative-filename smeta) 82 ;; (rdb::rocksdb-sst-file-metadata-get-size smeta) 83 ;; (rdb::rocksdb-sst-file-metadata-get-smallestkey smeta) 84 ;; (rdb::rocksdb-sst-file-metadata-get-largestkey smeta)) 85 ;; (rdb::rocksdb-sst-file-metadata-destroy smeta)) 86 (rdb::rocksdb-level-metadata-destroy lmeta)) 87 (rdb::rocksdb-column-family-metadata-destroy metadata)) 88 (info! (get-prop db "rocksdb.stats"))