Class: ShEx::Algebra::Or

Inherits:
Operator show all
Includes:
ShapeExpression
Defined in:
lib/shex/algebra/or.rb

Constant Summary collapse

NAME =
:or

Constants inherited from Operator

ShEx::Algebra::Operator::ARITY

Instance Attribute Summary

Attributes inherited from Operator

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

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ShapeExpression

#validate_expressions!, #validate_self_references!

Methods inherited from Operator

#base_uri, #closed?, #dup, #each_descendant, #eql?, #expression, #expressions, #find, #focus, #focus=, #inspect, #iri, iri, #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=, #value, value

Constructor Details

#initialize(*args, **options) ⇒ Or

Returns a new instance of Or.

Raises:

  • (ArgumentError)


7
8
9
10
11
12
13
14
15
16
# File 'lib/shex/algebra/or.rb', line 7

def initialize(*args, **options)
  case
  when args.length < 2
    raise ArgumentError, "wrong number of arguments (given #{args.length}, expected 2..)"
  end

  # All arguments must be ShapeExpression
  raise ArgumentError, "All operands must be Shape operands or resource" unless args.all? {|o| o.is_a?(ShapeExpression) || o.is_a?(RDF::Resource)}
  super
end

Class Method Details

.from_shexj(operator, **options) ⇒ Operator

Creates an operator instance from a parsed ShExJ representation

Returns:

Raises:

  • (ArgumentError)


22
23
24
25
26
# File 'lib/shex/algebra/or.rb', line 22

def self.from_shexj(operator, **options)
  raise ArgumentError unless operator.is_a?(Hash) && operator['type'] == 'ShapeOr'
  raise ArgumentError, "missing shapeExprs in #{operator.inspect}" unless operator.is_a?(Hash) && operator.has_key?('shapeExprs')
  super
end

Instance Method Details

#json_typeObject



80
81
82
# File 'lib/shex/algebra/or.rb', line 80

def json_type
  "ShapeOr"
end

#satisfies?(focus, depth: 0) ⇒ Boolean, ShapeExpression

S is a ShapeOr and there is some shape expression se2 in shapeExprs such that satisfies(n, se2, G, m).

Parameters:

  • focus (RDF::Resource)
  • depth (Integer) (defaults to: 0)

    for logging

  • options (Hash{Symbol => Object})

    Other, operand-specific options

Returns:

  • (Boolean)
  • (ShapeExpression)

    with matched and satisfied accessors for matched triples and sub-expressions

Raises:

  • (ShEx::NotMatched)

    with expression accessor to access matched and unmatched statements along with satisfied and unsatisfied operations.



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
# File 'lib/shex/algebra/or.rb', line 33

def satisfies?(focus, depth: 0)
  status "", depth: depth
  unsatisfied = []
  expressions.any? do |op|
    begin
      matched_op = case op
      when RDF::Resource
        schema.enter_shape(op, focus) do |shape|
          if shape
            shape.satisfies?(focus, depth: depth + 1)
          else
            status "Satisfy as #{op} was re-entered for #{focus}", depth: depth
            shape
          end
        end
      when ShapeExpression
        op.satisfies?(focus, depth: depth + 1)
      end
      return satisfy focus: focus, satisfied: matched_op, depth: depth
    rescue ShEx::NotSatisfied => e
      status "unsatisfied #{focus}", depth: depth
      op = op.dup
      if op.respond_to?(:satisfied)
        op.satisfied = e.expression.satisfied
        op.unsatisfied = e.expression.unsatisfied
      end
      unsatisfied << op
      status "unsatisfied: #{e.message}", depth: depth
      false
    end
  end

  not_satisfied "Expected some expression to be satisfied",
                focus: focus, unsatisfied: unsatisfied, depth: depth
end

#validate!Operator

expressions must be ShapeExpressions or references to ShapeExpressions

Returns:

Raises:



74
75
76
77
78
# File 'lib/shex/algebra/or.rb', line 74

def validate!
  validate_expressions!
  validate_self_references!
  super
end