class BELParser::Expression::Model::Statement

A {Statement} captures a BEL statement composed of a subject {Term}, relationship, and object {Term}. A {Statement} may be one of the following common forms:

Attributes

comment[R]
object[R]
relationship[R]
subject[R]
type[R]

Public Class Methods

new(subject, relationship = nil, object = nil, comment = nil) click to toggle source

Creates a {Statement} with subject, relationship, object, and comment.

@param [Term] subject @param [BELParser::Language::Relationship] relationship @param [Term, Statement] object @param [String] comment

# File lib/bel_parser/expression/model/statement.rb, line 28
def initialize(subject, relationship = nil, object = nil, comment = nil)
  if subject.nil? || !subject.is_a?(Term)
    raise(
      ArgumentError,
      "subject: expected Term, actual #{subject.class}")
  end
  @subject = subject

  case relationship
  when nil
    @type         = :observed_term
    @relationship = nil
  when BELParser::Language::Relationship
    @type         = :simple_statement
    @relationship = relationship
  else
    raise(ArgumentError,
      "relationship: expected nil or Relationship, actual #{relationship.class}")
  end

  case object
  when nil
    @type   = :observed_term
    @object = nil
  when BELParser::Expression::Model::Term
    @type   = :simple_statement
    @object = object
  when BELParser::Expression::Model::Statement
    @type   = :nested_statement
    @object = object
  else
    raise(ArgumentError,
      "object: expected nil, Term, or Statement, actual #{object.class}")
  end

  @comment = comment

  if @relationship && @object.nil?
    raise(
      ArgumentError,
      "object must be set when specifying a relationship")
  end

  if @object && @relationship.nil?
    raise(
      ArgumentError,
      "relationship must be set when specifying an object")
  end
end

Public Instance Methods

==(other) click to toggle source
# File lib/bel_parser/expression/model/statement.rb, line 119
def ==(other)
  return false if other == nil
  @subject      == other.subject &&
  @relationship == other.relationship &&
  @object       == other.object &&
  @comment      == other.comment
end
hash() click to toggle source
# File lib/bel_parser/expression/model/statement.rb, line 115
def hash
  [@subject, @relationship, @object, @comment].hash
end
namespaces() click to toggle source
# File lib/bel_parser/expression/model/statement.rb, line 90
def namespaces
  ns = @subject.namespaces
  ns.concat(@object.namespaces) unless @object.nil?
  ns
end
nested?() click to toggle source
# File lib/bel_parser/expression/model/statement.rb, line 86
def nested?
  @type == :nested_statement
end
simple?() click to toggle source
# File lib/bel_parser/expression/model/statement.rb, line 82
def simple?
  @type == :simple_statement
end
subject_only?() click to toggle source
# File lib/bel_parser/expression/model/statement.rb, line 78
def subject_only?
  @type == :observed_term
end
to_s(form = :short) click to toggle source
# File lib/bel_parser/expression/model/statement.rb, line 128
def to_s(form = :short)
  rel =
    case form
    when :short
      @relationship && @relationship.short
    when :long
      @relationship && @relationship.long
    else
      nil
    end

  lbl =
    case
    when subject_only?
      @subject.to_s(form)
    when simple?
      "#{@subject.to_s(form)} #{rel} #{@object.to_s(form)}"
    when nested?
      "#{@subject.to_s(form)} #{rel} (#{@object.to_s(form)})"
    else
      ''
    end

  comment ? lbl + ' //' + comment : lbl
end
valid?() click to toggle source
# File lib/bel_parser/expression/model/statement.rb, line 111
def valid?
  @subject.valid? && @object.valid?
end
validation( spec = BELParser::Language.default_specification, uri_reader = BELParser::Resource.default_uri_reader, url_reader = BELParser::Resource.default_url_reader) click to toggle source
# File lib/bel_parser/expression/model/statement.rb, line 96
def validation(
  spec       = BELParser::Language.default_specification,
  uri_reader = BELParser::Resource.default_uri_reader,
  url_reader = BELParser::Resource.default_url_reader)

  validator =
    BELParser::Expression::Validator.new(
      spec,
      Hash[namespaces.map { |ns| [ns.keyword, ns] }],
      uri_reader,
      url_reader)
  _, _, _, result = validator.each(StringIO.new("#{to_s}\n")).first
  result
end