Move filtered count to separate query, to improve performance for large inventories [SCI-11261] (#8090)

This commit is contained in:
Martin Artnik 2024-12-09 17:57:41 +01:00 committed by GitHub
parent 7ffb664dad
commit 2bfbe6e2df
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 13 additions and 8 deletions

View file

@ -32,10 +32,10 @@ class MyModuleRepositoriesController < ApplicationController
}
@all_rows_count = datatable_service.all_count
@filtered_rows_count = datatable_service.filtered_count
@columns_mappings = datatable_service.mappings
repository_rows = datatable_service.repository_rows
@repository_rows = repository_rows.page(page).per(per_page)
@filtered_rows_count = @repository_rows.load.take&.filtered_count || 0
render rows_view
end
@ -54,7 +54,7 @@ class MyModuleRepositoriesController < ApplicationController
)
unless service.succeed?
status = :unprocessable_entity
raise ActiveRecord::Rollback
raise ActiveRecord::Rollback
end
assigned_count += service.assigned_rows_count
skipped_count += (params[:rows_to_assign].length - service.assigned_rows_count)

View file

@ -15,6 +15,7 @@ class MyModuleRepositorySnapshotsController < ApplicationController
datatable_service = RepositorySnapshotDatatableService.new(@repository_snapshot, params, current_user, @my_module)
@all_rows_count = datatable_service.all_count
@filtered_rows_count = datatable_service.filtered_count
@columns_mappings = datatable_service.mappings
repository_rows = datatable_service.repository_rows
@ -25,7 +26,6 @@ class MyModuleRepositorySnapshotsController < ApplicationController
rows_view = 'repository_rows/snapshot_index'
end
@repository_rows = repository_rows.page(page).per(per_page)
@filtered_rows_count = @repository_rows.load.take&.filtered_count || 0
render rows_view
end

View file

@ -73,10 +73,10 @@ class MyModuleShareableLinksController < ApplicationController
}
@all_rows_count = datatable_service.all_count
@filtered_rows_count = datatable_service.filtered_count
@columns_mappings = datatable_service.mappings
@repository_rows = datatable_service.repository_rows.page(page).per(per_page)
@filtered_rows_count = @repository_rows.load.take&.filtered_count || 0
render 'repository_rows/simple_view_index'
end
@ -88,11 +88,11 @@ class MyModuleShareableLinksController < ApplicationController
datatable_service = RepositorySnapshotDatatableService.new(@repository_snapshot, params, nil, @my_module, preload_cells: false)
@all_rows_count = datatable_service.all_count
@filtered_rows_count = datatable_service.filtered_count
@columns_mappings = datatable_service.mappings
@repository = @repository_snapshot
@repository_rows = datatable_service.repository_rows.page(page).per(per_page)
@filtered_rows_count = @repository_rows.load.take&.filtered_count || 0
render 'repository_rows/simple_view_index'
end

View file

@ -27,11 +27,11 @@ class RepositoryRowsController < ApplicationController
datatable_service = RepositoryDatatableService.new(@repository, params, current_user)
@all_rows_count = datatable_service.all_count
@filtered_rows_count = datatable_service.filtered_count
@columns_mappings = datatable_service.mappings
repository_rows = datatable_service.repository_rows
repository_rows = repository_rows.where(archived: params[:archived]) unless @repository.archived?
@repository_rows = repository_rows.page(page).per(per_page)
@filtered_rows_count = @repository_rows.load.take&.filtered_count || 0
rescue RepositoryFilters::ColumnNotFoundException
render json: { custom_error: I18n.t('repositories.show.repository_filter.errors.column_not_found') }
rescue RepositoryFilters::ValueNotFoundException

View file

@ -8,7 +8,7 @@ end
class RepositoryDatatableService
include MyModulesHelper
attr_reader :repository_rows, :all_count, :mappings
attr_reader :repository_rows, :all_count, :filtered_count, :mappings
PREDEFINED_COLUMNS = %w(row_id row_name added_on added_by archived_on archived_by
assigned relationships updated_on updated_by).freeze
@ -144,6 +144,8 @@ class RepositoryDatatableService
repository_rows = repository_rows.where(id: advanced_search(repository_rows)) if @params[:advanced_search].present?
@filtered_count = repository_rows.count
repository_rows.joins('LEFT OUTER JOIN "users" "created_by" ON "created_by"."id" = "repository_rows"."created_by_id"')
.joins('LEFT OUTER JOIN "users" "last_modified_by" ON "last_modified_by"."id" = "repository_rows"."last_modified_by_id"')
.joins('LEFT OUTER JOIN "users" "archived_by" ON "archived_by"."id" = "repository_rows"."archived_by_id"')
@ -151,7 +153,6 @@ class RepositoryDatatableService
.select('MAX("created_by"."full_name") AS created_by_full_name')
.select('MAX("last_modified_by"."full_name") AS last_modified_by_full_name')
.select('MAX("archived_by"."full_name") AS archived_by_full_name')
.select('COUNT("repository_rows"."id") OVER() AS filtered_count')
.group('repository_rows.id')
end

View file

@ -32,6 +32,7 @@ class RepositorySnapshotDatatableService < RepositoryDatatableService
@all_count = repository_rows.count
if search_value.present?
repository_rows = repository_rows.joins(:created_by)
repository_row_matches = repository_rows.where_attributes_like(@repository.default_search_fileds, search_value)
results = repository_rows.where(id: repository_row_matches)
@ -45,7 +46,10 @@ class RepositorySnapshotDatatableService < RepositoryDatatableService
results = results.or(repository_rows.where(id: custom_cell_matches))
end
@filtered_count = results.count
repository_rows = results
else
@filtered_count = @all_count
end
repository_rows.joins('LEFT OUTER JOIN "users" "created_by" ON "created_by"."id" = "repository_rows"."created_by_id"')