Refactor the Geo::AttachmentRegistryFinder

This changes fixes a bunch of CodeReuse/ActiveRecord violations and make
the queries much easier to understand.
parent 7dcd5108
...@@ -84,7 +84,7 @@ module Geo ...@@ -84,7 +84,7 @@ module Geo
def find_retryable_failed_registries(batch_size:, except_file_ids: []) def find_retryable_failed_registries(batch_size:, except_file_ids: [])
find_failed_registries find_failed_registries
.retry_due .retry_due
.where.not(file_id: except_file_ids) .file_id_not_in(except_file_ids)
.limit(batch_size) .limit(batch_size)
end end
# rubocop: enable CodeReuse/ActiveRecord # rubocop: enable CodeReuse/ActiveRecord
...@@ -93,7 +93,7 @@ module Geo ...@@ -93,7 +93,7 @@ module Geo
def find_retryable_synced_missing_on_primary_registries(batch_size:, except_file_ids: []) def find_retryable_synced_missing_on_primary_registries(batch_size:, except_file_ids: [])
find_synced_missing_on_primary_registries find_synced_missing_on_primary_registries
.retry_due .retry_due
.where.not(file_id: except_file_ids) .file_id_not_in(except_file_ids)
.limit(batch_size) .limit(batch_size)
end end
# rubocop: enable CodeReuse/ActiveRecord # rubocop: enable CodeReuse/ActiveRecord
...@@ -196,67 +196,50 @@ module Geo ...@@ -196,67 +196,50 @@ module Geo
fdw_find_syncable.merge(Geo::FileRegistry.failed) fdw_find_syncable.merge(Geo::FileRegistry.failed)
end end
# rubocop: disable CodeReuse/ActiveRecord
def fdw_find_syncable def fdw_find_syncable
fdw_all.joins("INNER JOIN file_registry ON file_registry.file_id = #{fdw_table}.id") fdw_all
.inner_join_file_registry
.geo_syncable .geo_syncable
.merge(Geo::FileRegistry.attachments) .merge(Geo::FileRegistry.attachments)
end end
# rubocop: enable CodeReuse/ActiveRecord
# rubocop: disable CodeReuse/ActiveRecord
def fdw_find_unsynced(except_file_ids:) def fdw_find_unsynced(except_file_ids:)
upload_types = Geo::FileService::DEFAULT_OBJECT_TYPES.map { |val| "'#{val}'" }.join(',') fdw_all
.missing_file_registry
fdw_all.joins("LEFT OUTER JOIN file_registry
ON file_registry.file_id = #{fdw_table}.id
AND file_registry.file_type IN (#{upload_types})")
.geo_syncable .geo_syncable
.where(file_registry: { id: nil }) .id_not_in(except_file_ids)
.where.not(id: except_file_ids)
end end
# rubocop: enable CodeReuse/ActiveRecord
def fdw_find_synced_missing_on_primary def fdw_find_synced_missing_on_primary
fdw_find_synced.merge(Geo::FileRegistry.missing_on_primary) fdw_find_synced.merge(Geo::FileRegistry.missing_on_primary)
end end
def fdw_table
Geo::Fdw::Upload.table_name
end
# rubocop: disable CodeReuse/ActiveRecord
def fdw_find_migrated_local(except_file_ids:) def fdw_find_migrated_local(except_file_ids:)
fdw_all.joins("INNER JOIN file_registry ON file_registry.file_id = #{fdw_table}.id") fdw_all
.inner_join_file_registry
.with_files_stored_remotely .with_files_stored_remotely
.merge(Geo::FileRegistry.attachments) .merge(Geo::FileRegistry.attachments)
.where.not(id: except_file_ids) .id_not_in(except_file_ids)
end end
# rubocop: enable CodeReuse/ActiveRecord
# rubocop: disable CodeReuse/ActiveRecord
def legacy_find_synced def legacy_find_synced
legacy_inner_join_registry_ids( legacy_inner_join_registry_ids(
syncable, syncable,
find_synced_registries.pluck(:file_id), find_synced_registries.pluck_file_key,
Upload Upload
) )
end end
# rubocop: enable CodeReuse/ActiveRecord
# rubocop: disable CodeReuse/ActiveRecord
def legacy_find_failed def legacy_find_failed
legacy_inner_join_registry_ids( legacy_inner_join_registry_ids(
syncable, syncable,
find_failed_registries.pluck(:file_id), find_failed_registries.pluck_file_key,
Upload Upload
) )
end end
# rubocop: enable CodeReuse/ActiveRecord
# rubocop: disable CodeReuse/ActiveRecord
def legacy_find_unsynced(except_file_ids:) def legacy_find_unsynced(except_file_ids:)
registry_file_ids = Geo::FileRegistry.attachments.pluck(:file_id) | except_file_ids registry_file_ids = Geo::FileRegistry.attachments.pluck_file_key | except_file_ids
legacy_left_outer_join_registry_ids( legacy_left_outer_join_registry_ids(
syncable, syncable,
...@@ -264,11 +247,9 @@ module Geo ...@@ -264,11 +247,9 @@ module Geo
Upload Upload
) )
end end
# rubocop: enable CodeReuse/ActiveRecord
# rubocop: disable CodeReuse/ActiveRecord
def legacy_find_migrated_local(except_file_ids:) def legacy_find_migrated_local(except_file_ids:)
registry_file_ids = Geo::FileRegistry.attachments.pluck(:file_id) - except_file_ids registry_file_ids = Geo::FileRegistry.attachments.pluck_file_key - except_file_ids
legacy_inner_join_registry_ids( legacy_inner_join_registry_ids(
legacy_finder.attachments.with_files_stored_remotely, legacy_finder.attachments.with_files_stored_remotely,
...@@ -276,16 +257,13 @@ module Geo ...@@ -276,16 +257,13 @@ module Geo
Upload Upload
) )
end end
# rubocop: enable CodeReuse/ActiveRecord
# rubocop: disable CodeReuse/ActiveRecord
def legacy_find_synced_missing_on_primary def legacy_find_synced_missing_on_primary
legacy_inner_join_registry_ids( legacy_inner_join_registry_ids(
syncable, syncable,
find_synced_missing_on_primary_registries.pluck(:file_id), find_synced_missing_on_primary_registries.pluck_file_key,
Upload Upload
) )
end end
# rubocop: enable CodeReuse/ActiveRecord
end end
end end
...@@ -19,6 +19,20 @@ module Geo ...@@ -19,6 +19,20 @@ module Geo
.merge(Geo::FileRegistry.with_file_type(type)) .merge(Geo::FileRegistry.with_file_type(type))
end end
def inner_join_file_registry
join_statement =
arel_table
.join(file_registry_table, Arel::Nodes::InnerJoin)
.on(arel_table[:id].eq(file_registry_table[:file_id]))
joins(join_statement.join_sources)
end
def missing_file_registry
left_outer_join_file_registry
.where(file_registry_table[:id].eq(nil))
end
# Searches for a list of uploads based on the query given in `query`. # Searches for a list of uploads based on the query given in `query`.
# #
# On PostgreSQL this method uses "ILIKE" to perform a case-insensitive # On PostgreSQL this method uses "ILIKE" to perform a case-insensitive
...@@ -31,18 +45,18 @@ module Geo ...@@ -31,18 +45,18 @@ module Geo
private private
def inner_join_file_registry def file_registry_table
Geo::FileRegistry.arel_table
end
def left_outer_join_file_registry
join_statement = join_statement =
arel_table arel_table
.join(file_registry_table, Arel::Nodes::InnerJoin) .join(file_registry_table, Arel::Nodes::OuterJoin)
.on(arel_table[:id].eq(file_registry_table[:file_id])) .on(arel_table[:id].eq(file_registry_table[:file_id]).and(file_registry_table[:file_type].in(Geo::FileService::DEFAULT_OBJECT_TYPES)))
joins(join_statement.join_sources) joins(join_statement.join_sources)
end end
def file_registry_table
Geo::FileRegistry.arel_table
end
end end
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment