sparql 3.1.6 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +31 -22
  3. data/VERSION +1 -1
  4. data/bin/sparql +14 -4
  5. data/lib/sparql/algebra/aggregate.rb +1 -1
  6. data/lib/sparql/algebra/evaluatable.rb +4 -4
  7. data/lib/sparql/algebra/expression.rb +28 -3
  8. data/lib/sparql/algebra/extensions.rb +109 -45
  9. data/lib/sparql/algebra/operator/abs.rb +23 -3
  10. data/lib/sparql/algebra/operator/add.rb +21 -2
  11. data/lib/sparql/algebra/operator/alt.rb +26 -2
  12. data/lib/sparql/algebra/operator/and.rb +25 -3
  13. data/lib/sparql/algebra/operator/asc.rb +20 -1
  14. data/lib/sparql/algebra/operator/ask.rb +17 -1
  15. data/lib/sparql/algebra/operator/avg.rb +20 -2
  16. data/lib/sparql/algebra/operator/base.rb +18 -1
  17. data/lib/sparql/algebra/operator/bgp.rb +13 -1
  18. data/lib/sparql/algebra/operator/bnode.rb +34 -11
  19. data/lib/sparql/algebra/operator/bound.rb +22 -1
  20. data/lib/sparql/algebra/operator/ceil.rb +26 -3
  21. data/lib/sparql/algebra/operator/clear.rb +26 -2
  22. data/lib/sparql/algebra/operator/coalesce.rb +33 -11
  23. data/lib/sparql/algebra/operator/compare.rb +48 -40
  24. data/lib/sparql/algebra/operator/concat.rb +26 -2
  25. data/lib/sparql/algebra/operator/construct.rb +29 -6
  26. data/lib/sparql/algebra/operator/contains.rb +25 -3
  27. data/lib/sparql/algebra/operator/copy.rb +19 -2
  28. data/lib/sparql/algebra/operator/count.rb +53 -7
  29. data/lib/sparql/algebra/operator/create.rb +20 -2
  30. data/lib/sparql/algebra/operator/dataset.rb +27 -2
  31. data/lib/sparql/algebra/operator/datatype.rb +26 -7
  32. data/lib/sparql/algebra/operator/day.rb +24 -6
  33. data/lib/sparql/algebra/operator/delete.rb +29 -2
  34. data/lib/sparql/algebra/operator/delete_data.rb +23 -2
  35. data/lib/sparql/algebra/operator/delete_where.rb +24 -2
  36. data/lib/sparql/algebra/operator/desc.rb +20 -1
  37. data/lib/sparql/algebra/operator/describe.rb +27 -4
  38. data/lib/sparql/algebra/operator/distinct.rb +20 -3
  39. data/lib/sparql/algebra/operator/divide.rb +27 -3
  40. data/lib/sparql/algebra/operator/drop.rb +27 -3
  41. data/lib/sparql/algebra/operator/encode_for_uri.rb +23 -3
  42. data/lib/sparql/algebra/operator/equal.rb +13 -3
  43. data/lib/sparql/algebra/operator/exists.rb +28 -4
  44. data/lib/sparql/algebra/operator/exprlist.rb +15 -2
  45. data/lib/sparql/algebra/operator/extend.rb +64 -6
  46. data/lib/sparql/algebra/operator/filter.rb +27 -5
  47. data/lib/sparql/algebra/operator/floor.rb +26 -3
  48. data/lib/sparql/algebra/operator/function_call.rb +64 -0
  49. data/lib/sparql/algebra/operator/graph.rb +69 -6
  50. data/lib/sparql/algebra/operator/greater_than.rb +14 -4
  51. data/lib/sparql/algebra/operator/greater_than_or_equal.rb +14 -4
  52. data/lib/sparql/algebra/operator/group.rb +105 -8
  53. data/lib/sparql/algebra/operator/group_concat.rb +44 -8
  54. data/lib/sparql/algebra/operator/hours.rb +24 -6
  55. data/lib/sparql/algebra/operator/if.rb +20 -3
  56. data/lib/sparql/algebra/operator/in.rb +18 -1
  57. data/lib/sparql/algebra/operator/insert.rb +24 -2
  58. data/lib/sparql/algebra/operator/insert_data.rb +23 -2
  59. data/lib/sparql/algebra/operator/iri.rb +22 -5
  60. data/lib/sparql/algebra/operator/is_blank.rb +21 -4
  61. data/lib/sparql/algebra/operator/is_iri.rb +21 -4
  62. data/lib/sparql/algebra/operator/is_literal.rb +21 -4
  63. data/lib/sparql/algebra/operator/is_numeric.rb +23 -6
  64. data/lib/sparql/algebra/operator/is_triple.rb +33 -1
  65. data/lib/sparql/algebra/operator/join.rb +56 -1
  66. data/lib/sparql/algebra/operator/lang.rb +26 -1
  67. data/lib/sparql/algebra/operator/lang_matches.rb +23 -2
  68. data/lib/sparql/algebra/operator/lcase.rb +23 -3
  69. data/lib/sparql/algebra/operator/left_join.rb +42 -1
  70. data/lib/sparql/algebra/operator/less_than.rb +14 -4
  71. data/lib/sparql/algebra/operator/less_than_or_equal.rb +14 -4
  72. data/lib/sparql/algebra/operator/load.rb +25 -2
  73. data/lib/sparql/algebra/operator/max.rb +20 -2
  74. data/lib/sparql/algebra/operator/md5.rb +23 -6
  75. data/lib/sparql/algebra/operator/min.rb +22 -4
  76. data/lib/sparql/algebra/operator/minus.rb +65 -7
  77. data/lib/sparql/algebra/operator/minutes.rb +24 -6
  78. data/lib/sparql/algebra/operator/modify.rb +41 -5
  79. data/lib/sparql/algebra/operator/month.rb +24 -6
  80. data/lib/sparql/algebra/operator/move.rb +20 -2
  81. data/lib/sparql/algebra/operator/multiply.rb +27 -4
  82. data/lib/sparql/algebra/operator/negate.rb +24 -4
  83. data/lib/sparql/algebra/operator/not.rb +25 -4
  84. data/lib/sparql/algebra/operator/not_equal.rb +16 -1
  85. data/lib/sparql/algebra/operator/notexists.rb +30 -6
  86. data/lib/sparql/algebra/operator/notin.rb +20 -3
  87. data/lib/sparql/algebra/operator/notoneof.rb +21 -2
  88. data/lib/sparql/algebra/operator/now.rb +25 -6
  89. data/lib/sparql/algebra/operator/object.rb +33 -1
  90. data/lib/sparql/algebra/operator/or.rb +26 -3
  91. data/lib/sparql/algebra/operator/order.rb +71 -2
  92. data/lib/sparql/algebra/operator/path.rb +29 -2
  93. data/lib/sparql/algebra/operator/path_opt.rb +21 -2
  94. data/lib/sparql/algebra/operator/path_plus.rb +21 -2
  95. data/lib/sparql/algebra/operator/path_star.rb +20 -2
  96. data/lib/sparql/algebra/operator/plus.rb +43 -4
  97. data/lib/sparql/algebra/operator/predicate.rb +33 -1
  98. data/lib/sparql/algebra/operator/prefix.rb +24 -3
  99. data/lib/sparql/algebra/operator/project.rb +69 -5
  100. data/lib/sparql/algebra/operator/rand.rb +31 -3
  101. data/lib/sparql/algebra/operator/reduced.rb +20 -3
  102. data/lib/sparql/algebra/operator/regex.rb +27 -19
  103. data/lib/sparql/algebra/operator/replace.rb +27 -7
  104. data/lib/sparql/algebra/operator/reverse.rb +31 -2
  105. data/lib/sparql/algebra/operator/round.rb +26 -3
  106. data/lib/sparql/algebra/operator/same_term.rb +25 -7
  107. data/lib/sparql/algebra/operator/sample.rb +33 -9
  108. data/lib/sparql/algebra/operator/seconds.rb +24 -6
  109. data/lib/sparql/algebra/operator/seq.rb +20 -2
  110. data/lib/sparql/algebra/operator/sequence.rb +4 -11
  111. data/lib/sparql/algebra/operator/sha1.rb +19 -2
  112. data/lib/sparql/algebra/operator/sha256.rb +19 -2
  113. data/lib/sparql/algebra/operator/sha384.rb +19 -2
  114. data/lib/sparql/algebra/operator/sha512.rb +19 -2
  115. data/lib/sparql/algebra/operator/slice.rb +27 -5
  116. data/lib/sparql/algebra/operator/str.rb +22 -2
  117. data/lib/sparql/algebra/operator/strafter.rb +26 -3
  118. data/lib/sparql/algebra/operator/strbefore.rb +26 -3
  119. data/lib/sparql/algebra/operator/strdt.rb +23 -2
  120. data/lib/sparql/algebra/operator/strends.rb +26 -4
  121. data/lib/sparql/algebra/operator/strlang.rb +25 -7
  122. data/lib/sparql/algebra/operator/strlen.rb +24 -3
  123. data/lib/sparql/algebra/operator/strstarts.rb +26 -3
  124. data/lib/sparql/algebra/operator/struuid.rb +30 -10
  125. data/lib/sparql/algebra/operator/subject.rb +33 -1
  126. data/lib/sparql/algebra/operator/substr.rb +24 -3
  127. data/lib/sparql/algebra/operator/subtract.rb +29 -3
  128. data/lib/sparql/algebra/operator/sum.rb +25 -7
  129. data/lib/sparql/algebra/operator/table.rb +76 -4
  130. data/lib/sparql/algebra/operator/timezone.rb +24 -6
  131. data/lib/sparql/algebra/operator/tz.rb +23 -6
  132. data/lib/sparql/algebra/operator/ucase.rb +24 -3
  133. data/lib/sparql/algebra/operator/union.rb +29 -6
  134. data/lib/sparql/algebra/operator/update.rb +46 -4
  135. data/lib/sparql/algebra/operator/using.rb +49 -2
  136. data/lib/sparql/algebra/operator/uuid.rb +28 -9
  137. data/lib/sparql/algebra/operator/with.rb +38 -4
  138. data/lib/sparql/algebra/operator/year.rb +24 -6
  139. data/lib/sparql/algebra/operator.rb +135 -14
  140. data/lib/sparql/algebra/sxp_extensions.rb +3 -3
  141. data/lib/sparql/algebra.rb +20 -3
  142. data/lib/sparql/grammar/meta.rb +1103 -907
  143. data/lib/sparql/grammar/parser11.rb +63 -56
  144. metadata +43 -29
  145. data/lib/sparql/algebra/operator/triple.rb +0 -27
