Skip to content

Commit 6d0a89b

Browse files
authored
Extract validation methods in Statements module (#184)
Refactor the Statements module to reduce code duplication and improve maintainability by extracting repeated validation and SQL resolution logic. Changes: - Extract error message constants - Extract validation methods - Extract `resolve_sql_definition` method to handle SQL definition resolution - Simplify conditional logic (e.g., `version ||= 1` instead of if/nil check) - Remove unused `_on` variable in `create_trigger`
1 parent a361d75 commit 6d0a89b

File tree

1 file changed

+46
-43
lines changed

1 file changed

+46
-43
lines changed

lib/fx/statements.rb

Lines changed: 46 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,8 @@ def create_function(name, options = {})
3030
version = options.fetch(:version, 1)
3131
sql_definition = options[:sql_definition]
3232

33-
if version.nil? && sql_definition.nil?
34-
raise(
35-
ArgumentError,
36-
"version or sql_definition must be specified"
37-
)
38-
end
39-
sql_definition = sql_definition.strip_heredoc if sql_definition
40-
sql_definition ||= Fx::Definition.function(name: name, version: version).to_sql
33+
validate_version_or_sql_definition_present!(version, sql_definition)
34+
sql_definition = resolve_sql_definition(sql_definition, name, version, :function)
4135

4236
Fx.database.create_function(sql_definition)
4337
end
@@ -90,15 +84,9 @@ def update_function(name, options = {})
9084
version = options[:version]
9185
sql_definition = options[:sql_definition]
9286

93-
if version.nil? && sql_definition.nil?
94-
raise(
95-
ArgumentError,
96-
"version or sql_definition must be specified"
97-
)
98-
end
87+
validate_version_or_sql_definition_present!(version, sql_definition)
9988

100-
sql_definition = sql_definition.strip_heredoc if sql_definition
101-
sql_definition ||= Fx::Definition.function(name: name, version: version).to_sql
89+
sql_definition = resolve_sql_definition(sql_definition, name, version, :function)
10290

10391
Fx.database.update_function(name, sql_definition)
10492
end
@@ -127,22 +115,13 @@ def update_function(name, options = {})
127115
#
128116
def create_trigger(name, options = {})
129117
version = options[:version]
130-
_on = options[:on]
131118
sql_definition = options[:sql_definition]
132119

133-
if version.present? && sql_definition.present?
134-
raise(
135-
ArgumentError,
136-
"sql_definition and version cannot both be set"
137-
)
138-
end
120+
validate_version_and_sql_definition_exclusive!(version, sql_definition)
139121

140-
if version.nil?
141-
version = 1
142-
end
122+
version ||= 1
143123

144-
sql_definition = sql_definition.strip_heredoc if sql_definition
145-
sql_definition ||= Fx::Definition.trigger(name: name, version: version).to_sql
124+
sql_definition = resolve_sql_definition(sql_definition, name, version, :trigger)
146125

147126
Fx.database.create_trigger(sql_definition)
148127
end
@@ -202,32 +181,56 @@ def update_trigger(name, options = {})
202181
on = options[:on]
203182
sql_definition = options[:sql_definition]
204183

205-
if version.nil? && sql_definition.nil?
206-
raise(
207-
ArgumentError,
208-
"version or sql_definition must be specified"
209-
)
210-
end
211-
212-
if version.present? && sql_definition.present?
213-
raise(
214-
ArgumentError,
215-
"sql_definition and version cannot both be set"
216-
)
217-
end
184+
validate_version_or_sql_definition_present!(version, sql_definition)
185+
validate_version_and_sql_definition_exclusive!(version, sql_definition)
218186

219187
if on.nil?
220188
raise ArgumentError, "on is required"
221189
end
222190

223-
sql_definition = sql_definition.strip_heredoc if sql_definition
224-
sql_definition ||= Fx::Definition.trigger(name: name, version: version).to_sql
191+
sql_definition = resolve_sql_definition(sql_definition, name, version, :trigger)
225192

226193
Fx.database.update_trigger(
227194
name,
228195
on: on,
229196
sql_definition: sql_definition
230197
)
231198
end
199+
200+
private
201+
202+
VERSION_OR_SQL_DEFINITION_REQUIRED = "version or sql_definition must be specified".freeze
203+
private_constant :VERSION_OR_SQL_DEFINITION_REQUIRED
204+
205+
VERSION_AND_SQL_DEFINITION_EXCLUSIVE = "sql_definition and version cannot both be set".freeze
206+
private_constant :VERSION_AND_SQL_DEFINITION_EXCLUSIVE
207+
208+
def validate_version_or_sql_definition_present!(version, sql_definition)
209+
if version.nil? && sql_definition.nil?
210+
raise ArgumentError, VERSION_OR_SQL_DEFINITION_REQUIRED, caller
211+
end
212+
end
213+
214+
def validate_version_and_sql_definition_exclusive!(version, sql_definition)
215+
if version.present? && sql_definition.present?
216+
raise ArgumentError, VERSION_AND_SQL_DEFINITION_EXCLUSIVE, caller
217+
end
218+
end
219+
220+
def resolve_sql_definition(sql_definition, name, version, type)
221+
return sql_definition.strip_heredoc if sql_definition
222+
223+
definition =
224+
case type
225+
when :function
226+
Fx::Definition.function(name: name, version: version)
227+
when :trigger
228+
Fx::Definition.trigger(name: name, version: version)
229+
else
230+
raise ArgumentError, "Unknown type: #{type}. Must be :function or :trigger", caller
231+
end
232+
233+
definition.to_sql
234+
end
232235
end
233236
end

0 commit comments

Comments
 (0)