Class: Expressir::Model::ModelElement

Inherits:
Lutaml::Model::Serializable
  • Object
show all
Defined in:
lib/expressir/model/model_element.rb

Overview

Base model element

Direct Known Subclasses

Cache, DataTypes::Aggregate, DataTypes::Array, DataTypes::Bag, DataTypes::Binary, DataTypes::Boolean, DataTypes::Enumeration, DataTypes::EnumerationItem, DataTypes::Generic, DataTypes::GenericEntity, DataTypes::Integer, DataTypes::List, DataTypes::Logical, DataTypes::Number, DataTypes::Real, DataTypes::Select, DataTypes::Set, DataTypes::String, Declarations::Attribute, Declarations::Constant, Declarations::Entity, Declarations::Function, Declarations::InformalPropositionRule, Declarations::Interface, Declarations::InterfaceItem, Declarations::InterfacedItem, Declarations::Parameter, Declarations::Procedure, Declarations::RemarkItem, Declarations::Rule, Declarations::Schema, Declarations::SchemaVersion, Declarations::SchemaVersionItem, Declarations::SubtypeConstraint, Declarations::Type, Declarations::UniqueRule, Declarations::Variable, Declarations::WhereRule, ExpFile, Expressions::AggregateInitializer, Expressions::AggregateInitializerItem, Expressions::BinaryExpression, Expressions::EntityConstructor, Expressions::FunctionCall, Expressions::Interval, Expressions::QueryExpression, Expressions::UnaryExpression, Literals::Binary, Literals::Integer, Literals::Logical, Literals::Real, Literals::String, References::AttributeReference, References::GroupReference, References::IndexReference, References::SimpleReference, Repository, Statements::Alias, Statements::Assignment, Statements::Case, Statements::CaseAction, Statements::Compound, Statements::Escape, Statements::If, Statements::Null, Statements::ProcedureCall, Statements::Repeat, Statements::Return, Statements::Skip, SupertypeExpressions::BinarySupertypeExpression, SupertypeExpressions::OneofSupertypeExpression

Constant Summary collapse

