changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > demo / annotate examples/db/xdb/document.lisp

changeset 44: 99d4ab4f8d53
parent: 81b7333f27f8
author: Richard Westhaver <ellis@rwest.io>
date: Sun, 11 Aug 2024 01:50:18 -0400
permissions: -rw-r--r--
description: update
41
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
1
 ;;; obj/db/document.lisp --- Database Document Objects
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
2
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
3
 ;; Spliced from XDB, currently not in use outside of it
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
4
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
5
 ;;; Code:
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
6
 (in-package :xdb)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
7
 ;;; Document
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
8
 (defclass document ()
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
9
   ((collection :initarg :collection
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
10
                :accessor collection)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
11
    (key :initarg :key
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
12
         :accessor key)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
13
    (doc-type :initarg :doc-type
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
14
              :initform nil
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
15
              :accessor doc-type)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
16
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
17
 (defmethod duplicate-doc-p ((doc document) test-doc)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
18
   (or (eq doc test-doc)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
19
       (equal (key doc) (key test-doc))))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
20
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
21
 (defmethod add ((doc document) &key collection duplicate-doc-p-func)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
22
   (when doc
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
23
     (if (slot-boundp doc 'collection)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
24
         (add-doc (or (collection doc) collection) (or duplicate-doc-p-func  #'duplicate-doc-p))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
25
         (error "Must specify collection to add document to."))))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
26
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
27
 (defmethod get-val ((doc document) element &optional data-type)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
28
   (declare (ignore data-type))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
29
   (if (slot-boundp doc element)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
30
       (slot-val doc element)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
31
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
32
 (defmethod (setf get-val) (new-value (doc document) element &optional data-type)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
33
   (declare (ignore data-type))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
34
   (if doc
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
35
       (setf (slot-value doc element) new-value)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
36
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
37
 (defclass document-join (join-docs)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
38
   ())
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
39
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
40
 (defclass document-join-result (join-result)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
41
   ())
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
42
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
43
 (defmethod get-val ((composite-doc document-join-result) element &optional data-type)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
44
   (declare (ignore data-type))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
45
   (map 'list
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
46
        (lambda (doc)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
47
          (cons (doc-type doc) (get-val doc element)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
48
        (docs composite-doc)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
49
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
50
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
51
 (defmethod get-doc ((collection document-join) value &key (element 'key) (test #'equal))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
52
   (map-docs
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
53
    nil
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
54
    (lambda (doc)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
55
      (when (apply test (get-val doc element) value)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
56
        (return-from get-doc doc)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
57
    collection))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
58
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
59
 
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
60
 (defmethod find-doc ((collection document-join) &key test)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
61
   (if test
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
62
       (map-docs
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
63
        nil
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
64
        (lambda (doc)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
65
          (when (apply test doc)
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
66
            (return-from find-doc doc)))
81b7333f27f8 more examples
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
67
        collection)))