sparql 3.0.0 → 3.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +184 -70
  3. data/UNLICENSE +1 -1
  4. data/VERSION +1 -1
  5. data/bin/sparql +28 -17
  6. data/lib/rack/sparql.rb +1 -1
  7. data/lib/rack/sparql/conneg.rb +3 -3
  8. data/lib/sinatra/sparql.rb +5 -5
  9. data/lib/sparql.rb +14 -10
  10. data/lib/sparql/algebra.rb +15 -23
  11. data/lib/sparql/algebra/aggregate.rb +4 -4
  12. data/lib/sparql/algebra/evaluatable.rb +2 -2
  13. data/lib/sparql/algebra/expression.rb +28 -21
  14. data/lib/sparql/algebra/extensions.rb +142 -16
  15. data/lib/sparql/algebra/operator.rb +37 -16
  16. data/lib/sparql/algebra/operator/abs.rb +2 -2
  17. data/lib/sparql/algebra/operator/add.rb +3 -3
  18. data/lib/sparql/algebra/operator/alt.rb +4 -4
  19. data/lib/sparql/algebra/operator/and.rb +7 -7
  20. data/lib/sparql/algebra/operator/asc.rb +3 -3
  21. data/lib/sparql/algebra/operator/ask.rb +4 -14
  22. data/lib/sparql/algebra/operator/avg.rb +6 -4
  23. data/lib/sparql/algebra/operator/base.rb +10 -10
  24. data/lib/sparql/algebra/operator/bgp.rb +1 -1
  25. data/lib/sparql/algebra/operator/bnode.rb +5 -5
  26. data/lib/sparql/algebra/operator/bound.rb +3 -3
  27. data/lib/sparql/algebra/operator/ceil.rb +2 -2
  28. data/lib/sparql/algebra/operator/clear.rb +3 -3
  29. data/lib/sparql/algebra/operator/coalesce.rb +3 -13
  30. data/lib/sparql/algebra/operator/compare.rb +8 -8
  31. data/lib/sparql/algebra/operator/concat.rb +4 -4
  32. data/lib/sparql/algebra/operator/construct.rb +4 -14
  33. data/lib/sparql/algebra/operator/contains.rb +2 -2
  34. data/lib/sparql/algebra/operator/copy.rb +3 -3
  35. data/lib/sparql/algebra/operator/count.rb +3 -3
  36. data/lib/sparql/algebra/operator/create.rb +3 -3
  37. data/lib/sparql/algebra/operator/dataset.rb +5 -16
  38. data/lib/sparql/algebra/operator/datatype.rb +1 -1
  39. data/lib/sparql/algebra/operator/day.rb +1 -1
  40. data/lib/sparql/algebra/operator/delete.rb +7 -5
  41. data/lib/sparql/algebra/operator/delete_data.rb +3 -3
  42. data/lib/sparql/algebra/operator/delete_where.rb +5 -5
  43. data/lib/sparql/algebra/operator/desc.rb +1 -1
  44. data/lib/sparql/algebra/operator/describe.rb +3 -13
  45. data/lib/sparql/algebra/operator/distinct.rb +4 -14
  46. data/lib/sparql/algebra/operator/divide.rb +1 -1
  47. data/lib/sparql/algebra/operator/drop.rb +3 -3
  48. data/lib/sparql/algebra/operator/encode_for_uri.rb +3 -3
  49. data/lib/sparql/algebra/operator/equal.rb +3 -3
  50. data/lib/sparql/algebra/operator/exists.rb +5 -5
  51. data/lib/sparql/algebra/operator/exprlist.rb +3 -13
  52. data/lib/sparql/algebra/operator/extend.rb +21 -20
  53. data/lib/sparql/algebra/operator/filter.rb +6 -16
  54. data/lib/sparql/algebra/operator/floor.rb +2 -2
  55. data/lib/sparql/algebra/operator/graph.rb +5 -16
  56. data/lib/sparql/algebra/operator/greater_than.rb +5 -5
  57. data/lib/sparql/algebra/operator/greater_than_or_equal.rb +5 -5
  58. data/lib/sparql/algebra/operator/group.rb +25 -25
  59. data/lib/sparql/algebra/operator/group_concat.rb +6 -6
  60. data/lib/sparql/algebra/operator/hours.rb +1 -1
  61. data/lib/sparql/algebra/operator/if.rb +5 -15
  62. data/lib/sparql/algebra/operator/in.rb +4 -14
  63. data/lib/sparql/algebra/operator/insert.rb +6 -4
  64. data/lib/sparql/algebra/operator/insert_data.rb +3 -3
  65. data/lib/sparql/algebra/operator/iri.rb +1 -1
  66. data/lib/sparql/algebra/operator/is_blank.rb +1 -1
  67. data/lib/sparql/algebra/operator/is_iri.rb +1 -1
  68. data/lib/sparql/algebra/operator/is_literal.rb +1 -1
  69. data/lib/sparql/algebra/operator/is_numeric.rb +1 -1
  70. data/lib/sparql/algebra/operator/join.rb +12 -10
  71. data/lib/sparql/algebra/operator/lang.rb +1 -1
  72. data/lib/sparql/algebra/operator/lang_matches.rb +3 -3
  73. data/lib/sparql/algebra/operator/lcase.rb +2 -2
  74. data/lib/sparql/algebra/operator/left_join.rb +15 -12
  75. data/lib/sparql/algebra/operator/less_than.rb +5 -5
  76. data/lib/sparql/algebra/operator/less_than_or_equal.rb +5 -5
  77. data/lib/sparql/algebra/operator/load.rb +3 -3
  78. data/lib/sparql/algebra/operator/max.rb +6 -4
  79. data/lib/sparql/algebra/operator/md5.rb +1 -1
  80. data/lib/sparql/algebra/operator/min.rb +6 -4
  81. data/lib/sparql/algebra/operator/minus.rb +12 -11
  82. data/lib/sparql/algebra/operator/minutes.rb +1 -1
  83. data/lib/sparql/algebra/operator/modify.rb +4 -4
  84. data/lib/sparql/algebra/operator/month.rb +1 -1
  85. data/lib/sparql/algebra/operator/move.rb +3 -3
  86. data/lib/sparql/algebra/operator/multiply.rb +1 -1
  87. data/lib/sparql/algebra/operator/negate.rb +1 -1
  88. data/lib/sparql/algebra/operator/not.rb +1 -1
  89. data/lib/sparql/algebra/operator/not_equal.rb +2 -2
  90. data/lib/sparql/algebra/operator/notexists.rb +4 -4
  91. data/lib/sparql/algebra/operator/notin.rb +4 -14
  92. data/lib/sparql/algebra/operator/notoneof.rb +5 -6
  93. data/lib/sparql/algebra/operator/now.rb +1 -1
  94. data/lib/sparql/algebra/operator/or.rb +7 -7
  95. data/lib/sparql/algebra/operator/order.rb +6 -16
  96. data/lib/sparql/algebra/operator/path.rb +6 -5
  97. data/lib/sparql/algebra/operator/path_opt.rb +16 -16
  98. data/lib/sparql/algebra/operator/path_plus.rb +8 -8
  99. data/lib/sparql/algebra/operator/path_star.rb +4 -4
  100. data/lib/sparql/algebra/operator/plus.rb +3 -3
  101. data/lib/sparql/algebra/operator/prefix.rb +10 -10
  102. data/lib/sparql/algebra/operator/project.rb +4 -14
  103. data/lib/sparql/algebra/operator/rand.rb +1 -1
  104. data/lib/sparql/algebra/operator/reduced.rb +4 -14
  105. data/lib/sparql/algebra/operator/regex.rb +6 -6
  106. data/lib/sparql/algebra/operator/replace.rb +4 -4
  107. data/lib/sparql/algebra/operator/reverse.rb +4 -4
  108. data/lib/sparql/algebra/operator/round.rb +2 -2
  109. data/lib/sparql/algebra/operator/same_term.rb +8 -5
  110. data/lib/sparql/algebra/operator/sample.rb +3 -3
  111. data/lib/sparql/algebra/operator/seconds.rb +1 -1
  112. data/lib/sparql/algebra/operator/seq.rb +5 -6
  113. data/lib/sparql/algebra/operator/sequence.rb +4 -4
  114. data/lib/sparql/algebra/operator/sha1.rb +1 -1
  115. data/lib/sparql/algebra/operator/sha256.rb +1 -1
  116. data/lib/sparql/algebra/operator/sha384.rb +1 -1
  117. data/lib/sparql/algebra/operator/sha512.rb +1 -1
  118. data/lib/sparql/algebra/operator/slice.rb +4 -14
  119. data/lib/sparql/algebra/operator/str.rb +1 -1
  120. data/lib/sparql/algebra/operator/strafter.rb +2 -2
  121. data/lib/sparql/algebra/operator/strbefore.rb +2 -2
  122. data/lib/sparql/algebra/operator/strdt.rb +2 -2
  123. data/lib/sparql/algebra/operator/strends.rb +2 -2
  124. data/lib/sparql/algebra/operator/strlang.rb +2 -2
  125. data/lib/sparql/algebra/operator/strlen.rb +2 -2
  126. data/lib/sparql/algebra/operator/strstarts.rb +2 -2
  127. data/lib/sparql/algebra/operator/struuid.rb +1 -1
  128. data/lib/sparql/algebra/operator/substr.rb +4 -4
  129. data/lib/sparql/algebra/operator/subtract.rb +1 -1
  130. data/lib/sparql/algebra/operator/sum.rb +6 -4
  131. data/lib/sparql/algebra/operator/table.rb +6 -4
  132. data/lib/sparql/algebra/operator/timezone.rb +1 -1
  133. data/lib/sparql/algebra/operator/tz.rb +1 -1
  134. data/lib/sparql/algebra/operator/ucase.rb +2 -2
  135. data/lib/sparql/algebra/operator/union.rb +10 -9
  136. data/lib/sparql/algebra/operator/update.rb +4 -4
  137. data/lib/sparql/algebra/operator/using.rb +4 -4
  138. data/lib/sparql/algebra/operator/uuid.rb +1 -1
  139. data/lib/sparql/algebra/operator/with.rb +6 -6
  140. data/lib/sparql/algebra/operator/year.rb +1 -1
  141. data/lib/sparql/algebra/query.rb +2 -2
  142. data/lib/sparql/algebra/update.rb +2 -2
  143. data/lib/sparql/algebra/version.rb +1 -1
  144. data/lib/sparql/extensions.rb +5 -5
  145. data/lib/sparql/grammar.rb +111 -11
  146. data/lib/sparql/grammar/meta.rb +1372 -333
  147. data/lib/sparql/grammar/parser11.rb +56 -42
  148. data/lib/sparql/grammar/terminals11.rb +1 -0
  149. data/lib/sparql/results.rb +63 -44
  150. data/lib/sparql/version.rb +1 -1
  151. metadata +40 -47