@@ -3,13 +3,26 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL `sample` set function.
5
5
  #
6
- # @example
7
- # (prefix ((: <http://www.example.org/>))
8
- # (filter (|| (|| (= ?sample 1.0) (= ?sample 2.2)) (= ?sample 3.5))
9
- # (project (?sample)
10
- # (extend ((?sample ??.0))
11
- # (group () ((??.0 (sample ?o)))
12
- # (bgp (triple ?s :dec ?o)))))))
6
+ # [127] Aggregate::= ... | 'SAMPLE' '(' 'DISTINCT'? Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example/>
10
+ #
11
+ # SELECT ?w (SAMPLE(?v) AS ?S)
12
+ # {
13
+ # ?s :p ?v .
14
+ # OPTIONAL { ?s :q ?w }
15
+ # }
16
+ # GROUP BY ?w
17
+ #
18
+ # @example SSE
19
+ # (prefix ((: <http://example/>))
20
+ # (project (?w ?S)
21
+ # (extend ((?S ??.0))
22
+ # (group (?w) ((??.0 (sample ?v)))
23
+ # (leftjoin
24
+ # (bgp (triple ?s :p ?v))
25
+ # (bgp (triple ?s :q ?w))))) ))
13
26
  #
14
27
  # @see https://www.w3.org/TR/sparql11-query/#defn_aggSample
