Skip to content

Commit f1da78b

Browse files
authored
Merge pull request #844 from code0-tech/842-link-generic-type-to-owning-type
Link generic types to their owning types
2 parents d0d1151 + 38faee8 commit f1da78b

14 files changed

Lines changed: 69 additions & 36 deletions

File tree

app/models/data_type.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ class DataType < ApplicationRecord
2121
has_many :data_type_identifiers, class_name: 'DataTypeIdentifier', inverse_of: :data_type
2222
has_many :generic_types, class_name: 'GenericType', inverse_of: :data_type
2323

24+
has_many :owned_generic_types, class_name: 'GenericType', inverse_of: :owner
25+
2426
has_many :display_messages, -> { by_purpose(:display_message) },
2527
class_name: 'Translation', as: :owner, inverse_of: :owner
2628
has_many :aliases, -> { by_purpose(:alias) }, class_name: 'Translation', as: :owner, inverse_of: :owner

app/models/data_type_rule.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ class DataTypeRule < ApplicationRecord
1616

1717
belongs_to :data_type, inverse_of: :rules
1818

19+
has_many :owned_generic_types, class_name: 'GenericType', inverse_of: :owner
20+
1921
validates :variant, presence: true,
2022
inclusion: {
2123
in: VARIANTS.keys.map(&:to_s),

app/models/generic_mapper.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ class GenericMapper < ApplicationRecord
88
has_many :sources, class_name: 'DataTypeIdentifier', inverse_of: :generic_mapper
99
has_many :generic_combination_strategies, class_name: 'GenericCombinationStrategy', inverse_of: :generic_mapper
1010

11+
has_many :owned_generic_types, class_name: 'GenericType', inverse_of: :owner
12+
1113
validates :target, presence: true
1214

1315
def to_grpc

app/models/generic_type.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# frozen_string_literal: true
22

33
class GenericType < ApplicationRecord
4+
belongs_to :owner, polymorphic: true
45
belongs_to :data_type, class_name: 'DataType', inverse_of: :generic_types
56

67
has_many :generic_mappers, inverse_of: :generic_type

app/models/runtime_function_definition.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ class RuntimeFunctionDefinition < ApplicationRecord
1818
class_name: 'Translation', as: :owner, inverse_of: :owner
1919
has_many :aliases, -> { by_purpose(:alias) }, class_name: 'Translation', as: :owner, inverse_of: :owner
2020

21+
has_many :owned_generic_types, class_name: 'GenericType', inverse_of: :owner
22+
2123
validates :runtime_name, presence: true,
2224
length: { minimum: 3, maximum: 50 },
2325
uniqueness: { case_sensitive: false, scope: :runtime_id }

app/models/runtime_parameter_definition.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ class RuntimeParameterDefinition < ApplicationRecord
1010

1111
has_many :parameter_definitions, inverse_of: :runtime_parameter_definition
1212

13+
has_many :owned_generic_types, class_name: 'GenericType', inverse_of: :owner
14+
1315
validates :runtime_name, length: { minimum: 3, maximum: 50 }, presence: true,
1416
uniqueness: { case_sensitive: false, scope: :runtime_function_definition_id }
1517
end

app/services/runtimes/grpc/data_type_helper.rb

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,18 @@ module DataTypeHelper
66
# This method updates or creates GenericMappers based on the provided gRPC GenericMapper objects
77
# within the current runtime.
88
# @param generic_mappers [Array<Tucana::Shared::GenericMapper>] An array of gRPC GenericMapper objects.
9-
def update_mappers(generic_mappers, t)
9+
def update_mappers(generic_mappers, generic_type, t)
1010
raise 'Including class must define current_runtime' unless respond_to?(:current_runtime)
1111

1212
generic_mappers.to_a.map do |generic_mapper|
13-
mapper = GenericMapper.create_or_find_by(runtime: current_runtime,
14-
target: generic_mapper.target,
15-
sources: generic_mapper.source.map do |source|
16-
find_data_type_identifier(source, t)
17-
end)
13+
mapper = GenericMapper.find_by(runtime: current_runtime, generic_type: generic_type)
14+
15+
mapper = GenericMapper.new(runtime: current_runtime, generic_type: generic_type) if mapper.nil?
16+
17+
mapper.target = generic_mapper.target
18+
mapper.sources = generic_mapper.source.map do |source|
19+
find_data_type_identifier(source, mapper, t, additional_dti_kwargs: { generic_mapper: mapper })
20+
end
1821

1922
if mapper.nil? || !mapper.save
2023
t.rollback_and_return! ServiceResponse.error(
@@ -28,22 +31,19 @@ def update_mappers(generic_mappers, t)
2831

2932
# This method finds or creates a DataTypeIdentifier based on the provided identifier within the current runtime.
3033
# @param identifier [Tucana::Sagittarius::DataTypeIdentifier] The gRPC DataTypeIdentifier object.
31-
def find_data_type_identifier(identifier, t)
34+
def find_data_type_identifier(identifier, owner, t, additional_dti_kwargs: {})
3235
if identifier.data_type_identifier.present?
33-
return create_data_type_identifier(t, data_type_id: find_data_type(identifier.data_type_identifier, t).id)
36+
return create_data_type_identifier(
37+
t,
38+
**additional_dti_kwargs,
39+
data_type_id: find_data_type(identifier.data_type_identifier, t).id
40+
)
3441
end
3542

3643
if identifier.generic_type.present?
3744
data_type = find_data_type(identifier.generic_type.data_type_identifier, t)
3845

39-
generic_type = GenericType.find_by(
40-
data_type: data_type
41-
)
42-
if generic_type.nil?
43-
generic_type = GenericType.create(
44-
data_type: data_type
45-
)
46-
end
46+
generic_type = owner.owned_generic_types.find_or_initialize_by(data_type: data_type)
4747

4848
if generic_type.nil?
4949
t.rollback_and_return! ServiceResponse.error(
@@ -52,13 +52,14 @@ def find_data_type_identifier(identifier, t)
5252
)
5353
end
5454

55-
generic_type.assign_attributes(generic_mappers: update_mappers(identifier.generic_type.generic_mappers,
56-
t))
55+
generic_type.generic_mappers = update_mappers(identifier.generic_type.generic_mappers, generic_type, t)
5756

58-
return create_data_type_identifier(t, generic_type_id: generic_type.id)
57+
return create_data_type_identifier(t, **additional_dti_kwargs, generic_type_id: generic_type.id)
5958
end
6059

61-
return create_data_type_identifier(t, generic_key: identifier.generic_key) if identifier.generic_key.present?
60+
if identifier.generic_key.present?
61+
return create_data_type_identifier(t, **additional_dti_kwargs, generic_key: identifier.generic_key)
62+
end
6263

6364
raise ArgumentError, "Invalid identifier: #{identifier.inspect}"
6465
end

app/services/runtimes/grpc/data_types/update_service.rb

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,11 @@ def update_datatype(data_type, t)
122122
db_object.removed_at = nil
123123
db_object.variant = data_type.variant.to_s.downcase
124124
if parent?(data_type)
125-
db_object.parent_type = find_data_type_identifier(find_parent_rule(data_type).rule_config.parent_type, t)
125+
db_object.parent_type = find_data_type_identifier(
126+
find_parent_rule(data_type).rule_config.parent_type,
127+
db_object,
128+
t
129+
)
126130
end
127131
db_object.rules = update_rules(data_type.rules, db_object, t)
128132
db_object.names = update_translations(data_type.name, db_object.names)
@@ -142,34 +146,37 @@ def update_rules(rules, data_type, t)
142146
db_rules = data_type.rules.first(rules.length)
143147
rules.each_with_index do |rule, index|
144148
db_rules[index] ||= DataTypeRule.new
145-
db_rules[index].assign_attributes(variant: rule.variant.to_s.downcase, config: extend_rule_config(rule, t))
149+
db_rules[index].assign_attributes(
150+
variant: rule.variant.to_s.downcase,
151+
config: extend_rule_config(rule, db_rules[index], t)
152+
)
146153
end
147154

148155
db_rules
149156
end
150157

151-
def extend_rule_config(rule, t)
158+
def extend_rule_config(rule, db_rule, t)
152159
case rule.variant
153160
when :parent_type
154161
{}
155162
when :contains_key
156163
{
157164
key: rule.rule_config.key,
158165
data_type_identifier: rule.rule_config.data_type_identifier,
159-
data_type_identifier_id: find_data_type_identifier(rule.rule_config.data_type_identifier, t).id,
166+
data_type_identifier_id: find_data_type_identifier(rule.rule_config.data_type_identifier, db_rule, t).id,
160167
}
161168
when :contains_type, :return_type
162169
{
163170
data_type_identifier: rule.rule_config.data_type_identifier,
164-
data_type_identifier_id: find_data_type_identifier(rule.rule_config.data_type_identifier, t).id,
171+
data_type_identifier_id: find_data_type_identifier(rule.rule_config.data_type_identifier, db_rule, t).id,
165172
}
166173
when :input_types
167174
{
168175
input_types: rule.rule_config.input_types.map do |input_type|
169176
{
170177
input_identifier: input_type.input_identifier,
171178
data_type_identifier: input_type.data_type_identifier,
172-
data_type_identifier_id: find_data_type_identifier(input_type.data_type_identifier, t).id,
179+
data_type_identifier_id: find_data_type_identifier(input_type.data_type_identifier, db_rule, t).id,
173180
}
174181
end,
175182
}

app/services/runtimes/grpc/runtime_function_definitions/update_service.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,11 @@ def update_runtime_function_definition(runtime_function_definition, t)
5353
)
5454
db_object.removed_at = nil
5555
db_object.return_type = if runtime_function_definition.return_type_identifier.present?
56-
find_data_type_identifier(runtime_function_definition.return_type_identifier, t)
56+
find_data_type_identifier(
57+
runtime_function_definition.return_type_identifier,
58+
db_object,
59+
t
60+
)
5761
end
5862
db_object.names = update_translations(runtime_function_definition.name, db_object.names)
5963
db_object.descriptions = update_translations(runtime_function_definition.description, db_object.descriptions)
@@ -106,7 +110,7 @@ def update_parameters(runtime_function_definition, parameters, db_parameters, t)
106110
db_param.runtime_function_definition = runtime_function_definition
107111
db_param.runtime_name = real_param.runtime_name
108112
db_param.removed_at = nil
109-
db_param.data_type = find_data_type_identifier(real_param.data_type_identifier, t)
113+
db_param.data_type = find_data_type_identifier(real_param.data_type_identifier, db_param, t)
110114

111115
db_param.names = update_translations(real_param.name, db_param.names)
112116
db_param.descriptions = update_translations(real_param.description, db_param.descriptions)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# frozen_string_literal: true
2+
3+
class AddOwnerToGenericType < Code0::ZeroTrack::Database::Migration[1.0]
4+
def change
5+
add_reference :generic_types, :owner, polymorphic: true
6+
end
7+
end

0 commit comments

Comments
 (0)