Improve search speed on files and inventories [SCI-2739]

This commit is contained in:
Oleksii Kriuchykhin 2018-09-17 15:46:56 +02:00
parent fcf947e29b
commit 4ee9eb3134
2 changed files with 29 additions and 19 deletions

View file

@ -98,23 +98,31 @@ class Asset < ApplicationRecord
options = {}
)
project_ids =
Project
.search(user, include_archived, nil, Constants::SEARCH_NO_LIMIT)
.pluck(:id)
team_ids = user.teams.pluck(:id)
teams = user.teams.select(:id)
new_query =
Asset
.distinct
.left_outer_joins(:asset_text_datum)
.left_outer_joins(
step: { protocol: { my_module: { experiment: :project } } }
)
.left_outer_joins(result: { my_module: { experiment: :project } })
.left_outer_joins(repository_cell: { repository_column: :repository })
.where('projects.id IN (?) OR repositories.team_id IN (?)',
project_ids, team_ids)
assets_in_steps = Asset.joins(:step).where(
'steps.id IN (?)',
Step.search(user, include_archived, nil, Constants::SEARCH_NO_LIMIT)
.select(:id)
).pluck(:id)
assets_in_results = Asset.joins(:result).where(
'results.id IN (?)',
Result.search(user, include_archived, nil, Constants::SEARCH_NO_LIMIT)
.select(:id)
).pluck(:id)
assets_in_inventories = Asset.joins(
repository_cell: { repository_column: :repository }
).where('repositories.team_id IN (?)', teams).pluck(:id)
assets =
Asset.distinct
.where('assets.id IN (?) OR assets.id IN (?) OR assets.id IN (?)',
assets_in_steps, assets_in_results, assets_in_inventories)
new_query = Asset.left_outer_joins(:asset_text_datum)
.from(assets, 'assets')
a_query = s_query = ''

View file

@ -34,16 +34,19 @@ class Repository < ApplicationRecord
repository = nil,
options = {}
)
repositories = repository ? repository : Repository.where(team: user.teams)
repositories = repository || Repository.where(team: user.teams)
includes_json = { repository_cells: Extends::REPOSITORY_SEARCH_INCLUDES }
searchable_attributes = ['repository_rows.name', 'users.full_name'] +
Extends::REPOSITORY_EXTRA_SEARCH_ATTR
all_rows = RepositoryRow.where(repository: repositories)
new_query = RepositoryRow
.distinct
.from(all_rows, 'repository_rows')
.left_outer_joins(:created_by)
.left_outer_joins(includes_json)
.where(repository: repositories)
.where_attributes_like(searchable_attributes, query, options)
# Show all results if needed
@ -56,7 +59,6 @@ class Repository < ApplicationRecord
.group('repositories.id')
else
new_query
.distinct
.limit(Constants::SEARCH_LIMIT)
.offset((page - 1) * Constants::SEARCH_LIMIT)
end