class Stretchy::API

Constants

DEFAULT_BOOST
DEFAULT_PER_PAGE

Attributes

body[R]
collector[R]
context[R]
opts[R]
root[R]

Public Class Methods

new(opts = {}) click to toggle source
# File lib/stretchy/api.rb, line 21
def initialize(opts = {})
  @opts       = opts
  @collector  = AndCollector.new(opts[:nodes] || [], query: true)
  @root       = opts[:root]     || {}
  @body       = opts[:body]     || {}
  @context    = opts[:context]  || {}
end

Public Instance Methods

aggs(params = {}) click to toggle source
# File lib/stretchy/api.rb, line 74
def aggs(params = {})
  add_body aggs: params
end
boost(params = {}, options = {}) click to toggle source
# File lib/stretchy/api.rb, line 134
def boost(params = {}, options = {})
  return add_context(:boost) if Utils.is_empty? params

  subcontext = context.merge(boost: true)
  if params.is_a? self.class
    boost_json = options.merge(filter: params.json)
    add_nodes Node.new(boost_json, subcontext)
  else
    add_nodes Factory.raw_boost_node(params, subcontext)
  end
end
context?(*args) click to toggle source
# File lib/stretchy/api.rb, line 29
def context?(*args)
  (args - context.keys).empty?
end
count() click to toggle source
# File lib/stretchy/api.rb, line 176
def count
  results_obj.ids.count
end
current_page() click to toggle source
# File lib/stretchy/api.rb, line 60
def current_page
  Utils.current_page(offset, limit)
end
explain() click to toggle source
# File lib/stretchy/api.rb, line 64
def explain
  add_root explain: true
end
field_value(params = {}) click to toggle source
# File lib/stretchy/api.rb, line 146
def field_value(params = {})
  add_params params, :boost, :field_value_function_node
end
fields(*list) click to toggle source
# File lib/stretchy/api.rb, line 68
def fields(*list)
  add_root _source: list
end
Also aliased as: source
filter(params = {}) click to toggle source
# File lib/stretchy/api.rb, line 114
def filter(params = {})
  add_params params, :filter, :raw_node
end
fulltext(params = '') click to toggle source
# File lib/stretchy/api.rb, line 103
def fulltext(params = '')
  unless params.is_a?(String)
    raise Errors::InvalidParamsError.new('.fulltext only takes a string')
  end
  add_nodes Factory.fulltext_nodes_from_string(params, context)
end
geo_distance(params = {}) click to toggle source
# File lib/stretchy/api.rb, line 130
def geo_distance(params = {})
  add_params params, nil, :geo_distance_node
end
highlight(params = {}) click to toggle source
# File lib/stretchy/api.rb, line 78
def highlight(params = {})
  add_body highlight: params
end
limit(size = nil) click to toggle source
# File lib/stretchy/api.rb, line 33
def limit(size = nil)
  return @root[:size] || DEFAULT_PER_PAGE unless size
  add_root size: size.to_i
end
Also aliased as: limit_value
limit_value(size = nil)
Alias for: limit
match(params = {}) click to toggle source
# File lib/stretchy/api.rb, line 88
def match(params = {})
  if params.is_a? Hash
    subcontext = {query: true}
    subcontext[:nested] = true if params.delete(:nested)
    add_params params, subcontext, :context_nodes
  else
    add_params Hash[_all: params], :query, :context_nodes
  end
end
more_like(params = {}) click to toggle source
# File lib/stretchy/api.rb, line 98
def more_like(params = {})
  params[:ids] = Array(params[:ids]) if params[:ids]
  add_params params, :query, :more_like_node
end
near(params = {}) click to toggle source
# File lib/stretchy/api.rb, line 158
def near(params = {})
  add_params params, :boost, :decay_function_node
end
not(params = {}) click to toggle source
# File lib/stretchy/api.rb, line 122
def not(params = {})
  add_params params, :must_not, :context_nodes
end
offset(from = nil) click to toggle source
# File lib/stretchy/api.rb, line 39
def offset(from = nil)
  return @root[:from] || 0 unless from
  add_root from: from.to_i
