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, 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::Repository" => "Expressir::Model::Repository",
  "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)


105
106
107
108
# File 'lib/expressir/model/model_element.rb', line 105

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

#childrenArray<Declaration>

Returns:

  • (Array<Declaration>)


171
172
173
# File 'lib/expressir/model/model_element.rb', line 171

def children
  []
end

#children_by_idHash<String, Declaration>

Returns:



176
177
178
179
180
# File 'lib/expressir/model/model_element.rb', line 176

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:



138
139
140
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
# File 'lib/expressir/model/model_element.rb', line 138

def find(path)
  return self if 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:



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

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

#reset_children_by_idnil

Returns:

  • (nil)


183
184
185
186
# File 'lib/expressir/model/model_element.rb', line 183

def reset_children_by_id
  @children_by_id = nil
  nil
end

#sourceObject



97
98
99
100
101
102
# File 'lib/expressir/model/model_element.rb', line 97

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



188
189
190
191
192
# File 'lib/expressir/model/model_element.rb', line 188

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