@@ -6,8 +6,8 @@ module SPARQL::Grammar
6
6
  ##
7
7
  # A parser for the SPARQL 1.1 grammar.
8
8
  #
9
- # @see http://www.w3.org/TR/sparql11-query/#grammar
10
- # @see http://en.wikipedia.org/wiki/LR_parser
9
+ # @see https://www.w3.org/TR/sparql11-query/#grammar
10
+ # @see https://en.wikipedia.org/wiki/LR_parser
11
11
  class Parser
12
12
  include SPARQL::Grammar::Meta
13
13
  include SPARQL::Grammar::Terminals
@@ -216,7 +216,7 @@ module SPARQL::Grammar
216
216
  unless resolve_iris?
217
217
  # Only output if we're not resolving URIs internally
218
218
  add_prod_datum(:BaseDecl, data[:BaseDecl])
219
- add_prod_datum(:PrefixDecl, data[:PrefixDecl]) if data[:PrefixDecl]
219
+ add_prod_datum(:PrefixDecl, data[:PrefixDecl])
220
220
  end
221
221
  end
222
222
 
@@ -624,11 +624,14 @@ module SPARQL::Grammar
624
624
  if (lhs = (input.delete(:query) || []).first) && !lhs.empty?
625
625
  query = SPARQL::Algebra::Operator::Join.new(lhs, query)