15
28
  class Sample < Operator
@@ -31,9 +44,20 @@ module SPARQL; module Algebra
31
44
  # enum of evaluated operand
32
45
  # @return [RDF::Term] An arbitrary term
33
46
  # @raise [TypeError] If enum is empty
34
- def apply(enum)
47
+ def apply(enum, **options)
35
48
  enum.detect(lambda {raise TypeError, "Sampling an empty multiset"}) {|e| e.first}.first
36
49
  end
37
- end # LCase
50
+
51
+ ##
52
+ #
53
+ # Returns a partial SPARQL grammar for this operator.
54
+ #
55
+ # @return [String]
56
+ def to_sparql(**options)
57
+ distinct = operands.first == :distinct
58
+ args = distinct ? operands[1..-1] : operands
59
+ "SAMPLE(#{'DISTINCT ' if distinct}#{args.to_sparql(**options)})"
60
+ end
61
+ end # Sample
38
62
  end # Operator
39
63
  end; end # SPARQL::Algebra
@@ -5,11 +5,20 @@ module SPARQL; module Algebra
5
5
  #
6
6
  # Returns the seconds part of the lexical form of `arg`.
7
7
  #
8
- # @example
9
- # (prefix ((: <http://example.org/>))
10
- # (project (?s ?x)
11
- # (extend ((?x (seconds ?date)))
12
- # (bgp (triple ?s :date ?date)))))
8
+ # [121] BuiltInCall ::= ... | 'SECONDS' '(' Expression ')'
9
+ #
10
+ # @example SPARQL Grammar
11
+ # PREFIX : <http://example.org/>
12
+ # SELECT ?s (SECONDS(?date) AS ?x) WHERE {
13
+ # ?s :date ?date
14
+ # }
15
+ #
16
+ # @example SSE
17
+ # (prefix
18
+ # ((: <http://example.org/>))
19
+ # (project (?s ?x)
20
+ # (extend ((?x (seconds ?date)))
21
+ # (bgp (triple ?s :date ?date)))))
13
22
  #
14
23
  # @see https://www.w3.org/TR/sparql11-query/#func-seconds
15
24
  class Seconds < Operator::Unary
@@ -24,10 +33,19 @@ module SPARQL; module Algebra
24
33
  # the operand
25
34
  # @return [RDF::Literal]
26
35
  # @raise [TypeError] if the operand is not a simple literal
