lib/sparql/grammar/parser11.rb in sparql-2.2.2 vs lib/sparql/grammar/parser11.rb in sparql-3.0.0
- old
+ new
@@ -584,16 +584,24 @@
# [54] GroupGraphPatternSub ::= TriplesBlock? (GraphPatternNotTriples "."? TriplesBlock? )*
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
add_prod_datum(:query, res)
end
@@ -645,10 +653,15 @@
# Coalesce extensions
lhs = lhs.dup
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]))
elsif data[:query] && !lhs.empty?
add_prod_datum(:query, SPARQL::Algebra::Expression.for(:join, lhs, *data[:query]))
@@ -1829,18 +1842,18 @@
having = data.fetch(:having, [])
values = data.fetch(:ValuesClause, []).first
# 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] = [[]]
end
@@ -1866,10 +1879,10 @@
aggregated_vars.include?(v) ? v : SPARQL::Algebra::Expression[:sample, v]
end
# 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
av = RDF::Query::Variable.new(".#{agg}")
av.distinguished = false