Skip to content

Commit 526e08b

Browse files
committed
move valid? into preprocess_exp
Think this was the only reference to MiqExpressoin#valid?
1 parent a0ad741 commit 526e08b

File tree

1 file changed

+21
-27
lines changed

1 file changed

+21
-27
lines changed

lib/miq_expression.rb

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
class MiqExpression
2+
class InvalidExpression < StandardError; end
3+
24
# bit array of the types of nodes available/desired
35
MODE_NONE = 0
46
MODE_RUBY = 1
@@ -35,28 +37,11 @@ def initialize(exp, ctype = nil)
3537
@ruby = nil
3638
end
3739

38-
def valid?(component = exp)
39-
operator = component.keys.first
40-
case operator.downcase
41-
when "and", "or"
42-
component[operator].all?(&method(:valid?))
43-
when "not", "!"
44-
valid?(component[operator])
45-
when "find"
46-
validate_set = Set.new(%w[checkall checkany checkcount search])
47-
validate_keys = component[operator].keys.select { |k| validate_set.include?(k) }
48-
validate_keys.all? { |k| valid?(component[operator][k]) }
49-
else
50-
if component[operator].key?("field")
51-
field = Field.parse(component[operator]["field"])
52-
return false if field && !field.valid?
53-
end
54-
if Field.is_field?(component[operator]["value"])
55-
field = Field.parse(component[operator]["value"])
56-
return false unless field && field.valid?
57-
end
58-
true
59-
end
40+
def valid?
41+
preprocess_exp(exp)
42+
true
43+
rescue InvalidExpression
44+
false
6045
end
6146

6247
def set_tagged_target(model, associations = [])
@@ -180,14 +165,14 @@ def to_ruby(timezone = nil, prune_sql: false)
180165
nil
181166
elsif @ruby
182167
@ruby.dup
183-
elsif valid?
168+
else
184169
pexp = preprocess_exp(exp)
185170
pexp, _ = prune_exp(pexp, MODE_RUBY) if prune_sql
186171
@ruby = self.class._to_ruby(pexp, context_type, timezone) || true
187172
@ruby == true ? nil : @ruby.dup
188-
else
189-
""
190173
end
174+
rescue InvalidExpression
175+
""
191176
end
192177

193178
def self._to_ruby(exp, context_type, tz)
@@ -329,6 +314,8 @@ def to_sql(tz = nil)
329314
sql = to_arel(pexp, tz).to_sql if pexp.present?
330315
incl = includes_for_sql if sql.present?
331316
[sql, incl, attrs]
317+
rescue InvalidExpression
318+
[nil, nil, {:supported_by_sql => false}]
332319
end
333320

334321
def preprocess_exp(exp)
@@ -351,12 +338,19 @@ def preprocess_exp(exp)
351338
# op => {"field" => "foo", "value" => "baz"}
352339
# op => {"field" => "<count>, "value" => "0"}
353340
# op => {"count" => "Vm.snapshots", "value"=>"1"}
341+
# op => {"field" => "<count>", "value"=>"1"}
354342
# op => {"tag"=>"Host.managed-environment", "value"=>"prod"}
355343
operator_values = operator_values.dup
356344
field = operator_values["field"]
357-
field_field = operator_values["field-field"] = Field.parse(field) if field
345+
if field && field != "<count>"
346+
field_field = operator_values["field-field"] = Field.parse(field)
347+
raise(InvalidExpression, field) unless field_field.valid?
348+
end
358349
value = operator_values["value"]
359-
operator_values["value-field"] = Field.parse(value) if value
350+
if value
351+
value_field = operator_values["value-field"] = Field.parse(value)
352+
raise(InvalidExpression, field) if value_field && !value_field.valid?
353+
end
360354

361355
# attempt to do conversion only if db type of column is integer and value to compare to is String
362356
if %w[= != <= >= > <].include?(operator) && field_field&.integer? && value.instance_of?(String)

0 commit comments

Comments
 (0)