Class: Chewy::Fields::Root

Inherits:
Base
  • Object
show all
Defined in:
lib/chewy/fields/root.rb

Instance Attribute Summary collapse

Attributes inherited from Base

#children, #join_options, #name, #options, #parent

Instance Method Summary collapse

Methods inherited from Base

#multi_field?, #object_field?, #value

Constructor Details

#initialize(name, **options) ⇒ Root

Returns a new instance of Root.



6
7
8
9
10
11
# File 'lib/chewy/fields/root.rb', line 6

def initialize(name, **options)
  super

  @value ||= -> { self }
  @dynamic_templates = []
end

Instance Attribute Details

#dynamic_templatesObject (readonly)

Returns the value of attribute dynamic_templates.



4
5
6
# File 'lib/chewy/fields/root.rb', line 4

def dynamic_templates
  @dynamic_templates
end

#idObject (readonly)

Returns the value of attribute id.



4
5
6
# File 'lib/chewy/fields/root.rb', line 4

def id
  @id
end

Instance Method Details

#child_hashHash{Symbol => Chewy::Fields::Base}

Children indexed by name as a hash.

Returns:



87
88
89
# File 'lib/chewy/fields/root.rb', line 87

def child_hash
  @child_hash ||= children.index_by(&:name)
end

#compose(object, crutches = nil, fields: []) ⇒ Hash

Converts passed object to JSON-ready hash. Used for objects import.

Parameters:

  • object (Object)

    a base object for composition

  • crutches (Object) (defaults to: nil)

    any object that will be passed to every field value proc as a last argument

  • fields (Array<Symbol>) (defaults to: [])

    a list of fields to compose, every field will be composed if empty

Returns:

  • (Hash)

    JSON-ready hash with stringified keys



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/chewy/fields/root.rb', line 64

def compose(object, crutches = nil, fields: [])
  result = evaluate([object, crutches])

  if children.present?
    child_fields = if fields.present?
      child_hash.slice(*fields).values
    else
      children
    end

    child_fields.each_with_object({}) do |field, memo|
      memo.merge!(field.compose(result, crutches) || {})
    end.as_json
  elsif fields.present?
    result.as_json(only: fields, root: false)
  else
    result.as_json(root: false)
  end
end

#compose_id(object) ⇒ Object



51
52
53
54
55
# File 'lib/chewy/fields/root.rb', line 51

def compose_id(object)
  return unless id

  id.arity.zero? ? object.instance_exec(&id) : id.call(object)
end

#dynamic_template(*args) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/chewy/fields/root.rb', line 30

def dynamic_template(*args)
  options = args.extract_options!.deep_symbolize_keys
  if args.first
    template_name = :"template_#{dynamic_templates.count.next}"
    template = {template_name => {mapping: options}}

    template[template_name][:match_mapping_type] = args.second.to_s if args.second.present?

    regexp = args.first.is_a?(Regexp)
    template[template_name][:match_pattern] = 'regexp' if regexp

    match = regexp ? args.first.source : args.first
    path = match.include?(regexp ? '\.' : '.')

    template[template_name][path ? :path_match : :match] = match
    @dynamic_templates.push(template)
  else
    @dynamic_templates.push(options)
  end
end

#mappings_hashObject



18
19
20
21
22
23
24
25
26
27
28
# File 'lib/chewy/fields/root.rb', line 18

def mappings_hash
  mappings = super
  mappings[name].delete(:type)

  if dynamic_templates.present?
    mappings[name][:dynamic_templates] ||= []
    mappings[name][:dynamic_templates].concat dynamic_templates
  end

  mappings[name]
end

#update_options!(**options) ⇒ Object



13
14
15
16
# File 'lib/chewy/fields/root.rb', line 13

def update_options!(**options)
  @id = options.fetch(:id, options.fetch(:_id, @id))
  @options.merge!(options.except(:id, :_id, :type))
end