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"]

Instance Method Summary collapse

Constructor Details

#initialize(tokens, query_builder_options = nil) ⇒ Query

Returns a new instance of Query.

Parameters:

  • tokens (Array<Qiita::Elasticsearch::Token>)
  • query_builder_options (Hash) (defaults to: nil)

    For building new query from this query



13
14
15
16
# File 'lib/qiita/elasticsearch/query.rb', line 13

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”)

Parameters:

  • field_name (String) (defaults to: nil)
  • term (String) (defaults to: nil)

Returns:



22
23
24
25
26
27
28
# File 'lib/qiita/elasticsearch/query.rb', line 22

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”)

Parameters:

  • field_name (String) (defaults to: nil)
  • term (String) (defaults to: nil)

Returns:



34
35
36
37
38
39
40
# File 'lib/qiita/elasticsearch/query.rb', line 34

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”)

Parameters:

  • field_name (String) (defaults to: nil)
  • positive (false, nil, true) (defaults to: nil)
  • term (String) (defaults to: nil)

Returns:

  • (Boolean)


46
47
48
49
50
51
# File 'lib/qiita/elasticsearch/query.rb', line 46

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

Returns query property for request body for Elasticsearch.

Returns:

  • (Hash)

    query property for request body for Elasticsearch



54
55
56
# File 'lib/qiita/elasticsearch/query.rb', line 54

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

#sortArray

Returns sort property for request body for Elasticsearch.

Returns:

  • (Array)

    sort property for request body for Elasticsearch



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/qiita/elasticsearch/query.rb', line 59

def sort
  case sort_term
  when "created-asc"
    [{ "created_at" => "asc" }, "_score"]
  when "lgtms-asc"
    [{ "lgtms" => "asc" }, "_score"]
  when "lgtms-desc"
    [{ "lgtms" => "desc" }, "_score"]
  when "related-asc"
    ["_score"]
  when "related-desc"
    [{ "_score" => "desc" }]
  when "stocks-asc"
    [{ "stocks" => "asc" }, "_score"]
  when "stocks-desc"
    [{ "stocks" => "desc" }, "_score"]
  when "updated-asc"
    [{ "updated_at" => "asc" }, "_score"]
  when "updated-desc"
    [{ "updated_at" => "desc" }, "_score"]
  else
    DEFAULT_SORT
  end
end

#sort_termObject



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

def sort_term
  @tokens.select(&:sort?).last.try(:term)
end

#to_hashHash

Returns request body for Elasticsearch.

Returns:

  • (Hash)

    request body for Elasticsearch



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

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

#to_sString

Returns query string generated from its tokens.

Returns:

  • (String)

    query string generated from its tokens



97
98
99
# File 'lib/qiita/elasticsearch/query.rb', line 97

def to_s
  @tokens.join(" ")
end

#typeString?

Returns last positive type name in query string.

Returns:

  • (String, nil)

    last positive type name in query string



102
103
104
# File 'lib/qiita/elasticsearch/query.rb', line 102

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”)

Parameters:

  • field_name (String) (defaults to: nil)
  • term (String) (defaults to: nil)

Returns:



110
111
112
113
114
115
116
# File 'lib/qiita/elasticsearch/query.rb', line 110

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