Skip to content

Commit

Permalink
Finish 3.0.0
Browse files Browse the repository at this point in the history
  • Loading branch information
gkellogg committed Dec 31, 2017
2 parents 03ff7e8 + bb59900 commit 1962623
Show file tree
Hide file tree
Showing 9 changed files with 79 additions and 31 deletions.
4 changes: 4 additions & 0 deletions .travis.yml
@@ -1,12 +1,15 @@
language: ruby
bundler_args: --without debug
script: "bundle exec rspec spec"
before_install: "gem update --system"

env:
- CI=true
rvm:
- 2.2
- 2.3
- 2.4
- 2.5
- jruby-9
- rbx-3
cache: bundler
Expand All @@ -15,4 +18,5 @@ matrix:
allow_failures:
- rvm: jruby-9
- rvm: rbx-3
- rvm: 2.5
dist: trusty
16 changes: 8 additions & 8 deletions README.md
Expand Up @@ -257,19 +257,19 @@ Full documentation available on [Rubydoc.info][SPARQL doc]

## Dependencies

* [Ruby](http://ruby-lang.org/) (>= 1.9.3)
* [RDF.rb](http://rubygems.org/gems/rdf) (>= 1.1.12)
* [SPARQL::Client](https://rubygems.org/gems/sparql-client) (>= 1.1.3)
* [SXP](https://rubygems.org/gems/sxp) (>= 0.1.3)
* [Ruby](http://ruby-lang.org/) (>= 2.2.2)
* [RDF.rb](http://rubygems.org/gems/rdf) (~> 3.0)
* [SPARQL::Client](https://rubygems.org/gems/sparql-client) (~> 3.0)
* [SXP](https://rubygems.org/gems/sxp) (~> 1.0)
* [Builder](https://rubygems.org/gems/builder) (>= 3.0.0)
* [JSON](https://rubygems.org/gems/json) (>= 1.8.2)
* Soft dependency on [Linked Data][] (>= 1.1)
* Soft dependency on [Nokogiri](http://rubygems.org/gems/nokogiri) (>= 1.6.6)
* Soft dependency on [Linked Data][] (>= 3.0)
* Soft dependency on [Nokogiri](http://rubygems.org/gems/nokogiri) (>= 1.7)
Falls back to REXML for XML parsing Builder for XML serializing. Nokogiri is much more efficient
* Soft dependency on [Equivalent XML](https://rubygems.org/gems/equivalent-xml) (>= 0.3.0)
Equivalent XML performs more efficient comparisons of XML Literals when Nokogiri is included
* Soft dependency on [Rack][] (>= 1.6.0)
* Soft dependency on [Sinatra][] (>= 1.4.6)
* Soft dependency on [Rack][] (>= 2.0)
* Soft dependency on [Sinatra][] (>= 2.0)

## Installation

Expand Down
2 changes: 1 addition & 1 deletion VERSION
@@ -1 +1 @@
2.2.2
3.0.0
15 changes: 11 additions & 4 deletions lib/sparql/algebra/extensions.rb
Expand Up @@ -325,18 +325,25 @@ def query_yields_solutions?
end

##
# Return the non-destinguished variables contained within patterns
# Return the non-destinguished variables contained within patterns and graph name
# @return [Array<RDF::Query::Variable>]
def ndvars
patterns.map(&:ndvars).flatten
vars.reject(&:distinguished?)
end

##
# Return the variables contained within patterns
# Return the variables contained within patterns and graph name
# @return [Array<RDF::Query::Variable>]
def vars
patterns.map(&:vars).flatten
variables.values
end

##
# Returns `true` if this is executable (i.e., contains a graph patterns), `false`
# otherwise.
#
# @return [Boolean] `true` or `false`
def executable?; true; end
end

class RDF::Query::Pattern
Expand Down
2 changes: 1 addition & 1 deletion lib/sparql/algebra/query.rb
Expand Up @@ -22,7 +22,7 @@ def unshift(query)
#
# @return [Hash{Symbol => RDF::Query::Variable}]
def variables
operands.inject({}) {|hash, o| o.executable? ? hash.merge!(o.variables) : hash}
operands.inject({}) {|hash, o| o.executable? ? hash.merge(o.variables) : hash}
end

##
Expand Down
2 changes: 1 addition & 1 deletion lib/sparql/algebra/update.rb
Expand Up @@ -22,7 +22,7 @@ def unshift(query)
#
# @return [Hash{Symbol => RDF::Query::Variable}]
def variables
operands.inject({}) {|hash, o| o.executable? ? hash.merge!(o.variables) : hash}
operands.inject({}) {|hash, o| o.executable? ? hash.merge(o.variables) : hash}
end

##
Expand Down
23 changes: 18 additions & 5 deletions lib/sparql/grammar/parser11.rb
Expand Up @@ -586,12 +586,20 @@ class Parser
production(:GroupGraphPatternSub) do |input, data, callback|
debug("GroupGraphPatternSub") {"q #{data[:query].inspect}"}

res = data[:query].first
res = case data[:query].length
when 0 then SPARQL::Algebra::Operator::BGP.new
when 1 then data[:query].first
when 2
SPARQL::Algebra::Operator::Join.new(*data[:query])
else
error(nil, "Expected 0-2 queryies, got #{data[:query].length}", production: :GroupGraphPatternSub)
SPARQL::Algebra::Operator::BGP.new
end
debug("GroupGraphPatternSub(pre-filter)") {"res: #{res.inspect}"}

if data[:filter]
expr, query = flatten_filter(data[:filter])
query = res || SPARQL::Algebra::Operator::BGP.new
query = res
# query should be nil
res = SPARQL::Algebra::Operator::Filter.new(expr, query)
end
Expand Down Expand Up @@ -647,6 +655,11 @@ class Parser
lhs.operands.first.concat(data[:extend])
add_prod_datum(:query, lhs)
elsif data[:extend]
# The variable assigned in a BIND clause must not be already in-use within the immediately preceding TriplesBlock within a GroupGraphPattern.
# None of the variables on the lhs of data[:extend] may be used in lhs
data[:extend].each do |(v, _)|
error(nil, "BIND Variable #{v} used in pattern", production: :GraphPatternNotTriples) if lhs.vars.map(&:to_sym).include?(v.to_sym)
end
add_prod_datum(:query, SPARQL::Algebra::Expression.for(:extend, data[:extend], lhs))
elsif data[:leftjoin]
add_prod_datum(:query, SPARQL::Algebra::Expression.for(:leftjoin, lhs, *data[:leftjoin]))
Expand Down Expand Up @@ -1831,14 +1844,14 @@ def merge_modifiers(data)

# extension variables must not appear in projected variables.
# Add them to the projection otherwise
extensions.each do |(var, expr)|
extensions.each do |(var, _)|
raise Error, "Extension variable #{var} also in SELECT" if vars.map(&:to_s).include?(var.to_s)
vars << var
end

# If any extension contains an aggregate, and there is now group, implicitly group by 1
if !data[:group] &&
extensions.any? {|(var, function)| function.aggregate?} ||
extensions.any? {|(_, function)| function.aggregate?} ||
having.any? {|c| c.aggregate? }
debug {"Implicit group"}
data[:group] = [[]]
Expand Down Expand Up @@ -1868,7 +1881,7 @@ def merge_modifiers(data)

# Replace aggregates in expr as above
expr.replace_aggregate! do |function|
if avf = aggregates.detect {|(v, f)| f == function}
if avf = aggregates.detect {|(_, f)| f == function}
avf.first
else
# Allocate a temporary variable for this function, and retain the mapping for outside the group
Expand Down
17 changes: 6 additions & 11 deletions sparql.gemspec
Expand Up @@ -28,30 +28,25 @@ Gem::Specification.new do |gem|

gem.required_ruby_version = '>= 2.2.2'
gem.requirements = []
#gem.add_runtime_dependency 'rdf', '~> 3.0'
gem.add_runtime_dependency 'rdf', '~> 3.0'
#gem.add_runtime_dependency 'rdf-aggregate-repo', '~> 3.0'
gem.add_runtime_dependency 'rdf', '>= 2.2', '< 4.0'
gem.add_runtime_dependency 'rdf-aggregate-repo', '>= 2.2', '< 4.0'
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.1'
#gem.add_runtime_dependency 'rdf-xsd', '~> 2.1'
gem.add_runtime_dependency 'sxp', '~> 1.0'
gem.add_runtime_dependency 'sparql-client', '>= 2.1', '< 4.0'
gem.add_runtime_dependency 'rdf-xsd', '>= 2.2', '< 4.0'
gem.add_runtime_dependency 'sparql-client', '~> 3.0'
gem.add_runtime_dependency 'rdf-xsd', '~> 3.0'

gem.add_development_dependency 'sinatra', '~> 2.0'
gem.add_development_dependency 'rack', '~> 2.0'
gem.add_development_dependency 'rack-test', '~> 0.7'
gem.add_development_dependency 'rack-test', '~> 0.8'
gem.add_development_dependency 'rdf-spec', '~> 3.0'
#gem.add_development_dependency 'linkeddata', '~> 3.0'
#gem.add_development_dependency 'rdf-spec', '~> 3.0'
gem.add_development_dependency 'linkeddata', '>= 2.2', '< 4.0'
gem.add_development_dependency 'rdf-spec', '>= 2.2', '< 4.0'
gem.add_development_dependency 'open-uri-cached', '~> 0.0', '>= 0.0.5'
gem.add_development_dependency 'rspec', '~> 3.7'
gem.add_development_dependency 'rspec-its', '~> 1.2'
gem.add_development_dependency 'yard' , '~> 0.9'
gem.add_development_dependency 'yard' , '~> 0.9.12'

gem.post_install_message = nil
end
29 changes: 29 additions & 0 deletions spec/grammar/parser_spec.rb
Expand Up @@ -753,6 +753,14 @@ def self.variable(id, distinguished = true)
],
"count" => [
%q(SELECT (COUNT(?O) AS ?C) WHERE {?S ?P ?O}), %q((project (?C) (extend ((?C ?.0)) (group () ((?.0 (count ?O))) (bgp (triple ?S ?P ?O))))))
],
"illegal bind variable" => [
%q(SELECT * WHERE { ?s ?p ?o . BIND (?p AS ?o) }),
EBNF::LL1::Parser::Error
],
"illegal bind variable (graph name)" => [
%q(SELECT * WHERE { GRAPH ?g {?s ?p ?o} . BIND (?p AS ?g) }),
EBNF::LL1::Parser::Error
]
}.each do |title, (input, output)|
it title do |example|
Expand Down Expand Up @@ -2133,6 +2141,27 @@ def self.variable(id, distinguished = true)
(bgp (triple ?x a ext:Subject) (triple ?x ?prop ?obj)))
}
],
issue30: [
%q{
PREFIX ns:<http://ns.com>
CONSTRUCT {?item ns:link ?target}
WHERE {
?item ?link ?wrapper .
{?item ?p ?wrapper .}
?item ns:slot / ns:item ?target .
}
},
%q{
(prefix
((ns: <http://ns.com>))
(construct ((triple ?item ns:link ?target))
(join
(join
(bgp (triple ?item ?link ?wrapper))
(bgp (triple ?item ?p ?wrapper)))
(path ?item (seq ns:slot ns:item) ?target))))
}
],
}.each do |title, (input, result)|
it title do |example|
expect(input).to generate(result, example.metadata.merge(resolve_iris: false))
Expand Down

0 comments on commit 1962623

Please sign in to comment.