27
- def apply(operand)
36
+ def apply(operand, **options)
28
37
  raise TypeError, "expected an RDF::Literal::DateTime, but got #{operand.inspect}" unless operand.is_a?(RDF::Literal::DateTime)
29
38
  RDF::Literal(operand.object.second)
30
39
  end
40
+
41
+ ##
42
+ #
43
+ # Returns a partial SPARQL grammar for this operator.
44
+ #
45
+ # @return [String]
46
+ def to_sparql(**options)
47
+ "SECONDS(#{operands.last.to_sparql(**options)})"
48
+ end
31
49
  end # Seconds
32
50
  end # Operator
33
51
  end; end # SPARQL::Algebra
@@ -3,8 +3,17 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL Property Path `sequence` (SequencePath) operator.
5
5
  #
6
- # @example
7
- # (seq :a :b)
6
+ # # [90] PathSequence ::= PathEltOrInverse ( '/' PathEltOrInverse )*
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX ex: <http://www.example.org/schema#>
10
+ # PREFIX in: <http://www.example.org/instance#>
11
+ # SELECT * WHERE { in:a ex:p1/ex:p2 ?x }
12
+ #
13
+ # @example SSE
14
+ # (prefix ((ex: <http://www.example.org/schema#>)
15
+ # (in: <http://www.example.org/instance#>))
16
+ # (path in:a (seq ex:p1 ex:p2) ?x))
8
17
  #
9
18
  # @see https://www.w3.org/TR/sparql11-query/#defn_evalPP_sequence
10
19
  class Seq < Operator::Binary
@@ -67,6 +76,15 @@ module SPARQL; module Algebra
67
76
  @solutions.each(&block) if block_given?
68
77
  @solutions
69
78
  end
79
+
80
+ ##
81
+ #
82
+ # Returns a partial SPARQL grammar for this operator.
83
+ #
84
+ # @return [String]
85
+ def to_sparql(**options)
86
+ '(' + operands.to_sparql(delimiter: '/', **options) + ')'
87
+ end
70
88
  end # Seq
71
89
  end # Operator
72
90
  end; end # SPARQL::Algebra
@@ -4,18 +4,11 @@ module SPARQL; module Algebra
4
4
  ##
5
5
  # The SPARQL UPDATE `sequence` operator.
6
6
  #
7
- # Sequences through each operand
7
+ # Sequences through each operand.
8
8
  #
9
- # @example
10
- # (sequence
11
- # (bgp
12
- # (triple ?s ?p ??0)
13
- # (triple ??0 rdf:first ??1)
14
- # (triple ??0 rdf:rest ??2)
15
- # (triple ??2 rdf:first ??3)
16
- # (triple ??2 rdf:rest rdf:nil))
17
- # (path ??1 (seq (path* :p) :q) 123)
18
- # (path ??3 (reverse :r) "hello"))
9
+ # [103] CollectionPath ::= '(' GraphNodePath+ ')'
10
+ #
11
+ # @see https://www.w3.org/TR/sparql11-query/#collections
19
12
  class Sequence < Operator
20
13
  include SPARQL::Algebra::Update
21
14
 
@@ -7,7 +7,15 @@ module SPARQL; module Algebra
7
7
  #
8
8
  # Returns the SHA1 checksum, as a hex digit string, calculated on the UTF-8 representation of the simple literal or lexical form of the `xsd:string`. Hex digits `SHOULD` be in lower case.
9
9
  #
10
- # @example
10
+ # [121] BuiltInCall ::= ... | 'SHA1' '(' Expression ')'
11
+ #
12
+ # @example SPARQL Grammar
13
+ # PREFIX : <http://example.org/>
14
+ # SELECT (SHA1(?l) AS ?hash) WHERE {
15
+ # :s1 :str ?l
16
+ # }
17
+ #
18
+ # @example SSE
11
19
  # (prefix ((: <http://example.org/>))
12
20
  # (project (?hash)
13
21
  # (extend ((?hash (sha1 ?l)))
@@ -26,11 +34,20 @@ module SPARQL; module Algebra
26
34
  # the operand
27
35
  # @return [RDF::Literal]
28
36
  # @raise [TypeError] if the operand is not a simple literal
29
- def apply(operand)
37
+ def apply(operand, **options)
30
38
  raise TypeError, "expected an RDF::Literal, but got #{operand.inspect}" unless operand.literal?
31
39
  raise TypeError, "expected simple literal or xsd:string, but got #{operand.inspect}" unless (operand.datatype || RDF::XSD.string) == RDF::XSD.string
32
40
  RDF::Literal(Digest::SHA1.new.hexdigest(operand.to_s))
33
41
  end
42
+
43
+ ##
44
+ #
45
+ # Returns a partial SPARQL grammar for this operator.
46
+ #
47
+ # @return [String]
48
+ def to_sparql(**options)
49
+ "SHA1(" + operands.to_sparql(**options) + ")"
50
+ end
34
51
  end # SHA1
