Coverage report: /development/source/library/org/datagraph/spocq-shard/src/store/rdfcache/timemap.lisp

KindCoveredAll%
expression121140 86.4
branch920 45.0
Key
Not instrumented
Conditionalized out
Executed
Not executed
 
Both branches taken
One branch taken
Neither branch taken
1
 ;;; -*- Mode: lisp; Syntax: ansi-common-lisp; Base: 10; Package: org.datagraph.spocq.implementation; -*-
2
 
3
 (in-package :org.datagraph.spocq.implementation)
4
 ;; (load "/development/source/library/org/datagraph/spocq/src/store/property-paths.lisp")
5
 
6
 
7
 (:documentation "timemaps"
8
   "the external interface to revisions follows memento[vandesompel.2010]. this introduces several elements
9
  : an associated resource for version discovery
10
  : designatable versions - they propose an hierarchical namespace and resource delegation but
11
    - an hierarchy conflicts with composition requirements
12
    - delegation via 300 redirection increases latency
13
  : description of dependency between versions - they propose a sequence, but this does not suffice for more complex relations
14
  the w3c tag note on 'The use of Metadata in URIs'[w3c.metaDataInURI] indicates why the query parameters are better: they manifest
15
   assurances, as to the nature of that dimension. based upon which tools can provide more suitable interfaces.
16
 
17
  the specification for uri syntax[rdf3986] describes the purpose of query parameter as
18
   'The query component contains non-hierarchical data that'
19
  which pertains directly to this case, as the temporal dimension is one of many, and posses no dominance
20
  over the others. 
21
 
22
  see also the latest-version, successor-verion and predecessor-version link heders[rfc5829]
23
 
24
  ---
25
  [vandesompel.2010] : arxiv.org/abs/1003.3661
26
  [w3c.metaDataInURI] : http://www.w3.org/2001/tag/doc/metaDataInURI-31.html
27
  [rdf3986] : http://tools.ietf.org/html/rfc3986
28
  [rfc5829] : http://tools.ietf.org/html/rfc5829
29
  ---
30
 
31
  ")
32
 
33
 (defgeneric compute-timemap (repository &key timemap-properties)
34
   (:documentation "Given a repository, extract the version information and construct a graph which represents
35
     the timemap. Return this as sse-statements.")
36
   
37
   (:method ((repository-id string) &rest args)
38
     (apply #'compute-timemap (repository repository-id) args))
39
   
40
   (:method ((repository repository) &key (timemap-properties *timemap-properties*)) (declare (optimize (debug 3)))
41
     ;; based on the list of versions, collect the temporal bounds for each;
42
     ;; transform that into the aggregate list w/ respective period properties;
43
     ;; augment that with the general information about the repository as a whole.
44
     (let* ((revision-metadata (repository-list-revision-metadata repository))
45
            (repository-uri (repository-uri repository))
46
            ;;(timebundle-node (intern-blank-node (substitute-if-not #\_ #'alphanumericp (concatenate 'string (spocq:iri-lexical-form repository-uri) "/timebundle"))))
47
            ;;(timebundle-node (intern-blank-node "timebundle"))
48
            (timebundle-node (intern-iri (format nil "~a/~a"
49
                                                 (iri-lexical-form repository-uri)
50
                                                 (iri-lexical-form *timebundle-graph-uri*))))
51
            (timemap-node (intern-iri (format nil "~a/~a"
52
                                              (iri-lexical-form repository-uri)
53
                                              (iri-lexical-form *timemap-graph-uri*))))
54
            (start-timestamp (when revision-metadata (second (first (last revision-metadata)))))
55
            (head `((,timemap-node |rdf|:|type| <http://www.openarchives.org/ore/terms/ResourceMap>)
56
                    (,timemap-node <http://purl.org/dc/terms/modified> ,(universal-time-date-time (get-universal-time)))
57
                    (,timemap-node <http://purl.org/dc/terms/created> ,(universal-time-date-time (get-universal-time)))
58
                    (,timemap-node |rdf|:|type| <http://www.mementoweb.org/terms/tb/TimeMap> )
59
                    (,timebundle-node |rdf|:|type| <http://www.openarchives.org/ore/terms/Aggregation> )
60
                    (,timebundle-node  <http://www.openarchives.org/ore/terms/aggregates> ,repository-uri )
61
                    (,timebundle-node  <http://purl.org/dc/elements/1.1/title> ,(format nil "Memento Time Bundle for '~a'" (spocq:iri-lexical-form repository-uri)))
62
                    (,timebundle-node  |rdf|:|type| <http://www.mementoweb.org/terms/tb/TimeBundle> )
63
                    (,timemap-node <http://www.openarchives.org/ore/terms/describes>  ,timebundle-node  )
64
                    (,repository-uri |rdf|:|type| <http://www.mementoweb.org/terms/tb/TimeGate> )
65
                    (,repository-uri <http://www.mementoweb.org/terms/tb/timeGateFor> ,repository-uri )
66
                    (,repository-uri |rdf|:|type| <http://www.mementoweb.org/terms/tb/OriginalResource> ))))
67
       ;; emit revisions in a second segment such that the request can limit the response size
68
       ;; but still get information on the latest revision
69
       (labels ((make-period-node (id)
70
                  (intern-iri (format nil "~a#_~d" (iri-lexical-form timebundle-node) id)))
71
                (timemap-property-p (property)
72
                  (when (or (null timemap-properties) (member property timemap-properties :test #'equalp))
73
                    t))
74
                (revision-bundle (revision-uuid count start-timestamp end-timestamp)
75
                  (let* ((revision (repository-revision revision-uuid :reference repository))
76
                         (revision-uri (revision-uri revision))
77
                         (memento-uri (revision-memento-uri revision))
78
                         (period-node (make-period-node count)))
79
                    `((,timebundle-node <http://www.openarchives.org/ore/terms/aggregates> ,memento-uri )
80
                      ,@(when (or (timemap-property-p <http://www.mementoweb.org/terms/tb/start>)
81
                                  (and (timemap-property-p <http://www.mementoweb.org/terms/tb/end>)
82
                                       end-timestamp))
83
                          `((,memento-uri <http://www.mementoweb.org/terms/tb/validOver> ,period-node )))
84
                      ,@(when (timemap-property-p <http://www.mementoweb.org/terms/tb/mementoFor>)
85
                          `((,memento-uri <http://www.mementoweb.org/terms/tb/mementoFor> ,repository-uri )))
86
                      ,@(when (timemap-property-p '|rdf|:|type|)
87
                          `((,memento-uri |rdf|:|type| <http://www.mementoweb.org/terms/tb/Memento> )
88
                            (,revision-uri |rdf|:|type| <urn:dydra:Revision> )
89
                            (,memento-uri |owl|:|sameAs| ,revision-uri)))
90
                      ,@(when (and (timemap-property-p '|rdf|:|type|)
91
                                   (or (timemap-property-p <http://www.mementoweb.org/terms/tb/start>)
92
                                       (timemap-property-p <http://www.mementoweb.org/terms/tb/end>)))
93
                          `((,period-node |rdf|:|type| <http://www.mementoweb.org/terms/tb/Period> )))
94
                      ,@(when (timemap-property-p <http://www.mementoweb.org/terms/tb/start>)
95
                          `((,period-node <http://www.mementoweb.org/terms/tb/start> ,(timeline-location-date-time start-timestamp))))
96
                      ,@(when (and end-timestamp (timemap-property-p <http://www.mementoweb.org/terms/tb/end>))
97
                          `((,period-node <http://www.mementoweb.org/terms/tb/end> ,(timeline-location-date-time end-timestamp))))))))
98
         (append head
99
                 ;; include the period iff there is data in the repository
100
                 (when start-timestamp
101
                   (let ((period-node (make-period-node 0)))
102
                   `((,repository-uri <http://www.mementoweb.org/terms/tb/covers> ,period-node )
103
                     (,period-node |rdf|:|type| <http://www.mementoweb.org/terms/tb/Period> )
104
                     ;; no end 
105
                     (,period-node <http://www.mementoweb.org/terms/tb/start>  ,(timeline-location-date-time start-timestamp)))))
106
                 (loop for length-limit = (or (response-end) most-positive-fixnum)
107
                   for count from 1
108
                   for (revision-uuid start-timestamp) in revision-metadata
109
                   for end-timestamp = nil then start-timestamp
110
                   for revision-bundle = (revision-bundle revision-uuid count start-timestamp end-timestamp)
111
                   for length = (+ (length head) (length revision-bundle)) then (+ length (length revision-bundle))
112
                   until (> length length-limit)        ; ensure it should fit
113
                   nconc revision-bundle))))))
114
 
115
 ;;; (compute-timemap "6/1606")
116
 ;;; (compute-timemap "jhacker/basic-term-1")
117
 ;;; (format t "~{~/n3:format/~%~}" (compute-timemap (repository "6/1606")))
118