Class: RDF::N3::Algebra::ResourceOperator
- Inherits:
-
SPARQL::Algebra::Operator::Binary
- Object
- SPARQL::Algebra::Operator::Binary
- RDF::N3::Algebra::ResourceOperator
- Includes:
- Builtin, SPARQL::Algebra::Query, SPARQL::Algebra::Update
- Defined in:
- lib/rdf/n3/algebra/resource_operator.rb
Overview
This is a generic operator where the subject is a literal or binds to a literal 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
Log::Conclusion, Log::Content, Log::EqualTo, Log::Includes, Log::N3String, Log::OutputString, Log::ParsedAsN3, Log::Semantics, Math::ACos, Math::ACosH, Math::ASin, Math::ASinH, Math::ATan, Math::ATanH, Math::AbsoluteValue, Math::Ceiling, Math::Cos, Math::CosH, Math::EqualTo, Math::Floor, Math::GreaterThan, Math::LessThan, Math::Negation, Math::Rounded, Math::Sin, Math::SinH, Math::Tan, Math::TanH, Str::Contains, Str::ContainsIgnoringCase, Str::EndsWith, Str::EqualIgnoringCase, Str::GreaterThan, Str::LessThan, Str::Matches, Str::StartsWith, Time::Day, Time::DayOfWeek, Time::GmTime, Time::Hour, Time::InSeconds, Time::LocalTime, Time::Minute, Time::Month, Time::Second, Time::Timezone, Time::Year
Constant Summary collapse
- NAME =
:resourceOperator
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 literal and provides a mechanism for subclasses to operate over (and validate) that argument.
-
#input_operand ⇒ RDF::Term
Input is generically the subject.
-
#resolve(resource, position: :subject) ⇒ RDF::Term
Subclasses implement ‘resolve`.
-
#valid?(subject, object) ⇒ 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.
111 112 113 114 115 116 117 118 119 120 |
# File 'lib/rdf/n3/algebra/resource_operator.rb', line 111 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 literal and provides a mechanism for subclasses to operate over (and validate) that 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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/rdf/n3/algebra/resource_operator.rb', line 19 def execute(queryable, solutions:, **) RDF::Query::Solutions(solutions.map do |solution| subject = operand(0).evaluate(solution.bindings, formulae: formulae) || operand(0) object = operand(1).evaluate(solution.bindings, formulae: formulae) || operand(1) subject = formulae.fetch(subject, subject) if subject.node? 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 valid?(subject, object) lhs = resolve(subject, position: :subject) if lhs.nil? log_error(self.class.const_get(:NAME), "subject evaluates to null") {subject.inspect} next end rhs = resolve(object, position: :object) if rhs.nil? log_error(self.class.const_get(:NAME), "object evaluates to null") {object.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 subject.variable? log_debug(self.class.const_get(:NAME), "result") {SXP::Generator.string(rhs.to_sxp_bin).strip} solution.merge(subject.to_sym => rhs) elsif respond_to?(:apply) res = apply(lhs, rhs) log_debug(self.class.const_get(:NAME), "result") {SXP::Generator.string(res.to_sxp_bin).strip} # Return the result applying subject and object case res when RDF::Literal::TRUE solution when RDF::Literal::FALSE nil when RDF::Query::Solution solution.merge(res) else log_error(self.class.const_get(:NAME), "unexpected result type") nil end elsif rhs != 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
77 78 79 |
# File 'lib/rdf/n3/algebra/resource_operator.rb', line 77 def input_operand operand(0) end |
#resolve(resource, position: :subject) ⇒ RDF::Term
Subclasses implement ‘resolve`.
Returns nil if resource does not validate, given its position
88 89 90 |
# File 'lib/rdf/n3/algebra/resource_operator.rb', line 88 def resolve(resource, position: :subject) raise NotImplemented end |
#valid?(subject, object) ⇒ Boolean
Subclasses may override or supplement validate to perform validation on the list subject
98 99 100 101 102 103 104 105 106 107 |
# File 'lib/rdf/n3/algebra/resource_operator.rb', line 98 def valid?(subject, object) case subject when RDF::Query::Variable object.term? when RDF::Term object.term? || object.variable? else false end end |