diff --git a/.travis.yml b/.travis.yml index 64a238e8..9e1f468d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,14 +4,15 @@ script: "bundle exec rspec spec" env: - CI=true rvm: - - 2.2.6 - - 2.3.1 - - 2.4.0 - - jruby - - rbx + - 2.2 + - 2.3 + - 2.4 + - jruby-9 + - rbx-3 cache: bundler sudo: false matrix: allow_failures: - - rvm: rbx - - rvm: jruby + - rvm: jruby-9 + - rvm: rbx-3 +dist: trusty diff --git a/VERSION b/VERSION index ccbccc3d..c043eea7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.2.0 +2.2.1 diff --git a/examples/issue27.rb b/examples/issue27.rb new file mode 100644 index 00000000..5d0db1dc --- /dev/null +++ b/examples/issue27.rb @@ -0,0 +1,34 @@ +require 'linkeddata' +require 'pp' +ttl = %( +@prefix rdf: . +@prefix simc: . +@prefix sim: . + +simc:Collection a rdf:List. +simc:Collection rdf:first sim:Homer. +simc:Collection rdf:rest simc:c1. +simc:c1 rdf:first sim:Marge. +simc:c1 rdf:rest simc:c2. +simc:c2 rdf:first sim:Bart. +simc:c2 rdf:rest simc:c3. +simc:c3 rdf:first sim:Maggie. +simc:c3 rdf:rest simc:c4. +simc:c4 rdf:first sim:Lisa. +simc:c4 rdf:rest rdf:nil. +) +rep = RDF::Repository.new +RDF::Turtle::Reader.new(ttl) do |reader| + rep << reader +end + +query = %{ + PREFIX simc: + PREFIX rdf: + + SELECT ?r ?f WHERE { + simc:Collection rdf:rest* ?r . + ?r rdf:first ?f + } +} +pp SPARQL.execute(query, rep) diff --git a/lib/rack/sparql/conneg.rb b/lib/rack/sparql/conneg.rb index f37cb8b7..461cb643 100644 --- a/lib/rack/sparql/conneg.rb +++ b/lib/rack/sparql/conneg.rb @@ -76,7 +76,8 @@ def serialize(env, status, headers, body) headers = headers.merge(VARY).merge('Content-Type' => results.content_type) # FIXME: don't overwrite existing Vary headers [status, headers, [results]] rescue RDF::WriterError => e - not_acceptable(e.message) + # Use this instead of not_acceptable so that headers are not lost. + http_error(406, e.message, headers.merge(VARY)) end end diff --git a/lib/sparql/grammar/parser11.rb b/lib/sparql/grammar/parser11.rb index c32a122d..12c48d23 100644 --- a/lib/sparql/grammar/parser11.rb +++ b/lib/sparql/grammar/parser11.rb @@ -615,9 +615,12 @@ class Parser end end if (lhs = (input.delete(:query) || []).first) && !lhs.empty? - query = SPARQL::Algebra::Expression.for(:join, lhs, query) + query = SPARQL::Algebra::Operator::Join.new(lhs, query) end add_prod_datum(:query, query) + elsif !Array(data[:query]).empty? + # Join query and path + add_prod_datum(:query, SPARQL::Algebra::Operator::Join.new(data[:path].first, data[:query].first)) else add_prod_datum(:query, data[:path]) end diff --git a/sparql.gemspec b/sparql.gemspec index 27f801e2..ebbfca53 100755 --- a/sparql.gemspec +++ b/sparql.gemspec @@ -29,23 +29,23 @@ Gem::Specification.new do |gem| gem.required_ruby_version = '>= 2.2.2' gem.requirements = [] - gem.add_runtime_dependency 'rdf', '~> 2.1' - gem.add_runtime_dependency 'rdf-aggregate-repo', '~> 2.0' + gem.add_runtime_dependency 'rdf', '~> 2.2' + gem.add_runtime_dependency 'rdf-aggregate-repo', '~> 2.2' gem.add_runtime_dependency 'ebnf', '~> 1.1' gem.add_runtime_dependency 'builder', '~> 3.2' gem.add_runtime_dependency 'sxp', '~> 1.0' - gem.add_runtime_dependency 'sparql-client', '~> 2.0' + gem.add_runtime_dependency 'sparql-client', '~> 2.1' gem.add_runtime_dependency 'rdf-xsd', '~> 2.1' - gem.add_development_dependency 'sinatra', '~> 1.4', '>= 1.4.6' - gem.add_development_dependency 'rack', '~> 1.6' + gem.add_development_dependency 'sinatra', '~> 2.0' + gem.add_development_dependency 'rack', '~> 2.0' gem.add_development_dependency 'rack-test', '~> 0.6' - gem.add_development_dependency 'linkeddata', '~> 2.0' - gem.add_development_dependency 'rdf-spec', '~> 2.0' + gem.add_development_dependency 'linkeddata', '~> 2.2' + gem.add_development_dependency 'rdf-spec', '~> 2.2' gem.add_development_dependency 'open-uri-cached', '~> 0.0', '>= 0.0.5' - gem.add_development_dependency 'rspec', '~> 3.5' + gem.add_development_dependency 'rspec', '~> 3.6' gem.add_development_dependency 'rspec-its', '~> 1.2' - gem.add_development_dependency 'yard' , '~> 0.8' + gem.add_development_dependency 'yard' , '~> 0.9' gem.post_install_message = nil end diff --git a/spec/grammar/misc_spec.rb b/spec/grammar/misc_spec.rb index 348e054d..952ea471 100644 --- a/spec/grammar/misc_spec.rb +++ b/spec/grammar/misc_spec.rb @@ -59,6 +59,25 @@ ) ?item)))))) } + }, + "issue 27" => { + query: %( + PREFIX simc: + PREFIX rdf: + + SELECT ?r ?f WHERE { + simc:Collection rdf:rest* ?r . + ?r rdf:first ?f + } + ), + sse: %{(project (?r ?f) + (join + (path + (path* ) + ?r) + (bgp (triple ?r ?f)) + ) + )} } }.each do |test, options| it "parses #{test}" do diff --git a/spec/support/models.rb b/spec/support/models.rb index c5ae8bed..e30cac2c 100644 --- a/spec/support/models.rb +++ b/spec/support/models.rb @@ -259,7 +259,7 @@ def solutions def parse_rdf_bindings(graph) JSON::LD::API.fromRDF(graph) do |expanded| - JSON::LD::API.frame(expanded, RESULT_FRAME) do |framed| + JSON::LD::API.frame(expanded, RESULT_FRAME, pruneBlankNodeIdentifiers: false) do |framed| nodes = {} solution = framed['@graph'].first['solution'] if framed['@graph'].first.has_key?('solution') solutions = Array(solution).