35
52
  end # Operator
36
53
  end; end # SPARQL::Algebra
@@ -7,7 +7,15 @@ module SPARQL; module Algebra
7
7
  #
8
8
  # Returns the SHA256 checksum, as a hex digit string, calculated on the UTF-8 representation of the simple literal or lexical form of the `xsd:string`. Hex digits `SHOULD` be in lower case.
9
9
  #
10
- # @example
10
+ # [121] BuiltInCall ::= ... | 'SHA256' '(' Expression ')'
11
+ #
12
+ # @example SPARQL Grammar
13
+ # PREFIX : <http://example.org/>
14
+ # SELECT (SHA256(?l) AS ?hash) WHERE {
15
+ # :s1 :str ?l
16
+ # }
17
+ #
18
+ # @example SSE
11
19
  # (prefix ((: <http://example.org/>))
12
20
  # (project (?hash)
13
21
  # (extend ((?hash (sha256 ?l)))
@@ -26,11 +34,20 @@ module SPARQL; module Algebra
26
34
  # the operand
27
35
  # @return [RDF::Literal]
28
36
  # @raise [TypeError] if the operand is not a simple literal
29
- def apply(operand)
37
+ def apply(operand, **options)
30
38
  raise TypeError, "expected an RDF::Literal, but got #{operand.inspect}" unless operand.literal?
31
39
  raise TypeError, "expected simple literal or xsd:string, but got #{operand.inspect}" unless (operand.datatype || RDF::XSD.string) == RDF::XSD.string
32
40
  RDF::Literal(Digest::SHA256.new.hexdigest(operand.to_s))
33
41
  end
42
+
43
+ ##
44
+ #
45
+ # Returns a partial SPARQL grammar for this operator.
46
+ #
47
+ # @return [String]
48
+ def to_sparql(**options)
49
+ "SHA256(" + operands.to_sparql(**options) + ")"
50
+ end
34
51
  end # SHA256
35
52
  end # Operator
36
53
  end; end # SPARQL::Algebra
@@ -7,7 +7,15 @@ module SPARQL; module Algebra
7
7
  #
8
8
  # Returns the SHA384 checksum, as a hex digit string, calculated on the UTF-8 representation of the simple literal or lexical form of the `xsd:string`. Hex digits `SHOULD` be in lower case.
9
9
  #
10
- # @example
10
+ # [121] BuiltInCall ::= ... | 'SHA384' '(' Expression ')'
11
+ #
12
+ # @example SPARQL Grammar
13
+ # PREFIX : <http://example.org/>
14
+ # SELECT (SHA384(?l) AS ?hash) WHERE {
15
+ # :s1 :str ?l
16
+ # }
17
+ #
18
+ # @example SSE
11
19
  # (prefix ((: <http://example.org/>))
12
20
  # (project (?hash)
13
21
  # (extend ((?hash (sha384 ?l)))
@@ -26,11 +34,20 @@ module SPARQL; module Algebra
26
34
  # the operand
27
35
  # @return [RDF::Literal]
28
36
  # @raise [TypeError] if the operand is not a simple literal
29
- def apply(operand)
37
+ def apply(operand, **options)
30
38
  raise TypeError, "expected an RDF::Literal, but got #{operand.inspect}" unless operand.literal?
31
39
  raise TypeError, "expected simple literal or xsd:string, but got #{operand.inspect}" unless (operand.datatype || RDF::XSD.string) == RDF::XSD.string
32
40
  RDF::Literal(Digest::SHA384.new.hexdigest(operand.to_s))
33
41
  end
42
+
43
+ ##
44
+ #
45
+ # Returns a partial SPARQL grammar for this operator.
46
+ #
47
+ # @return [String]
48
+ def to_sparql(**options)
49
+ "SHA384(" + operands.to_sparql(**options) + ")"
50
+ end
34
51
  end # SHA384
35
52
  end # Operator
36
53
  end; end # SPARQL::Algebra
@@ -7,7 +7,15 @@ module SPARQL; module Algebra
7
7
  #
8
8
  # Returns the SHA512 checksum, as a hex digit string, calculated on the UTF-8 representation of the simple literal or lexical form of the `xsd:string`. Hex digits `SHOULD` be in lower case.
9
9
  #
10
- # @example
10
+ # [121] BuiltInCall ::= ... | 'SHA512' '(' Expression ')'
11
+ #
12
+ # @example SPARQL Grammar
13
+ # PREFIX : <http://example.org/>
14
+ # SELECT (SHA512(?l) AS ?hash) WHERE {
15
+ # :s1 :str ?l
16
+ # }
17
+ #
18
+ # @example SSE
11
19
  # (prefix ((: <http://example.org/>))
