changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > demo / annotate examples/db/mbdb.lisp

changeset 39: 1ef551e24009
child: 6b652d7d6663
author: Richard Westhaver <ellis@rwest.io>
date: Thu, 11 Apr 2024 18:58:35 -0400
permissions: -rw-r--r--
description: added musicbrainz db example
39
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
1
 ;;; examples/mbdb.lisp --- MusicBrainz Database import and analysis
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
2
 
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
3
 ;; This example show how to migrate a set of complex JSON objects to
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
4
 ;; RocksDB using a dump from the MusicBrainz database
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
5
 ;; (https://musicbrainz.org/). The files are hosted at
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
6
 ;; https://packy.compiler.company/data/mbdump
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
7
 
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
8
 ;;; Code:
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
9
 (defpackage :examples/mbdb
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
10
   (:use :cl :std :dat/json :net/fetch :obj/id :rdb :cli/clap :obj/uuid)
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
11
   (:import-from :log :info! :debug!)
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
12
   (:import-from :rocksdb :load-rocksdb)
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
13
   (:export :main))
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
14
 
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
15
 (in-package :examples/mbdb)
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
16
 
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
17
 (load-rocksdb t)
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
18
 
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
19
 (declaim (type pathname *mbdb-path*))
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
20
 (defvar *mbdb-path* #P"/tmp/mbdb/")
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
21
 (defvar *mbdb* (create-db *mbdb-path* :opts (default-rdb-opts)))
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
22
 
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
23
 (defvar *mbdump-base-url* "https://packy.compiler.company/data/mbdump/"
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
24
   "Remote location of MusicBrainz JSON data files.")
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
25
 
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
26
 (defvar *mbdump-files*
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
27
   (mapcar (lambda (f) (make-pathname :name f :type "json" :directory *mbdump-base-url*))
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
28
           (list "area" "artist" "event" "instrument"
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
29
                 "label" "place" "recording" "release"
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
30
                 "release-group" "series" "work")))
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
31
 
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
32
 (defun extract-columns (obj)
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
33
   "Extract fields from a JSON-OBJECT, returning a vector of
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
34
   uninitialized column-families which can be created with CREATE-CFS.
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
35
 
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
36
 Returns multiple values: the list of columns, the id, and type-id if present."
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
37
   (values
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
38
    (mapcar #'car (json-object-members obj))
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
39
    (make-uuid-from-string (json-getf obj "id"))
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
40
    (when-let ((tid (json-getf obj "type-id")))
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
41
      (make-uuid-from-string tid))))
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
42
 
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
43
 (defmain ()
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
44
   (let ((*default-pathname-defaults* (ensure-directories-exist *mbdb-path* :verbose t)))
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
45
     (log:info! "Welcome to MBDB")
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
46
     (with-db (db *mbdb*)
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
47
       (open-db db)
1ef551e24009 added musicbrainz db example
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
48
       (close-db db))))