<commit_before># -*- coding: utf-8 -*-

class TopController < ApplicationController
  def index

    # params[:radio_param]が無いなら、全てのデータを表示
    if params[:radio_param].nil?
      @files = resources_list
      @tags = collect_tags @files
      return
    end

    # 検索(@filesを絞り込む)
    case params[:radio_param][:search_type]
    when "file"
      # ファイル名指定検索
      @files.select!{|file|file.include?(params[:keyword])}
      @tags = collect_tags @files
    when "tag"
      # タグ指定検索
      @files = tag_search params[:keyword]
      @tags = collect_tags @files
    else
      # 何も無し
    end
  end

  private

  def resources_list
    # public/resources 以下のファイル名をすべて返す
    Dir.entries("public/resources").delete_if{|a|a.start_with?(".")}
  end

  def collect_tags files
    # files 全てから(file_name=>tagの配列)のハッシュを返す

    return {} if files.nil?

    tags = {}
    files.each do |file|
      tags[file] = TaggedFile.where({:file_name => file}).map{|a|a.tag}
    end
    tags
  end

  def tag_search pattern
    # patternを含むタグを持っているファイル名の配列を返す
    selected_tag = TaggedFile.where("tag like '%#{pattern}%'")

    # タグが見つからない場合
    return [] if selected_tag.empty?

    # 検索対象のタグを持ってるファイル名配列を作る
    selected_tag.map!{|a|a.file_name}

    # タグを持ってるファイル名配列に存在ものだけ残す
    files = resources_list
    return [] if files.empty?

    files.select! do |file|
      selected_tag.include?(file)<commit_msg>different implementation file name search, use select and where<commit_after># -*- coding: utf-8 -*-

class TopController < ApplicationController
  def index

    # params[:radio_param]が無いなら、全てのデータを表示
    if params[:radio_param].nil?
      @files = resources_list
      @tags = collect_tags @files
      return
    end

    # 検索(@filesを絞り込む)
    case params[:radio_param][:search_type]
    when "file"
      # ファイル名指定検索
      @files = file_name_search params[:keyword]
      @tags = collect_tags @files
    when "tag"
      # タグ指定検索
      @files = tag_search params[:keyword]
      @tags = collect_tags @files
    else
      # 何も無し
    end
  end

  private

  def resources_list
    # public/resources 以下のファイル名をすべて返す
    Dir.entries("public/resources").delete_if{|a|a.start_with?(".")}
  end

  def collect_tags files
    # files 全てから(file_name=>tagの配列)のハッシュを返す

    return {} if files.nil?

    tags = {}
    files.each do |file|
      tags[file] = TaggedFile.where({:file_name => file}).map{|a|a.tag}
    end
    tags
  end

  def file_name_search pattern
    # pattern を含むファイル名の配列を返す
    TaggedFile.select("distinct file_name").
      where("file_name like '%#{pattern}%'").map{|a|a.file_name}
  end

  def tag_search pattern
    # patternを含むタグを持っているファイル名の配列を返す
    selected_tag = TaggedFile.where("tag like '%#{pattern}%'")

    # タグが見つからない場合
    return [] if selected_tag.empty?

    # 検索対象のタグを持ってるファイル名配列を作る
    selected_tag.map!{|a|a.file_name}

    # タグを持ってるファイル名配列に存在ものだけ残す
    files = resources_list
    return [] if files.empty?

    files.select! do |file|
      selected_tag.include?(file)
{'fraction_non_alphanumeric': 0.1144578313253012, 'fraction_numerical': 0.0006693440428380187, 'mean_word_length': 2.9906542056074765, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1343588', 'n_tokens_mistral': 1225, 'n_tokens_neox': 1210, 'n_words': 200}