From ad0bd44b51d286c37759a8c6331cf895e725c1e4 Mon Sep 17 00:00:00 2001 From: Alex Kriuchykhin <okriuchykhin@biosistemika.com> Date: Tue, 15 Feb 2022 18:01:53 +0100 Subject: [PATCH] Allow multiple use of same column in advanced filters [SCI-6538] (#3857) --- app/services/repository_datatable_service.rb | 39 ++++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/app/services/repository_datatable_service.rb b/app/services/repository_datatable_service.rb index 3ea314f47..038bc9b03 100644 --- a/app/services/repository_datatable_service.rb +++ b/app/services/repository_datatable_service.rb @@ -117,12 +117,12 @@ class RepositoryDatatableService def advanced_search(repository_rows) adv_search_params = @params[:advanced_search] filter = @repository.repository_table_filters.new - adv_search_params[:filter_elements].each do |filter_element_params| + adv_search_params[:filter_elements].each_with_index do |filter_element_params, index| repository_rows = if PREDEFINED_COLUMNS.include?(filter_element_params[:repository_column_id]) add_predefined_column_filter_condition(repository_rows, filter_element_params) else - add_custom_column_filter_condition(repository_rows, filter, filter_element_params) + add_custom_column_filter_condition(repository_rows, filter, index, filter_element_params) end end @@ -338,7 +338,7 @@ class RepositoryDatatableService end end - def add_custom_column_filter_condition(repository_rows, filter, filter_element_params) + def add_custom_column_filter_condition(repository_rows, filter, index, filter_element_params) repository_column = @repository.repository_columns.find_by(id: filter_element_params['repository_column_id']) raise RepositoryFilters::ColumnNotFoundException unless repository_column @@ -348,26 +348,25 @@ class RepositoryDatatableService parameters: filter_element_params[:parameters] ) config = Extends::REPOSITORY_ADVANCED_SEARCH_ATTR[filter_element.repository_column.data_type.to_sym] + join_cells_alias = "repository_cells_#{index}" + join_values_alias = "repository_values_#{index}" + + enforce_referenced_value_existence!(filter_element) + + repository_rows = + repository_rows + .joins( + "LEFT OUTER JOIN \"repository_cells\" AS \"#{join_cells_alias}\"" \ + " ON \"repository_rows\".\"id\" = \"#{join_cells_alias}\".\"repository_row_id\"" \ + " AND \"#{join_cells_alias}\".\"repository_column_id\" = '#{filter_element.repository_column.id}'" + ).joins( + "LEFT OUTER JOIN \"#{config[:table_name]}\" AS \"#{join_values_alias}\"" \ + " ON \"#{join_values_alias}\".\"id\" = \"#{join_cells_alias}\".\"value_id\"" + ) if %w(empty file_not_attached).include?(filter_element_params[:operator]) - repository_rows.left_outer_joins(config[:table_name]).where(config[:table_name] => nil) + repository_rows.where(join_values_alias => { id: nil }) else - join_cells_alias = "repository_column_cells_#{filter_element.repository_column.id}" - join_values_alias = "repository_column_values_#{filter_element.repository_column.id}" - - enforce_referenced_value_existence!(filter_element) - - repository_rows = - repository_rows - .joins( - "LEFT OUTER JOIN \"repository_cells\" AS \"#{join_cells_alias}\"" \ - " ON \"repository_rows\".\"id\" = \"#{join_cells_alias}\".\"repository_row_id\"" \ - " AND \"#{join_cells_alias}\".\"repository_column_id\" = '#{filter_element.repository_column.id}'") - .joins( - "LEFT OUTER JOIN \"#{config[:table_name]}\" AS \"#{join_values_alias}\"" \ - " ON \"#{join_values_alias}\".\"id\" = \"#{join_cells_alias}\".\"value_id\"" - ) - value_klass = filter_element.repository_column.data_type.constantize value_klass.add_filter_condition(repository_rows, join_values_alias, filter_element) end