Class: RDF::N3::Algebra::List::Iterate
- Inherits:
-
RDF::N3::Algebra::ListOperator
- Object
- SPARQL::Algebra::Operator
- SPARQL::Algebra::Operator::Binary
- RDF::N3::Algebra::ListOperator
- RDF::N3::Algebra::List::Iterate
- Defined in:
- vendor/bundler/ruby/3.3.0/bundler/gems/rdf-n3-a6ef81a7e1ce/lib/rdf/n3/algebra/list/iterate.rb
Overview
Generates a list of lists when each constituent list is composed of the index and value of each element in the subject.
Binds variables in the object list.
Constant Summary collapse
Constants included from Util::Logger
Constants inherited from SPARQL::Algebra::Operator::Binary
SPARQL::Algebra::Operator::Binary::ARITY
Constants inherited from SPARQL::Algebra::Operator
SPARQL::Algebra::Operator::ARITY, SPARQL::Algebra::Operator::IsURI
Constants included from SPARQL::Algebra::Expression
SPARQL::Algebra::Expression::PATTERN_PARENTS
Instance Attribute Summary
Attributes included from Enumerable
Attributes included from SPARQL::Algebra::Query
Attributes inherited from SPARQL::Algebra::Operator
Instance Method Summary collapse
-
#execute(queryable, solutions:, **options) ⇒ RDF::Query::Solutions
Evaluates this operator using the given variable
bindings
.
Methods inherited from RDF::N3::Algebra::ListOperator
#as_literal, #input_operand, #resolve, #validate
Methods included from Builtin
#each, #evaluate, #hash, #input_operand, #rank, #to_uri
Methods included from Util::Logger
#log_debug, #log_depth, #log_error, #log_fatal, #log_info, #log_recover, #log_recovering?, #log_statistics, #log_warn, #logger
Methods included from Enumerable
add_entailment, #canonicalize, #canonicalize!, #dump, #each_graph, #each_object, #each_predicate, #each_quad, #each_statement, #each_subject, #each_term, #each_triple, #entail, #enum_graph, #enum_object, #enum_predicate, #enum_quad, #enum_statement, #enum_subject, #enum_term, #enum_triple, #graph?, #graph_names, #invalid?, #method_missing, #object?, #objects, #predicate?, #predicates, #project_graph, #quad?, #quads, #respond_to_missing?, #statement?, #statements, #subject?, #subjects, #supports?, #term?, #terms, #to_a, #to_h, #to_set, #triple?, #triples, #valid?, #validate!
Methods included from Util::Aliasing::LateBound
Methods included from Isomorphic
#bijection_to, #isomorphic_with?
Methods included from Countable
Methods included from SPARQL::Algebra::Update
#graph_name=, #unshift, #variables
Methods included from SPARQL::Algebra::Query
#each_solution, #empty?, #failed?, #graph_name=, #matched?, #query_yields_boolean?, #query_yields_solutions?, #query_yields_statements?, #unshift, #variables
Methods inherited from SPARQL::Algebra::Operator::Binary
Methods inherited from SPARQL::Algebra::Operator
#aggregate?, arity, base_uri, #base_uri, base_uri=, #bind, #boolean, #constant?, #deep_dup, #each_descendant, #eql?, #evaluatable?, evaluate, #executable?, #first_ancestor, for, #formulae, #initialize, #inspect, #mergable?, #ndvars, #node?, #operand, #optimize, #optimize!, #parent, #parent=, prefixes, #prefixes, prefixes=, #rewrite, #to_binary, #to_sparql, to_sparql, #to_sxp, #to_sxp_bin, #validate!, #variable?, #variables, #vars
Methods included from SPARQL::Algebra::Expression
cast, #constant?, #evaluate, extension, extension?, extensions, for, #invalid?, new, #node?, open, #optimize, #optimize!, parse, register_extension, #to_sxp_bin, #valid?, #validate!, #variable?
Constructor Details
This class inherits a constructor from SPARQL::Algebra::Operator::Binary
Dynamic Method Handling
This class handles dynamic methods through the method_missing method in the class RDF::Enumerable
Instance Method Details
#execute(queryable, solutions:, **options) ⇒ RDF::Query::Solutions
Evaluates this operator using the given variable bindings
.
The subject MUST evaluate to a list and the object to a list composed of two components: index and value.
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'vendor/bundler/ruby/3.3.0/bundler/gems/rdf-n3-a6ef81a7e1ce/lib/rdf/n3/algebra/list/iterate.rb', line 34 def execute(queryable, solutions:, **) 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 # If subject evaluated to a BNode, re-expand as a list subject = RDF::N3::List.try_list(subject, queryable).evaluate(solution.bindings, formulae: formulae) next unless validate(subject) object = operand(1).evaluate(solution.bindings, formulae: formulae) || operand(1) next unless object # If object evaluated to a BNode, re-expand as a list object = RDF::N3::List.try_list(object, queryable).evaluate(solution.bindings, formulae: formulae) || object if object.list? && object.variable? # Create a solution for those entries in subject that match object if object.length != 2 log_error(NAME) {"object is not a list with two entries: #{object.to_sxp}"} next end if object.first.variable? && object.last.variable? solutions = RDF::Query::Solutions.new subject.each_with_index do |r, i| s = solution.merge(object.first.to_sym => RDF::Literal(i), object.last.to_sym => r) log_debug(self.class.const_get(:NAME), "result: #{s.to_sxp}") solutions << s end solutions elsif object.first.variable? # Solution binds indexes to all matching values solutions = RDF::Query::Solutions.new subject.each_with_index do |r, i| next unless r == object.last s = solution.merge(object.first.to_sym => RDF::Literal(i)) log_debug(self.class.const_get(:NAME), "result: #{s.to_sxp}") solutions << s end solutions elsif object.last.variable? # Solution binds value at specified index next unless v = subject.at(object.first) s = solution.merge(object.last.to_sym => v) log_debug(self.class.const_get(:NAME), "result: #{s.to_sxp}") s end elsif object.variable? # Create a solution for each index/value pair in subject solutions = RDF::Query::Solutions.new subject.each_with_index do |r, i| s = solution.merge(object.to_sym => RDF::N3::List[RDF::Literal(i), r]) log_debug(self.class.const_get(:NAME), "result: #{s.to_sxp}") solutions << s end solutions else # Evaluates to true if the subject has a matching entry same = subject.at(object.first) == object.last log_debug(self.class.const_get(:NAME), "result: #{same.inspect}") solution if same end end.flatten.compact.uniq) end |