SKIP_ATTRIBUTES =
i[parent _class].freeze
POLYMORPHIC_CLASS_MAP =
{
  "Expressir::Model::Cache" => "Expressir::Model::Cache",
  "Expressir::Model::ExpFile" => "Expressir::Model::ExpFile",
  "Expressir::Model::Repository" => "Expressir::Model::Repository",
  "Expressir::Model::RemarkInfo" => "Expressir::Model::RemarkInfo",
  "Expressir::Model::DataTypes::Aggregate" => "Expressir::Model::DataTypes::Aggregate",
  "Expressir::Model::DataTypes::Array" => "Expressir::Model::DataTypes::Array",
  "Expressir::Model::DataTypes::Bag" => "Expressir::Model::DataTypes::Bag",
  "Expressir::Model::DataTypes::Binary" => "Expressir::Model::DataTypes::Binary",
  "Expressir::Model::DataTypes::Boolean" => "Expressir::Model::DataTypes::Boolean",
  "Expressir::Model::DataTypes::EnumerationItem" => "Expressir::Model::DataTypes::EnumerationItem",
  "Expressir::Model::DataTypes::Enumeration" => "Expressir::Model::DataTypes::Enumeration",
  "Expressir::Model::DataTypes::GenericEntity" => "Expressir::Model::DataTypes::GenericEntity",
  "Expressir::Model::DataTypes::Generic" => "Expressir::Model::DataTypes::Generic",
  "Expressir::Model::DataTypes::Integer" => "Expressir::Model::DataTypes::Integer",
  "Expressir::Model::DataTypes::List" => "Expressir::Model::DataTypes::List",
  "Expressir::Model::DataTypes::Logical" => "Expressir::Model::DataTypes::Logical",
  "Expressir::Model::DataTypes::Number" => "Expressir::Model::DataTypes::Number",
  "Expressir::Model::DataTypes::Real" => "Expressir::Model::DataTypes::Real",
  "Expressir::Model::DataTypes::Select" => "Expressir::Model::DataTypes::Select",
  "Expressir::Model::DataTypes::Set" => "Expressir::Model::DataTypes::Set",
  "Expressir::Model::DataTypes::String" => "Expressir::Model::DataTypes::String",
  "Expressir::Model::Declarations::DerivedAttribute" => "Expressir::Model::Declarations::DerivedAttribute",
  "Expressir::Model::Declarations::Attribute" => "Expressir::Model::Declarations::Attribute",
  "Expressir::Model::Declarations::Constant" => "Expressir::Model::Declarations::Constant",
  "Expressir::Model::Declarations::Entity" => "Expressir::Model::Declarations::Entity",
  "Expressir::Model::Declarations::Function" => "Expressir::Model::Declarations::Function",
  "Expressir::Model::Declarations::InterfaceItem" => "Expressir::Model::Declarations::InterfaceItem",
  "Expressir::Model::Declarations::Interface" => "Expressir::Model::Declarations::Interface",
  "Expressir::Model::Declarations::InterfacedItem" => "Expressir::Model::Declarations::InterfacedItem",
  "Expressir::Model::Declarations::Parameter" => "Expressir::Model::Declarations::Parameter",
  "Expressir::Model::Declarations::Procedure" => "Expressir::Model::Declarations::Procedure",
  "Expressir::Model::Declarations::RemarkItem" => "Expressir::Model::Declarations::RemarkItem",
  "Expressir::Model::Declarations::InformalPropositionRule" => "Expressir::Model::Declarations::InformalPropositionRule",
  "Expressir::Model::Declarations::Rule" => "Expressir::Model::Declarations::Rule",
  "Expressir::Model::Declarations::SchemaVersionItem" => "Expressir::Model::Declarations::SchemaVersionItem",
  "Expressir::Model::Declarations::SchemaVersion" => "Expressir::Model::Declarations::SchemaVersion",
  "Expressir::Model::Declarations::Schema" => "Expressir::Model::Declarations::Schema",
  "Expressir::Model::Declarations::SubtypeConstraint" => "Expressir::Model::Declarations::SubtypeConstraint",
  "Expressir::Model::Declarations::Type" => "Expressir::Model::Declarations::Type",
  "Expressir::Model::Declarations::UniqueRule" => "Expressir::Model::Declarations::UniqueRule",
  "Expressir::Model::Declarations::Variable" => "Expressir::Model::Declarations::Variable",
  "Expressir::Model::Declarations::WhereRule" => "Expressir::Model::Declarations::WhereRule",
  "Expressir::Model::Expressions::AggregateInitializerItem" => "Expressir::Model::Expressions::AggregateInitializerItem",
  "Expressir::Model::Expressions::AggregateInitializer" => "Expressir::Model::Expressions::AggregateInitializer",
  "Expressir::Model::Expressions::BinaryExpression" => "Expressir::Model::Expressions::BinaryExpression",
  "Expressir::Model::Expressions::EntityConstructor" => "Expressir::Model::Expressions::EntityConstructor",
  "Expressir::Model::Expressions::FunctionCall" => "Expressir::Model::Expressions::FunctionCall",
  "Expressir::Model::Expressions::Interval" => "Expressir::Model::Expressions::Interval",
  "Expressir::Model::Expressions::QueryExpression" => "Expressir::Model::Expressions::QueryExpression",
  "Expressir::Model::Expressions::UnaryExpression" => "Expressir::Model::Expressions::UnaryExpression",
  "Expressir::Model::Literals::Binary" => "Expressir::Model::Literals::Binary",
  "Expressir::Model::Literals::Integer" => "Expressir::Model::Literals::Integer",
  "Expressir::Model::Literals::Logical" => "Expressir::Model::Literals::Logical",
  "Expressir::Model::Literals::Real" => "Expressir::Model::Literals::Real",
  "Expressir::Model::Literals::String" => "Expressir::Model::Literals::String",
  "Expressir::Model::References::AttributeReference" => "Expressir::Model::References::AttributeReference",
  "Expressir::Model::References::GroupReference" => "Expressir::Model::References::GroupReference",
  "Expressir::Model::References::IndexReference" => "Expressir::Model::References::IndexReference",
  "Expressir::Model::References::SimpleReference" => "Expressir::Model::References::SimpleReference",
  "Expressir::Model::Statements::Alias" => "Expressir::Model::Statements::Alias",
  "Expressir::Model::Statements::Assignment" => "Expressir::Model::Statements::Assignment",
  "Expressir::Model::Statements::CaseAction" => "Expressir::Model::Statements::CaseAction",
  "Expressir::Model::Statements::Case" => "Expressir::Model::Statements::Case",
  "Expressir::Model::Statements::Compound" => "Expressir::Model::Statements::Compound",
  "Expressir::Model::Statements::Escape" => "Expressir::Model::Statements::Escape",
  "Expressir::Model::Statements::If" => "Expressir::Model::Statements::If",
  "Expressir::Model::Statements::Null" => "Expressir::Model::Statements::Null",
  "Expressir::Model::Statements::ProcedureCall" => "Expressir::Model::Statements::ProcedureCall",
  "Expressir::Model::Statements::Repeat" => "Expressir::Model::Statements::Repeat",
  "Expressir::Model::Statements::Return" => "Expressir::Model::Statements::Return",
  "Expressir::Model::Statements::Skip" => "Expressir::Model::Statements::Skip",
  "Expressir::Model::SupertypeExpressions::BinarySupertypeExpression" => "Expressir::Model::SupertypeExpressions::BinarySupertypeExpression",
  "Expressir::Model::SupertypeExpressions::OneofSupertypeExpression" => "Expressir::Model::SupertypeExpressions::OneofSupertypeExpression",
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(_options = {}) ⇒ ModelElement

Returns a new instance of ModelElement.

Parameters:

  • options (Hash)


108
109
110
111
# File 'lib/expressir/model/model_element.rb', line 108

def initialize(_options = {})
  super
  attach_parent_to_children
end

Instance Attribute Details

#parentObject

:parent is a special attribute that is used to store the parent of the current element It is not a real attribute attribute :parent, ModelElement



11
12
13
# File 'lib/expressir/model/model_element.rb', line 11

def parent
  @parent
end

Instance Method Details

#add_remark(remark_info) ⇒ Object

Add a remark to this element

Parameters:



199
200
201
202
203
204
# File 'lib/expressir/model/model_element.rb', line 199

def add_remark(remark_info)
  self.untagged_remarks ||= []
  return unless remark_info.is_a?(RemarkInfo)

  self.untagged_remarks << remark_info
end

#childrenArray<Declaration>

Returns:

  • (Array<Declaration>)


174
175
176
# File 'lib/expressir/model/model_element.rb', line 174

def children
  []
end

#children_by_idHash<String, Declaration>

Returns:



179
180
181
182
183
# File 'lib/expressir/model/model_element.rb', line 179

def children_by_id
  @children_by_id ||= children.select(&:id).to_h do |x|
    [x.id.safe_downcase, x]
  end
end

#find(path) ⇒ ModelElement

Parameters:

Returns:



141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# File 'lib/expressir/model/model_element.rb', line 141

def find(path)
  return self if path.nil? || path.empty?

  path_parts = path.safe_downcase.split(".").map do |current_path|
    _, _, current_path = current_path.rpartition(":") # ignore prefix
    current_path
  end

  current_scope = self
  target_node = nil
  loop do
    # find in current scope
    current_node = current_scope
    path_parts.each do |current_path|
      current_node = current_node.children_by_id[current_path]
      break unless current_node
    end
    target_node = current_node
    break if target_node

    # retry search in parent scope
    current_scope = current_scope.parent
    break unless current_scope
  end

  if target_node.is_a? Model::Declarations::InterfacedItem
    target_node = target_node.base_item
  end

  target_node
end

#pathString

Returns:



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

def path
  # this creates an implicit scope
  return if is_a?(Statements::Alias) || is_a?(Statements::Repeat) || is_a?(Expressions::QueryExpression)

  current_node = self
  path_parts = []
  loop do
    # Skip adding the id if this is a RemarkItem that belongs to an InformalPropositionRule
    # and has the same id as its parent
    if !(current_node.is_a? References::SimpleReference) && current_node.class.method_defined?(:id) &&
        !(is_a?(Declarations::RemarkItem) &&
          parent.is_a?(Declarations::InformalPropositionRule) &&
          id == parent.id)
      path_parts << current_node.id
    end

    current_node = current_node.parent
    break unless current_node
  end

  return if path_parts.empty?

  path_parts.reverse.join(".")
end

#remark_infosArray<RemarkInfo>

Get all remarks as RemarkInfo objects

Returns:

  • (Array<RemarkInfo>)

    Array of RemarkInfo objects



208
209
210
211
212
# File 'lib/expressir/model/model_element.rb', line 208

def remark_infos
  return [] if untagged_remarks.nil?

  untagged_remarks.grep(RemarkInfo)
end

#reset_children_by_idnil

Returns:

  • (nil)


186
187
188
189
# File 'lib/expressir/model/model_element.rb', line 186

def reset_children_by_id
  @children_by_id = nil
  nil
end

#sourceObject



100
101
102
103
104
105
# File 'lib/expressir/model/model_element.rb', line 100

def source
  formatter = Class.new(Expressir::Express::Formatter) do
    include Expressir::Express::HyperlinkFormatter
  end
  formatter.format(self)
end

#to_s(no_remarks: false, formatter: nil) ⇒ Object



191
192
193
194
195
# File 'lib/expressir/model/model_element.rb', line 191

def to_s(no_remarks: false, formatter: nil)
  f = formatter || Express::Formatter.new(no_remarks: no_remarks)
  f.no_remarks = no_remarks
  f.format(self)
end