Skip to content

Commit 196abcf

Browse files
committed
introduce value-field
converge value_in_sql and field_in_sql
1 parent 6f0cc92 commit 196abcf

File tree

2 files changed

+20
-20
lines changed

2 files changed

+20
-20
lines changed

lib/miq_expression.rb

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,7 @@ def preprocess_exp(exp)
351351
field = operator_values["field"]
352352
field_field = operator_values["field-field"] = Field.parse(field) if field
353353
value = operator_values["value"]
354+
operator_values["value-field"] = Field.parse(value) if value
354355

355356
# attempt to do conversion only if db type of column is integer and value to compare to is String
356357
if %w[= != <= >= > <].include?(operator) && field_field&.integer? && value.class == String
@@ -491,17 +492,17 @@ def sql_supports_atom?(exp)
491492
when "includes"
492493
# Support includes operator using "LIKE" only if first operand is in main table
493494
if exp[operator].key?("field") && (!exp[operator]["field"].include?(".") || (exp[operator]["field"].include?(".") && exp[operator]["field"].split(".").length == 2))
494-
field_in_sql?(exp[operator]["field"], exp[operator]["field-field"])
495+
field_in_sql?(exp[operator]["field-field"])
495496
else
496497
# TODO: Support includes operator for sub-sub-tables
497498
false
498499
end
499500
when "includes any", "includes all", "includes only"
500501
# Support this only from the main model (for now)
501-
if exp[operator].keys.include?("field") && exp[operator]["field"].split(".").length == 1
502-
model, field = exp[operator]["field"].split("-")
503-
method = "miq_expression_#{operator.downcase.tr(' ', '_')}_#{field}_arel"
504-
model.constantize.respond_to?(method)
502+
if exp[operator]["field-field"] && exp[operator]["field"]&.split(".")&.length == 1
503+
field_field = exp[operator]["field-field"]
504+
method = "miq_expression_#{operator.downcase.tr(' ', '_')}_#{field_field.column}_arel"
505+
field_field.model.respond_to?(method)
505506
else
506507
false
507508
end
@@ -517,17 +518,16 @@ def sql_supports_atom?(exp)
517518
# => TODO: support count of child relationship
518519
return false if exp[operator].key?("count")
519520

520-
field_in_sql?(exp[operator]["field"]) && value_in_sql?(exp[operator]["value"])
521+
field_in_sql?(exp[operator]["field-field"]) && value_in_sql?(exp[operator]["value-field"])
521522
end
522523
end
523524

524-
def value_in_sql?(value)
525-
value_field = Field.parse(value)
525+
def value_in_sql?(value_field)
526526
!value_field&.valid? || value_field&.attribute_supported_by_sql?
527527
end
528528

529529
# NOTE: dropped cached :exclude_col. needed?
530-
def field_in_sql?(field, field_field)
530+
def field_in_sql?(field_field)
531531
field_field.attribute_supported_by_sql? &&
532532
!field_field.exclude_col_by_preprocess_options?(preprocess_options)
533533
end

spec/lib/miq_expression_spec.rb

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -243,9 +243,9 @@
243243

244244
describe "#reduce_exp" do
245245
let(:sql_field) { {"=" => {"field" => "Vm-name", "value" => "foo"}.freeze}.freeze }
246-
let(:sql_field_out) { {"=" => {"field" => "Vm-name", "field-field" => MiqExpression::Field.parse("Vm-name"), "value" => "foo"}.freeze}.freeze }
246+
let(:sql_field_out) { {"=" => {"field" => "Vm-name", "field-field" => MiqExpression::Field.parse("Vm-name"), "value" => "foo", "value-field" => nil}.freeze}.freeze }
247247
let(:ruby_field) { {"=" => {"field" => "Vm-platform", "value" => "bar"}.freeze}.freeze }
248-
let(:ruby_field_out) { {"=" => {"field" => "Vm-platform", "field-field" => MiqExpression::Field.parse("Vm-platform"), "value" => "bar"}.freeze}.freeze }
248+
let(:ruby_field_out) { {"=" => {"field" => "Vm-platform", "field-field" => MiqExpression::Field.parse("Vm-platform"), "value" => "bar", "value-field" => nil}.freeze}.freeze }
249249

