Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use Arel helper methods to generate arel #22581

Merged
merged 5 commits into from
Aug 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/models/disk.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class Disk < ApplicationRecord
virtual_column :used_percent_of_provisioned, :type => :float
virtual_column :partitions_aligned, :type => :string, :uses => {:partitions => :aligned}
virtual_column :used_disk_storage, :type => :integer, :arel => (lambda do |t|
t.grouping(Arel::Nodes::NamedFunction.new('COALESCE', [t[:size_on_disk], t[:size], 0]))
t.grouping(t.coalesce([t[:size_on_disk], t[:size], 0]))
end)

# A performance improvement was introduced in Rails 6:
Expand Down
4 changes: 2 additions & 2 deletions app/models/hardware.rb
Original file line number Diff line number Diff line change
Expand Up @@ -147,8 +147,8 @@ def provisioned_storage

virtual_attribute :provisioned_storage, :integer, :arel => (lambda do |t|
t.grouping(
t.grouping(Arel::Nodes::NamedFunction.new('COALESCE', [arel_table[:allocated_disk_storage], 0])) +
t.grouping(Arel::Nodes::NamedFunction.new('COALESCE', [t[:memory_mb], 0])) * 1.megabyte
t.grouping(t.coalesce([t[:allocated_disk_storage], 0])) +
(t.grouping(t.coalesce([t[:memory_mb], 0])) * 1.megabyte)
)
end)

Expand Down
2 changes: 1 addition & 1 deletion app/models/miq_group.rb
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ def regional_groups
end

def self.regional_groups(group)
where(arel_table.grouping(Arel::Nodes::NamedFunction.new("LOWER", [arel_table[:description]]).eq(group.description.downcase)))
where(arel_table.grouping(arel_table.lower(arel_table[:description]).eq(group.description.downcase)))
end

def self.create_tenant_group(tenant)
Expand Down
8 changes: 4 additions & 4 deletions app/models/mixins/ownership_mixin.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ module OwnershipMixin
# all the same user.
virtual_attribute :owned_by_current_user, :boolean, :uses => :evm_owner, :arel => (lambda do |t|
userid = User.current_userid.to_s.downcase
t.grouping(Arel::Nodes::NamedFunction.new("LOWER", [arel_table[:evm_owner_userid]]).eq(userid))
t.grouping(t.lower(t[:evm_owner_userid]).eq(userid))
end)

virtual_delegate :owning_ldap_group, :to => "miq_group.description", :allow_nil => true, :type => :string
Expand All @@ -46,7 +46,7 @@ module OwnershipMixin
virtual_attribute :owned_by_current_ldap_group, :boolean, :arel => (lambda do |t|
ldap_group = User.current_user.try(:ldap_group).to_s.downcase

t.grouping(Arel::Nodes::NamedFunction.new("LOWER", [arel_table[:owning_ldap_group]]).eq(ldap_group))
t.grouping(t.lower(t[:owning_ldap_group]).eq(ldap_group))
end)
end

Expand Down Expand Up @@ -92,11 +92,11 @@ def user_or_group_owned(user, miq_group)
private

def user_owned(user)
where(arel_table.grouping(Arel::Nodes::NamedFunction.new("LOWER", [arel_table[:evm_owner_userid]]).eq(user.userid.downcase)))
where(arel_table.grouping(arel_table.lower(arel_table[:evm_owner_userid]).eq(user.userid.downcase)))
end

def group_owned(miq_group)
where(arel_table.grouping(Arel::Nodes::NamedFunction.new("LOWER", [arel_table[:owning_ldap_group]]).eq(miq_group.description.downcase)))
where(arel_table.grouping(arel_table.lower(arel_table[:owning_ldap_group]).eq(miq_group.description.downcase)))
end
end

Expand Down
26 changes: 6 additions & 20 deletions app/models/service/aggregation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,8 @@ def aggregate_all_vms_disk_count_arel
# @return (see #aggregate_hardware_arel)
def aggregate_all_vms_disk_space_allocated_arel
column_name = "aggregate_all_vm_disk_space_allocated"
coalesce_values = [disks_tbl[:size], zero]
aggregation_sql = Arel::Nodes::NamedFunction.new('SUM',
[Arel::Nodes::NamedFunction.new('COALESCE', coalesce_values)])
coalesce_values = [disks_tbl[:size], Arel.sql("0")]
aggregation_sql = Arel::Nodes::NamedFunction.new('SUM', [disks_tbl.coalesce(coalesce_values)])
aggregate_hardware_arel(column_name, aggregation_sql, :include_disks => true)
end

Expand All @@ -78,9 +77,8 @@ def aggregate_all_vms_disk_space_allocated_arel
# @return (see #aggregate_hardware_arel)
def aggregate_all_vms_disk_space_used_arel
column_name = "aggregate_all_vm_disk_space_used"
coalesce_values = [disks_tbl[:size_on_disk], disks_tbl[:size], zero]
aggregation_sql = Arel::Nodes::NamedFunction.new('SUM',
[Arel::Nodes::NamedFunction.new('COALESCE', coalesce_values)])
coalesce_values = [disks_tbl[:size_on_disk], disks_tbl[:size], Arel.sql("0")]
aggregation_sql = Arel::Nodes::NamedFunction.new('SUM', [disks_tbl.coalesce(coalesce_values)])
aggregate_hardware_arel(column_name, aggregation_sql, :include_disks => true)
end

