Class: Qiita::Elasticsearch::Query

Inherits:
Object
  • Object
show all
Defined in:
lib/qiita/elasticsearch/query.rb

Constant Summary collapse

DEFAULT_SORT =
[{ "created_at" => "desc" }, "_score"]
SORTS_TABLE =
{
  "created-asc" => [{ "created_at" => "asc" }, "_score"],
  "created-desc" => [{ "created_at" => "desc" }, "_score"],
  "likes-asc" => [{ "lgtms" => "asc" }, "_score"],
  "likes-desc" => [{ "lgtms" => "desc" }, "_score"],
  "related-asc" => ["_score"],
  "related-desc" => [{ "_score" => "desc" }],
  "stocks-asc" => [{ "stocks" => "asc" }, "_score"],
  "stocks-desc" => [{ "stocks" => "desc" }, "_score"],
  "updated-asc" => [{ "updated_at" => "asc" }, "_score"],
  "updated-desc" => [{ "updated_at" => "desc" }, "_score"],
}

Instance Method Summary collapse

Constructor Details

#initialize(tokens, query_builder_options = nil) ⇒ Query



26
27
28
29
# File 'lib/qiita/elasticsearch/query.rb', line 26

def initialize(tokens, query_builder_options = nil)
  @query_builder_options = query_builder_options
  @tokens = tokens
end

Instance Method Details

#append_field_token(field_name: nil, term: nil) ⇒ Qiita::Elasticsearch::Query

Examples:

query.append_field_token(field_name: “tag”, term: “Ruby”)



35
36
37
38
39
40
41
# 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) ⇒ Qiita::Elasticsearch::Query

Examples:

query.delete_field_token(field_name: “tag”, term: “Ruby”)



47
48
49
50
51
52
53
# 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) ⇒ Boolean

Examples:

query.has_field_token?(field_name: “tag”, term: “Ruby”)



59
60
61
62
63
64
# 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

#queryHash



67
68
69
# File 'lib/qiita/elasticsearch/query.rb', line 67

def query
  Nodes::OrSeparatableNode.new(@tokens).to_hash
end

#sortArray



72
73
74
# File 'lib/qiita/elasticsearch/query.rb', line 72

def sort
  SORTS_TABLE[sort_term] || DEFAULT_SORT
end

#sort_termObject



76
77
78
79
# 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_hashHash



82
83
84
85
86
87
# File 'lib/qiita/elasticsearch/query.rb', line 82

def to_hash
  {
    "query" => query,
    "sort" => sort,
  }
end

#to_sString



90
91
92
# File 'lib/qiita/elasticsearch/query.rb', line 90

def to_s
  @tokens.join(" ")
end

#typeString?



95
96
97
# 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) ⇒ Qiita::Elasticsearch::Query

Examples:

query.update_field_token(field_name: “tag”, term: “Ruby”)



103
104
105
106
107
108
109
# 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