class Qiita::Elasticsearch::Query

Constants

DEFAULT_SORT
SORTS_TABLE

Public Class Methods

new(tokens, query_builder_options = nil) click to toggle source

@param [Array<Qiita::Elasticsearch::Token>] tokens @param [Hash] query_builder_options For building new query from this query

# File lib/qiita/elasticsearch/query.rb, line 26
def initialize(tokens, query_builder_options = nil)
  @query_builder_options = query_builder_options
  @tokens = tokens
end

Public Instance Methods

append_field_token(field_name: nil, term: nil) click to toggle source

@param [String] field_name @param [String] term @return [Qiita::Elasticsearch::Query] @example query.append_field_token(field_name: “tag”, term: “Ruby”)

# File lib/qiita/elasticsearch/query.rb, line 35
def append_field_token(field_name: nil, term: nil)
  if has_field_token?(field_name: field_name, term: term)
    self
  else
    build_query([*@tokens, "#{field_name}:#{term}"].join(" "))
  end
end
delete_field_token(field_name: nil, term: nil) click to toggle source

@param [String] field_name @param [String] term @return [Qiita::Elasticsearch::Query] @example query.delete_field_token(field_name: “tag”, term: “Ruby”)

# File lib/qiita/elasticsearch/query.rb, line 47
def delete_field_token(field_name: nil, term: nil)
  build_query(
    @tokens.reject do |token|
      (field_name.nil? || token.field_name == field_name) && (term.nil? || token.term == term)
    end.join(" ")
  )
end
has_field_token?(field_name: nil, positive: nil, term: nil) click to toggle source

@param [String] field_name @param [false, nil, true] positive @param [String] term @example query.has_field_token?(field_name: “tag”, term: “Ruby”)

# File lib/qiita/elasticsearch/query.rb, line 59
def has_field_token?(field_name: nil, positive: nil, term: nil)
  @tokens.any? do |token|
    (field_name.nil? || token.field_name == field_name) && (term.nil? || token.term == term) &&
      (positive.nil? || positive && token.positive? || !positive && token.negative?)
  end
end
query() click to toggle source

@return [Hash] query property for request body for Elasticsearch

# File lib/qiita/elasticsearch/query.rb, line 67
def query
  Nodes::OrSeparatableNode.new(@tokens).to_hash
end
sort() click to toggle source

@return [Array] sort property for request body for Elasticsearch

# File lib/qiita/elasticsearch/query.rb, line 72
def sort
  SORTS_TABLE[sort_term] || DEFAULT_SORT
end
sort_term() click to toggle source
# File lib/qiita/elasticsearch/query.rb, line 76
def sort_term
  term = @tokens.select(&:sort?).last.try(:term)
  term if SORTS_TABLE.key?(term)
end
to_hash() click to toggle source

@return [Hash] request body for Elasticsearch

# File lib/qiita/elasticsearch/query.rb, line 82
def to_hash
  {
    "query" => query,
    "sort" => sort,
  }
end
to_s() click to toggle source

@return [String] query string generated from its tokens

# File lib/qiita/elasticsearch/query.rb, line 90
def to_s
  @tokens.join(" ")
end
type() click to toggle source

@return [String, nil] last positive type name in query string

# File lib/qiita/elasticsearch/query.rb, line 95
def type
  @tokens.select(&:type?).select(&:positive?).last.try(:type)
end
update_field_token(field_name: nil, term: nil) click to toggle source

@param [String] field_name @param [String] term @return [Qiita::Elasticsearch::Query] @example query.update_field_token(field_name: “tag”, term: “Ruby”)

# File lib/qiita/elasticsearch/query.rb, line 103
def update_field_token(field_name: nil, term: nil)
  build_query(
    @tokens.reject do |token|
      token.field_name == field_name
    end.map(&:to_s).push("#{field_name}:#{term}").join(" ")
  )
end

Private Instance Methods

build_query(query_string) click to toggle source

Build a new query from query string @param [String] query_string @return [Qiita::Elasticsearch::Query] @example build_query(“test tag:Ruby”)

# File lib/qiita/elasticsearch/query.rb, line 117
def build_query(query_string)
  query_builder.build(query_string)
end
query_builder() click to toggle source

@return [Qiita::Elasticsearch::QueryBuilder]

# File lib/qiita/elasticsearch/query.rb, line 122
def query_builder
  QueryBuilder.new(query_builder_options)
end
query_builder_options() click to toggle source

@return [Hash]

# File lib/qiita/elasticsearch/query.rb, line 127
def query_builder_options
  @query_builder_options || {}
end