sparql 3.1.6 → 3.2.1

Sign up to get free protection for your applications and to get access to all the features.
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