626
626
  end
627
+ if data[:path]
628
+ query = SPARQL::Algebra::Operator::Join.new(query, Array(data[:path]).first)
629
+ end
627
630
  add_prod_datum(:query, query)
628
631
  elsif !Array(data[:query]).empty?
629
632
  # Join query and path
630
633
  add_prod_datum(:query, SPARQL::Algebra::Operator::Join.new(data[:path].first, data[:query].first))
631
- else
634
+ elsif data[:path]
632
635
  add_prod_datum(:query, data[:path])
633
636
  end
634
637
  end
@@ -698,9 +701,9 @@ module SPARQL::Grammar
698
701
  end
699
702
  end
700
703
 
701
- # [60] Bind ::= 'BIND' '(' Expression 'AS' Var ')'
704
+ # [60] Bind ::= 'BIND' '(' (Expression || EmbTP) 'AS' Var ')'
702
705
  production(:Bind) do |input, data, callback|
703
- add_prod_datum :extend, [data[:Expression].unshift(data[:Var].first)]
706
+ add_prod_datum :extend, [(data[:Expression] || data[:pattern]).unshift(data[:Var].first)]
704
707
  end
705
708
 
706
709
  # [61] InlineData ::= 'VALUES' DataBlock
@@ -716,7 +719,7 @@ module SPARQL::Grammar
716
719
  production(:InlineDataOneVar) do |input, data, callback|
