Class: RDF::N3::Algebra::ListOperator
- Inherits:
-
SPARQL::Algebra::Operator::Binary
- Object
- SPARQL::Algebra::Operator::Binary
- RDF::N3::Algebra::ListOperator
- Includes:
- Builtin, SPARQL::Algebra::Query, SPARQL::Algebra::Update
- Defined in:
- lib/rdf/n3/algebra/list_operator.rb
Overview
This is a generic operator where the subject is a list or binds to a list and the object is either a constant that equals the evaluation of the subject, or a variable to which the result is bound in a solution
Direct Known Subclasses
RDF::N3::Algebra::List::Append, RDF::N3::Algebra::List::First, RDF::N3::Algebra::List::In, RDF::N3::Algebra::List::Iterate, RDF::N3::Algebra::List::Last, RDF::N3::Algebra::List::Length, RDF::N3::Algebra::List::Member, RDF::N3::Algebra::Log::Conjunction, RDF::N3::Algebra::Log::DtLit, RDF::N3::Algebra::Log::LangLit, Math::Difference, Math::Exponentiation, Math::Product, Math::Quotient, Math::Remainder, Math::Sum, Str::Concatenation, Str::Format, Str::Replace, Str::Scrape
Constant Summary collapse
- NAME =
:listOperator
Instance Attribute Summary
Attributes included from Enumerable
Instance Method Summary collapse
-
#as_literal(object) ⇒ Object
Returns a literal for the numeric argument.
-
#execute(queryable, solutions:, **options) ⇒ RDF::Query::Solutions
The operator takes a list and provides a mechanism for subclasses to operate over (and validate) that list argument.
-
#input_operand ⇒ RDF::Term
Input is generically the subject.
-
#resolve(list) ⇒ RDF::Term
Subclasses implement
resolve
. -
#validate(list) ⇒ Boolean
Subclasses may override or supplement validate to perform validation on the list subject.
Methods included from Builtin
#each, #evaluate, #hash, #rank, #to_uri
Instance Method Details
#as_literal(object) ⇒ Object
Returns a literal for the numeric argument.
85 86 87 88 89 90 91 92 93 94 |
# File 'lib/rdf/n3/algebra/list_operator.rb', line 85 def as_literal(object) case object when Float literal = RDF::Literal(object, canonicalize: true) literal.instance_variable_set(:@string, literal.to_s.downcase) literal else RDF::Literal(object, canonicalize: true) end end |
#execute(queryable, solutions:, **options) ⇒ RDF::Query::Solutions
The operator takes a list and provides a mechanism for subclasses to operate over (and validate) that list argument.
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/rdf/n3/algebra/list_operator.rb', line 19 def execute(queryable, solutions:, **) RDF::Query::Solutions(solutions.map do |solution| # Might be a variable or node evaluating to a list in queryable, or might be a list with variables subject = operand(0).evaluate(solution.bindings, formulae: formulae) next unless subject # If it evaluated to a BNode, re-expand as a list subject = RDF::N3::List.try_list(subject, queryable).evaluate(solution.bindings, formulae: formulae) object = operand(1).evaluate(solution.bindings, formulae: formulae) || operand(1) object = formulae.fetch(object, object) if object.node? log_info(self.class.const_get(:NAME), "subject") {SXP::Generator.string(subject.to_sxp_bin).strip} log_info(self.class.const_get(:NAME), "object") {SXP::Generator.string(object.to_sxp_bin).strip} next unless validate(subject) lhs = resolve(subject) if lhs.nil? log_error(self.class.const_get(:NAME), "subject evaluates to null") {subject.inspect} next end if object.variable? log_debug(self.class.const_get(:NAME), "result") {SXP::Generator.string(lhs.to_sxp_bin).strip} solution.merge(object.to_sym => lhs) elsif object != lhs log_debug(self.class.const_get(:NAME), "result: false") nil else log_debug(self.class.const_get(:NAME), "result: true") solution end end.compact.uniq) end |
#input_operand ⇒ RDF::Term
Input is generically the subject
56 57 58 |
# File 'lib/rdf/n3/algebra/list_operator.rb', line 56 def input_operand operand(0) end |
#resolve(list) ⇒ RDF::Term
Subclasses implement resolve
.
65 66 67 |
# File 'lib/rdf/n3/algebra/list_operator.rb', line 65 def resolve(list) raise NotImplemented end |
#validate(list) ⇒ Boolean
Subclasses may override or supplement validate to perform validation on the list subject
74 75 76 77 78 79 80 81 |
# File 'lib/rdf/n3/algebra/list_operator.rb', line 74 def validate(list) if list.list? && list.valid? true else log_error(NAME) {"operand is not a list: #{list.to_sxp}"} false end end |