module Elasticsearch::Git::Repository::ClassMethods

Public Instance Methods

search_blob(query, type: :all, page: 1, per: 20, options: {}) click to toggle source
# File lib/elasticsearch/git/repository.rb, line 474
def search_blob(query, type: :all, page: 1, per: 20, options: {})
  page ||= 1

  query_hash = {
    query: {
      bool: {
        must: {
          simple_query_string: {
            query: query,
            default_operator: :and,
            fields: [ 'blob.content', 'blob.file_name' ]
          }
        }
      }
    },
    size: per,
    from: per * (page - 1)
  }

  query_hash[:query][:bool][:filter] = []

  if options[:repository_id]
    query_hash[:query][:bool][:filter] << {
      terms: {
        'blob.rid' => [options[:repository_id]].flatten
      }
    }
  end

  if options[:additional_filter]
    query_hash[:query][:bool][:filter] ||= []
    query_hash[:query][:bool][:filter] << options[:additional_filter]
  end

  if options[:language]
    query_hash[:query][:bool][:filter] << {
      terms: {
        'blob.language' => [options[:language]].flatten
      }
    }
  end

  options[:order] = :default if options[:order].blank?

  query_hash[:sort] = [:_score]

  if options[:highlight]
    query_hash[:highlight] = {
      pre_tags: ["gitlabelasticsearch→"],
      post_tags: ["←gitlabelasticsearch"],
      order: "score",
      fields: {
        "blob.content" => {},
        "blob.file_name" => {},
      }
    }
  end

  res = self.__elasticsearch__.search(query_hash)

  {
    results: res.results,
    total_count: res.size
  }
end
search_commit(query, page: 1, per: 20, options: {}) click to toggle source
# File lib/elasticsearch/git/repository.rb, line 411
def search_commit(query, page: 1, per: 20, options: {})
  page ||= 1

  fields = %w(message^10 sha^5 author.name^2 author.email^2 committer.name committer.email).map {|i| "commit.#{i}"}

  query_hash = {
    query: {
      bool: {
        must: [{
          simple_query_string: {
            fields: fields,
            query: query,
            default_operator: :or
          }
        }]
      }
    },
    size: per,
    from: per * (page - 1)
  }

  if query.blank?
    query_hash[:query][:bool][:must] = { match_all: {}}
    query_hash[:track_scores] = true
  end

  if options[:repository_id]
    query_hash[:query][:bool][:filter] = {
      terms: {
        'commit.rid' => [options[:repository_id]].flatten
      }
    }
  end

  if options[:additional_filter]
    query_hash[:query][:bool][:filter] ||= []
    query_hash[:query][:bool][:filter] << options[:additional_filter]
  end

  if options[:highlight]
    es_fields = fields.map { |field| field.split('^').first }.inject({}) do |memo, field|
      memo[field.to_sym] = {}
      memo
    end

    query_hash[:highlight] = {
      pre_tags: ["gitlabelasticsearch→"],
      post_tags: ["←gitlabelasticsearch"],
      fields: es_fields
    }
  end

  options[:order] = :default if options[:order].blank?

  query_hash[:sort] = [:_score]

  res = self.__elasticsearch__.search(query_hash)
  {
    results: res.results,
    total_count: res.size
  }
end
search_file_names(query, page: 1, per: 20, options: {}) click to toggle source
# File lib/elasticsearch/git/repository.rb, line 540
def search_file_names(query, page: 1, per: 20, options: {})
  query_hash = {
    fields: ['blob.path'],
    query: {
        fuzzy: {
            'repository.blob.path' => { value: query }
        },
    },
    filter: {
        term: {
            'repository.blob.rid' => [options[:repository_id]].flatten
        }
    },
    size: per,
    from: per * (page - 1)
  }

  self.__elasticsearch__.search(query_hash)
end