1
1
class MiqExpression
2
+ class InvalidExpression < StandardError ; end
3
+
2
4
# bit array of the types of nodes available/desired
3
5
MODE_NONE = 0
4
6
MODE_RUBY = 1
@@ -35,28 +37,11 @@ def initialize(exp, ctype = nil)
35
37
@ruby = nil
36
38
end
37
39
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
60
45
end
61
46
62
47
def set_tagged_target ( model , associations = [ ] )
@@ -180,14 +165,14 @@ def to_ruby(timezone = nil, prune_sql: false)
180
165
nil
181
166
elsif @ruby
182
167
@ruby . dup
183
- elsif valid?
168
+ else
184
169
pexp = preprocess_exp ( exp )
185
170
pexp , _ = prune_exp ( pexp , MODE_RUBY ) if prune_sql
186
171
@ruby = self . class . _to_ruby ( pexp , context_type , timezone ) || true
187
172
@ruby == true ? nil : @ruby . dup
188
- else
189
- ""
190
173
end
174
+ rescue InvalidExpression
175
+ ""
191
176
end
192
177
193
178
def self . _to_ruby ( exp , context_type , tz )
@@ -329,6 +314,8 @@ def to_sql(tz = nil)
329
314
sql = to_arel ( pexp , tz ) . to_sql if pexp . present?
330
315
incl = includes_for_sql if sql . present?
331
316
[ sql , incl , attrs ]
317
+ rescue InvalidExpression
318
+ [ nil , nil , { :supported_by_sql => false } ]
332
319
end
333
320
334
321
def preprocess_exp ( exp )
@@ -350,15 +337,18 @@ def preprocess_exp(exp)
350
337
# op => {"regkey"=>"foo", "regval"=>"bar", "value"=>"baz"}
351
338
# op => {"field" => "foo", "value" => "baz"}
352
339
# op => {"count" => "Vm.snapshots", "value"=>"1"}
340
+ # op => {"field" => "<count>", "value"=>"1"}
353
341
# op => {"tag"=>"Host.managed-environment", "value"=>"prod"}
354
342
operator_values = operator_values . dup
355
343
field = operator_values [ "field" ]
356
- if field
344
+ if field && field != "<count>"
357
345
field_field = operator_values [ "field-field" ] = Field . parse ( field )
346
+ raise ( InvalidExpression , field ) unless field_field . valid?
358
347
end
359
348
value = operator_values [ "value" ]
360
349
if value
361
350
value_field = operator_values [ "value-field" ] = Field . parse ( value )
351
+ raise ( InvalidExpression , field ) if value_field && !value_field . valid?
362
352
end
363
353
364
354
# attempt to do conversion only if db type of column is integer and value to compare to is String
0 commit comments