Class: SPARQL::Algebra::Operator::If

Inherits:
Ternary show all
Includes:
Evaluatable
Defined in:
lib/sparql/algebra/operator/if.rb

Overview

The SPARQL if function.

[121] BuiltInCall ::= … | ‘IF’ ‘(’ Expression ‘,’ Expression ‘,’ Expression ‘)’

Examples:

SPARQL Grammar

BASE <http://example.org/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?o (IF(lang(?o) = "ja", true, false) AS ?integer)
WHERE { ?s ?p ?o }

SSE

(base <http://example.org/>
  (prefix ((xsd: <http://www.w3.org/2001/XMLSchema#>))
    (project (?o ?integer)
      (extend ((?integer (if (= (lang ?o) "ja") true false)))
        (bgp (triple ?s ?p ?o))))))

See Also:

Constant Summary collapse

NAME =
:if

Constants inherited from Ternary

Ternary::ARITY

Constants inherited from SPARQL::Algebra::Operator

ARITY, IsURI, URI

Constants included from Expression

Expression::PATTERN_PARENTS

Instance Attribute Summary

Attributes inherited from SPARQL::Algebra::Operator

#operands

Instance Method Summary collapse

Methods included from Evaluatable

#apply, #memoize, #replace_aggregate!, #replace_vars!

Methods inherited from Ternary

#initialize

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, #initialize, #inspect, #ndvars, #node?, #operand, #optimize, #optimize!, #parent, #parent=, #prefixes, prefixes, prefixes=, #rewrite, #to_binary, to_sparql, #to_sxp, #to_sxp_bin, #validate!, #variable?, #variables, #vars

Methods included from Expression

cast, #constant?, 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::Ternary

Instance Method Details

#evaluate(bindings, **options) ⇒ RDF::Term

The IF function form evaluates the first argument, interprets it as a effective boolean value, then returns the value of expression2 if the EBV is true, otherwise it returns the value of expression3. Only one of expression2 and expression3 is evaluated. If evaluating the first argument raises an error, then an error is raised for the evaluation of the IF expression.

Evaluates the first operand and returns the evaluation of either the second or third operands

Examples:


IF(?x = 2, "yes", "no") #=> "yes"
IF(bound(?y), "yes", "no") #=> "no"
IF(?x=2, "yes", 1/?z) #=> "yes", the expression 1/?z is not evaluated
IF(?x=1, "yes", 1/?z) #=> raises an error
IF("2" > 1, "yes", "no") #=> raises an error

Parameters:

Returns:

Raises:

  • (TypeError)


44
45
46
47
48
49
50
# File 'lib/sparql/algebra/operator/if.rb', line 44

def evaluate(bindings, **options)
  operand(0).evaluate(bindings, **options.merge(depth: options[:depth].to_i + 1)) == RDF::Literal::TRUE ?
    operand(1).evaluate(bindings, **options.merge(depth: options[:depth].to_i + 1)) :
    operand(2).evaluate(bindings, **options.merge(depth: options[:depth].to_i + 1))
rescue
  raise TypeError
end

#to_sparql(**options) ⇒ String

Returns a partial SPARQL grammar for this operator.

Returns:

  • (String)


57
58
59
# File 'lib/sparql/algebra/operator/if.rb', line 57

def to_sparql(**options)
  "IF(" + operands.to_sparql(delimiter: ', ', **options) + ")"
end