12
20
  # (project (?hash)
13
21
  # (extend ((?hash (sha512 ?l)))
@@ -26,11 +34,20 @@ module SPARQL; module Algebra
26
34
  # the operand
27
35
  # @return [RDF::Literal]
28
36
  # @raise [TypeError] if the operand is not a simple literal
29
- def apply(operand)
37
+ def apply(operand, **options)
30
38
  raise TypeError, "expected an RDF::Literal, but got #{operand.inspect}" unless operand.literal?
31
39
  raise TypeError, "expected simple literal or xsd:string, but got #{operand.inspect}" unless (operand.datatype || RDF::XSD.string) == RDF::XSD.string
32
40
  RDF::Literal(Digest::SHA512.new.hexdigest(operand.to_s))
33
41
  end
42
+
43
+ ##
44
+ #
45
+ # Returns a partial SPARQL grammar for this operator.
46
+ #
47
+ # @return [String]
48
+ def to_sparql(**options)
49
+ "SHA512(" + operands.to_sparql(**options) + ")"
50
+ end
34
51
  end # SHA512
35
52
  end # Operator
36
53
  end; end # SPARQL::Algebra
@@ -3,12 +3,23 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL GraphPattern `slice` operator.
5
5
  #
6
- # @example
6
+ # [25] LimitOffsetClauses ::= LimitClause OffsetClause? | OffsetClause LimitClause?
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/ns#>
10
+ #
11
+ # SELECT ?v
12
+ # WHERE { :a ?p ?v }
13
+ # ORDER BY ?v
14
+ # OFFSET 100
15
+ # LIMIT 1
16
+ #
17
+ # @example SSE
7
18
  # (prefix ((: <http://example.org/ns#>))
8
- # (slice 1 1
9
- # (project (?v)
10
- # (order (?v)
11
- # (bgp (triple ??0 :num ?v))))))
19
+ # (slice 100 1
20
+ # (project (?v)
21
+ # (order (?v)
22
+ # (bgp (triple :a ?p ?v))))))
12
23
  #
13
24
  # @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
14
25
  class Slice < Operator::Ternary
@@ -52,6 +63,17 @@ module SPARQL; module Algebra
52
63
  @solutions.each(&block) if block_given?
53
64
  @solutions
54
65
  end
66
+
67
+ ##
68
+ #
69
+ # Extracts OFFSET and LIMIT.
70
+ #
71
+ # @return [String]
72
+ def to_sparql(**options)
73
+ offset = operands[0].to_i unless operands[0] == :_
74
+ limit = operands[1].to_i unless operands[1] == :_
75
+ operands.last.to_sparql(offset: offset, limit: limit, **options)
76
+ end
55
77
  end # Slice
56
78
  end # Operator
57
79
  end; end # SPARQL::Algebra
@@ -3,7 +3,18 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL `str` operator.
5
5
  #
6
- # @example
6
+ # [121] BuiltInCall ::= ... | 'STR' '(' Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
10
+ # PREFIX : <http://example.org/things#>
11
+ # SELECT ?x ?v
12
+ # WHERE
13
+ # { ?x :p ?v .
14
+ # FILTER ( str(?v) = "1" ) .
15
+ # }
16
+ #
17
+ # @example SSE
7
18
  # (prefix ((xsd: <http://www.w3.org/2001/XMLSchema#>)
8
19
  # (: <http://example.org/things#>))
9
20
  # (project (?x ?v)
@@ -23,13 +34,22 @@ module SPARQL; module Algebra
23
34
  # a literal or IRI
24
35
  # @return [RDF::Literal] a simple literal
25
36
  # @raise [TypeError] if the operand is not a literal or IRI
26
- def apply(term)
37
+ def apply(term, **options)
27
38
  case term
28
39
  when RDF::Literal then RDF::Literal(term.value)
29
40
  when RDF::URI then RDF::Literal(term.to_s)
30
41
  else raise TypeError, "expected an RDF::Literal or RDF::URI, but got #{term.inspect}"
31
42
  end
32
43
  end
44
+
45
+ ##
46
+ #
47
+ # Returns a partial SPARQL grammar for this operator.
48
+ #
49
+ # @return [String]
50
+ def to_sparql(**options)
51
+ "str(" + operands.first.to_sparql(**options) + ")"
52
+ end
33
53
  end # Str
34
54
  end # Operator
35
55
  end; end # SPARQL::Algebra
@@ -3,8 +3,22 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # A SPARQL `strafter` operator.
5
5
  #
6
- # @example
7
- # (strafter ?x ?y)
6
+ # [121] BuiltInCall ::= ... | 'STRAFTER' '(' Expression ',' Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
11
+ # SELECT ?s (STRAFTER(?str,"e") AS ?suffix) WHERE {
12
+ # ?s :str ?str
13
+ # }
14
+ #
15
+ # @example SSE
16
+ # (prefix
17
+ # ((: <http://example.org/>)
18
+ # (xsd: <http://www.w3.org/2001/XMLSchema#>))
19
+ # (project (?s ?suffix)
20
+ # (extend ((?suffix (strafter ?str "e")))
21
+ # (bgp (triple ?s :str ?str)))))
8
22
  #
