Coverage report: /development/source/library/org/datagraph/spocq-shard/src/store/rdfcache/timemap.lisp
| Kind | Covered | All | % |
| expression | 121 | 140 | 86.4 |
| branch | 9 | 20 | 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; -*-
3
(in-package :org.datagraph.spocq.implementation)
4
;; (load "/development/source/library/org/datagraph/spocq/src/store/property-paths.lisp")
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.
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
22
see also the latest-version, successor-verion and predecessor-version link heders[rfc5829]
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
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.")
37
(:method ((repository-id string) &rest args)
38
(apply #'compute-timemap (repository repository-id) args))
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))
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>)
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))))))))
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> )
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)
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))))))
115
;;; (compute-timemap "6/1606")
116
;;; (compute-timemap "jhacker/basic-term-1")
117
;;; (format t "~{~/n3:format/~%~}" (compute-timemap (repository "6/1606")))