Class: SPARQL::Algebra::Operator::And
- Includes:
- Evaluatable
- Defined in:
- lib/sparql/algebra/operator/and.rb
Overview
The SPARQL logical and operator.
[112] ConditionalAndExpression::= ValueLogical ( '&&' ValueLogical )*
Constant Summary collapse
- NAME =
[:'&&', :and]
Instance Method Summary collapse
-
#evaluate(bindings, **options) ⇒ RDF::Literal::Boolean
Returns a logical
ANDofleftandright. -
#initialize(left, right, **options) ⇒ And
constructor
Initializes a new operator instance.
-
#to_sparql(**options) ⇒ String
Returns a partial SPARQL grammar for this operator.
Methods included from Evaluatable
#apply, #memoize, #replace_aggregate!, #replace_vars!
Constructor Details
#initialize(left, right, **options) ⇒ And
Initializes a new operator instance.
40 41 42 |
# File 'lib/sparql/algebra/operator/and.rb', line 40 def initialize(left, right, **) super end |
Instance Method Details
#evaluate(bindings, **options) ⇒ RDF::Literal::Boolean
Returns a logical AND of left and right. Note that logical-and operates on the effective boolean value of its arguments.
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/sparql/algebra/operator/and.rb', line 53 def evaluate(bindings, **) begin left = boolean(operand(0).evaluate(bindings, **.merge(depth: [:depth].to_i + 1))).true? rescue TypeError left = nil end begin right = boolean(operand(1).evaluate(bindings, **.merge(depth: [:depth].to_i + 1))).true? rescue TypeError right = nil end # From https://www.w3.org/TR/sparql11-query/#evaluation # A logical-and that encounters an error on only one branch will return an error if the other branch is # TRUE and FALSE if the other branch is FALSE. case when left.nil? && right.nil? then raise(TypeError) when left.nil? then right ? raise(TypeError) : RDF::Literal::FALSE when right.nil? then left ? raise(TypeError) : RDF::Literal::FALSE else RDF::Literal(left && right) end end |
#to_sparql(**options) ⇒ String
Returns a partial SPARQL grammar for this operator.
82 83 84 |
# File 'lib/sparql/algebra/operator/and.rb', line 82 def to_sparql(**) "(#{operands.first.to_sparql(**)} && #{operands.last.to_sparql(**)})" end |