Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add option for explicit rdf:type declarations #8

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions configuration/settings.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,7 @@
(defparameter *supply-cache-headers-p* nil
"when non-nil, cache headers are supplied. this works together with mu-cache.")

(defparameter *declare-resource-types-p*
(let ((env (uiop:getenv "MU_DECLARE_RESOURCE_TYPES")))
(and env (or (equal env "true") (equal env "TRUE") (equal env "True") (equal env T))))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps the following is more readable:

(defparameter *declare-resource-types-p* (equalp "true" (uiop:getenv "MU_DECLARE_RESOURCE_TYPES"))
  "....")

"when true, explicitly declare rdf:type for all resources in property and relation queries.")
37 changes: 31 additions & 6 deletions framework/call-implementation.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -375,9 +375,26 @@
(setf (gethash property (solution-fields solution)) value))

(defun solution-field-p (solution property)
"returns non-nil if <property> has been fetched for <solution>."
"Returns non-nil if <property> has been fetched for <solution>."
(second (multiple-value-list (solution-value solution property))))

(defun resource-type-declaration (resource-url resource)
"Returns an rdf:type declaration if *declare-resource-types-p* is t,
otherwise the empty string."
(if (or 4 *declare-resource-types-p*)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not following what the value of this or statement is. Leftover debugging?

(format nil "~A a ~A. "
(s-url resource-url) (ld-class resource))
""))

(defun relation-resource-type-declaration (resource-url resource link)
"Returns an rdf:type declaration for linked resources if
*declare-resource-types-p* is t, otherwise the empty string."
(if *declare-resource-types-p*
(format nil "~A a ~A. ~A a ~A.~%"
resource-url (ld-class resource) "?resource"
(ld-class (find-resource-by-name (resource-name link))))
""))

(defgeneric complete-solution (solution item-spec)
(:documentation "Completes <solution> for the settings requested in
<item-spec>.")
Expand Down Expand Up @@ -407,7 +424,8 @@
(sparql:select
"*"
(format nil
"~{~&~:[OPTIONAL {~A ~{~A~,^/~} ~A.}~;~A ~{~A~,^/~} ~A.~]~}"
"~A~{~&~:[OPTIONAL {~A ~{~A~,^/~} ~A.}~;~A ~{~A~,^/~} ~A.~]~}"
(resource-type-declaration resource-url resource)
(loop for slot in missing-single-value-properties
append (list (required-p slot)
(s-url resource-url)
Expand Down Expand Up @@ -664,9 +682,11 @@
:resource (referred-resource link)
:sparql-body (filter-body-for-search
:sparql-body (format nil
(s+ "~A ~{~A~,^/~} ?resource. "
(s+ "~A"
"~A ~{~A~,^/~} ?resource. "
"?resource mu:uuid ?uuid. "
"~@[~A~] ")
(relation-resource-type-declaration resource-url resource link)
resource-url
(ld-property-list link)
(authorization-query resource :show resource-url))
Expand All @@ -693,9 +713,11 @@
(let* ((resource-url (s-url (node-url item-spec)))
(query-results
(first (sparql:select (s-var "uuid")
(format nil (s+ "~A ~{~A~,^/~} ?resource. "
(format nil (s+ "~A"
"~A ~{~A~,^/~} ?resource. "
"?resource mu:uuid ?uuid. "
"~@[~A~] ")
(relation-resource-type-declaration resource-url (resource item-spec) link)
resource-url
(ld-property-list link)
(authorization-query item-spec :show resource-url)))))
Expand All @@ -708,9 +730,11 @@
(let* ((resource-url (s-url (node-url item-spec)))
(query-results
(sparql:select (s-var "uuid")
(format nil (s+ "~A ~{~A~,^/~} ?resource. "
(format nil (s+ "~A"
"~A ~{~A~,^/~} ?resource. "
"?resource mu:uuid ?uuid. "
"~@[~A~] ")
(relation-resource-type-declaration resource-url resource link)
resource-url
(ld-property-list link)
(authorization-query item-spec :show resource-url))))
Expand Down Expand Up @@ -905,10 +929,11 @@
(loop for new-uuid
in (jsown:filter
(sparql:select (s-distinct (s-var "target"))
(format nil (s+ "?s mu:uuid ~A. "
(format nil (s+ "?s mu:uuid ~A" "~A. "
"?s ~{~A/~}mu:uuid ?target. "
"~@[~A~] ")
(s-str uuid)
(if *declare-resource-types-p* (format nil "; a ~A" (ld-class resource)) "")
(ld-property-list relation)
(authorization-query resource :show (s-var "s"))))
map "target" "value")
Expand Down
2 changes: 1 addition & 1 deletion framework/response-generation.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@
;; between having to sort (order-info) and not having
;; to sort. some logic is shared.
(let ((sparql-variables (if order-info
(format nil "DISTINCT ~A~{ ~{MAX(~A) AS ~A~}~}"
(format nil "DISTINCT ~A~{ ~{(MAX(~A) AS ~A)~}~}"
(s-var "uuid") (mapcar (lambda (a) (list a a)) order-variables))
(format nil "DISTINCT ~A" (s-var "uuid"))))
(sparql-body (if order-info
Expand Down