717
720
  add_prod_datum :Var, data[:Var]
718
721
 
719
- data[:DataBlockValue].each do |d|
722
+ Array(data[:DataBlockValue]).each do |d|
720
723
  add_prod_datum :row, [[:row, data[:Var].dup << d]]
721
724
  end
722
725
  end
@@ -856,11 +859,8 @@ module SPARQL::Grammar
856
859
  data[:Subject] = prod_data[:Subject]
857
860
  error(nil, "Expected Subject", production: :ObjectList) if !prod_data[:Subject] && validate?
858
861
  error(nil, "Expected Verb", production: :ObjectList) if !(prod_data[:Verb] || prod_data[:VerbPath]) && validate?
859
- if prod_data[:Verb]
860
- data[:Verb] = prod_data[:Verb]
861
- else
862
- data[:VerbPath] = prod_data[:VerbPath]
863
- end
862
+ data[:Verb] = prod_data[:Verb] if prod_data[:Verb]
863
+ data[:VerbPath] = prod_data[:VerbPath] if prod_data[:VerbPath]
864
864
  end
865
865
  production(:ObjectList) do |input, data, callback|
866
866
  add_prod_datum(:pattern, data[:pattern])
@@ -874,7 +874,7 @@ module SPARQL::Grammar
874
874
  if prod_data[:Verb]
875
875
  add_pattern(:Object, subject: prod_data[:Subject], predicate: prod_data[:Verb], object: object)
876
876
  add_prod_datum(:pattern, data[:pattern])
