Class: ShEx::Algebra::LanguageStemRange

Inherits:
StemRange show all
Defined in:
lib/shex/algebra/stem_range.rb

Constant Summary collapse

NAME =
:languageStemRange

Constants inherited from Operator::Binary

Operator::Binary::ARITY

Constants inherited from Operator

Operator::ARITY

Instance Attribute Summary

Attributes inherited from Operator

#id, #logger, #operands, #options, #schema

Instance Method Summary collapse

Methods inherited from StemRange

#exclusions, from_shexj

Methods inherited from Operator::Binary

#initialize

Methods inherited from Operator

#base_uri, #closed?, #dup, #each_descendant, #eql?, #expression, #expressions, #find, #focus, #focus=, from_shexj, #initialize, #inspect, #iri, iri, #json_type, #matched, #matched=, #message, #message=, #not_matched, #not_satisfied, #operand, #parent, #parent=, #references, #satisfied, #satisfied=, #satisfy, #semact?, #semantic_actions, #serialize_value, #status, #structure_error, #to_h, #to_json, #to_sxp, #to_sxp_bin, #triple_expression?, #unmatched, #unmatched=, #unsatisfied, #unsatisfied=, #validate!, #value, value

Constructor Details

This class inherits a constructor from ShEx::Algebra::Operator::Binary

Instance Method Details

#match?(value, depth: 0) ⇒ Boolean

For a node n and constraint value v, nodeSatisfies(n, v) if n matches some valueSetValue vsv in v. A term matches a valueSetValue if:

  • vsv is a StemRange with stem st and exclusions excls and nodeIn(n, st) and there is no x in excls such that nodeIn(n, excl).

  • vsv is a Wildcard with exclusions excls and there is no x in excls such that nodeIn(n, excl).



102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/shex/algebra/stem_range.rb', line 102

def match?(value, depth: 0)
  initial_match = case operands.first
  when :wildcard then true
  when RDF::Literal
    value.language? &&
    (operands.first.to_s.empty? || value.language.to_s.match?(%r(^#{operands.first}((-.*)?)$)))
  else false
  end

  unless initial_match
    status "#{value} does not match #{operands.first}", depth: depth
    return false
  end

  if exclusions.any? do |exclusion|
      case exclusion
      when RDF::Literal, String then value.language.to_s == exclusion
      when Stem                 then exclusion.match?(value, depth: depth + 1)
      else                           false
      end
    end
    status "#{value} excluded", depth: depth
    return false
  end

  status "matched #{value}", depth: depth
  true
end