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 457
def search_blob(query, type: :all, page: 1, per: 20, options: {})
  page ||= 1

  query_hash = {
    query: {
      filtered: {
        query: {
          match: {
            'blob.content' => {
              query: "#{query}",
              operator: :and
            }
          }
        }
      }
    },
    facets: {
      languageFacet: {
        terms: {
          field: :language,
          all_terms: true,
          size: 20
        }
      },
      blobRepositoryFaset: {
        terms: {
          field: :rid,
          all_terms: true,
          size: repositories_count
        }
      }
    },
    size: per,
    from: per * (page - 1)
  }

  if options[:repository_id]
    query_hash[:query][:filtered][:filter] ||= { and: [] }
    query_hash[:query][:filtered][:filter][:and] << {
      terms: {
        "blob.rid" => [options[:repository_id]].flatten
      }
    }
  end

  if options[:language]
    query_hash[:query][:filtered][:filter] ||= { and: [] }
    query_hash[:query][:filtered][:filter][:and] << {
      terms: {
        "blob.language" => [options[:language]].flatten
      }
    }
  end

  options[:order] = :default if options[:order].blank?
  order = case options[:order].to_sym
          when :recently_indexed
            { _timestamp: { order: :desc, mode: :min } }
          when :last_indexed
            { _timestamp: { order: :asc, mode: :min } }
          else
            {}
          end

  query_hash[:sort] = order.blank? ? [:_score] : [order, :_score]

  if options[:highlight]
    query_hash[:highlight] = {
      pre_tags: ["gitlabelasticsearch→"],
      post_tags: ["←gitlabelasticsearch"],
      fields: {
        "blob.content" => {},
        "type" => "fvh",
        "boundary_chars" => "\n"
      }
    }
  end

  res = self.__elasticsearch__.search(query_hash)

  {
    results: res.results,
    total_count: res.size,
    languages: res.response["facets"]["languageFacet"]["terms"],
    repositories: res.response["facets"]["blobRepositoryFaset"]["terms"]
  }
end
search_commit(query, page: 1, per: 20, options: {}) click to toggle source
# File lib/elasticsearch/git/repository.rb, line 380
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: {
      filtered: {
        query: {
          multi_match: {
            fields: fields,
            query: "#{query}",
            operator: :or
          }
        },
      },
    },
    facets: {
      commitRepositoryFaset: {
        terms: {
          field: "commit.rid",
          all_terms: true,
          size: repositories_count
        }
      }
    },
    size: per,
    from: per * (page - 1)
  }

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

  if options[:repository_id]
    query_hash[:query][:filtered][:filter] ||= { and: [] }
    query_hash[:query][:filtered][:filter][:and] << {
      terms: {
        "commit.rid" => [options[:repository_id]].flatten
      }
    }
  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?
  order = case options[:order].to_sym
          when :recently_indexed
            { _timestamp: { order: :desc, mode: :min } }
          when :last_indexed
            { _timestamp: { order: :asc,  mode: :min } }
          else
            {}
          end

  query_hash[:sort] = order.blank? ? [:_score] : [order, :_score]

  res = self.__elasticsearch__.search(query_hash)
  {
    results: res.results,
    total_count: res.size,
    repositories: res.response["facets"]["commitRepositoryFaset"]["terms"]
  }
end
search_file_names(query, page: 1, per: 20, options: {}) click to toggle source
# File lib/elasticsearch/git/repository.rb, line 545
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