250250
context "mode: :sql" do
251251
it "(sql AND ruby) => (sql)" do
@@ -3017,7 +3017,7 @@
30173017
end
30183018
end
30193019

3020-
describe "#sql_supports_atom?" do
3020+
describe "#sql_supports_atom? (private)" do
30213021
context "expression key is 'CONTAINS'" do
30223022
context "operations with 'tag'" do
30233023
it "returns true for tag of the main model" do
@@ -3166,51 +3166,51 @@
31663166
end
31673167
end
31683168

3169-
describe "#field_in_sql?" do
3169+
describe "#field_in_sql? (private)" do
31703170
it "returns true for model.virtualfield (with sql)" do
31713171
field = "ManageIQ::Providers::InfraManager::Vm-archived"
31723172
expression = {"=" => {"field" => field, "value" => "true"}}
3173-
expect(described_class.new(expression).field_in_sql?(field, MiqExpression::Field.parse(field))).to eq(true)
3173+
expect(described_class.new(expression).field_in_sql?(MiqExpression::Field.parse(field))).to eq(true)
31743174
end
31753175

31763176
it "returns false for model.virtualfield (with no sql)" do
31773177
field = "ManageIQ::Providers::InfraManager::Vm-uncommitted_storage"
31783178
expression = {"=" => {"field" => field, "value" => "true"}}
3179-
expect(described_class.new(expression).field_in_sql?(field, MiqExpression::Field.parse(field))).to eq(false)
3179+
expect(described_class.new(expression).field_in_sql?(MiqExpression::Field.parse(field))).to eq(false)
31803180
end
31813181

31823182
it "returns false for model.association-virtualfield" do
31833183
field = "ManageIQ::Providers::InfraManager::Vm.storage-v_used_space_percent_of_total"
31843184
expression = {">=" => {"field" => field, "value" => "50"}}
3185-
expect(described_class.new(expression).field_in_sql?(field, MiqExpression::Field.parse(field))).to eq(false)
3185+
expect(described_class.new(expression).field_in_sql?(MiqExpression::Field.parse(field))).to eq(false)
31863186
end
31873187

31883188
it "returns true for model-field" do
31893189
field = "ManageIQ::Providers::InfraManager::Vm-vendor"
31903190
expression = {"=" => {"field" => field, "value" => "redhat"}}
3191-
expect(described_class.new(expression).field_in_sql?(field, MiqExpression::Field.parse(field))).to eq(true)
3191+
expect(described_class.new(expression).field_in_sql?(MiqExpression::Field.parse(field))).to eq(true)
31923192
end
31933193

31943194
it "returns true for model.association-field" do
31953195
field = "ManageIQ::Providers::InfraManager::Vm.guest_applications-vendor"
31963196
expression = {"CONTAINS" => {"field" => field, "value" => "redhat"}}
3197-
expect(described_class.new(expression).field_in_sql?(field, MiqExpression::Field.parse(field))).to eq(true)
3197+
expect(described_class.new(expression).field_in_sql?(MiqExpression::Field.parse(field))).to eq(true)
31983198
end
31993199

32003200
it "returns false if column excluded from processing for adhoc performance metrics" do
32013201
field = "EmsClusterPerformance-cpu_usagemhz_rate_average"
32023202
expression = {">=" => {"field" => field, "value" => "0"}}
32033203
obj = described_class.new(expression)
32043204
obj.preprocess_options = {:vim_performance_daily_adhoc => true}
3205-
expect(obj.field_in_sql?(field, MiqExpression::Field.parse(field))).to eq(false)
3205+
expect(obj.field_in_sql?(MiqExpression::Field.parse(field))).to eq(false)
32063206
end
32073207

32083208
it "returns true if column not excluded from processing for adhoc performance metrics" do
32093209
field = "EmsClusterPerformance-derived_cpu_available"
32103210
expression = {">=" => {"field" => field, "value" => "0"}}
32113211
obj = described_class.new(expression)
32123212
obj.preprocess_options = {:vim_performance_daily_adhoc => true}
3213-
expect(obj.field_in_sql?(field, MiqExpression::Field.parse(field))).to eq(true)
3213+
expect(obj.field_in_sql?(MiqExpression::Field.parse(field))).to eq(true)
32143214
end
32153215
end
32163216

0 commit comments

Comments
 (0)