Module: Elastics::Tasks::Mappings
- Included in:
- Elastics::Tasks
- Defined in:
- lib/elastics/tasks/mappings.rb
Instance Attribute Summary collapse
-
#mappings_path ⇒ Object
writeonly
Sets the attribute mappings_path.
Instance Method Summary collapse
-
#fix_mapping(name, mapping) ⇒ Object
Adds missing type name in the top-level and updates properties definition.
- #index_for_type(type) ⇒ Object
- #indices ⇒ Object
-
#mappings ⇒ Object
Merges mappings from single files and dirs.
-
#mappings_from_dirs ⇒ Object
Reads mappings from separate files.
-
#mappings_from_files ⇒ Object
Reads mappings from single yml file.
- #mappings_paths ⇒ Object
-
#put_mappings(options = {}) ⇒ Object
Mappings to put can be filtered with ‘:indices` & `:types` arrays.
- #types ⇒ Object
Instance Attribute Details
#mappings_path=(value) ⇒ Object (writeonly)
Sets the attribute mappings_path
4 5 6 |
# File 'lib/elastics/tasks/mappings.rb', line 4 def mappings_path=(value) @mappings_path = value end |
Instance Method Details
#fix_mapping(name, mapping) ⇒ Object
Adds missing type name in the top-level and updates properties definition. It allows to write
properties:
name: string
project_id: integer
instead of
task:
properties:
name:
type: string
project_id:
type: integer
79 80 81 82 83 84 85 86 |
# File 'lib/elastics/tasks/mappings.rb', line 79 def fix_mapping(name, mapping) mapping = {name => mapping} unless mapping.keys == [name] properties = mapping[name]['properties'] properties && properties.each do |field, val| properties[field] = {type: val} if val.is_a?(String) end mapping end |
#index_for_type(type) ⇒ Object
96 97 98 |
# File 'lib/elastics/tasks/mappings.rb', line 96 def index_for_type(type) config[:index] || type end |
#indices ⇒ Object
92 93 94 |
# File 'lib/elastics/tasks/mappings.rb', line 92 def indices @indices ||= (super + types.map { |type| index_for_type(type) }).uniq end |
#mappings ⇒ Object
Merges mappings from single files and dirs.
25 26 27 |
# File 'lib/elastics/tasks/mappings.rb', line 25 def mappings @mappings ||= mappings_from_files.merge!(mappings_from_dirs) end |
#mappings_from_dirs ⇒ Object
Reads mappings from separate files. Type name is taken from file name.
# user.yml
dynamic: false
properties:
name: string
55 56 57 58 59 60 61 62 |
# File 'lib/elastics/tasks/mappings.rb', line 55 def mappings_from_dirs mappings_paths.map { |path| Dir["#{path}/*.yml"] }. flatten.sort. each_with_object({}) do |file, hash| name = File.basename file, '.yml' hash[name] = fix_mapping(name, load_yaml(file)) end end |
#mappings_from_files ⇒ Object
Reads mappings from single yml file.
user:
dynamic: false
properties:
name: string
tweet:
properties:
content: string
user_id: integer
39 40 41 42 43 44 45 46 47 |
# File 'lib/elastics/tasks/mappings.rb', line 39 def mappings_from_files mappings_paths.each_with_object({}) do |path, hash| file = "#{path}.yml" next unless File.exists?(file) load_yaml(file).each do |name, data| hash[name] = fix_mapping(name, data) end end end |
#mappings_paths ⇒ Object
6 7 8 |
# File 'lib/elastics/tasks/mappings.rb', line 6 def mappings_paths @mappings_paths ||= base_paths.map { |x| File.join x, 'mappings' } end |
#put_mappings(options = {}) ⇒ Object
Mappings to put can be filtered with ‘:indices` & `:types` arrays.
11 12 13 14 15 16 17 18 19 20 21 22 |
# File 'lib/elastics/tasks/mappings.rb', line 11 def put_mappings( = {}) version = .fetch :version, :current filter = [:indices].try!(:map, &:to_s) each_filtered(types, [:types]) do |type| index = index_for_type(type) next if filter && !filter.include?(index) versioned_index = versioned_index_name(index, version) log "Putting mapping #{index}/#{type} (#{versioned_index}/#{type})" client.put_mapping index: versioned_index, type: type, body: mappings[type] end end |
#types ⇒ Object
88 89 90 |
# File 'lib/elastics/tasks/mappings.rb', line 88 def types @types ||= mappings.keys end |