Method: Wordmap.create

Defined in:
lib/wordmap.rb

.create(path, hash, index_names = []) ⇒ Object

Raises:

  • (ArgumentError)


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
# File 'lib/wordmap.rb', line 16

def create(path, hash, index_names = [])
  raise ArgumentError, "Path already exists: #{path}" if Dir.exist?(path)

  index_data = index_names.map { |name| [name, {}] }.to_h
  vecs = Builder.build_vectors(hash)
  cells_c = vecs.map(&:size).reduce(:*)

  Dir.mktmpdir do |dirpath|
    vecs.each.with_index do |vec, i|
      Builder.write_vector("#{dirpath}/vec#{i}", vec, SPACER)
    end

    Builder.write_data(dirpath, vecs, cells_c, hash, SPACER) do |k, v, i|
      index_names.each do |name|
        index_keys = Array(yield(name, k, v)).compact
        next if index_keys.empty?
        index_keys.each do |index_key|
          index_data[name][index_key] ||= []
          index_data[name][index_key] << i
        end
      end
    end

    index_data.each do |name, data|
      next if data.empty?
      data.transform_values! { |v| IndexValue.pack(v) }
      create("#{dirpath}/i-#{name}.wmap", data)
    end

    FileUtils.cp_r(dirpath, path)
  end
end