end
page(num = nil, params = {}) click to toggle source

page 1 = from: 0, size: per_page page 2 = from: per_page, size: per_page

# File lib/stretchy/api.rb, line 46
def page(num = nil, params = {})
  return current_page if num.nil?
  per   = params[:limit] || params[:per_page] || limit
  per   = per.to_i > 0 ? per.to_i : 1
  start = [num.to_i - 1, 0].max
  add_root from: start * per, size: per
end
per(num = nil) click to toggle source
# File lib/stretchy/api.rb, line 54
def per(num = nil)
  return limit if num.nil?
  add_root size: [num.to_i, 1].max
end
Also aliased as: per_page
per_page(num = nil)
Alias for: per
query(params = {}) click to toggle source
# File lib/stretchy/api.rb, line 110
def query(params = {})
  add_params params, :query, :raw_node
end
random(params) click to toggle source
# File lib/stretchy/api.rb, line 150
def random(params)
  if params.is_a? Hash
    add_params params, :boost, :random_score_function_node
  else
    add_params Hash[seed: params], :boost, :random_score_function_node
  end
end
range(params = {}) click to toggle source
# File lib/stretchy/api.rb, line 126
def range(params = {})
  add_params params, nil, :range_node
end
request() click to toggle source
# File lib/stretchy/api.rb, line 162
def request
  @request ||= begin
    root.merge(body: body.merge(query: collector.as_json))
  end
end
response() click to toggle source
# File lib/stretchy/api.rb, line 168
def response
  @response ||= Stretchy.search(request)
end
results_obj() click to toggle source
# File lib/stretchy/api.rb, line 172
def results_obj
  @results ||= Results.new request, response
end
should(params = {}) click to toggle source
# File lib/stretchy/api.rb, line 118
def should(params = {})
  add_params params, :should, :context_nodes
end
source(*list)
Alias for: fields
where(params = {}) click to toggle source
# File lib/stretchy/api.rb, line 82
def where(params = {})
  subcontext = {filter: true}
  subcontext[:nested] = params.delete(:nested) if params[:nested]
  add_params params, subcontext, :context_nodes
end

Private Instance Methods

add_body(options = {}) click to toggle source
# File lib/stretchy/api.rb, line 218
def add_body(options = {})
  self.class.new(opts.merge(
    nodes:    collector.nodes,
    root:     root,
    body:     body.merge(options),
    context:  context
  ))
end
add_context(*args) click to toggle source
# File lib/stretchy/api.rb, line 227
def add_context(*args)
  self.class.new(opts.merge(
    nodes:   collector.nodes,
    root:    root,
    body:    body,
    context: context.merge(args_to_context(*args))
  ))
end
add_nodes(additional) click to toggle source
# File lib/stretchy/api.rb, line 200
def add_nodes(additional)
  self.class.new(opts.merge(
    nodes: collector.nodes + Array(additional),
    root:  root,
    body:  body,
    context: {}
  ))
end
add_params(params = {}, new_context, factory_method) click to toggle source
# File lib/stretchy/api.rb, line 189
def add_params(params = {}, new_context, factory_method)
  return add_context(new_context) if is_empty?(params)
  subcontext = context.merge(args_to_context(new_context))

  if params.is_a? self.class
    add_nodes params.with_context(subcontext)
  else
    add_nodes Factory.send(factory_method, params, subcontext)
  end
end
add_root(options = {}) click to toggle source
# File lib/stretchy/api.rb, line 209
def add_root(options = {})
  self.class.new(opts.merge(
    nodes:    collector.nodes,
    root:     root.merge(options),
    body:     body,
    context:  context
  ))
end
args_to_context(*args) click to toggle source
# File lib/stretchy/api.rb, line 182
def args_to_context(*args)
  args.reduce({}) do |ctx, item|
    next ctx if item.nil?
    item.is_a?(Hash) ? ctx.merge(item) : ctx.merge({item => true})
  end
end