class SearchController < ApplicationController before_filter :load_vars, only: :index before_filter :load_markdown, only: :index MIN_QUERY_CHARS = 2 def index if not @search_query redirect_to new_search_path end count_search_results search_projects if @search_category == :projects search_experiments if @search_category == :experiments search_workflows if @search_category == :workflows search_modules if @search_category == :modules search_results if @search_category == :results search_tags if @search_category == :tags search_reports if @search_category == :reports search_protocols if @search_category == :protocols search_steps if @search_category == :steps search_checklists if @search_category == :checklists search_samples if @search_category == :samples search_assets if @search_category == :assets search_tables if @search_category == :tables search_comments if @search_category == :comments @search_pages = (@search_count.to_f / SEARCH_LIMIT.to_f).ceil @start_page = @search_page - 2 @start_page = 1 if @start_page < 1 @end_page = @start_page + 4 if @end_page > @search_pages @end_page = @search_pages @start_page = @end_page - 4 @start_page = 1 if @start_page < 1 end end def new end private def load_vars @search_query = params[:q] || '' @search_category = params[:category] || '' @search_category = @search_category.to_sym @search_page = params[:page].to_i || 1 @display_query = @search_query if @search_query.length < MIN_QUERY_CHARS flash[:error] = t'search.index.error.query_length', n: MIN_QUERY_CHARS return redirect_to :back end # splits the search query to validate all entries @splited_query = @search_query.split if @splited_query.first.length < MIN_QUERY_CHARS flash[:error] = t'search.index.error.query_length', n: MIN_QUERY_CHARS redirect_to :back elsif @splited_query.length > 1 @search_query = '' @splited_query.each_with_index do |w, i| @search_query += "#{@splited_query[i]} " if w.length >= MIN_QUERY_CHARS end else @search_query = @splited_query.join(' ') end @search_page = 1 if @search_page < 1 end # Initialize markdown parser def load_markdown if @search_category == :results @markdown = Redcarpet::Markdown.new( Redcarpet::Render::HTML.new( filter_html: true, no_images: true ) ) end end protected def search_by_name(model) model.search(current_user, true, @search_query, @search_page) end def count_by_name(model) search_by_name(model).limit(nil).offset(nil).size end def count_search_results @project_search_count = count_by_name Project @experiment_search_count = count_by_name Experiment @workflow_search_count = count_by_name MyModuleGroup @module_search_count = count_by_name MyModule @result_search_count = count_by_name Result @tag_search_count = count_by_name Tag @report_search_count = count_by_name Report @protocol_search_count = count_by_name Protocol @step_search_count = count_by_name Step @checklist_search_count = count_by_name Checklist @sample_search_count = count_by_name Sample @asset_search_count = count_by_name Asset @table_search_count = count_by_name Table @comment_search_count = count_by_name Comment @search_results_count = @project_search_count @search_results_count += @experiment_search_count @search_results_count += @workflow_search_count @search_results_count += @module_search_count @search_results_count += @result_search_count @search_results_count += @tag_search_count @search_results_count += @report_search_count @search_results_count += @protocol_search_count @search_results_count += @step_search_count @search_results_count += @checklist_search_count @search_results_count += @sample_search_count @search_results_count += @asset_search_count @search_results_count += @table_search_count @search_results_count += @comment_search_count end def search_projects @project_results = [] if @project_search_count > 0 @project_results = search_by_name Project end @search_count = @project_search_count end def search_experiments @experiment_results = [] if @experiment_search_count > 0 @experiment_results = search_by_name Experiment end @search_count = @experiment_search_count end def search_workflows @workflow_results = [] if @workflow_search_count > 0 @workflow_results = search_by_name MyModuleGroup end @search_count = @workflow_search_count end def search_modules @module_results = [] if @module_search_count > 0 @module_results = search_by_name MyModule end @search_count = @module_search_count end def search_results @result_results = [] if @result_search_count > 0 @result_results = search_by_name Result end @search_count = @result_search_count end def search_tags @tag_results = [] if @tag_search_count > 0 @tag_results = search_by_name Tag end @search_count = @tag_search_count end def search_reports @report_results = [] if @report_search_count > 0 @report_results = search_by_name Report end @search_count = @report_search_count end def search_protocols @protocol_results = [] if @protocol_search_count > 0 @protocol_results = search_by_name Protocol end @search_count = @protocol_search_count end def search_steps @step_results = [] if @step_search_count > 0 @step_results = search_by_name Step end @search_count = @step_search_count end def search_checklists @checklist_results = [] if @checklist_search_count > 0 @checklist_results = search_by_name Checklist end @search_count = @checklist_search_count end def search_samples @sample_results = [] if @sample_search_count > 0 @sample_results = search_by_name Sample end @search_count = @sample_search_count end def search_assets @asset_results = [] if @asset_search_count > 0 @asset_results = search_by_name Asset end @search_count = @asset_search_count end def search_tables @table_results = [] if @table_search_count > 0 @table_results = search_by_name Table end @search_count = @table_search_count end def search_comments @comment_results = [] if @comment_search_count > 0 @comment_results = search_by_name Comment end @search_count = @comment_search_count end end