Class: ShEx::Algebra::And

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

Constant Summary collapse

NAME =
:and

Constants inherited from Operator

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) ⇒ And

Returns a new instance of And.

Raises:

  • (ArgumentError)


7
8
9
10
11
12
13
14
15
16
# File 'lib/shex/algebra/and.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/and.rb', line 22

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

Instance Method Details

#json_typeObject



74
75
76
# File 'lib/shex/algebra/and.rb', line 74

def json_type
  "ShapeAnd"
end

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

S is a ShapeAnd and for every shape expression se2 in shapeExprs, 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
# File 'lib/shex/algebra/and.rb', line 33

def satisfies?(focus, depth: 0)
  status ""
  satisfied = []
  unsatisfied = expressions.dup

  # Operand raises NotSatisfied, so no need to check here.
  expressions.each do |op|
    satisfied << 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
        end
      end
    when ShapeExpression
      op.satisfies?(focus, depth: depth + 1)
    end
    unsatisfied.shift
  end
  satisfy focus: focus, satisfied: satisfied, depth: depth
rescue ShEx::NotSatisfied => e
  not_satisfied e.message,
                focus:       focus, 
                satisfied:   satisfied,
                unsatisfied: unsatisfied,
                depth:       depth
end

#validate!Operator

expressions must be ShapeExpressions or references to ShapeExpressions

Returns:

Raises:



68
69
70
71
72
# File 'lib/shex/algebra/and.rb', line 68

def validate!
  validate_expressions!
  validate_self_references!
  super
end