9
23
  # @see https://www.w3.org/TR/sparql11-query/#func-strafter
10
24
  # @see https://www.w3.org/TR/xpath-functions/#func-substring-after
@@ -37,7 +51,7 @@ module SPARQL; module Algebra
37
51
  # a literal
38
52
  # @return [RDF::Literal]
39
53
  # @raise [TypeError] if operands are not compatible
40
- def apply(left, right)
54
+ def apply(left, right, **options)
41
55
  case
42
56
  when !left.compatible?(right)
43
57
  raise TypeError, "expected two RDF::Literal operands, but got #{left.inspect} and #{right.inspect}"
@@ -52,6 +66,15 @@ module SPARQL; module Algebra
52
66
  RDF::Literal(parts.last, datatype: left.datatype, language: left.language)
53
67
  end
54
68
  end
69
+
70
+ ##
71
+ #
72
+ # Returns a partial SPARQL grammar for this operator.
73
+ #
74
+ # @return [String]
75
+ def to_sparql(**options)
76
+ "STRAFTER(" + operands.to_sparql(delimiter: ', ', **options) + ")"
77
+ end
55
78
  end # StrAfter
56
79
  end # Operator
57
80
  end; end # SPARQL::Algebra
@@ -3,8 +3,22 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # A SPARQL `strbefore` operator.
5
5
  #
6
- # @example
7
- # (strbefore ?x ?y)
6
+ # [121] BuiltInCall ::= ... | 'STRBEFORE' '(' Expression ',' Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
11
+ # SELECT ?s (STRBEFORE(?str,"s") AS ?prefix) WHERE {
12
+ # ?s :str ?str
13
+ # }
14
+ #
15
+ # @example SSE
16
+ # (prefix
17
+ # ((: <http://example.org/>)
18
+ # (xsd: <http://www.w3.org/2001/XMLSchema#>))
19
+ # (project (?s ?prefix)
20
+ # (extend ((?prefix (strbefore ?str "s")))
21
+ # (bgp (triple ?s :str ?str)))))
8
22
  #
9
23
  # @see https://www.w3.org/TR/sparql11-query/#func-strbefore
10
24
  # @see https://www.w3.org/TR/xpath-functions/#func-substring-before
@@ -37,7 +51,7 @@ module SPARQL; module Algebra
37
51
  # a literal
38
52
  # @return [RDF::Literal]
39
53
  # @raise [TypeError] if operands are not compatible
40
- def apply(left, right)
54
+ def apply(left, right, **options)
41
55
  case
42
56
  when !left.plain? || !right.plain?
43
57
  raise TypeError, "expected two RDF::Literal operands, but got #{left.inspect} and #{right.inspect}"
@@ -54,6 +68,15 @@ module SPARQL; module Algebra
54
68
  RDF::Literal(parts.first, language: left.language, datatype: left.datatype)
55
69
  end
56
70
  end
71
+
72
+ ##
73
+ #
74
+ # Returns a partial SPARQL grammar for this operator.
75
+ #
76
+ # @return [String]
77
+ def to_sparql(**options)
78
+ "STRBEFORE(" + operands.to_sparql(delimiter: ', ', **options) + ")"
79
+ end
57
80
  end # StrBefore
58
81
  end # Operator
59
82
  end; end # SPARQL::Algebra
@@ -3,7 +3,19 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL `strdt` operator.
5
5
  #
6
- # @example
6
+ # [121] BuiltInCall ::= ... | 'STRDT' '(' Expression ',' Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
11
+ # SELECT ?s (STRDT(?str,xsd:string) AS ?str1) WHERE {
12
+ # ?s :str ?str
13
+ # FILTER(LANGMATCHES(LANG(?str), "en"))
14
+ # }
15
+ #
16
+ # @example SSE
17
+ # (prefix
18
+ # ((: <http://example.org/>) (xsd: <http://www.w3.org/2001/XMLSchema#>))
7
19
  # (project (?s ?str1)
8
20
  # (extend ((?str1 (strdt ?str xsd:string)))
9
21
  # (filter (langMatches (lang ?str) "en")
@@ -24,10 +36,19 @@ module SPARQL; module Algebra
24
36
  # datatype
25
37
  # @return [RDF::Literal] a datatyped literal
26
38
  # @see https://www.w3.org/TR/sparql11-query/#func-strdt
27
- def apply(value, datatypeIRI)
39
+ def apply(value, datatypeIRI, **options)
28
40
  raise TypeError, "Literal #{value.inspect} is not simple" unless value.simple?
