Module: Expressir::Express::Builders::Helpers
- Included in:
- BuiltInBuilder, ExpressionBuilder, LiteralBuilder, ReferenceBuilder, SimpleIdBuilder, StatementBuilder, TypeBuilder
- Defined in:
- lib/expressir/express/builders/helpers.rb
Overview
Shared helper methods for all builders. Included as a module to avoid duplication.
Instance Method Summary collapse
-
#apply_qualifier(ref, qualifier) ⇒ Object
Apply qualifier to reference.
-
#extract_id_ref(data) ⇒ Object
Extract ID from reference types like functionId, constantId, etc.
-
#extract_interval_op(data) ⇒ Object
Extract interval operator.
-
#extract_nested_text(data) ⇒ Object
Recursively extract text from nested structures.
-
#extract_operator(data) ⇒ Object
Extract binary operator.
-
#extract_rel_op(data) ⇒ Object
Extract relational operator.
-
#extract_text(val) ⇒ Object
Extract text from Parsanol::Slice or return as-is.
-
#extract_unary_op(data) ⇒ Object
Extract unary operator.
-
#first_value(hash) ⇒ Object
Get first value from a hash (for union types).
Instance Method Details
#apply_qualifier(ref, qualifier) ⇒ Object
Apply qualifier to reference
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
# File 'lib/expressir/express/builders/helpers.rb', line 130 def apply_qualifier(ref, qualifier) case qualifier when Expressir::Model::References::AttributeReference Expressir::Model::References::AttributeReference.new(ref: ref, attribute: qualifier.attribute) when Expressir::Model::References::GroupReference Expressir::Model::References::GroupReference.new(ref: ref, entity: qualifier.entity) when Expressir::Model::References::IndexReference Expressir::Model::References::IndexReference.new(ref: ref, index1: qualifier.index1, index2: qualifier.index2) else ref end end |
#extract_id_ref(data) ⇒ Object
Extract ID from reference types like functionId, constantId, etc.
58 59 60 61 62 63 64 65 66 |
# File 'lib/expressir/express/builders/helpers.rb', line 58 def extract_id_ref(data) id_data = data[:function_id] || data[:constant_id] || data[:parameter_id] || data[:variable_id] || data[:attribute_id] || data[:entity_id] || data[:type_id] || data[:procedure_id] || data[:schema_id] || data[:type_label_id] || data[:enumeration_id] || data[:rename_id] || data[:simple_id] extract_nested_text(id_data || first_value(data)) end |
#extract_interval_op(data) ⇒ Object
Extract interval operator
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/expressir/express/builders/helpers.rb', line 69 def extract_interval_op(data) return nil unless data if data.is_a?(Array) data.each do |item| next unless item.is_a?(Hash) return "LESS_THAN" if item[:op_less_than] return "LESS_THAN_OR_EQUAL" if item[:op_less_equal] end nil elsif data.is_a?(Hash) return "LESS_THAN" if data[:op_less_than] return "LESS_THAN_OR_EQUAL" if data[:op_less_equal] nil end end |
#extract_nested_text(data) ⇒ Object
Recursively extract text from nested structures
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/expressir/express/builders/helpers.rb', line 33 def extract_nested_text(data) return nil unless data return data.to_s if data.is_a?(String) return data.to_s if data.is_a?(Symbol) # Handle Parsanol Slice objects return data.to_s if data.class.name&.include?("Slice") if data.is_a?(Hash) str = data[:str] return str.to_s if str data.each_value do |value| result = extract_nested_text(value) return result if result end elsif data.is_a?(Array) data.each do |item| result = extract_nested_text(item) return result if result end end nil end |
#extract_operator(data) ⇒ Object
Extract binary operator
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/expressir/express/builders/helpers.rb', line 88 def extract_operator(data) return nil unless data return :ADDITION if data[:op_plus] return :SUBTRACTION if data[:op_minus] return :OR if data[:t_or] return :XOR if data[:t_xor] return :MULTIPLICATION if data[:op_asterisk] return :REAL_DIVISION if data[:op_slash] return :INTEGER_DIVISION if data[:t_div] return :MODULO if data[:t_mod] return :AND if data[:t_and] return :COMBINE if data[:op_double_pipe] extract_text(first_value(data))&.upcase&.to_sym end |
#extract_rel_op(data) ⇒ Object
Extract relational operator
115 116 117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/expressir/express/builders/helpers.rb', line 115 def extract_rel_op(data) return nil unless data return :EQUAL if data[:t_equal] || data[:op_equals] return :NOT_EQUAL if data[:t_not_equal] || data[:op_less_greater] return :LESS_THAN if data[:t_less_than] || data[:op_less_than] return :GREATER_THAN if data[:t_greater_than] || data[:op_greater_than] return :LESS_THAN_OR_EQUAL if data[:t_less_than_or_equal] || data[:op_less_equal] return :GREATER_THAN_OR_EQUAL if data[:t_greater_than_or_equal] || data[:op_greater_equal] return :INSTANCE_EQUAL if data[:t_instance_equal] || data[:op_colon_equals_colon] return :INSTANCE_NOT_EQUAL if data[:t_instance_not_equal] || data[:op_colon_less_greater_colon] extract_text(first_value(data))&.upcase&.to_sym end |
#extract_text(val) ⇒ Object
Extract text from Parsanol::Slice or return as-is
10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# File 'lib/expressir/express/builders/helpers.rb', line 10 def extract_text(val) return nil unless val # Handle String, Symbol, and objects with to_str (duck typing via class check) return val.to_s if val.is_a?(String) return val.to_s if val.is_a?(Symbol) # Handle Parsanol Slice objects - they respond to to_s but not to_str return val.to_s if val.class.name&.include?("Slice") if val.is_a?(Hash) str = val[:str] return str.to_s if str end val end |
#extract_unary_op(data) ⇒ Object
Extract unary operator
105 106 107 108 109 110 111 112 |
# File 'lib/expressir/express/builders/helpers.rb', line 105 def extract_unary_op(data) return nil unless data return :PLUS if data[:op_plus] return :MINUS if data[:op_minus] return :NOT if data[:t_not] extract_text(first_value(data))&.upcase&.to_sym end |
#first_value(hash) ⇒ Object
Get first value from a hash (for union types)
26 27 28 29 30 |
# File 'lib/expressir/express/builders/helpers.rb', line 26 def first_value(hash) return nil unless hash.is_a?(Hash) hash.values.first end |