Class: Stretchy::Queries::FunctionScoreQuery

Inherits:
Base
  • Object
show all
Defined in:
lib/stretchy/queries/function_score_query.rb

Constant Summary collapse

SCORE_MODES =
%w(multiply sum avg first max min)
BOOST_MODES =
%w(multiply replace sum avg max min)

Constants included from Utils::Contract

Utils::Contract::ASSERTIONS, Utils::Contract::DECAY_FUNCTIONS, Utils::Contract::DISTANCE_FORMAT

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Utils::Contract

included, #require_one, #validate!

Constructor Details

#initialize(options = {}) ⇒ FunctionScoreQuery

Returns a new instance of FunctionScoreQuery.



20
21
22
23
24
25
26
27
28
29
30
# File 'lib/stretchy/queries/function_score_query.rb', line 20

def initialize(options = {})
  @functions  = Array(options[:functions])
  @query      = options[:query]
  @filter     = options[:filter]
  
  self.class.attributes.map do |field|
    instance_variable_set("@#{field}", options[field])
  end
  validate!
  validate_query_or_filter
end

Class Method Details

.attributesObject



32
33
34
# File 'lib/stretchy/queries/function_score_query.rb', line 32

def self.attributes
  [:boost, :max_boost, :score_mode, :boost_mode, :min_score]
end

Instance Method Details

#to_searchObject



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/stretchy/queries/function_score_query.rb', line 42

def to_search
  json = {}
  json[:functions]  = @functions.map(&:to_search)
  if @query
    json[:query]    = @query.to_search
  elsif @filter
    json[:filter]   = @filter.to_search
  else
    json[:query]    = Stretchy::Queries::MatchAllQuery.new.to_search
  end

  self.class.attributes.reduce(json) do |body, field|
    ivar = instance_variable_get("@#{field}")
    body[field] = ivar if ivar
    body
  end

  { function_score: json }
end

#validate_query_or_filterObject



36
37
38
39
40
# File 'lib/stretchy/queries/function_score_query.rb', line 36

def validate_query_or_filter
  if @query && @filter
    raise Stretchy::Errors::ContractError.new "Cannot have both query and filter -- combine using a FilteredQuery"
  end
end