class Elasticsearch::Persistence::QueryBuilder

Attributes

structure[R]
values[R]

Public Class Methods

new(values) click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 7
def initialize(values)
  @values = values
end

Public Instance Methods

aggregations() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 11
def aggregations
  values[:aggregation]
end
count?() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 71
def count?
  values[:count]
end
fields() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 39
def fields
  values[:field]
end
filters() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 15
def filters
  values[:filter]
end
highlights() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 47
def highlights
  values[:highlight]
end
must_nots() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 31
def must_nots
  @must_nots ||= compact_where(values[:must_not])
end
or_filters() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 19
def or_filters
  values[:or_filter]
end
query() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 23
def query
  @query ||= compact_where(values[:where])
end
query_filters() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 59
def query_filters
  values[:filter]
end
query_string_options() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 67
def query_string_options
  @query_string_options || {}
end
query_strings() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 27
def query_strings
  @query_string ||= compact_where(values[:query_string], bool: false)
end
search_options() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 63
def search_options
  build_search_options
end
shoulds() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 35
def shoulds
  @shoulds ||= compact_where(values[:should])
end
size() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 51
def size
  values[:size]
end
sort() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 55
def sort
  values[:order]
end
source() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 43
def source
  values[:source]
end
to_elastic() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 75
def to_elastic
  @structure = Jbuilder.new ignore_nil: true
  build_query
  build_sort unless sort.blank?
  build_highlights unless highlights.blank?
  build_fields unless fields.blank?
  build_source unless source.blank?
  build_aggregations unless aggregations.blank?
  structure.attributes!
end

Private Instance Methods

aggregation(name, opts = {}) click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 256
def aggregation(name, opts = {})
  Jbuilder.new do |agg|
    case
    when opts.is_a?(Hash)
        agg.extract! opts, *opts.keys
    when opts.is_a?(Array)
        extract_filter_arguments_from_array(agg, opts)
    else
      raise "#aggregation only accepts Hash or Array"
    end
  end
end
as_must(q) click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 213
def as_must(q)
  _must = []
  q.each do |arg|
    arg.each_pair { |k,v| _must << (v.is_a?(Array) ? {terms: Hash[k,v]} : {term: Hash[k,v]}) } if arg.class == Hash
    _must << {term: Hash[[arg.split(/:/).collect(&:strip)]]} if arg.class == String
    _must << arg.first if arg.class == Array
  end
  _must.length == 1 ? _must.first : _must
end
as_query_string(q) click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 223
def as_query_string(q)
  _and = []

  @query_string_options = q.pop if q.length > 1

  q.each do |arg|
    arg.each_pair { |k,v|  _and << "(#{k}:#{v})" } if arg.class == Hash
    _and << "(#{arg})" if arg.class == String
  end
  _and.join(" AND ")
end
build_aggregations() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 179
def build_aggregations
  structure.aggregations do
    aggregations.each do |agg|
      structure.set! agg[:name], aggregation(agg[:name], agg[:args])
    end
  end
end
build_fields() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 187
def build_fields
  structure.fields do
    structure.array! fields.flatten
  end
end
build_filtered_query() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 120
def build_filtered_query
  structure.filter do
    structure.or do
      or_filters.each do |f|
        structure.child! do
          structure.set! f[:name], extract_filters(f[:name], f[:args])
        end
      end
    end unless or_filters.blank?

    structure.bool do
      structure.must do
        query_filters.each do |f|
          structure.child! do
            structure.set! f[:name], extract_filters(f[:name], f[:args])
          end
        end
      end
    end unless query_filters.blank?
  end
end
build_filters() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 167
def build_filters
  filters.each do |f|
    structure.filter extract_filters(f[:name], f[:args])
  end
end
build_highlights() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 157
def build_highlights
  structure.highlight do
    structure.fields do
      highlights.each do |highlight|
        structure.set! highlight, extract_highlighter(highlight)
      end
    end
  end
end
build_or_filters() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 173
def build_or_filters
  or_filters.each do |f|
    structure.filter extract_filters(f[:name], f[:args])
  end
end
build_query() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 100
def build_query
  return if missing_bool_query? && missing_query_string? && missing_query_filter?
  structure.query do
    structure.bool do
          structure.must query unless missing_bool_query?
          structure.must_not must_nots unless must_nots.nil?
          structure.should shoulds unless shoulds.nil?

      build_filtered_query if query_filters || or_filters

    end unless missing_bool_query? && missing_query_filter?


    structure.query_string do
      structure.extract! query_string_options, *query_string_options.keys
      structure.query query_strings
    end unless query_strings.nil?
  end
end
build_search_options() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 193
def build_search_options
  values[:search_option] ||= []

  opts = extra_search_options
  (values[:search_option] + [opts]).compact.inject(Hash.new) { |h,k,v| h.merge(k) }
end
build_sort() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 153
def build_sort
  structure.sort sort.flatten.inject(Hash.new) { |h,v| h.merge(v) }
end
build_source() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 142
def build_source
  if [true,false].include? source.first
    structure._source source.first
  else
    structure._source do
        structure.include source.first.delete(:include) if source.first.has_key? :include
        structure.exclude source.first.delete(:exclude) if source.first.has_key? :exclude
    end
  end
end
compact_where(q, opts = {bool:true}) click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 204
def compact_where(q, opts = {bool:true})
  return if q.nil?
  if opts.delete(:bool)
    as_must(q)
  else
    as_query_string(q.flatten)
  end
end
extra_search_options() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 200
def extra_search_options
  [:size].inject(Hash.new) { |h,k| h[k] = self.send(k) unless self.send(k).nil?; h}
end
extract_filter_arguments_from_array(element, opts) click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 269
def extract_filter_arguments_from_array(element, opts)
  opts.each do |opt|
    element.child! do
    element.extract! opt , *opt.keys
    end
  end
end
extract_filters(name,opts = {}) click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 243
def extract_filters(name,opts = {})
  Jbuilder.new do |filter|
      case
      when opts.is_a?(Hash)
          filter.extract! opts, *opts.keys
      when opts.is_a?(Array)
          extract_filter_arguments_from_array(filter, opts)
      else
        raise "#filter only accepts Hash or Array"
      end
  end
end
extract_highlighter(highlighter) click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 237
def extract_highlighter(highlighter)
  Jbuilder.new do |highlight|
    highlight.extract! highlighter
  end
end
missing_bool_query?() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 88
def missing_bool_query?
  query.nil? && must_nots.nil? && shoulds.nil?
end
missing_query_filter?() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 96
def missing_query_filter?
  query_filters.nil? && or_filters.nil?
end
missing_query_string?() click to toggle source
# File lib/elasticsearch/persistence/relation/query_builder.rb, line 92
def missing_query_string?
  query_strings.nil?
end