Class: Expressir::Model::ModelElement
- Inherits:
-
Lutaml::Model::Serializable
- Object
- Lutaml::Model::Serializable
- Expressir::Model::ModelElement
- 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
-
#parent ⇒ Object
: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.
Instance Method Summary collapse
-
#add_remark(remark_info) ⇒ Object
Add a remark to this element.
- #children ⇒ Array<Declaration>
- #children_by_id ⇒ Hash<String, Declaration>
- #find(path) ⇒ ModelElement
-
#initialize(_options = {}) ⇒ ModelElement
constructor
A new instance of ModelElement.
- #path ⇒ String
-
#remark_infos ⇒ Array<RemarkInfo>
Get all remarks as RemarkInfo objects.
- #reset_children_by_id ⇒ nil
- #source ⇒ Object
- #to_s(no_remarks: false, formatter: nil) ⇒ Object
Constructor Details
#initialize(_options = {}) ⇒ ModelElement
Returns a new instance of ModelElement.
108 109 110 111 |
# File 'lib/expressir/model/model_element.rb', line 108 def initialize( = {}) super attach_parent_to_children end |
Instance Attribute Details
#parent ⇒ Object
: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
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 |
#children ⇒ Array<Declaration>
174 175 176 |
# File 'lib/expressir/model/model_element.rb', line 174 def children [] end |
#children_by_id ⇒ Hash<String, Declaration>
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
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 |
#path ⇒ String
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_infos ⇒ Array<RemarkInfo>
Get all remarks as 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_id ⇒ 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 |
#source ⇒ Object
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 |