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
# 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



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

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

#simple?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



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



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