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)))) |