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
|