mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-11-08 07:21:03 +08:00
Move filtered count to separate query, to improve performance for large inventories [SCI-11261] (#8090)
This commit is contained in:
parent
7ffb664dad
commit
2bfbe6e2df
6 changed files with 13 additions and 8 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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"')
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue