Class: BELParser::Expression::Model::Statement

Inherits:
Object
  • Object
show all
Defined in:
lib/bel_parser/expression/model/statement.rb

Overview

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:

  • SUBJECT

    • complex(p(HGNC:F3),p(HGNC:F7))

  • SUBJECT RELATIONSHIP OBJECT(Term)

    • pep(complex(p(HGNC:F3),p(HGNC:F7))) => pep(p(HGNC:F9))

  • SUBJECT RELATIONSHIP OBJECT(Statement)

    • p(HGNC:VHL) -> (p(HGNC:TNF) -> bp(GOBP:“cell death”))

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(subject, relationship = nil, object = nil, comment = nil) ⇒ Statement

Creates a BELParser::Expression::Model::Statement with subject, relationship, object, and comment.

Parameters:



28
29
30
31
32
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
# 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

  unless relationship.nil? || relationship.is_a?(BELParser::Language::Relationship)
    raise(
      ArgumentError,
      "relationship: expected nil or Relationship, actual #{relationship.class}")
  end
  @relationship = relationship

  unless object.nil? || [Term, Statement].any?(&object.method(:is_a?))
    raise(
      ArgumentError,
      "object: expected nil, Term, or Statement, actual #{object.class}")
  end
  @object       = object
  @comment      = comment

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

  if @object && !@relationship
    raise(
      ArgumentError,
      "relationsihp must be set when specifying an object")
  end
end

Instance Attribute Details

#commentObject

Returns the value of attribute comment.



19
20
21
# File 'lib/bel_parser/expression/model/statement.rb', line 19

def comment
  @comment
end

#objectObject

Returns the value of attribute object.



19
20
21
# File 'lib/bel_parser/expression/model/statement.rb', line 19

def object
  @object
end

#relationshipObject

Returns the value of attribute relationship.



19
20
21
# File 'lib/bel_parser/expression/model/statement.rb', line 19

def relationship
  @relationship
end

#subjectObject

Returns the value of attribute subject.



19
20
21
# File 'lib/bel_parser/expression/model/statement.rb', line 19

def subject
  @subject
end

Instance Method Details

#==(other) ⇒ Object Also known as: eql?



105
106
107
108
109
110
111
# File 'lib/bel_parser/expression/model/statement.rb', line 105

def ==(other)
  return false if other == nil
  @subject      == other.subject &&
  @relationship == other.relationship &&
  @object       == other.object &&
  @comment      == other.comment
end

#hashObject



101
102
103
# File 'lib/bel_parser/expression/model/statement.rb', line 101

def hash
  [@subject, @relationship, @object, @comment].hash
end

#namespacesObject



76
77
78
79
80
# File 'lib/bel_parser/expression/model/statement.rb', line 76

def namespaces
  ns = @subject.namespaces
  ns.concat(@object.namespaces) unless @object.nil?
  ns
end

#nested?Boolean

Returns:

  • (Boolean)


72
73
74
# File 'lib/bel_parser/expression/model/statement.rb', line 72

def nested?
  @object && @object.is_a?(Statement)
end

#simple?Boolean

Returns:

  • (Boolean)


68
69
70
# File 'lib/bel_parser/expression/model/statement.rb', line 68

def simple?
  @object && @object.is_a?(Term)
end

#subject_only?Boolean

Returns:

  • (Boolean)


64
65
66
# File 'lib/bel_parser/expression/model/statement.rb', line 64

def subject_only?
  !@relationship
end

#to_s(form = :short) ⇒ Object



114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/bel_parser/expression/model/statement.rb', line 114

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?Boolean

Returns:

  • (Boolean)


97
98
99
# File 'lib/bel_parser/expression/model/statement.rb', line 97

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



82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/bel_parser/expression/model/statement.rb', line 82

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