Expand Down Expand Up @@ -167,7 +165,7 @@ def aggregation_where_clause(arel, subtree_services)
# service_resources, vms, and hardwares
def base_service_aggregation_join(arel, services_tbl, options = {})
arel.join(service_resources_tbl).on(service_resources_tbl[:service_id].eq(services_tbl[:id])
.and(service_resources_tbl[:resource_type].eq(vm_or_template_type)))
.and(service_resources_tbl[:resource_type].eq(Arel.sql("'VmOrTemplate'"))))
.join(vms_tbl).on(vm_join_clause(options)).tap do |arel_query|
unless options[:skip_hardware]
arel_query.join(hardwares_tbl).on(hardwares_tbl[:vm_or_template_id].eq(vms_tbl[:id]))
Expand Down Expand Up @@ -230,20 +228,8 @@ def partitions_tbl
@partitions_tbl ||= Partition.arel_table
end

def zero
@zero ||= Arel::Nodes::SqlLiteral.new("0")
end

def vm_or_template_type
@vm_or_template_type ||= Arel::Nodes::SqlLiteral.new("'VmOrTemplate'")
end

def ancestry_match
@ancestry_match ||= Arel::Nodes::SqlLiteral.new("'/%'")
end

def ancestry_ilike
@ancestry_ilike ||= Arel::Nodes::NamedFunction.new("CONCAT", [Service.arel_table[:id], ancestry_match])
@ancestry_ilike ||= Arel::Nodes::NamedFunction.new("CONCAT", [Service.arel_table[:id], Arel.sql("'/%'")])
end

def service_id_cast
Expand Down
2 changes: 1 addition & 1 deletion app/models/tenant.rb
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ def nested_ae_namespaces
end

def self.regional_tenants(tenant)
where(arel_table.grouping(Arel::Nodes::NamedFunction.new("LOWER", [arel_table[:name]]).eq(tenant.name.downcase)))
where(arel_table.grouping(arel_table.lower(arel_table[:name]).eq(tenant.name.downcase)))
end

def accessible_tenant_ids(strategy = nil)
Expand Down
23 changes: 8 additions & 15 deletions app/models/vm_or_template.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1232,13 +1232,13 @@ def normalized_state
virtual_attribute :normalized_state, :string, :arel => (lambda do |t|
t.grouping(
Arel::Nodes::Case.new
.when(arel_table[:archived]).then(Arel::Nodes::SqlLiteral.new("\'archived\'"))
.when(arel_table[:orphaned]).then(Arel::Nodes::SqlLiteral.new("\'orphaned\'"))
.when(t[:template].eq(t.create_true)).then(Arel::Nodes::SqlLiteral.new("\'template\'"))
.when(t[:retired].eq(t.create_true)).then(Arel::Nodes::SqlLiteral.new("\'retired\'"))
.when(arel_table[:disconnected]).then(Arel::Nodes::SqlLiteral.new("\'disconnected\'"))
.when(arel_table[:archived]).then(Arel.sql("\'archived\'"))
.when(arel_table[:orphaned]).then(Arel.sql("\'orphaned\'"))
.when(t[:template].eq(t.create_true)).then(Arel.sql("\'template\'"))
.when(t[:retired].eq(t.create_true)).then(Arel.sql("\'retired\'"))
.when(arel_table[:disconnected]).then(Arel.sql("\'disconnected\'"))
.else(t.lower(
Arel::Nodes::NamedFunction.new('COALESCE', [t[:power_state], Arel::Nodes::SqlLiteral.new("\'unknown\'")])
t.coalesce([t[:power_state], Arel.sql("\'unknown\'")])
))
)
end)
Expand Down Expand Up @@ -1336,7 +1336,7 @@ def v_is_a_template
# technically it is capitalized, but for sorting, not a concern
# but we do need nil to become false
virtual_attribute :v_is_a_template, :string, :arel => (lambda do |t|
t.grouping(arel_coalesce([t[:template], t.create_false]))
t.grouping(t.coalesce([t[:template], t.create_false]))
end)

def v_datastore_path
Expand Down Expand Up @@ -1550,7 +1550,7 @@ def self.miq_expression_includes_any_ipaddresses_arel(ipaddress)
.join(networks).on(networks[:hardware_id].eq(hardwares[:id]))
.where(hardwares[:vm_or_template_id].eq(vms[:id]).and(match_grouping))
.take(1)
Arel::Nodes::SqlLiteral.new("1").eq(query)
Arel.sql("1").eq(query)
end

def self.scan_by_property(property, value, _options = {})
Expand Down Expand Up @@ -1720,11 +1720,4 @@ def command_queue_options(queue_options)
:zone => my_zone,
}.merge(queue_options)
end

# this is verbose, helper for generating arel
def self.arel_coalesce(values)
Arel::Nodes::NamedFunction.new('COALESCE', values)
end

private_class_method :arel_coalesce
end
2 changes: 1 addition & 1 deletion lib/miq_expression.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1536,7 +1536,7 @@ def subquery_for_contains(field, limiter_query)

conn = main_model.connection
sql = conn.unprepared_statement { conn.to_sql(relation_query.arel) }
Arel::Nodes::In.new(primary_attribute, Arel::Nodes::SqlLiteral.new(sql))
Arel::Nodes::In.new(primary_attribute, Arel.sql(sql))
end

def self.determine_relat_path(ref)
Expand Down