picky 0.12.1 → 0.12.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/picky/Index_api.rb +10 -3
- data/lib/picky/cacher/partial/substring.rb +4 -4
- data/lib/picky/calculations/location.rb +39 -0
- data/lib/picky/configuration/index.rb +2 -2
- data/lib/picky/extensions/array.rb +0 -8
- data/lib/picky/extensions/symbol.rb +2 -16
- data/lib/picky/generator.rb +0 -2
- data/lib/picky/index/bundle.rb +7 -5
- data/lib/picky/index/file/basic.rb +2 -6
- data/lib/picky/index/files.rb +24 -14
- data/lib/picky/indexed/bundle.rb +7 -14
- data/lib/picky/indexed/category.rb +2 -1
- data/lib/picky/indexed/wrappers/bundle/calculation.rb +35 -0
- data/lib/picky/indexed/wrappers/bundle/location.rb +40 -0
- data/lib/picky/indexed/wrappers/bundle/wrapper.rb +25 -0
- data/lib/picky/indexers/serial.rb +1 -1
- data/lib/picky/indexing/bundle.rb +7 -0
- data/lib/picky/indexing/category.rb +22 -1
- data/lib/picky/loader.rb +10 -0
- data/lib/picky/sources/couch.rb +1 -1
- data/lib/picky/sources/csv.rb +6 -4
- data/lib/picky/sources/db.rb +1 -1
- data/lib/picky/sources/delicious.rb +1 -1
- data/lib/picky/sources/wrappers/base.rb +5 -4
- data/lib/picky/sources/wrappers/location.rb +16 -22
- data/lib/tasks/try.rake +2 -2
- data/spec/lib/calculations/location_spec.rb +35 -0
- data/spec/lib/extensions/array_spec.rb +0 -10
- data/spec/lib/extensions/symbol_spec.rb +1 -69
- data/spec/lib/index/files_spec.rb +54 -34
- data/spec/lib/indexed/bundle_spec.rb +17 -14
- data/spec/lib/indexed/wrappers/bundle/calculation_spec.rb +37 -0
- data/spec/lib/indexed/wrappers/bundle/wrapper_spec.rb +27 -0
- data/spec/lib/indexing/bundle_spec.rb +5 -1
- data/spec/lib/sources/couch_spec.rb +1 -1
- data/spec/lib/sources/csv_spec.rb +41 -11
- data/spec/lib/sources/db_spec.rb +5 -5
- data/spec/lib/sources/delicious_spec.rb +6 -6
- data/spec/lib/sources/wrappers/base_spec.rb +7 -3
- data/spec/lib/sources/wrappers/location_spec.rb +11 -12
- metadata +13 -3
data/lib/picky/Index_api.rb
CHANGED
@@ -35,13 +35,20 @@ class IndexAPI
|
|
35
35
|
end
|
36
36
|
alias category define_category
|
37
37
|
|
38
|
+
# TODO Rewrite wrap_exact, wrap_source ?
|
39
|
+
#
|
38
40
|
def define_location name, options = {}
|
39
|
-
grid = options[:grid]
|
41
|
+
grid = options[:grid] || raise("Grid size needs to be given to a location")
|
40
42
|
precision = options[:precision]
|
41
43
|
|
42
|
-
define_category name, options do |indexing,
|
43
|
-
indexing.source = Sources::Wrappers::Location.new indexing
|
44
|
+
define_category name, options do |indexing, indexed|
|
45
|
+
indexing.source = Sources::Wrappers::Location.new indexing, grid: grid, precision: precision
|
44
46
|
indexing.tokenizer = Tokenizers::Index.new
|
47
|
+
# indexing.partial = Partial::None.new
|
48
|
+
|
49
|
+
exact_bundle = Indexed::Wrappers::Bundle::Location.new indexed.exact, grid: grid
|
50
|
+
indexed.exact = exact_bundle
|
51
|
+
indexed.partial = exact_bundle
|
45
52
|
end
|
46
53
|
end
|
47
54
|
alias location define_location
|
@@ -83,8 +83,8 @@ module Cacher
|
|
83
83
|
|
84
84
|
# Remove duplicate ids.
|
85
85
|
#
|
86
|
-
#
|
87
|
-
#
|
86
|
+
# THINK If it is unique for a subtoken, it is
|
87
|
+
# unique for all derived longer tokens.
|
88
88
|
#
|
89
89
|
result.each_value &:uniq!
|
90
90
|
|
@@ -99,14 +99,14 @@ module Cacher
|
|
99
99
|
#
|
100
100
|
# "token" here means just text.
|
101
101
|
#
|
102
|
-
#
|
102
|
+
# THINK Could be improved by appending the aforegoing ids?
|
103
103
|
#
|
104
104
|
def generate_for token, index, result
|
105
105
|
@generator.each_subtoken(token) do |subtoken|
|
106
106
|
if result[subtoken]
|
107
107
|
result[subtoken] += index[token] # unique
|
108
108
|
else
|
109
|
-
result[subtoken] = index[token].dup
|
109
|
+
result[subtoken] = index[token].dup
|
110
110
|
end
|
111
111
|
end
|
112
112
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Calculations
|
2
|
+
|
3
|
+
# A location calculation recalculates a 1-d location
|
4
|
+
# to the Picky internal 1-d "grid".
|
5
|
+
#
|
6
|
+
# For example, if you have a location x == 12.3456,
|
7
|
+
# it will be recalculated into 3, if the minimum is 9
|
8
|
+
# and the gridlength is 1.
|
9
|
+
#
|
10
|
+
class Location
|
11
|
+
|
12
|
+
attr_reader :minimum
|
13
|
+
|
14
|
+
def initialize user_grid, precision = nil
|
15
|
+
@user_grid = user_grid
|
16
|
+
@precision = precision || 1
|
17
|
+
@grid = @user_grid / (@precision + 0.5)
|
18
|
+
end
|
19
|
+
|
20
|
+
def minimum= minimum
|
21
|
+
minimum -= @user_grid
|
22
|
+
@minimum = minimum
|
23
|
+
end
|
24
|
+
|
25
|
+
#
|
26
|
+
#
|
27
|
+
def add_margin length
|
28
|
+
@minimum -= length
|
29
|
+
end
|
30
|
+
|
31
|
+
#
|
32
|
+
#
|
33
|
+
def recalculate location
|
34
|
+
((location - @minimum) / @grid).floor
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -28,14 +28,6 @@ class Array
|
|
28
28
|
result
|
29
29
|
end
|
30
30
|
|
31
|
-
# Accesses a random element of this array.
|
32
|
-
#
|
33
|
-
# TODO Remove?
|
34
|
-
#
|
35
|
-
def random
|
36
|
-
self[Kernel.rand(self.length)]
|
37
|
-
end
|
38
|
-
|
39
31
|
# Sort the array using distance from levenshtein.
|
40
32
|
#
|
41
33
|
# Will raise if encounters not to_s-able element.
|
@@ -2,22 +2,8 @@
|
|
2
2
|
#
|
3
3
|
class Symbol
|
4
4
|
|
5
|
-
# :keys.
|
6
|
-
# :keys.
|
7
|
-
#
|
8
|
-
def subtokens from_length = 1
|
9
|
-
sub = self.id2name
|
10
|
-
|
11
|
-
size = sub.size
|
12
|
-
from_length = size + from_length if from_length < 0
|
13
|
-
from_length = size if size < from_length
|
14
|
-
|
15
|
-
result = [self]
|
16
|
-
size.downto(from_length + 1) { result << sub.chop!.intern }
|
17
|
-
result
|
18
|
-
end
|
19
|
-
|
20
|
-
# TODO Duplicate code.
|
5
|
+
# :keys.each_subtoken # => yields each of [:keys, :key, :ke, :k]
|
6
|
+
# :keys.each_subtoken(2) # => yields each of [:keys, :key, :ke]
|
21
7
|
#
|
22
8
|
def each_subtoken from_length = 1
|
23
9
|
sub = self.id2name
|
data/lib/picky/generator.rb
CHANGED
data/lib/picky/index/bundle.rb
CHANGED
@@ -22,17 +22,19 @@ module Index
|
|
22
22
|
class Bundle
|
23
23
|
|
24
24
|
attr_reader :identifier, :files
|
25
|
-
attr_accessor :index, :weights, :similarity, :similarity_strategy
|
25
|
+
attr_accessor :index, :weights, :similarity, :configuration, :similarity_strategy
|
26
26
|
|
27
|
-
delegate :
|
27
|
+
delegate :clear, :to => :index
|
28
|
+
delegate :[], :[]=, :to => :configuration
|
28
29
|
|
29
30
|
def initialize name, configuration, similarity_strategy
|
30
31
|
@identifier = "#{configuration.identifier} (#{name})"
|
31
32
|
@files = Files.new name, configuration
|
32
33
|
|
33
|
-
@index
|
34
|
-
@weights
|
35
|
-
@similarity
|
34
|
+
@index = {}
|
35
|
+
@weights = {}
|
36
|
+
@similarity = {}
|
37
|
+
@configuration = {} # A hash with config options.
|
36
38
|
|
37
39
|
@similarity_strategy = similarity_strategy
|
38
40
|
end
|
@@ -33,15 +33,13 @@ module Index
|
|
33
33
|
# the directory the index file is in.
|
34
34
|
#
|
35
35
|
def backup
|
36
|
-
prepare_backup
|
36
|
+
prepare_backup backup_directory
|
37
37
|
FileUtils.cp cache_path, target, verbose: true
|
38
38
|
end
|
39
39
|
# The backup directory of this file.
|
40
40
|
# Equal to the file's dirname plus /backup
|
41
41
|
#
|
42
|
-
|
43
|
-
#
|
44
|
-
def backup_path
|
42
|
+
def backup_directory
|
45
43
|
::File.join ::File.dirname(cache_path), 'backup'
|
46
44
|
end
|
47
45
|
# Prepares the backup directory for the file.
|
@@ -58,8 +56,6 @@ module Index
|
|
58
56
|
end
|
59
57
|
# The backup filename.
|
60
58
|
#
|
61
|
-
# TODO: Duplicate work done here?
|
62
|
-
#
|
63
59
|
def backup_file_path_of path
|
64
60
|
dir, name = ::File.split path
|
65
61
|
::File.join dir, 'backup', name
|
data/lib/picky/index/files.rb
CHANGED
@@ -3,22 +3,23 @@ module Index
|
|
3
3
|
class Files
|
4
4
|
|
5
5
|
attr_reader :bundle_name
|
6
|
-
attr_reader :prepared, :index, :similarity, :
|
6
|
+
attr_reader :prepared, :index, :weights, :similarity, :configuration
|
7
7
|
|
8
|
-
delegate :index_name, :category_name, :to => :@
|
8
|
+
delegate :index_name, :category_name, :to => :@config
|
9
9
|
|
10
|
-
def initialize bundle_name,
|
11
|
-
@bundle_name
|
12
|
-
@
|
10
|
+
def initialize bundle_name, config
|
11
|
+
@bundle_name = bundle_name
|
12
|
+
@config = config
|
13
13
|
|
14
14
|
# Note: We marshal the similarity, as the
|
15
15
|
# Yajl json lib cannot load symbolized
|
16
16
|
# values, just keys.
|
17
17
|
#
|
18
|
-
@prepared
|
19
|
-
@index
|
20
|
-
@
|
21
|
-
@
|
18
|
+
@prepared = File::Text.new config.prepared_index_path
|
19
|
+
@index = File::JSON.new config.index_path(bundle_name, :index)
|
20
|
+
@weights = File::JSON.new config.index_path(bundle_name, :weights)
|
21
|
+
@similarity = File::Marshal.new config.index_path(bundle_name, :similarity)
|
22
|
+
@configuration = File::JSON.new config.index_path(bundle_name, :configuration)
|
22
23
|
end
|
23
24
|
|
24
25
|
# Delegators.
|
@@ -35,11 +36,14 @@ module Index
|
|
35
36
|
def dump_index index_hash
|
36
37
|
index.dump index_hash
|
37
38
|
end
|
39
|
+
def dump_weights weights_hash
|
40
|
+
weights.dump weights_hash
|
41
|
+
end
|
38
42
|
def dump_similarity similarity_hash
|
39
43
|
similarity.dump similarity_hash
|
40
44
|
end
|
41
|
-
def
|
42
|
-
|
45
|
+
def dump_configuration configuration_hash
|
46
|
+
configuration.dump configuration_hash
|
43
47
|
end
|
44
48
|
|
45
49
|
# Loading.
|
@@ -53,6 +57,9 @@ module Index
|
|
53
57
|
def load_weights
|
54
58
|
weights.load
|
55
59
|
end
|
60
|
+
def load_configuration
|
61
|
+
configuration.load
|
62
|
+
end
|
56
63
|
|
57
64
|
# Cache ok?
|
58
65
|
#
|
@@ -82,16 +89,18 @@ module Index
|
|
82
89
|
#
|
83
90
|
def backup
|
84
91
|
index.backup
|
85
|
-
similarity.backup
|
86
92
|
weights.backup
|
93
|
+
similarity.backup
|
94
|
+
configuration.backup
|
87
95
|
end
|
88
96
|
|
89
97
|
# Restores the indexes from the "backup" directory.
|
90
98
|
#
|
91
99
|
def restore
|
92
100
|
index.restore
|
93
|
-
similarity.restore
|
94
101
|
weights.restore
|
102
|
+
similarity.restore
|
103
|
+
configuration.restore
|
95
104
|
end
|
96
105
|
|
97
106
|
|
@@ -99,8 +108,9 @@ module Index
|
|
99
108
|
#
|
100
109
|
def delete
|
101
110
|
index.delete
|
102
|
-
similarity.delete
|
103
111
|
weights.delete
|
112
|
+
similarity.delete
|
113
|
+
configuration.delete
|
104
114
|
end
|
105
115
|
|
106
116
|
end
|
data/lib/picky/indexed/bundle.rb
CHANGED
@@ -21,25 +21,13 @@ module Indexed
|
|
21
21
|
@weights[sym]
|
22
22
|
end
|
23
23
|
|
24
|
-
# Load the data from the db.
|
25
|
-
#
|
26
|
-
def load_from_index_file
|
27
|
-
load_from_index_generation_message
|
28
|
-
clear
|
29
|
-
retrieve
|
30
|
-
end
|
31
|
-
# Notifies the user that the index is being loaded.
|
32
|
-
#
|
33
|
-
def load_from_index_generation_message
|
34
|
-
timed_exclaim "LOAD INDEX #{identifier}."
|
35
|
-
end
|
36
|
-
|
37
24
|
# Loads all indexes.
|
38
25
|
#
|
39
26
|
def load
|
40
27
|
load_index
|
41
|
-
load_similarity
|
42
28
|
load_weights
|
29
|
+
load_similarity
|
30
|
+
load_configuration
|
43
31
|
end
|
44
32
|
# Loads the core index.
|
45
33
|
#
|
@@ -56,6 +44,11 @@ module Indexed
|
|
56
44
|
def load_similarity
|
57
45
|
self.similarity = files.load_similarity
|
58
46
|
end
|
47
|
+
# Loads the configuration.
|
48
|
+
#
|
49
|
+
def load_configuration
|
50
|
+
self.configuration = files.load_configuration
|
51
|
+
end
|
59
52
|
|
60
53
|
end
|
61
54
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Indexed
|
2
|
+
module Wrappers
|
3
|
+
|
4
|
+
module Bundle
|
5
|
+
|
6
|
+
# A calculation rewrites the symbol into a float.
|
7
|
+
#
|
8
|
+
# TODO I really need to allow integers as keys. The code below is just not ok.
|
9
|
+
#
|
10
|
+
class Calculation < Wrapper
|
11
|
+
|
12
|
+
#
|
13
|
+
#
|
14
|
+
def recalculate float
|
15
|
+
float
|
16
|
+
end
|
17
|
+
|
18
|
+
#
|
19
|
+
#
|
20
|
+
def ids sym
|
21
|
+
@bundle.ids recalculate(sym.to_s.to_f).to_s.to_sym
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
#
|
26
|
+
def weight sym
|
27
|
+
@bundle.weight recalculate(sym.to_s.to_f).to_s.to_sym
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Indexed
|
2
|
+
module Wrappers
|
3
|
+
|
4
|
+
module Bundle
|
5
|
+
|
6
|
+
# A location calculation recalculates a location to the Picky internal location.
|
7
|
+
#
|
8
|
+
class Location < Calculation
|
9
|
+
|
10
|
+
def initialize bundle, options = {}
|
11
|
+
super bundle
|
12
|
+
|
13
|
+
precision = options[:precision] || 1
|
14
|
+
user_grid = options[:grid] || raise("Gridsize needs to be given for location #{bundle.identifier}.")
|
15
|
+
|
16
|
+
@calculation = Calculations::Location.new user_grid, precision
|
17
|
+
end
|
18
|
+
|
19
|
+
#
|
20
|
+
#
|
21
|
+
def recalculate float
|
22
|
+
@calculation.recalculate float
|
23
|
+
end
|
24
|
+
|
25
|
+
#
|
26
|
+
#
|
27
|
+
def load
|
28
|
+
# Load first the bundle, then extract the config.
|
29
|
+
#
|
30
|
+
bundle.load
|
31
|
+
minimum = bundle[:location_minimum] || raise("Configuration :location_minimum for #{bundle.identifier} missing.")
|
32
|
+
@calculation.minimum = minimum
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Indexed
|
2
|
+
module Wrappers
|
3
|
+
|
4
|
+
# Per Bundle wrappers.
|
5
|
+
#
|
6
|
+
module Bundle
|
7
|
+
|
8
|
+
# Base wrapper. Just delegates all methods to the bundle.
|
9
|
+
#
|
10
|
+
class Wrapper
|
11
|
+
|
12
|
+
attr_reader :bundle
|
13
|
+
|
14
|
+
def initialize bundle
|
15
|
+
@bundle = bundle
|
16
|
+
end
|
17
|
+
|
18
|
+
delegate :load, :ids, :weight, :to => :@bundle
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -120,6 +120,7 @@ module Indexing
|
|
120
120
|
dump_index
|
121
121
|
dump_similarity
|
122
122
|
dump_weights
|
123
|
+
dump_configuration
|
123
124
|
end
|
124
125
|
# Dumps the core index.
|
125
126
|
#
|
@@ -139,6 +140,12 @@ module Indexing
|
|
139
140
|
timed_exclaim "DUMP SIMILARITY #{identifier}."
|
140
141
|
files.dump_similarity similarity
|
141
142
|
end
|
143
|
+
# Dumps the similarity index.
|
144
|
+
#
|
145
|
+
def dump_configuration
|
146
|
+
timed_exclaim "DUMP CONFIGURATION #{identifier}."
|
147
|
+
files.dump_configuration configuration
|
148
|
+
end
|
142
149
|
|
143
150
|
# Alerts the user if an index is missing.
|
144
151
|
#
|
@@ -4,15 +4,32 @@ module Indexing
|
|
4
4
|
|
5
5
|
attr_reader :exact, :partial, :name, :configuration, :indexer
|
6
6
|
|
7
|
+
# Mandatory params:
|
8
|
+
# * name: Category name to use as identifier and file names.
|
9
|
+
# * index: Index to which this category is attached to.
|
10
|
+
# Options:
|
11
|
+
# * partial: Partial::None.new, Partial::Substring.new(from:start_char, to:up_to_char) (defaults from:-3, to:-1)
|
12
|
+
# * similarity: Similarity::None.new (default), Similarity::Phonetic.new(amount_of_similarly_linked_words)
|
13
|
+
# * source: Use if the category should use a different source.
|
14
|
+
# * from: The source category identifier to take the data from.
|
15
|
+
#
|
16
|
+
# Advanced Options (TODO):
|
17
|
+
#
|
18
|
+
# * weights:
|
19
|
+
# * tokenizer:
|
20
|
+
# * exact_indexing_bundle:
|
21
|
+
# * partial_indexing_bundle:
|
22
|
+
#
|
7
23
|
def initialize name, index, options = {}
|
8
24
|
@name = name
|
25
|
+
@from = options[:from]
|
9
26
|
|
10
27
|
# Now we have enough info to combine the index and the category.
|
11
28
|
#
|
12
29
|
@configuration = Configuration::Index.new index, self
|
13
30
|
|
14
31
|
@tokenizer = options[:tokenizer] || Tokenizers::Index.default
|
15
|
-
@indexer = Indexers::Serial.new configuration, options[:source], @tokenizer
|
32
|
+
@indexer = Indexers::Serial.new configuration, options[:source], @tokenizer
|
16
33
|
|
17
34
|
# TODO Push into Bundle.
|
18
35
|
#
|
@@ -27,6 +44,10 @@ module Indexing
|
|
27
44
|
delegate :identifier, :prepare_index_directory, :to => :configuration
|
28
45
|
delegate :source, :source=, :tokenizer, :tokenizer=, :to => :indexer
|
29
46
|
|
47
|
+
def from
|
48
|
+
@from || name
|
49
|
+
end
|
50
|
+
|
30
51
|
# TODO Spec.
|
31
52
|
#
|
32
53
|
def backup_caches
|
data/lib/picky/loader.rb
CHANGED
@@ -108,6 +108,10 @@ module Loader
|
|
108
108
|
#
|
109
109
|
load_relative 'character_substituters/west_european'
|
110
110
|
|
111
|
+
# Calculations.
|
112
|
+
#
|
113
|
+
load_relative 'calculations/location'
|
114
|
+
|
111
115
|
# Signal handling
|
112
116
|
#
|
113
117
|
load_relative 'signals'
|
@@ -188,6 +192,12 @@ module Loader
|
|
188
192
|
|
189
193
|
load_relative 'indexed/wrappers/exact_first'
|
190
194
|
|
195
|
+
# Bundle Wrapper
|
196
|
+
#
|
197
|
+
load_relative 'indexed/wrappers/bundle/wrapper'
|
198
|
+
load_relative 'indexed/wrappers/bundle/calculation'
|
199
|
+
load_relative 'indexed/wrappers/bundle/location'
|
200
|
+
|
191
201
|
# Tokens.
|
192
202
|
#
|
193
203
|
load_relative 'query/token'
|
data/lib/picky/sources/couch.rb
CHANGED
data/lib/picky/sources/csv.rb
CHANGED
@@ -7,12 +7,14 @@ module Sources
|
|
7
7
|
|
8
8
|
class CSV < Base
|
9
9
|
|
10
|
-
attr_reader :file_name, :category_names
|
10
|
+
attr_reader :file_name, :csv_options, :category_names
|
11
11
|
|
12
12
|
def initialize *category_names, options
|
13
13
|
require 'csv'
|
14
14
|
@category_names = category_names
|
15
|
-
|
15
|
+
|
16
|
+
@csv_options = Hash === options && options || {}
|
17
|
+
@file_name = @csv_options.delete(:file) || raise_no_file_given(category_names)
|
16
18
|
end
|
17
19
|
|
18
20
|
#
|
@@ -24,7 +26,7 @@ module Sources
|
|
24
26
|
# Harvests the data to index.
|
25
27
|
#
|
26
28
|
def harvest _, category
|
27
|
-
index = category_names.index category.
|
29
|
+
index = category_names.index category.from
|
28
30
|
get_data do |ary|
|
29
31
|
indexed_id = ary.shift.to_i # TODO is to_i necessary?
|
30
32
|
text = ary[index]
|
@@ -37,7 +39,7 @@ module Sources
|
|
37
39
|
#
|
38
40
|
#
|
39
41
|
def get_data &block
|
40
|
-
::CSV.foreach file_name, &block
|
42
|
+
::CSV.foreach file_name, csv_options, &block
|
41
43
|
end
|
42
44
|
|
43
45
|
end
|
data/lib/picky/sources/db.rb
CHANGED
@@ -126,7 +126,7 @@ module Sources
|
|
126
126
|
# Base harvest statement for dbs.
|
127
127
|
#
|
128
128
|
def harvest_statement type, category
|
129
|
-
"SELECT indexed_id, #{category.
|
129
|
+
"SELECT indexed_id, #{category.from} FROM #{snapshot_table_name(type)} st"
|
130
130
|
end
|
131
131
|
|
132
132
|
# Override in subclasses.
|
@@ -4,12 +4,13 @@ module Sources
|
|
4
4
|
|
5
5
|
class Base
|
6
6
|
|
7
|
-
attr_reader :backend
|
7
|
+
attr_reader :backend, :category
|
8
8
|
|
9
|
-
# Wraps
|
9
|
+
# Wraps an indexing category.
|
10
10
|
#
|
11
|
-
def initialize
|
12
|
-
@
|
11
|
+
def initialize category
|
12
|
+
@category = category
|
13
|
+
@backend = category.source
|
13
14
|
end
|
14
15
|
|
15
16
|
# Default is delegation for all methods
|