Module: Elasticsearch::DSL::Search::BaseComponent

Included in:
Aggregations::Avg, Aggregations::Cardinality, Aggregations::ExtendedStats, Aggregations::GeoBounds, Aggregations::Max, Aggregations::Min, Aggregations::PercentileRanks, Aggregations::Percentiles, Aggregations::ScriptedMetric, Aggregations::Stats, Aggregations::Sum, Aggregations::TopHits, Aggregations::ValueCount, Filters::And, Filters::Bool, Filters::Exists, Filters::GeoBoundingBox, Filters::GeoDistance, Filters::GeoDistanceRange, Filters::GeoPolygon, Filters::GeoShape, Filters::GeohashCell, Filters::HasChild, Filters::HasParent, Filters::Ids, Filters::Indices, Filters::Limit, Filters::MatchAll, Filters::Missing, Filters::Nested, Filters::Not, Filters::Or, Filters::Prefix, Filters::Query, Filters::Range, Filters::Regexp, Filters::Script, Filters::Term, Filters::Terms, Filters::Type, Highlight, Queries::Bool, Queries::Boosting, Queries::Common, Queries::ConstantScore, Queries::DisMax, Queries::Filtered, Queries::FunctionScore, Queries::Fuzzy, Queries::FuzzyLikeThis, Queries::FuzzyLikeThisField, Queries::GeoShape, Queries::HasChild, Queries::HasParent, Queries::Ids, Queries::Indices, Queries::Match, Queries::MatchAll, Queries::MoreLikeThis, Queries::MultiMatch, Queries::Nested, Queries::Prefix, Queries::QueryString, Queries::Range, Queries::Regexp, Queries::SimpleQueryString, Queries::SpanFirst, Queries::SpanMulti, Queries::SpanNear, Queries::SpanNot, Queries::SpanOr, Queries::SpanTerm, Queries::Template, Queries::Term, Queries::Terms, Queries::TopChildren, Queries::Wildcard, Sort, Suggest
Defined in:
lib/elasticsearch/dsl/search/base_component.rb

Overview

Module containing common functionality for DSL classes

Defined Under Namespace

Modules: ClassMethods, InstanceMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/elasticsearch/dsl/search/base_component.rb', line 8

def self.included(base)
  base.__send__ :extend,  ClassMethods
  base.__send__ :include, InstanceMethods

  base.instance_eval do
    #   Defines an "inner" method for DSL classes
    #
    #     @example Define a method `bar` for the MyQuery class which updates the query definition
    #
    #         class MyQuery
    #           include BaseComponent
    #
    #           option_method :bar
    #         end
    #
    #         q = MyQuery.new :foo do
    #           bar 'TEST'
    #         end
    #
    #         q.to_hash
    #         # => {:myquery=>{:foo=>{:bar=>"TEST"}}}
    #
    #     @example Define a method `bar` with custom logic for updating the Hash with query definition
    #
    #         class MyCustomQuery
    #           include BaseComponent
    #
    #           option_method :bar, lambda { |*args| @hash[self.name.to_sym][@args].update custom: args.pop }
    #         end
    #
    #         q = MyCustomQuery.new :foo do
    #           bar 'TEST'
    #         end
    #
    #         q.to_hash
    #       # => {:mycustomquery=>{:foo=>{:custom=>"TEST"}}}
    #
    def option_method(name, block=nil)
      if block
        self.__send__ :define_method, name, &block
      else
        self.__send__ :define_method, name do |*args|
          # 1. Component has empty @args (ie. no user supplied name or @hash value)
          if @args && @args.respond_to?(:to_hash) && @args.empty?
            @hash[self.name.to_sym].update name.to_sym => args.first
          # 2. Component user-supplied name or @hash value passed in @args
          else
            @hash[self.name.to_sym] = { @args => {} } unless @hash[self.name.to_sym][@args]
            @hash[self.name.to_sym][@args].update name.to_sym => args.first
          end
        end
      end
    end
  end
end

Instance Method Details

#initialize(*args, &block) ⇒ Object



64
65
66
67
68
69
# File 'lib/elasticsearch/dsl/search/base_component.rb', line 64

def initialize(*args, &block)
  @hash    = { name => {} }
  @args    = args.first || {}
  @options = args.size > 1 ? args.last : {}
  @block   = block
end