877
- else
877
+ elsif prod_data[:VerbPath]
878
878
  add_prod_datum(:path,
879
879
  SPARQL::Algebra::Expression(:path,
880
880
  prod_data[:Subject].first,
@@ -886,11 +886,8 @@ module SPARQL::Grammar
886
886
 
887
887
  # [81] TriplesSameSubjectPath ::= VarOrTerm PropertyListPathNotEmpty | TriplesNode PropertyListPath
888
888
  production(:TriplesSameSubjectPath) do |input, data, callback|
889
- if data[:pattern]
890
- add_prod_datum(:pattern, data[:pattern])
891
- else
892
- add_prod_datum(:path, data[:path])
893
- end
889
+ add_prod_datum(:pattern, data[:pattern])
890
+ add_prod_datum(:path, data[:path])
894
891
  end
895
892
 
896
893
  # [83] PropertyListPathNotEmpty ::= ( VerbPath | VerbSimple ) ObjectList ( ';' ( ( VerbPath | VerbSimple ) ObjectList )? )*
@@ -900,16 +897,14 @@ module SPARQL::Grammar
900
897
  data[:Subject] = subject
901
898
  end
902
899
  production(:PropertyListPathNotEmpty) do |input, data, callback|
903
- if data[:pattern]
904
- add_prod_datum(:pattern, data[:pattern])
905
- else
906
- add_prod_datum(:path, data[:path])
907
- end
900
+ add_prod_datum(:pattern, data[:pattern])
901
+ add_prod_datum(:path, data[:path])
908
902
  end
909
903
 
910
904
  # [84] VerbPath ::= Path
911
905
  production(:VerbPath) do |input, data, callback|
912
906
  if data[:Path]
907
+ input.delete(:Verb)
913
908
  input[:VerbPath] = data[:Path]
914
909
  else
915
910
  input[:Verb] = data[:iri]
@@ -1109,11 +1104,21 @@ module SPARQL::Grammar
1109
1104
  data.values.each {|v| add_prod_datum(:VarOrTerm, v)}
1110
1105
  end
1111
1106
 
1107
+ # [106s] VarOrTermOrEmbTP ::= Var | GraphTerm | EmbTP
1108
+ production(:VarOrTermOrEmbTP) do |input, data, callback|
1109
+ data.values.each {|v| add_prod_datum(:VarOrTerm, v)}
1110
+ end
1111
+
1112
1112
  # [107] VarOrIri ::= Var | iri
1113
1113
  production(:VarOrIri) do |input, data, callback|
1114
1114
  data.values.each {|v| add_prod_datum(:VarOrIri, v)}
1115
1115
  end
1116
1116
 
1117
+ # [107s] VarOrBlankNodeOrIriOrEmbTP ::= Var | BlankNode| iri | EmbTP
1118
+ production(:VarOrBlankNodeOrIriOrEmbTP) do |input, data, callback|
1119
+ data.values.each {|v| add_prod_datum(:VarOrBlankNodeOrIriOrEmbTP, v)}
1120
+ end
1121
+
1117
1122
  # [109] GraphTerm ::= iri | RDFLiteral | NumericLiteral
1118
1123
  # | BooleanLiteral | BlankNode | NIL
1119
1124
  production(:GraphTerm) do |input, data, callback|
@@ -1124,6 +1129,17 @@ module SPARQL::Grammar
1124
1129
  data[:NIL])
1125
1130
  end
1126
1131
 
1132
+ # [1xx] EmbTP ::= '<<' VarOrBlankNodeOrIriOrEmbTP Verb VarOrTermOrEmbTP '>>'
1133
+ production(:EmbTP) do |input, data, callback|
1134
+ subject = data[:VarOrBlankNodeOrIriOrEmbTP]
1135
+ predicate = data[:Verb]
1136
+ object = data[:VarOrTerm]
1137
+ add_pattern(:EmbTP,
1138
+ subject: subject,
1139
+ predicate: predicate,
1140
+ object: object)
1141
+ end
1142
+
1127
1143
  # [110] Expression ::= ConditionalOrExpression
1128
1144
  production(:Expression) do |input, data, callback|
1129
1145
  add_prod_datum(:Expression, data[:Expression])
@@ -1420,7 +1436,7 @@ module SPARQL::Grammar
1420
1436
  str = lit.delete(:string)
1421
1437
  lit[:datatype] = lit.delete(:iri) if lit[:iri]
1422
1438
  lit[:language] = lit.delete(:language).last.downcase if lit[:language]
1423
- input[:literal] = RDF::Literal.new(str, lit) if str
1439
+ input[:literal] = RDF::Literal.new(str, **lit) if str
1424
1440
  end
1425
1441
  end
1426
1442
 
@@ -1471,7 +1487,7 @@ module SPARQL::Grammar
1471
1487
  # @yieldparam [SPARQL::Grammar::Parser] parser
1472
1488
  # @yieldreturn [void] ignored
1473
1489
  # @return [SPARQL::Grammar::Parser]
1474
- def initialize(input = nil, options = {}, &block)
1490
+ def initialize(input = nil, **options, &block)
1475
1491
  @input = case input
1476
1492
  when IO, StringIO then input.read
1477
1493
  else input.to_s.dup
@@ -1532,13 +1548,16 @@ module SPARQL::Grammar
1532
1548
  # @param [Symbol, #to_s] prod The starting production for the parser.
1533
1549
  # It may be a URI from the grammar, or a symbol representing the local_name portion of the grammar URI.
1534
1550
  # @return [Array]
1535
- # @see http://www.w3.org/TR/sparql11-query/#sparqlAlgebra
1536
- # @see http://axel.deri.ie/sparqltutorial/ESWC2007_SPARQL_Tutorial_unit2b.pdf
1551
+ # @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
1552
+ # @see https://axel.deri.ie/sparqltutorial/ESWC2007_SPARQL_Tutorial_unit2b.pdf
1537
1553
  def parse(prod = START)
1538
- ll1_parse(@input, prod.to_sym, @options.merge(branch: BRANCH,
1539
- first: FIRST,
1540
- follow: FOLLOW,
1541
- whitespace: WS)
1554
+ ll1_parse(@input,
1555
+ prod.to_sym,
1556
+ branch: BRANCH,
1557
+ first: FIRST,
1558
+ follow: FOLLOW,
1559
+ whitespace: WS,
1560
+ **@options
1542
1561
  ) do |context, *data|
1543
1562
  case context
1544
1563
  when :trace
@@ -1723,9 +1742,7 @@ module SPARQL::Grammar
1723
1742
 
1724
1743
  if id
1725
1744
  @vars[id] ||= begin
1726
- v = RDF::Query::Variable.new(id)
1727
- v.distinguished = distinguished
1728
- v
1745
+ RDF::Query::Variable.new(id, distinguished: distinguished)
1729
1746
  end
1730
1747
  else
1731
1748
  unless distinguished
@@ -1733,9 +1750,7 @@ module SPARQL::Grammar
1733
1750
  id = @nd_var_gen
1734
1751
  @nd_var_gen = id.succ
1735
1752
  end
1736
- v = RDF::Query::Variable.new(id)
1737
- v.distinguished = distinguished
1738
- v
1753
+ RDF::Query::Variable.new(id, distinguished: distinguished)
1739
1754
  end
1740
1755
  end
1741
1756
 
@@ -1763,7 +1778,7 @@ module SPARQL::Grammar
1763
1778
  end
1764
1779
 
1765
1780
  # Create a literal
1766
- def literal(value, options = {})
1781
+ def literal(value, **options)
1767
1782
  options = options.dup
1768
1783
  # Internal representation is to not use xsd:string, although it could arguably go the other way.
1769
1784
  options.delete(:datatype) if options[:datatype] == RDF::XSD.string
@@ -1772,7 +1787,7 @@ module SPARQL::Grammar
1772
1787
  "options: #{options.inspect}, " +
1773
1788
  "validate: #{validate?.inspect}, "
1774
1789
  end
1775
- RDF::Literal.new(value, options.merge(validate: validate?))
1790
+ RDF::Literal.new(value, validate: validate?, **options)
1776
1791
  end
1777
1792
 
1778
1793
  # Take collection of objects and create RDF Collection using rdf:first, rdf:rest and rdf:nil
@@ -1803,7 +1818,7 @@ module SPARQL::Grammar
1803
1818
  #
1804
1819
  # @param [String] production Production generating pattern
1805
1820
  # @param [Hash{Symbol => Object}] options
1806
- def add_pattern(production, options)
1821
+ def add_pattern(production, **options)
1807
1822
  progress(production, "[:pattern, #{options[:subject]}, #{options[:predicate]}, #{options[:object]}]")
1808
1823
  triple = {}
1809
1824
  options.each_pair do |r, v|
@@ -1885,8 +1900,7 @@ module SPARQL::Grammar
1885
1900
  avf.first
1886
1901
  else
1887
1902
  # Allocate a temporary variable for this function, and retain the mapping for outside the group
1888
- av = RDF::Query::Variable.new(".#{agg}")
1889
- av.distinguished = false
1903
+ av = RDF::Query::Variable.new(".#{agg}", distinguished: false)
1890
1904
  agg += 1
1891
1905
  aggregates << [av, function]
1892
1906
  av
@@ -110,6 +110,7 @@ module SPARQL::Grammar
110
110
  |isBLANK|isIRI|isURI|isLITERAL|isNUMERIC|sameTerm
111
111
  |true
112
112
  |false
113
+ |<<|>>
113
114
  |&&|!=|!|<=|>=|\^\^|\|\||[\(\),.;\[\]\{\}\+\-=<>\?\^\|\*\/a]
114
115
  )xim.freeze
115
116
 
@@ -14,28 +14,38 @@ module SPARQL
14
14
  ##
15
15
  # Generate Solutions as JSON
16
16
  # @return [String]
17
- # @see http://www.w3.org/TR/rdf-sparql-json-res/
17
+ # @see https://www.w3.org/TR/rdf-sparql-json-res/
18
18
  def to_json
19
19
  require 'json' unless defined?(::JSON)
20
-
21
- bindings = self.map do |solution|
22
- variable_names.inject({}) do |memo, n|
23
- memo.merge case s = solution[n]
24
- when RDF::URI
25
- {n => {type: "uri", value: s.to_s }}
26
- when RDF::Node
27
- {n => {type: "bnode", value: s.id }}
28
- when RDF::Literal
29
- if s.datatype?
30
- {n => {type: "typed-literal", datatype: s.datatype.to_s, value: s.to_s }}
31
- elsif s.language
32
- {n => {type: "literal", "xml:lang" => s.language.to_s, value: s.to_s }}
33
- else
34
- {n => {type: "literal", value: s.to_s }}
35
- end
20
+
21
+ format = ->(value) do
22
+ case value
23
+ when RDF::URI then {type: "uri", value: value.to_s }
24
+ when RDF::Node then {type: "bnode", value: value.id }
25
+ when RDF::Literal
26
+ if value.datatype?
27
+ {type: "typed-literal", datatype: value.datatype.to_s, value: value.to_s }
28
+ elsif value.language?
29
+ {type: "literal", "xml:lang" => value.language.to_s, value: value.to_s }
36
30
  else
37
- {}
31
+ {type: "literal", value: value.to_s }
38
32
  end
33
+ when RDF::Statement
34
+ {
35
+ type: 'triple',
36
+ value: {
37
+ s: format.call(value.subject),
38
+ p: format.call(value.predicate),
39
+ o: format.call(value.object)
40
+ }
41
+ }
42
+ end
43
+ end
44
+
45
+ bindings = self.map do |solution|
46
+ variable_names.inject({}) do |memo, n|
47
+ rep = format.call(solution[n])
48
+ rep ? memo.merge(n => rep) : memo
39
49
  end
40
50
  end
41
51
 
@@ -48,12 +58,36 @@ module SPARQL
48
58
  ##
49
59
  # Generate Solutions as XML
50
60
  # @return [String]
51
- # @see http://www.w3.org/TR/rdf-sparql-XMLres/
61
+ # @see https://www.w3.org/TR/rdf-sparql-XMLres/
52
62
  def to_xml
53
63
  require 'builder' unless defined?(::Builder)
54
64
 
55
65
  xml = ::Builder::XmlMarkup.new(indent: 2)
56
66
  xml.instruct!
67
+
68
+ format = ->(s) do
69
+ case s
70
+ when RDF::URI
71
+ xml.uri(s.to_s)
72
+ when RDF::Node
73
+ xml.bnode(s.id)
74
+ when RDF::Literal
75
+ if s.datatype?
76
+ xml.literal(s.to_s, "datatype" => s.datatype.to_s)
77
+ elsif s.language
78
+ xml.literal(s.to_s, "xml:lang" => s.language.to_s)
79
+ else
80
+ xml.literal(s.to_s)
81
+ end
82
+ when RDF::Statement
83
+ xml.triple do
84
+ xml.s {format.call(s.subject)}
85
+ xml.p {format.call(s.predicate)}
86
+ xml.o {format.call(s.object)}
87
+ end
88
+ end
89
+ end
90
+
57
91
  xml.sparql(xmlns: "http://www.w3.org/2005/sparql-results#") do
58
92
  xml.head do
59
93
  variable_names.each do |n|
@@ -67,20 +101,7 @@ module SPARQL
67
101
  s = solution[n]
68
102
  next unless s
69
103
  xml.binding(name: n) do
70
- case s
71
- when RDF::URI
72
- xml.uri(s.to_s)
73
- when RDF::Node
74
- xml.bnode(s.id)
75
- when RDF::Literal
76
- if s.datatype?
77
- xml.literal(s.to_s, "datatype" => s.datatype.to_s)
78
- elsif s.language
79
- xml.literal(s.to_s, "xml:lang" => s.language.to_s)
80
- else
81
- xml.literal(s.to_s)
82
- end
83
- end
104
+ format.call(s)
84
105
  end
85
106
  end
86
107
  end
@@ -118,7 +139,7 @@ module SPARQL
118
139
  ##
119
140
  # Generate Solutions as CSV
120
141
  # @return [String]
121
- # @see http://www.w3.org/TR/rdf-sparql-json-res/#results
142
+ # @see https://www.w3.org/TR/2013/REC-sparql11-results-csv-tsv-20130321/
122
143
  def to_csv
123
144
  require 'csv' unless defined?(::CSV)
124
145
  bnode_map = {}
@@ -135,7 +156,7 @@ module SPARQL
135
156
  this
136
157
  end
137
158
  else
138
- solution[n].to_s
159
+ solution[n].to_s.strip
139
160
  end
140
161
  end
141
162
  end
@@ -144,11 +165,9 @@ module SPARQL
144
165
  ##
145
166
  # Generate Solutions as TSV
146
167
  # @return [String]
147
- # @see http://www.w3.org/TR/rdf-sparql-json-res/#results
168
+ # @see https://www.w3.org/TR/2013/REC-sparql11-results-csv-tsv-20130321/
148
169
  def to_tsv
149
170
  require 'csv' unless defined?(::CSV)
150
- bnode_map = {}
151
- bnode_gen = "_:a"
152
171
  results = [
153
172
  variable_names.map {|v| "?#{v}"}.join("\t")
154
173
  ] + self.map do |solution|
@@ -159,7 +178,7 @@ module SPARQL
159
178
  when nil
160
179
  ""
161
180
  else
162
- RDF::NTriples.serialize(term)
181
+ RDF::NTriples.serialize(term).strip
163
182
  end
164
183
  end.join("\t")
165
184
  end
@@ -185,7 +204,7 @@ module SPARQL
185
204
  # @return [String]
186
205
  # String with serialized results and `#content_type`
187
206
  # @raise [RDF::WriterError] when inappropriate formatting options are used
188
- def serialize_results(solutions, options = {})
207
+ def serialize_results(solutions, **options)
189
208
  format = options[:format].to_sym if options[:format]
190
209
  content_type = options[:content_type].to_s.split(';').first
191
210
  content_types = Array(options[:content_types] || '*/*')
@@ -226,7 +245,7 @@ module SPARQL
226
245
  when RDF::Queryable
227
246
  begin
228
247
  require 'linkeddata'
229
- rescue LoadError => e
248
+ rescue LoadError
230
249
  require 'rdf/ntriples'
231
250
  end
232
251
  fmt = RDF::Format.for(format ? format.to_sym : {content_type: content_type})
@@ -236,7 +255,7 @@ module SPARQL
236
255
  end
237
256
  format ||= fmt.to_sym
238
257
  content_type ||= fmt.content_type.first
239
- results = solutions.dump(format, options)
258
+ results = solutions.dump(format, **options)
240
259
  raise RDF::WriterError, "Unknown format #{fmt.inspect} for #{solutions.class}" unless results
241
260
  results
242
261
  when RDF::Query::Solutions
@@ -280,7 +299,7 @@ module SPARQL
280
299
  # @param [Array<String>] available
281
300
  # @return [String]
282
301
  #
283
- # @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
302
+ # @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
284
303
  def first_content_type(acceptable, available)
285
304
  return acceptable.first if available.empty?
286
305
  available.flatten!
@@ -306,7 +325,7 @@ module SPARQL
306
325
  # May also be an RDF::Writer content_type to serialize DESCRIBE or CONSTRUCT results
307
326
  # @return [String]
308
327
  # String with serialized results and #content_type
309
- def serialize_exception(exception, options = {})
328
+ def serialize_exception(exception, **options)
310
329
  format = options[:format]
311
330
  content_type = options[:content_type]
312
331
  content_type ||= SPARQL::Results::MIME_TYPES[format]
@@ -1,6 +1,6 @@
1
1
  module SPARQL
2
2
  module VERSION
3
- VERSION_FILE = File.join(File.expand_path(File.dirname(__FILE__)), "..", "..", "VERSION")
3
+ VERSION_FILE = File.expand_path("../../../VERSION", __FILE__)
4
4
  MAJOR, MINOR, TINY, EXTRA = File.read(VERSION_FILE).chomp.split(".")
5
5
 
6
6
  STRING = [MAJOR, MINOR, TINY, EXTRA].compact.join('.')