29
41
  RDF::Literal.new(value.to_s, datatype: datatypeIRI)
30
42
  end
43
+
44
+ ##
45
+ #
46
+ # Returns a partial SPARQL grammar for this operator.
47
+ #
48
+ # @return [String]
49
+ def to_sparql(**options)
50
+ "STRDT(" + operands.to_sparql(delimiter: ', ', **options) + ")"
51
+ end
31
52
  end # StrDT
32
53
  end # Operator
33
54
  end; end # SPARQL::Algebra
@@ -1,10 +1,23 @@
1
1
  module SPARQL; module Algebra
2
2
  class Operator
3
3
  ##
4
- # A SPARQL `contains` operator.
4
+ # A SPARQL `strends` operator.
5
5
  #
6
- # @example
7
- # (strends ?x ?y)
6
+ # [121] BuiltInCall ::= ... | 'STRENDS' '(' Expression ',' Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # SELECT ?s ?str WHERE {
11
+ # ?s :str ?str
12
+ # FILTER STRENDS(?str, "a")
13
+ # }
14
+ #
15
+ # @example SSE
16
+ # (prefix
17
+ # ((: <http://example.org/>))
18
+ # (project (?s ?str)
19
+ # (filter (strends ?str "a")
20
+ # (bgp (triple ?s :str ?str)))))
8
21
  #
9
22
  # @see https://www.w3.org/TR/sparql11-query/#func-strends
10
23
  # @see https://wwww.w3.org/TR/xpath-functions/#func-ends-with
@@ -33,7 +46,7 @@ module SPARQL; module Algebra
33
46
  # a literal
34
47
  # @return [RDF::Literal::Boolean]
35
48
  # @raise [TypeError] if operands are not compatible
36
- def apply(left, right)
49
+ def apply(left, right, **options)
37
50
  case
38
51
  when !left.compatible?(right)
39
52
  raise TypeError, "expected two RDF::Literal operands, but got #{left.inspect} and #{right.inspect}"
@@ -41,6 +54,15 @@ module SPARQL; module Algebra
41
54
  else RDF::Literal::FALSE
42
55
  end
43
56
  end
57
+
58
+ ##
59
+ #
60
+ # Returns a partial SPARQL grammar for this operator.
61
+ #
62
+ # @return [String]
63
+ def to_sparql(**options)
64
+ "STRENDS(" + operands.to_sparql(delimiter: ', ', **options) + ")"
65
+ end
44
66
  end # StrEnds
45
67
  end # Operator
46
68
  end; end # SPARQL::Algebra
@@ -3,12 +3,21 @@ module SPARQL; module Algebra
3
3
  ##
4
4
  # The SPARQL `strlang` operator.
5
5
  #
6
- # @example
7
- # (prefix ((: <http://example.org/>))
8
- # (project (?s ?s2)
9
- # (extend ((?s2 (strlang ?str "en-US")))
10
- # (filter (langMatches (lang ?str) "en")
11
- # (bgp (triple ?s :str ?str))))))
6
+ # [121] BuiltInCall ::= ... | 'STRLANG' '(' Expression ',' Expression ')'
7
+ #
8
+ # @example SPARQL Grammar
9
+ # PREFIX : <http://example.org/>
10
+ # SELECT ?s (STRLANG(?str,"en-US") AS ?s2) WHERE {
11
+ # ?s :str ?str
12
+ # FILTER(LANGMATCHES(LANG(?str), "en"))
13
+ # }
14
+ #
15
+ # @example SSE
16
+ # (prefix ((: <http://example.org/>))
17
+ # (project (?s ?s2)
18
+ # (extend ((?s2 (strlang ?str "en-US")))
19
+ # (filter (langMatches (lang ?str) "en")
20
+ # (bgp (triple ?s :str ?str))))))
12
21
  #
13
22
  # @see https://www.w3.org/TR/sparql11-query/#func-strlang
14
23
  class StrLang < Operator::Binary
@@ -25,10 +34,19 @@ module SPARQL; module Algebra
25
34
  # datatype
26
35
  # @return [RDF::Literal] a datatyped literal
27
36
  # @see https://www.w3.org/TR/sparql11-query/#func-strlang
28
- def apply(value, langTag)
37
+ def apply(value, langTag, **options)
29
38
  raise TypeError, "Literal #{value.inspect} is not simple" unless value.simple?
30
39
  RDF::Literal.new(value.to_s, language: langTag.to_s)
31
40
  end
41
+
42
+ ##
43
+ #
44
+ # Returns a partial SPARQL grammar for this operator.
45
+ #
46
+ # @return [String]
47
+ def to_sparql(**options)
48
+ "STRLANG(" + operands.to_sparql(delimiter: ', ', **options) + ")"
49
+ end
32
50
  end # StrLang
33
51
  end # Operator
34
52
  end; end # SPARQL::Algebra