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.



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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# 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

Instance Attribute Details

#commentObject (readonly)

Returns the value of attribute comment.



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

def comment
  @comment
end

#objectObject (readonly)

Returns the value of attribute object.



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

def object
  @object
end

#relationshipObject (readonly)

Returns the value of attribute relationship.



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

def relationship
  @relationship
end

#subjectObject (readonly)

Returns the value of attribute subject.



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

def subject
  @subject
end

#typeObject (readonly)

Returns the value of attribute type.



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

def type
  @type
end

Instance Method Details

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



119
120
121
122
123
124
125
# 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

#hashObject



115
116
117
# File 'lib/bel_parser/expression/model/statement.rb', line 115

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

#namespacesObject



90
91
92
93
94
# 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?Boolean



86
87
88
# File 'lib/bel_parser/expression/model/statement.rb', line 86

def nested?
  @type == :nested_statement
end

#simple?Boolean



82
83
84
# File 'lib/bel_parser/expression/model/statement.rb', line 82

def simple?
  @type == :simple_statement
end

#subject_only?Boolean



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

def subject_only?
  @type == :observed_term
end

#to_s(form = :short) ⇒ Object



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# 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?Boolean



111
112
113
# 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) ⇒ Object



96
97
98
99
100
101
102
103
104
105
106
107
108
109
# 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