Sha256: cac1265ba0b6d0469d71b9e160a514046324f5761cbc1e2367fa495564d34b19
Contents?: true
Size: 1.76 KB
Versions: 4
Compression:
Stored size: 1.76 KB
Contents
module RDF::N3::Algebra::List ## # Iff the object is a list and the subject is in that list, then this is true. # # @example # { 1 list:in ( 1 2 3 4 5 ) } => { :test4a a :SUCCESS }. class In < RDF::N3::Algebra::ListOperator NAME = :listIn URI = RDF::N3::List.in ## # Evaluates this operator using the given variable `bindings`. # If the first operand is a variable, it creates a solution for each element in the list. # # @param [RDF::Queryable] queryable # the graph or repository to query # @param [RDF::Query::Solutions] solutions # solutions for chained queries # @return [RDF::Query::Solutions] def execute(queryable, solutions:, **options) RDF::Query::Solutions(solutions.map do |solution| subject = operand(0).evaluate(solution.bindings, formulae: formulae) || operand(0) # Might be a variable or node evaluating to a list in queryable, or might be a list with variables list = operand(1).evaluate(solution.bindings, formulae: formulae) next unless list # If it evaluated to a BNode, re-expand as a list list = RDF::N3::List.try_list(list, queryable).evaluate(solution.bindings, formulae: formulae) log_debug(NAME) {"subject: #{subject.to_sxp}, list: #{list.to_sxp}"} unless list.list? && list.valid? log_error(NAME) {"operand is not a list: #{list.to_sxp}"} next end if subject.variable? # Bind all list entries to this solution, creates an array of solutions list.to_a.map do |term| solution.merge(subject.to_sym => term) end elsif list.to_a.include?(subject) solution else nil end end.flatten.compact.uniq) end end end
Version data entries
4 entries across 4 versions & 1 rubygems
Version | Path |
---|---|
rdf-n3-3.3.0 | lib/rdf/n3/algebra/list/in.rb |
rdf-n3-3.2.1 | lib/rdf/n3/algebra/list/in.rb |
rdf-n3-3.2.0 | lib/rdf/n3/algebra/list/in.rb |
rdf-n3-3.1.2 | lib/rdf/n3/algebra/list/in.rb |