-
Notifications
You must be signed in to change notification settings - Fork 49
/
file.rb
73 lines (65 loc) · 2.35 KB
/
file.rb
1
2
3
4
5
6
7
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
63
64
65
66
67
68
69
70
71
72
73
module Picky
module Backends
# Naive implementation of a file-based index.
# In-Memory Hash with length, offset:
# { :bla => [20, 312] }
# That map to positions the File, encoded in JSON:
# ...[1,2,3,21,7,4,13,15]...
#
class File < Backend
# Returns an object that on #initial, #load returns an object that responds to:
# [:token] # => [id, id, id, id, id] (an array of ids)
#
def create_inverted bundle
extract_lambda_or(inverted, bundle) ||
JSON.new(bundle.index_path(:inverted))
end
# Returns an object that on #initial, #load returns an object that responds to:
# [:token] # => 1.23 (a weight)
#
def create_weights bundle
extract_lambda_or(weights, bundle) ||
JSON.new(bundle.index_path(:weights))
end
# Returns an object that on #initial, #load returns an object that responds to:
# [:encoded] # => [:original, :original] (an array of original symbols this similarity encoded thing maps to)
#
def create_similarity bundle
extract_lambda_or(similarity, bundle) ||
JSON.new(bundle.index_path(:similarity))
end
# Returns an object that on #initial, #load returns an object that responds to:
# [:key] # => value (a value for this config key)
#
def create_configuration bundle
extract_lambda_or(configuration, bundle) ||
JSON.new(bundle.index_path(:configuration))
end
# Returns an object that on #initial, #load returns an object that responds to:
# [id] # => [:sym1, :sym2]
#
def create_realtime bundle
extract_lambda_or(similarity, bundle) ||
JSON.new(bundle.index_path(:realtime))
end
# Currently, the loaded ids are intersected using
# the fast C-based intersection.
#
# However, if we could come up with a clever way
# to do this faster, it would be most welcome.
#
def ids combinations, _, _
# Get the ids for each combination.
#
id_arrays = combinations.inject([]) do |total, combination|
total << combination.ids
end
# Call the optimized C algorithm.
#
# Note: It orders the passed arrays by size.
#
Performant::Array.memory_efficient_intersect id_arrays
end
end
end
end