Coverage report: /development/source/library/org/datagraph/spocq-shard/src/core/encoding/ssf-sparql-1-0-5-formula.lisp
| Kind | Covered | All | % |
| expression | 354 | 778 | 45.5 |
| branch | 31 | 86 | 36.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.sparql-1-0-4; -*-
3
(in-package :org.datagraph.spocq.sparql-1-0-4)
5
;;; to handle quad construct wrt 1.0.4
7
;;; reduction operators
9
(defun |Add-Constructor| (GraphOrDefaultx2 Silence?)
10
`(spocq.a:|add| ,@(reverse GraphOrDefaultx2) ,@(unless Silence? `(:verbose t))))
12
(defun |Annotation-Constructor| (VerbObjectList)
15
(defun |ArithmeticAggregate-Constructor| (ArithmeticAggregateOperator Distinctness? Expression*)
16
`(,ArithmeticAggregateOperator ,@(reverse Expression*)
17
,@(when Distinctness? `(:distinct ,Distinctness?))))
19
(defun |AskQuery-Constructor| (DatasetClause* SolutionModifier WhereClause)
20
"Combine any modifiers into the where clause and construct an ask on whatever combination results."
22
(update-dataset-graphs DatasetClause* :query)
23
(when SolutionModifier
24
(destructuring-bind (&key limit offset order group-by) SolutionModifier
25
(declare (ignore group-by)) ; group can hace no effect as there is no aggregation
26
(when (and order (or limit offset))
27
;; order iff a slice is present
28
(setf WhereClause `(spocq.a:|order| ,WhereClause ,order)))
29
(when (or limit offset)
30
(setf WhereClause `(spocq.a:|slice| ,WhereClause
31
,@(when offset `(:offset ,offset))
32
,@(when limit `(:count ,limit)))))))
33
`(spocq.a:|ask| ,WhereClause))
35
(defun |BaseDecl-Constructor| (IRI_REF)
36
(setf (base-iri) IRI_REF))
38
(defun |Bind-Constructor| (Expression IRIref Lambda Var)
39
(cond ((and Expression Var)
40
;; return a tagged binding for later combination
41
`(:bind ,Var ,Expression))
43
(spocq.i::log-warn "Lambda is not enabled")
45
'(spocq.a:|table| spocq.a:|unit|))))
47
(defun |BuiltInCall-Constructor| (BuiltinBinaryCall BuiltinListCall BuiltinNullCall BuiltinNullOrUnaryCall BuiltinUnaryCall
48
ExistsFunc IfExpression NotExistsFunc RegexExpression ReplaceExpression SubstringExpression)
49
(or BuiltinNullCall BuiltinNullOrUnaryCall BuiltinBinaryCall BuiltinUnaryCall BuiltinListCall
50
ExistsFunc NotExistsFunc
51
RegexExpression ReplaceExpression IfExpression SubstringExpression))
53
(defun |Clear-Constructor| (GrafRefAll Silence?)
54
`(spocq.a:|clear| ,GrafRefAll ,@(unless Silence? `(:verbose t))))
57
(defun |Collection-Constructor| (DottedNode GraphNode+)
58
(let* ((tail (or DottedNode '|rdf|:|nil|))
60
(dolist (node GraphNode+)
61
(let ((cell (ecase *nondistinguished-marker-type*
62
(:blank-node (cons-blank-node "b"))
63
(:variable (cons-variable)))))
65
(setf triples (append node triples))
66
(setf node (second (first node))))
67
(push (list 'spocq.a:|triple| cell '|rdf|:|rest| tail) triples)
68
(push (list 'spocq.a:|triple| cell '|rdf|:|first| node) triples)
71
;;; (parse-sparql "insert data { _:a <http://predicate> ( 1 2 ) }")
72
;;; (parse-sparql "insert data { (4 5) <http://predicate> ( (7 8) ) }")
73
;;; (parse-sparql "insert data { (4 5) <http://predicate> ( (7 8) 2 ) }")
74
;;; (parse-sparql "insert data { (4 5) <http://predicate> ( (7 8) (9 10) ) }")
76
(defun |ConstrainedBlankNode-Constructor| (BlankNode)
77
(assert spocq.i::*allow-blank-node-verb* ()
78
"Blank nodes are not permitted as statement pattern verbs")
81
(defun |ConstructClause-Constructor| (ConstructTemplate Dimensions)
82
`(spocq.a:|construct| ,ConstructTemplate ,Dimensions))
84
(defun |ConstructQuery-Constructor| (ConstructTemplate DatasetClause* SolutionModifier TriplesTemplate? Var+ WhereClause Wild)
85
"Assemble a construct operation either with an explict template or with the template 'inline'.
86
Save the dataset specification when noe was provided in the request itself."
88
(update-dataset-graphs DatasetClause* :query)
89
(cond ((or ConstructTemplate Wild Var+)
90
(when SolutionModifier
91
(destructuring-bind (&key limit offset order group-by) SolutionModifier
92
(declare (ignore group-by)) ; group can have no effect as there is no aggregation
94
(setf WhereClause `(spocq.a:|order| ,WhereClause ,order)))
95
(when (or limit offset)
96
(setf WhereClause `(spocq.a:|slice| ,WhereClause
97
,@(when offset `(:offset ,offset))
98
,@(when limit `(:count ,limit)))))))
99
(cond (Wild ; build a construct pattern from all statements
100
(setf ConstructTemplate (let ((statements ()))
101
(flet ((collect-statements (expression)
102
(if (bgp-form-p expression)
103
(dolist (statement (rest expression) t)
104
(when (triple-form-p statement)
105
(pushnew statement statements :test #'equalp)))
107
(declare (dynamic-extent #'collect-statements))
108
(map-tree #'collect-statements WhereClause))
109
(reverse statements))))
110
(Var+ ; build a construct pattern from all statements which intersect
111
(setf ConstructTemplate (let ((statements ()))
112
(flet ((collect-statements (expression)
113
(if (bgp-form-p expression)
114
(dolist (statement (rest expression) t)
115
(when (and (triple-form-p statement)
116
(intersection statement Var+))
117
(assert (every #'(lambda (term)
118
(or (distinguished-variable-p term)
119
(spocq.e:constantp term)))
120
(statement-terms statement))
122
"Construct pattern statement may include terms and variables only: ~a."
124
(pushnew statement statements :test #'equalp)))
126
(declare (dynamic-extent #'collect-statements))
127
(map-tree #'collect-statements WhereClause))
128
(reverse statements)))))
129
`(spocq.a:|construct| ,WhereClause ,ConstructTemplate))
131
(setf ConstructTemplate (copy-tree TriplesTemplate?))
132
(let ((field-expression (cons 'spocq.a:|bgp| TriplesTemplate?)))
133
(when SolutionModifier
134
(destructuring-bind (&key limit offset order group-by) SolutionModifier
135
(declare (ignore group-by)) ; group can have no effect as there is no aggregation
136
(when (or limit offset)
137
(setf field-expression `(spocq.a:|slice| ,field-expression
138
,@(when offset `(:offset ,offset))
139
,@(when limit `(:count ,limit)))))
141
(setf field-expression `(spocq.a:|order| ,field-expression ,order)))))
142
`(spocq.a:|construct| ,field-expression ,ConstructTemplate)))
144
'(spocq.a:|table| spocq.a:|unit|))))
146
(defun |ConstructTemplate-Constructor| (ConstructQuads)
149
(defun |ConstructQuads-Constructor| (ConstructQuads ConstructTriples VarOrIRIref)
150
(append (if VarOrIRIref
151
(loop for (nil subject predicate object) in ConstructTriples
152
collect `(spocq.a:|quad| ,subject ,predicate ,object ,VarOrIRIref))
156
(defun |Copy-Constructor| (GraphOrDefaultx2 Silence?)
157
`(spocq.a:|copy| ,@(reverse GraphOrDefaultx2) ,@(unless Silence? `(:verbose t))))
159
(defun |Create-Constructor| (GrafRef Silence?)
160
`(spocq.a:|create| ,GrafRef ,@(unless Silence? `(:verbose t))))
162
(defun |DeleteClause-Constructor| (QuadPattern)
163
`(:delete ,QuadPattern))
165
(defun |DeleteData-Constructor| (QuadData)
166
`(spocq.a:|deleteData| ,QuadData))
168
(defun |DeleteWhere-Constructor| (QuadPattern)
169
`(spocq.a:|deleteWhere| ,QuadPattern))
171
(defun |DescribeClause-Constructor| (Dimensions VarOrIRIref+)
172
`(spocq.a:|describe| ,VarOrIRIref+ ,Dimensions))
174
(defun |Dimensions-Constructor| (Var+)
177
(defun |DottedNode-Constructor| (GraphNode)
180
(defun |Drop-Constructor| (GrafRefAll Silence?)
181
`(spocq.a:|drop| ,GrafRefAll ,@(unless Silence? `(:verbose t))))
183
(defun |FieldClause-Constructor| (BindingsClause ValuesClause)
184
"Accommodate both the bindings- and values-clause syntax, to them as either an addenda
185
or as an inline solution field, as per productions ValuesClause (11) and InlineData (61)."
186
(or BindingsClause ValuesClause))
188
(defun |FirstTriplesTemplate-Constructor| (TriplesTemplate)
191
;; supersede the 1.0 version
192
(defun |GraphNode-Constructor| (TriplesNode VarOrTermOrGroup)
193
(or TriplesNode VarOrTermOrGroup))
195
(defun |GraphRef-Constructor| (IRIRef)
198
(defun |GraphOrDefault-Constructor| (GraphRef)
199
(or GraphRef :default))
201
(defun |GraphPatternNotTriples-Constructor| (GraphGraphPattern GroupOrUnionGraphPattern MinusGraphPattern OptionalGraphPattern RevisionGraphPattern ServiceGraphPattern)
202
(or OptionalGraphPattern GroupOrUnionGraphPattern GraphGraphPattern MinusGraphPattern RevisionGraphPattern ServiceGraphPattern))
204
(defun |GraphRefAll-Constructor| (GraphRef GraphRefKeyword)
205
(or GraphRef GraphRefKeyword))
207
(defun |GraphRefKeyword-Constructor| (item)
208
;; sbcl-1.0.46 w/ coverage choked on
209
;; (rest (assoc item '((spocq.s:all . :all) (spocq.s:default . :default) (spocq.s:named . :named)) :test #'string-equal))
210
(cond ((string-equal item "all") :all)
211
((string-equal item "default") :default)
212
((string-equal item "named") :named)
213
(t (error "Invalid graph reference: ~s." item))))
215
(defun |GroupGraphPatternRest-Constructor| (Bind FieldClause Filter GraphPatternNotTriples TriplesBlock)
216
(list* (or Bind Filter GraphPatternNotTriples
217
(when FieldClause `(spocq.a:|bindings| ,@FieldClause)))
218
(when TriplesBlock (list (cons 'spocq.a:|bgp| TriplesBlock)))))
220
(defun |GroupGraphPatternSub-Constructor| (GroupGraphPatternRest* TriplesBlock)
221
;; filter scope is the entire group, optional is left associated and
222
;; an optional treats a missing intial triple block as a unit table
223
(let ((unit '(spocq.a:|table| spocq.a:|unit|)))
225
(setf TriplesBlock (cons 'spocq.a:|bgp| TriplesBlock)))
226
(cond (GroupGraphPatternRest*
227
(let ((group TriplesBlock)
230
(dolist (ggp-element (reverse GroupGraphPatternRest*))
231
(destructuring-bind (gpnt-or-filter &optional triples-block) ggp-element
232
(case (first gpnt-or-filter)
234
(destructuring-bind (var expression) (rest gpnt-or-filter)
235
(setf group `(spocq.a:|extend| ,(or group unit) ,var ,expression))))
237
(push (second gpnt-or-filter) filters))
241
`(spocq.a:|minus| ,group ,(second gpnt-or-filter))
242
;; null minus anything is null
245
;; as per 6.1 the optional may have no predecessor
246
(let* ((optional-group (second gpnt-or-filter))
247
(optional-filter (when (eq (first optional-group) 'spocq.a:|filter|)
248
(third optional-group))))
249
(when optional-filter
250
(setf optional-group (second optional-group)))
252
`(spocq.a:|leftjoin| ,(or group unit) ,optional-group
253
,@(when optional-filter (list :test optional-filter))))))
255
(cond ((and (or (spocq.i::service-form-p gpnt-or-filter)
256
(spocq.i::revision-form-p gpnt-or-filter))
257
(variable-p (second gpnt-or-filter)))
258
(push gpnt-or-filter sip-forms))
261
(cond ((and (bgp-form-p group) (bgp-form-p gpnt-or-filter))
262
(cons 'spocq.a:|bgp| (append (rest gpnt-or-filter) (rest group))))
264
`(spocq.a:|join| ,gpnt-or-filter ,group)))))
266
(setf group gpnt-or-filter)))))
268
;; if the constituents are both bgps, then merge them
271
(if (and (bgp-form-p group) (bgp-form-p triples-block))
272
(cons 'spocq.a:|bgp| (append (rest triples-block) (rest group)))
273
`(spocq.a:|join| ,triples-block ,group))
275
(labels ((transform-sip (sip-form group)
276
(if (and group (not (spocq.i::table-form-p group)))
277
(destructuring-bind (op iri group-graph-pattern &rest args) sip-form
278
(if (or (spocq.i::service-form-p (first args))
279
(spocq.i::revision-form-p (first args)))
280
`(,op ,iri ,group-graph-pattern ,(transform-sip (first args) group) ,@(rest args))
281
`(,op ,iri ,group-graph-pattern ,group ,@args)))
283
(loop for sip-form in sip-forms
284
;; rearrange service forms which have a variable location
285
;; do (print (list :group group :service service))
286
do (setf group (transform-sip sip-form group))))
288
`(spocq.a:|filter| ,(or group unit)
290
`(spocq.a:|exprlist| ,@(reverse filters))
296
;; introduce a bgp where a just a term was allowed
297
(defun |GroupTemplate-Constructor| (ObjectVarOrTermOrGroup SubjectVarOrTermOrGroup TriplesTemplate Verb)
299
(cons 'spocq.a:|bgp| TriplesTemplate)
300
`(spocq.a:|bgp| (spocq.a:|triple| ,SubjectVarOrTermOrGroup ,Verb ,ObjectVarOrTermOrGroup))))
302
(defun |InsertClause-Constructor| (QuadPattern)
303
`(:insert ,QuadPattern))
305
(defun |InsertData-Constructor| (QuadData)
306
`(spocq.a:|insertData| ,QuadData))
308
(defun |Lambda-Constructor| (Expression* Var*)
309
`(lambda ,Var* ,@Expression*))
311
(defun |Load-Constructor| (GraphRef IRIRef Silence?)
312
`(spocq.a:|load| ,IRIRef ,GraphRef ,@(unless Silence? `(:verbose t))))
314
(defun |MemberOperator-Constructor| (NotIn)
315
(or NotIn 'spocq.a:|in|))
317
(defun |Modify-Constructor| (DeleteClause GroupGraphPattern InsertClause IRIRef? UsingClause*)
318
(let ((graph-clauses ()))
319
(loop for (key used) in UsingClause*
321
((:from :using) (push used (getf graph-clauses :graphs)))
322
((:from-named :using-named) (push used (getf graph-clauses :named-graphs)))))
323
(destructuring-bind (&key named-graphs graphs) graph-clauses
324
(setf named-graphs (or (request-argument :named-graphs) named-graphs))
325
(setf graphs (or (request-argument :default-graphs) graphs))
326
`(spocq.a:|modify| ,GroupGraphPattern
329
,@(when IRIRef? `(:with ,IRIRef?))
330
,@(when graphs `(:graphs ,graphs))
331
,@(when named-graphs `(:named-graphs ,named-graphs))))))
333
(defun |Move-Constructor| (GraphOrDefaultx2 Silence?)
334
`(spocq.a:|move| ,@(reverse GraphOrDefaultx2) ,@(unless Silence? `(:verbose t))))
336
(defun |NamedIRIref-Constructor| (IRIRef)
339
(defun |NotIn-Constructor| ()
342
(defun |Pragma-Constructor| (PragmaArgList VARNAME)
343
"Pragmas are declarations and configuration instructions which are handled on-the-fly at the start
344
of parsing the given query. Each operator can accept its own argument complement."
346
(loop for value in PragmaArgList
347
do (set-pragma VARNAME value)))
349
(defun |PragmaArgList-Constructor| (NILLIST PragmaArg*)
350
(declare (ignore NILLIST))
352
(reverse PragmaArg*)))
354
(defun |PragmaArg-Constructor| (Expression VARNAME)
355
(or Expression VARNAME))
357
(defun |PrefixDecl-Constructor| (IRI_REF_NAMESTRING PNAME_NS)
358
;; allow simple pragmas as prefix declarations
359
(unless (set-pragma PNAME_NS IRI_REF_NAMESTRING)
360
(setf (prefix-namespace PNAME_NS) IRI_REF_NAMESTRING))
361
(list PNAME_NS IRI_REF_NAMESTRING))
363
(defun |Prologue-Constructor| (BaseDecl Pragma PrefixDecl)
364
(or BaseDecl PrefixDecl Pragma))
366
(defun |QuadPattern-Constructor| (Quads)
369
(defun |QuadData-Constructor| (Quads)
370
(let ((variables (spocq.i::expression-variables Quads)))
371
;; replace indistinguished variables with unique blank nodes
374
(sublis (loop for variable in variables
375
when (spocq.i::undistinguished-variable-p variable)
376
do (setf variables (remove variable variables))
377
collect (cons variable
378
(spocq.i::cons-global-blank-node :prefix "DATA-")))
381
(case spocq.i::*quad-data-variable-behavior*
382
((nil |urn:dydra|:|error|)
383
(error "QuadData may not contain variables: ~s."
384
(subseq quads 0 (min 32 (length quads)))))
386
(sublis (loop for variable in variables
387
collect (cons variable
388
(intern-iri (format nil "urn:sparql:variable?=name=~a" variable))))
392
(defun flatten-triples (sequence)
393
(collect-list (collect)
394
(labels ((do-flatten (sequence)
395
(case (first sequence)
396
((spocq.a:|graph| spocq.a:|triple|)
399
(dolist (sub sequence) (do-flatten sub))))))
400
(do-flatten sequence))))
402
(defun |Quads-Constructor| (Quads? TriplesOrQuads)
403
"This returns a list of the quads without any modification for joins etc."
404
(when (graph-form-p TriplesOrQuads)
405
(setf TriplesOrQuads (list TriplesOrQuads)))
406
(append TriplesOrQuads Quads?))
410
(defun |Quads-Constructor| (RestQuads* TriplesTemplate?)
411
"This returns a list of the quads qithout any modification for joins etc."
412
(flatten-triples (cons TriplesTemplate? (reverse RestQuads*))))
414
(defun |QuadsNotTriples-Constructor| (TriplesTemplate? VarOrIRIref)
415
`(spocq.a:|graph| ,VarOrIRIref ,TriplesTemplate?))
417
(defun |Query-Constructor| (AskQuery ConstructQuery DescribeQuery FieldClause? SelectQuery)
418
;; 1.1 added an optional bindings clause. the CR moved it from the select production to the query construction
419
;; evidently with the intent to have it act in the position of a solution modifier for all query forms.
420
;; also, the prologue is shared by query and update, so promoted to the sparql constructor
422
;; http://lists.w3.org/Archives/Public/public-rdf-dawg/2010JulSep/0370.html
423
;; http://lists.w3.org/Archives/Public/public-rdf-dawg/2011JanMar/0005.html
424
(let ((base-clause (or AskQuery ConstructQuery DescribeQuery SelectQuery)))
426
(destructuring-bind (operator solution-field &rest rest)
428
`(,operator (spocq.a:|join| (spocq.a:|bindings| ,@FieldClause?) ,solution-field) ,@rest))
431
(defun |RelatedNumeric-Constructor| (ExpressionList MemberOperator NumericExpression RelationalOperator)
433
`(,MemberOperator ,ExpressionList)
434
`(,RelationalOperator ,NumericExpression)))
436
(defun |ReplaceExpression-Constructor| (Expression++?)
437
`(spocq.a:|replace| ,@(reverse Expression++?)))
439
(defun |RestQuads-Constructor| (QuadsNotTriples TriplesTemplate?)
440
(cond (TriplesTemplate?
441
(cons QuadsNotTriples TriplesTemplate?))
444
(assert QuadsNotTriples ()
445
"Invalid reduction (RestQuads): QuadsNotTriples is required."))))
448
(defun |RevisionGraphPattern-Constructor| (GroupGraphPattern String VarOrIRI)
449
`(spocq.a:|revision| ,(or VarOrIRI String) ,GroupGraphPattern))
451
(defun |ServiceGraphPattern-Constructor| (GroupGraphPattern Silence? VarOrIRI)
452
(declare (special sparql-1-0-4::|ServiceGraphPattern-INDEX|))
453
(flet ((extract-ggp (tokens)
454
(loop for token in tokens
456
if (eql token 'SPOCQ.S:{)
457
collect token and do (incf level)
458
else if (eql token 'SPOCQ.S:})
459
collect token and do (decf level)
461
while (plusp level)))
462
(subselect-p (tokens)
463
(and (eq (pop tokens) 'SPOCQ.S:{) (eq (pop tokens) 'SPOCQ.S:SELECT))))
464
(let* ((tokens (spocq.i::input-tokens sparql-1-0-4::|ServiceGraphPattern-INDEX|))
465
(ggp-tokens (extract-ggp (member 'SPOCQ.S:{ tokens)))
466
(text (if (subselect-p ggp-tokens)
467
(spocq.i::untokenize-sparql (rest (butlast ggp-tokens)))
468
(concatenate 'string "select * where " (spocq.i::untokenize-sparql ggp-tokens)))))
469
(assert ggp-tokens ()
470
"invalid group graph pattern: ~s." (spocq.i::untokenize-sparql tokens))
471
`(spocq.a:|service| ,VarOrIRI ,GroupGraphPattern
473
,@(when Silence? `(:silent t))))))
475
(defun |Silence-Constructor| (item)
478
;; temporary until changed bnf
479
(defun |SourceSelector-Constructor| (GraphRefKeyword &optional (IRIref :none))
480
(if (eq IRIref :none)
484
(ecase GraphRefKeyword
485
(:all |urn:dydra|:|all|)
486
(:default |urn:dydra|:|default|)
487
(:named |urn:dydra|:|named|))))))
489
(defun |SubSelect-Constructor| (&rest args)
491
(6 (destructuring-bind (ConstructClause DescribeClause FieldClause? SelectClause SolutionModifier WhereClause) args
492
(cond (ConstructClause
493
(destructuring-bind (ConstructTemplate Dimensions) (rest ConstructClause)
494
(append (|ConstructQuery-Constructor| ConstructTemplate nil SolutionModifier nil nil WhereClause nil)
495
(when Dimensions (list Dimensions)))))
497
(destructuring-bind (VarOrIRIref+ Dimensions) (rest DescribeClause)
498
(append (|DescribeQuery-Constructor| nil SolutionModifier VarOrIRIref+ WhereClause)
499
(when Dimensions (list Dimensions)))))
501
(org.datagraph.spocq.sparql-1-0-2::construct-select :SelectClause SelectClause
502
:SolutionModifier SolutionModifier
503
:WhereClause (if FieldClause?
504
`(spocq.a:|join| (spocq.a:|bindings| ,@FieldClause?) ,WhereClause)
506
(4 (destructuring-bind (FieldClause? SelectClause SolutionModifier WhereClause) args
507
(org.datagraph.spocq.sparql-1-0-2::construct-select :SelectClause SelectClause
508
:SolutionModifier SolutionModifier
509
:WhereClause (if FieldClause?
510
`(spocq.a:|join| (spocq.a:|bindings| ,@FieldClause?) ,WhereClause)
514
(defun |TriplesBlockRest-Constructor| (TriplesSameSubject)
517
(defun |TriplesTemplateRest-Constructor| (TriplesSameSubject)
520
(defun |TriplesBlock-Constructor| (TriplesBlockRest* TriplesSameSubject)
521
(flatten-triples (if TriplesBlockRest*
522
(append TriplesSameSubject TriplesBlockRest*)
523
TriplesSameSubject)))
526
(defun |TriplesTemplate-Constructor| (TriplesSameSubject TriplesTemplateRest*)
527
(flatten-triples (if TriplesTemplateRest*
528
(append TriplesSameSubject TriplesTemplateRest*)
529
TriplesSameSubject)))
531
(defun |TriplesOrQuads-Constructor| (QuadsNotTriples TriplesTemplate)
532
(or QuadsNotTriples TriplesTemplate))
534
(defun |TriplesSameSubject-Constructor| (Annotation PropertyList PropertyListNotEmpty TriplesNode VarOrTermOrGroup)
535
;; PropertyList PropertyListNotEmpty are different non-terminals for the same form in different contexts
536
(flet ((generate-triples (subject verb-object-list)
537
(loop for (verb object) in verb-object-list
538
append (if (consp object)
539
(cond ((bgp-form-p object) ;; if it is a nested bgp, leave it
540
`((spocq.a:|triple| ,subject ,verb ,object)))
541
((triple-form-p object) ;; integrate a single triple
542
(cons `(spocq.a:|triple| ,subject ,verb ,(second object))
544
(t ;; extract the subject from a same-subject list
545
(unless (triple-form-p (first object))
546
(warn "invalid TriplesSameSubject object: ~s" object))
547
(cons `(spocq.a:|triple| ,subject ,verb ,(second (first object)))
549
`((spocq.a:|triple| ,subject ,verb ,object))))))
550
(let ((triples (cond (TriplesNode
551
(if (eq TriplesNode '|rdf|:|nil|)
552
(loop for (verb object) in PropertyList
553
collect `(spocq.a:|triple| ,TriplesNode ,verb ,object))
555
(append (generate-triples (second (first TriplesNode)) PropertyList)
559
;; expand the property lists. these will be either simple verb object, or verb with nested object
560
(generate-triples VarOrTermOrGroup PropertyListNotEmpty))
562
(error "One of |TriplesNode| |VarOrTermOrGroup| is required.")))))
564
(generate-triples (cons 'spocq.a:|bgp| triples) Annotation)
567
(defun |TriplesTemplate-Constructor| (TriplesSameSubject TriplesTemplate)
568
(append (flatten-triples TriplesSameSubject) TriplesTemplate))
570
(defun |Sparql-Constructor| (Prologue* Query Update)
571
(declare (ignore Prologue*))
574
(defun |Update-Constructor| (Update? Update1)
575
`(spocq.a:|update| ,Update1 ,@(cdr Update?)))
577
(defun |Update1-Constructor| (Add Clear Copy DeleteData DeleteWhere Drop Create InsertData Load Modify Move)
578
(or Add Clear Copy DeleteData DeleteWhere Drop Create InsertData Load Modify Move))
580
(defun |UsingClause-Constructor| (IRIref NamedIRIref)
584
`(:using-named ,NamedIRIref))
586
(assert (or IRIref NamedIRIref) ()
587
"Invalid reduction (UsingClause): One of IRIref NamedIRIref is required."))))
589
(defun |ValuesClause-Constructor| (clause)
592
(defun |ValuesData-Constructor| (BindingList* BindingValue* Var VarList)
594
;; a single variable with one value per solution
595
(|BindingsClause-Constructor| (mapcar #'list BindingValue*) (list Var)))
597
(|BindingsClause-Constructor| BindingList* VarList))
599
;; provide a null field
600
(|BindingsClause-Constructor| nil nil))))
602
(defun |VarList-Constructor| (Var*)
603
;; do not reverse it, the bindings clause constructor reverses both arguments
606
(defun |VariableOrBindingOrAggregate-Constructor| (Aggregate Expression Var)
608
(let ((operator (first aggregate)))
609
`(,(cons-symbol *variable-package* (string operator) (princ-to-string (next-variable-index)))
615
(defun |VARNAME-Constructor| (item)
618
(defun |VarOrTermOrGroup-Constructor| (|GraphTerm| |GroupTemplate| |Var|)
619
(or |GraphTerm| |GroupTemplate| |Var|))
621
(defun |VarOrTerm-Constructor| (|GraphTerm| |Var|)
622
(or |GraphTerm| |Var|))
624
(defun |ObjectVarOrTermOrGroup-Constructor| (VarOrTermOrGroup)
627
(defun |SubjectVarOrTermOrGroup-Constructor| (VarOrTermOrGroup)
630
(defun |Verb-Constructor| (ConstrainedBlankNode Path VarOrIRIref)
631
"Add the option of a constrained blank node as a verb"
632
(or ConstrainedBlankNode Path VarOrIRIref |http://www.w3.org/1999/02/22-rdf-syntax-ns#|:|type|))
635
(defclass sparql-atn (bnfp:atn)
651
|PathNegatedPropertySet|
652
|PathOneInPropertySet|
655
:reader atn-ambiguous-rules)))
657
(defmethod bnfp::atn-ambiguous ((node sparql-atn) current-state)
658
(if (member (bnfp:atn-name node) (atn-ambiguous-rules node))
664
;;; to translate the bnf into lisp
665
;;; likely in a listener as this file's package does not exist at the outset
666
;;; is may already be present in the image
667
(asdf:load-system :de.setf.atn-parser)
668
(asdf:load-system :de.setf.utility.codecs)
669
(asdf:load-system :cl-ppcre)
670
(setq atnp::*wfst-size* 3200)
671
(setq atnp::*wfst* (make-array atnp::*wfst-size* :initial-element nil))
672
(load #p"P-LIBRARY:org;datagraph;spocq-page-ring;src;core;package.lisp") ; may fail, missing packages
673
(load #p"P-LIBRARY:org;datagraph;spocq-page-ring;src;core;encoding;package-1-0.lisp")
674
(load #p"P-LIBRARY:org;datagraph;spocq-page-ring;src;core;encoding;package-1-0-1.lisp")
675
(load #p"P-LIBRARY:org;datagraph;spocq-page-ring;src;core;encoding;package-1-0-2.lisp")
676
(load #p"P-LIBRARY:org;datagraph;spocq-page-ring;src;core;encoding;package-1-0-3.lisp")
677
(load #p"P-LIBRARY:org;datagraph;spocq-page-ring;src;core;encoding;package-1-0-4.lisp")
678
(load #p"P-LIBRARY:org;datagraph;spocq-page-ring;src;core;encoding;ssf-sparql-lexer.lisp")
680
(in-package :SPARQL-1-0-4) ;; 1-0-5 is in the same package
681
;; load any constructor extensions
682
;; (load #p"/development/source/library/org/datagraph/spocq/src/patches/20151006-sub-describe.lisp")
683
(let ((bnfp:*class.atn* 'sparql-atn)
684
(bnfp:*class.atn-node* bnfp:*class.atn-node*)
685
(bnfp:*class.cat-atn-edge* bnfp:*class.cat-atn-edge*)
686
(bnfp:*class.pop-atn-edge* bnfp:*class.pop-atn-edge*)
687
(bnfp:*class.push-atn-edge* bnfp:*class.push-atn-edge*)
688
(bnfp:*class.test-atn-edge* bnfp:*class.test-atn-edge*))
689
(bnfp:compile-atn-system ;; #p"P-LIBRARY:org;datagraph;spocq-page-ring;src;core;encoding;sparql-1-0-4.bnf"
690
;; #p"org/datagraph/spocq/src/core/encoding/sparql-1-0-4.bnf"
691
;; #p"org/datagraph/spocq-dev/src/core/encoding/sparql-1-0-5.bnf"
692
#p"org/datagraph/spocq-dev/src/core/encoding/sparql-1-0-5-formula.bnf"
693
:execute t :compile nil
694
:token-package (find-package :spocq.s)
695
:source-package (find-package :sparql-1-0-4)
696
:source-pathname "LIBRARY:org;datagraph;spocq-dev;src;core;encoding;sparql-1-0-5-formula.lisp"
697
:input-function 'input-reference
698
:input-eof-function 'input-eof?
699
:ambiguous t ; the property paths make it ambiguous
703
;;; to compile the parser state machine manually
704
(load (compile-file #p"LIBRARY:org;datagraph;spocq-dev;src;core;encoding;sparql-1-0-5.lisp"))
708
;;; generate the grammar's atn definition
709
(let ((bnfp:*class.atn* bnfp:*class.atn*)
710
(bnfp:*class.atn-node* bnfp:*class.atn-node*)
711
(bnfp:*class.cat-atn-edge* bnfp:*class.cat-atn-edge*)
712
(bnfp:*class.pop-atn-edge* bnfp:*class.pop-atn-edge*)
713
(bnfp:*class.push-atn-edge* bnfp:*class.push-atn-edge*)
714
(bnfp:*class.test-atn-edge* bnfp:*class.test-atn-edge*))
715
(atnp::print-atn-system #p"LIBRARY:org;datagraph;spocq;src;core;encoding;sparql-1-0-4.bnf"
716
:source-package (find-package :sparql-1-0-4)))
718
(let ((bnfp:*class.atn* bnfp:*class.atn*)
719
(bnfp:*class.atn-node* bnfp:*class.atn-node*)
720
(bnfp:*class.cat-atn-edge* bnfp:*class.cat-atn-edge*)
721
(bnfp:*class.pop-atn-edge* bnfp:*class.pop-atn-edge*)
722
(bnfp:*class.push-atn-edge* bnfp:*class.push-atn-edge*)
723
(bnfp:*class.test-atn-edge* bnfp:*class.test-atn-edge*))
724
(atnp::graph-atn-system #p"LIBRARY:org;datagraph;spocq;src;core;encoding;sparql-1-0-4.bnf"
725
:source-package (find-package :sparql-1-0-4)))
727
;;; 2018-02-05 test aggregation extensions
728
(spocq.i::parse-sparql "select (corr(strlen(str(?s1)), strlen(str(?s2))) as ?corr) where {?s ?pred ?s1 . ?s ?pred ?s2}")
729
(spocq.i::test-sparql "select (corr(strlen(str(?s1)), strlen(str(?s2))) as ?corr) where {?s ?pred ?s1 . ?s ?pred ?s2}"
730
:repository-id "james/foaf")
733
(parse-sparql "select *
735
_:s1 <http://example.org/predicate> 3 .
738
;;; original syntax with blank node subject
740
(parse-sparql "select *
742
[ <http://example.org/superpred1> 0 , 1 ;
743
<http://example.org/superpred2> 2]
744
<http://example.org/predicate> 3 .
749
{??1 <http://example.org/predicate> 3}
750
{??1 <http://example.org/superpred1> 0}
751
{??1 <http://example.org/superpred1> 1}
752
{??1 <http://example.org/superpred2> 2})
759
(parse-sparql "select *
761
{_:f1 <http://example.org/superpred1> 0 , 1 ;
762
<http://example.org/superpred2> 2}
763
<http://example.org/predicate> 3 .
768
{(bgp (triple <_:f1> <http://example.org/superpred1> 0) (triple <_:f1> <http://example.org/superpred1> 1) (triple <_:f1> <http://example.org/superpred2> 2)) <http://example.org/predicate> 3})
774
(parse-sparql "select *
776
<<_:f1 <http://example.org/superpred1> 0 >>
777
<http://example.org/predicate> 3 .
782
{(bgp (triple <_:f1> <http://example.org/superpred1> 0)) <http://example.org/predicate> 3})
786
;;; original syntax w/ blank node object
788
(parse-sparql "select *
790
<http://example.org/subject>
791
<http://example.org/predicate>
792
[<http://example.org/superpred1> 0 , 1 ;
793
<http://example.org/superpred2> 2].
798
{<http://example.org/subject> <http://example.org/predicate> ??1}
799
{??1 <http://example.org/superpred1> 0}
800
{??1 <http://example.org/superpred1> 1}
801
{??1 <http://example.org/superpred2> 2})
807
(parse-sparql "select *
809
<http://example.org/subject>
810
<http://example.org/predicate>
811
{_:f1 <http://example.org/superpred1> 0 , 1 ;
812
<http://example.org/superpred2> 2}.
817
{<http://example.org/subject> <http://example.org/predicate> (bgp (triple <_:f1> <http://example.org/superpred1> 0) (triple <_:f1> <http://example.org/superpred1> 1) (triple <_:f1> <http://example.org/superpred2> 2))})
823
(parse-sparql "select *
825
<http://example.org/subject>
826
<http://example.org/predicate>
827
<<_:f1 <http://example.org/superpred1> 0 >>.
832
{<http://example.org/subject> <http://example.org/predicate> (bgp (triple <_:f1> <http://example.org/superpred1> 0))})
837
(parse-sparql "select *
839
<http://example.org/subject> <http://example.org/predicate>
840
{_:f1 <http://example.org/subpred1>
841
{ _:f2 <http://example.org/subpred2> ?o } }
846
{<http://example.org/subject> <http://example.org/predicate> (bgp (triple <_:f1> <http://example.org/subpred1> (bgp (triple <_:f2> <http://example.org/subpred2> ?::o))))})
854
<http://example.org/subject> <http://example.org/predicate> <http://example.org/object>
855
{ <http://example.org/subpred1> ?o }
858
(send-response-message :query (parse-sparql "
861
<http://example.org/subject> <http://example.org/predicate> <http://example.org/object>
862
{ <http://example.org/subpred1> ?o }
863
}") *trace-output* mime:application/vnd.dydra.sparql-query-algebra)
867
{(bgp (triple <http://example.org/subject> <http://example.org/predicate> <http://example.org/object>)) <http://example.org/subpred1> ?o})
870
(parse-term "{ <http://example.org/subpred1> ?o }" :production 'org.datagraph.spocq.sparql-1-0-4::|Annotation|)
872
((<http://example.org/subpred1> ?::|o|))
876
<http://example.org/subject> <http://example.org/predicate> <http://example.org/object>
877
{ <http://example.org/subpred1> ?o }"
878
:production 'org.datagraph.spocq.sparql-1-0-4::|TriplesSameSubject|))
880
({(bgp (triple <http://example.org/subject> <http://example.org/predicate> <http://example.org/object>)) <http://example.org/subpred1> ?o})
882
((ORG.DATAGRAPH.SPOCQ.ALGEBRA:|triple|
883
(ORG.DATAGRAPH.SPOCQ.ALGEBRA:|bgp|
884
(ORG.DATAGRAPH.SPOCQ.ALGEBRA:|triple| <http://example.org/subject>
885
<http://example.org/predicate>
886
<http://example.org/object>))
887
<http://example.org/subpred1> ?::|o|))
889
(send-response-message :query (parse-sparql "
890
prefix star: <http://rdf-star/>
893
<http://e.o/subject> star:p/star:q <http://e.o/object>
894
{ <http://e.o/r> ?o }
895
}") *trace-output* mime:application/vnd.dydra.sparql-query-algebra)
897
Project(BGP( BGP( <http://example.org/subject> (<https://github.com/w3c/rdf-star/p>/<https://github.com/w3c/rdf-star/q>) <http://example.org/object>) <http://example.org/subpred1> ?o),
901
(send-response-message :query (parse-sparql "
902
prefix : <http://rdf-star/>
903
ASK { ?x :p* ?y { :a :b }
904
}") *trace-output* mime:application/vnd.dydra.sparql-query-algebra)