Skip to content

Commit

Permalink
Move filtered count to separate query, to improve performance for lar…
Browse files Browse the repository at this point in the history
…ge inventories [SCI-11261] (#8090)
  • Loading branch information
artoscinote authored Dec 9, 2024
1 parent 7ffb664 commit 2bfbe6e
Show file tree
Hide file tree
Showing 6 changed files with 13 additions and 8 deletions.
4 changes: 2 additions & 2 deletions app/controllers/my_module_repositories_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,10 @@ def index_dt
}

@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

Expand All @@ -54,7 +54,7 @@ def assign_my_modules
)
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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ def index_dt
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

Expand All @@ -25,7 +26,6 @@ def index_dt
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

Expand Down
4 changes: 2 additions & 2 deletions app/controllers/my_module_shareable_links_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,10 @@ def repository_index_dt
}

@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
Expand All @@ -88,11 +88,11 @@ def repository_snapshot_index_dt
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
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/repository_rows_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@ def index
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
Expand Down
5 changes: 3 additions & 2 deletions app/services/repository_datatable_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class ValueNotFoundException < StandardError; 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
Expand Down Expand Up @@ -144,14 +144,15 @@ def fetch_rows(search_value)

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"')
.select('repository_rows.*')
.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

Expand Down
4 changes: 4 additions & 0 deletions app/services/repository_snapshot_datatable_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ def fetch_rows(search_value)
@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)

Expand All @@ -45,7 +46,10 @@ def fetch_rows(search_value)
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"')
Expand Down

0 comments on commit 2bfbe6e

Please sign in to comment.