expressir 2.3.5 → 2.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/expressir/express/builder.rb +1 -1
- data/lib/expressir/express/builder_registry.rb +10 -35
- data/lib/expressir/express/builders/constant_builder.rb +8 -2
- data/lib/expressir/express/builders/procedure_decl_builder.rb +2 -1
- data/lib/expressir/express/builders/statement_builder.rb +18 -5
- data/lib/expressir/express/builders/type_builder.rb +20 -12
- data/lib/expressir/express/formatters/data_types_formatter.rb +13 -3
- data/lib/expressir/express/formatters/expressions_formatter.rb +7 -4
- data/lib/expressir/express/formatters/literals_formatter.rb +1 -4
- data/lib/expressir/express/remark_attacher.rb +1 -1
- data/lib/expressir/model/declarations/function.rb +0 -1
- data/lib/expressir/model/declarations/procedure.rb +0 -1
- data/lib/expressir/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6af1982d1df8fc35cf696c67614f670e45386121feb42b962290a8b40acbc7f6
|
|
4
|
+
data.tar.gz: c03425e140c7b68391efef97105a3c86124d4269a8bb564515b0e83596a62932
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a330cbcd461ed7099e473a4a3d8c689f238096afce4c581b35a198bc487ddf5bd7a8bb777af698b1553efc1950eb878aa03874cc0b6904cb451b95a128962998
|
|
7
|
+
data.tar.gz: 1c995702e07eb2756811f35cbde5dfad4f1d32452c77a45404d551a1bfce1e374789219c72be5383eb5f804cf4489aee05cb2e29def2245ddd2d40cf591fa4c3
|
|
@@ -354,7 +354,7 @@ module Expressir
|
|
|
354
354
|
end
|
|
355
355
|
|
|
356
356
|
def attach_source_info(result, data)
|
|
357
|
-
return unless @source && result.is_a?(Model::ModelElement)
|
|
357
|
+
return unless @source && result.is_a?(Expressir::Model::ModelElement)
|
|
358
358
|
|
|
359
359
|
source_info = extract_source_info(data)
|
|
360
360
|
return unless source_info
|
|
@@ -181,18 +181,18 @@ module Expressir
|
|
|
181
181
|
Builder.register(:interval_high) { |d| expression.build_interval_high(d) }
|
|
182
182
|
Builder.register(:interval_item) { |d| expression.build_interval_item(d) }
|
|
183
183
|
Builder.register(:interval_op) do |d|
|
|
184
|
-
expression.
|
|
184
|
+
expression.extract_interval_op(d)
|
|
185
185
|
end
|
|
186
186
|
|
|
187
187
|
# Operators
|
|
188
188
|
Builder.register(:add_like_op) do |d|
|
|
189
|
-
expression.
|
|
189
|
+
expression.extract_operator(d)
|
|
190
190
|
end
|
|
191
191
|
Builder.register(:mul_like_op) do |d|
|
|
192
|
-
expression.
|
|
192
|
+
expression.extract_operator(d)
|
|
193
193
|
end
|
|
194
|
-
Builder.register(:unary_op) { |d| expression.
|
|
195
|
-
Builder.register(:rel_op) { |d| expression.
|
|
194
|
+
Builder.register(:unary_op) { |d| expression.extract_unary_op(d) }
|
|
195
|
+
Builder.register(:rel_op) { |d| expression.extract_rel_op(d) }
|
|
196
196
|
|
|
197
197
|
# ========================================================================
|
|
198
198
|
# Interface Builder (closures)
|
|
@@ -319,45 +319,20 @@ module Expressir
|
|
|
319
319
|
subtype_constraint.build_total_over(d)
|
|
320
320
|
end
|
|
321
321
|
|
|
322
|
-
Builder.register(:subtype_constraint_decl) do |d|
|
|
323
|
-
subtype_constraint.build_subtype_constraint_decl(d)
|
|
324
|
-
end
|
|
325
|
-
Builder.register(:total_over) do |d|
|
|
326
|
-
subtype_constraint.build_total_over(d)
|
|
327
|
-
end
|
|
328
|
-
Builder.register(:supertype_expression) do |d|
|
|
329
|
-
subtype_constraint.build_supertype_expression(d)
|
|
330
|
-
end
|
|
331
|
-
Builder.register(:supertype_factor) do |d|
|
|
332
|
-
subtype_constraint.build_supertype_factor(d)
|
|
333
|
-
end
|
|
334
|
-
Builder.register(:supertype_term) do |d|
|
|
335
|
-
subtype_constraint.build_supertype_term(d)
|
|
336
|
-
end
|
|
337
|
-
Builder.register(:one_of) { |d| subtype_constraint.build_one_of(d) }
|
|
338
|
-
Builder.register(:supertype_rule) do |d|
|
|
339
|
-
subtype_constraint.build_supertype_rule(d)
|
|
340
|
-
end
|
|
341
|
-
Builder.register(:subtype_constraint) do |d|
|
|
342
|
-
subtype_constraint.build_subtype_constraint(d)
|
|
343
|
-
end
|
|
344
|
-
Builder.register(:subtype_declaration) do |d|
|
|
345
|
-
subtype_constraint.build_subtype_declaration(d)
|
|
346
|
-
end
|
|
347
|
-
|
|
348
322
|
# ========================================================================
|
|
349
323
|
# Type Builder (closures)
|
|
350
324
|
# ========================================================================
|
|
351
325
|
|
|
352
326
|
# Simple types
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
327
|
+
Builder.register(:boolean_type) { |d| type_builder.build_boolean_type(d) }
|
|
328
|
+
Builder.register(:integer_type) { |d| type_builder.build_integer_type(d) }
|
|
329
|
+
Builder.register(:logical_type) { |d| type_builder.build_logical_type(d) }
|
|
330
|
+
Builder.register(:number_type) { |d| type_builder.build_number_type(d) }
|
|
356
331
|
|
|
357
332
|
# Type constructors
|
|
358
333
|
Builder.register(:generic_type) { |_d| Expressir::Model::DataTypes::Generic.new }
|
|
359
334
|
Builder.register(:generic_entity_type) { |_d| Expressir::Model::DataTypes::GenericEntity.new }
|
|
360
|
-
Builder.register(:aggregate_type) { |
|
|
335
|
+
Builder.register(:aggregate_type) { |d| type_builder.build_aggregate_type(d) }
|
|
361
336
|
Builder.register(:general_set_type) do |d|
|
|
362
337
|
type_builder.build_general_set_type(d)
|
|
363
338
|
end
|
|
@@ -36,7 +36,10 @@ module Expressir
|
|
|
36
36
|
ids = if ids_data.is_a?(Hash)
|
|
37
37
|
[Builder.build({ variable_id: ids_data })]
|
|
38
38
|
elsif ids_data.is_a?(Array)
|
|
39
|
-
ids_data.
|
|
39
|
+
ids_data.filter_map do |elem|
|
|
40
|
+
actual_id = elem[:variable_id] || elem
|
|
41
|
+
Builder.build({ variable_id: actual_id })
|
|
42
|
+
end
|
|
40
43
|
else
|
|
41
44
|
[]
|
|
42
45
|
end
|
|
@@ -64,7 +67,10 @@ module Expressir
|
|
|
64
67
|
ids = if ids_data.is_a?(Hash)
|
|
65
68
|
[Builder.build({ parameter_id: ids_data })]
|
|
66
69
|
elsif ids_data.is_a?(Array)
|
|
67
|
-
ids_data.
|
|
70
|
+
ids_data.filter_map do |elem|
|
|
71
|
+
actual_id = elem[:parameter_id] || elem
|
|
72
|
+
Builder.build({ parameter_id: actual_id })
|
|
73
|
+
end
|
|
68
74
|
else
|
|
69
75
|
[]
|
|
70
76
|
end
|
|
@@ -62,7 +62,8 @@ module Expressir
|
|
|
62
62
|
|
|
63
63
|
parameters = []
|
|
64
64
|
Builder.ensure_array(params_data).each do |param|
|
|
65
|
-
|
|
65
|
+
actual_param = param[:procedure_head_parameter] || param
|
|
66
|
+
result = Builder.build({ procedure_head_parameter: actual_param })
|
|
66
67
|
parameters.concat(Builder.ensure_array(result)) if result
|
|
67
68
|
end
|
|
68
69
|
parameters
|
|
@@ -85,12 +85,14 @@ module Expressir
|
|
|
85
85
|
def build_case_stmt(ast_data)
|
|
86
86
|
selector = Builder.build_optional(ast_data[:selector])
|
|
87
87
|
actions = Builder.build_children(ast_data[:case_action])
|
|
88
|
-
|
|
88
|
+
otherwise_stmt = if ast_data[:t_otherwise] && ast_data[:stmt].is_a?(Hash)
|
|
89
|
+
Builder.build({ stmt: ast_data[:stmt] })
|
|
90
|
+
end
|
|
89
91
|
|
|
90
92
|
Expressir::Model::Statements::Case.new(
|
|
91
93
|
expression: selector,
|
|
92
94
|
actions: actions.compact,
|
|
93
|
-
|
|
95
|
+
otherwise_statement: otherwise_stmt,
|
|
94
96
|
)
|
|
95
97
|
end
|
|
96
98
|
|
|
@@ -101,12 +103,23 @@ module Expressir
|
|
|
101
103
|
end
|
|
102
104
|
|
|
103
105
|
def build_case_action(ast_data)
|
|
104
|
-
|
|
105
|
-
|
|
106
|
+
label_data = ast_data[:list_of_case_label]
|
|
107
|
+
labels = if label_data.is_a?(Hash)
|
|
108
|
+
Builder.build_children(label_data[:case_label])
|
|
109
|
+
elsif label_data.is_a?(Array)
|
|
110
|
+
label_data.flat_map do |item|
|
|
111
|
+
Builder.build_children(item.is_a?(Hash) ? item[:case_label] : item)
|
|
112
|
+
end
|
|
113
|
+
else
|
|
114
|
+
[]
|
|
115
|
+
end
|
|
116
|
+
stmt = if ast_data[:stmt].is_a?(Hash)
|
|
117
|
+
Builder.build({ stmt: ast_data[:stmt] })
|
|
118
|
+
end
|
|
106
119
|
|
|
107
120
|
Expressir::Model::Statements::CaseAction.new(
|
|
108
121
|
labels: labels.compact,
|
|
109
|
-
|
|
122
|
+
statement: stmt,
|
|
110
123
|
)
|
|
111
124
|
end
|
|
112
125
|
|
|
@@ -7,18 +7,20 @@ module Expressir
|
|
|
7
7
|
class TypeBuilder
|
|
8
8
|
include ::Expressir::Express::Builders::Helpers
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
10
|
+
def build_boolean_type(_ast_data)
|
|
11
|
+
Expressir::Model::DataTypes::Boolean.new
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def build_integer_type(_ast_data)
|
|
15
|
+
Expressir::Model::DataTypes::Integer.new
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def build_logical_type(_ast_data)
|
|
19
|
+
Expressir::Model::DataTypes::Logical.new
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def build_number_type(_ast_data)
|
|
23
|
+
Expressir::Model::DataTypes::Number.new
|
|
22
24
|
end
|
|
23
25
|
|
|
24
26
|
# String type
|
|
@@ -49,6 +51,12 @@ module Expressir
|
|
|
49
51
|
end
|
|
50
52
|
end
|
|
51
53
|
|
|
54
|
+
# Aggregate type (AGGREGATE OF type)
|
|
55
|
+
def build_aggregate_type(ast_data)
|
|
56
|
+
base_type = Builder.build_optional(ast_data[:parameter_type])
|
|
57
|
+
Expressir::Model::DataTypes::Aggregate.new(base_type: base_type)
|
|
58
|
+
end
|
|
59
|
+
|
|
52
60
|
# Aggregation types
|
|
53
61
|
def build_array_type(ast_data)
|
|
54
62
|
build_aggregation_type(ast_data, Expressir::Model::DataTypes::Array)
|
|
@@ -4,8 +4,18 @@ module Expressir
|
|
|
4
4
|
module DataTypesFormatter
|
|
5
5
|
private
|
|
6
6
|
|
|
7
|
-
def format_data_types_aggregate(
|
|
8
|
-
|
|
7
|
+
def format_data_types_aggregate(node)
|
|
8
|
+
[
|
|
9
|
+
"AGGREGATE",
|
|
10
|
+
*if node.base_type
|
|
11
|
+
[
|
|
12
|
+
" ",
|
|
13
|
+
"OF",
|
|
14
|
+
" ",
|
|
15
|
+
format(node.base_type),
|
|
16
|
+
]
|
|
17
|
+
end,
|
|
18
|
+
].join
|
|
9
19
|
end
|
|
10
20
|
|
|
11
21
|
def format_data_types_array(node)
|
|
@@ -257,7 +267,7 @@ module Expressir
|
|
|
257
267
|
].join
|
|
258
268
|
end,
|
|
259
269
|
].join
|
|
260
|
-
|
|
270
|
+
elsif node.items&.length&.positive?
|
|
261
271
|
indent_char = self.class.const_get(:INDENT_CHAR)
|
|
262
272
|
item_indent = indent_char * "(".length
|
|
263
273
|
[
|
|
@@ -24,9 +24,9 @@ module Expressir
|
|
|
24
24
|
def format_expressions_binary_expression(node)
|
|
25
25
|
operator_precedence = self.class.const_get(:OPERATOR_PRECEDENCE)
|
|
26
26
|
op1_bin_exp = node.operand1.is_a?(Model::Expressions::BinaryExpression) &&
|
|
27
|
-
(operator_precedence[node.operand1.operator]
|
|
27
|
+
(operator_precedence[node.operand1.operator] >= operator_precedence[node.operator])
|
|
28
28
|
op2_bin_exp = node.operand2.is_a?(Model::Expressions::BinaryExpression) &&
|
|
29
|
-
(operator_precedence[node.operand2.operator]
|
|
29
|
+
(operator_precedence[node.operand2.operator] >= operator_precedence[node.operator])
|
|
30
30
|
|
|
31
31
|
[
|
|
32
32
|
*if op1_bin_exp
|
|
@@ -138,6 +138,9 @@ module Expressir
|
|
|
138
138
|
end
|
|
139
139
|
|
|
140
140
|
def format_expressions_unary_expression(node)
|
|
141
|
+
needs_parens = node.operand.is_a?(Model::Expressions::BinaryExpression) ||
|
|
142
|
+
node.operand.is_a?(Model::Expressions::Interval)
|
|
143
|
+
|
|
141
144
|
[
|
|
142
145
|
case node.operator
|
|
143
146
|
when Model::Expressions::UnaryExpression::MINUS then "-"
|
|
@@ -147,11 +150,11 @@ module Expressir
|
|
|
147
150
|
if node.operator == Model::Expressions::UnaryExpression::NOT
|
|
148
151
|
" "
|
|
149
152
|
end,
|
|
150
|
-
*if
|
|
153
|
+
*if needs_parens
|
|
151
154
|
"("
|
|
152
155
|
end,
|
|
153
156
|
format(node.operand),
|
|
154
|
-
*if
|
|
157
|
+
*if needs_parens
|
|
155
158
|
")"
|
|
156
159
|
end,
|
|
157
160
|
].join
|
|
@@ -525,7 +525,7 @@ module Expressir
|
|
|
525
525
|
def find_target_in_where_clause(scope, tag, remark_line)
|
|
526
526
|
return nil unless supports_where_rules?(scope)
|
|
527
527
|
|
|
528
|
-
where_rules = scope
|
|
528
|
+
where_rules = safe_get_collection(scope, :where_rules)
|
|
529
529
|
return nil unless where_rules&.any?
|
|
530
530
|
|
|
531
531
|
# Search source text for WHERE clause containing this remark
|
data/lib/expressir/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: expressir
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.3.
|
|
4
|
+
version: 2.3.6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ribose Inc.
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-05-
|
|
11
|
+
date: 2026-05-14 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: base64
|