picky 0.11.2 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. data/lib/picky/Index_api.rb +49 -0
  2. data/lib/picky/alias_instances.rb +4 -1
  3. data/lib/picky/application.rb +16 -15
  4. data/lib/picky/cacher/partial/{subtoken.rb → substring.rb} +19 -18
  5. data/lib/picky/{character_substitution/european.rb → character_substituters/west_european.rb} +2 -2
  6. data/lib/picky/configuration/index.rb +67 -0
  7. data/lib/picky/cores.rb +3 -0
  8. data/lib/picky/index/bundle.rb +35 -51
  9. data/lib/picky/index/file/basic.rb +39 -5
  10. data/lib/picky/index/file/json.rb +10 -0
  11. data/lib/picky/index/file/marshal.rb +10 -0
  12. data/lib/picky/index/file/text.rb +22 -0
  13. data/lib/picky/index/files.rb +11 -36
  14. data/lib/picky/indexed/bundle.rb +61 -0
  15. data/lib/picky/{index → indexed}/categories.rb +1 -1
  16. data/lib/picky/{index → indexed}/category.rb +13 -16
  17. data/lib/picky/{index/type.rb → indexed/index.rb} +6 -6
  18. data/lib/picky/{index/types.rb → indexed/indexes.rb} +10 -10
  19. data/lib/picky/{index → indexed}/wrappers/exact_first.rb +8 -8
  20. data/lib/picky/indexers/no_source_specified_error.rb +1 -1
  21. data/lib/picky/indexers/serial.rb +64 -0
  22. data/lib/picky/indexers/solr.rb +1 -3
  23. data/lib/picky/indexes_api.rb +41 -0
  24. data/lib/picky/indexing/bundle.rb +43 -13
  25. data/lib/picky/indexing/category.rb +17 -64
  26. data/lib/picky/indexing/{type.rb → index.rb} +13 -3
  27. data/lib/picky/indexing/{types.rb → indexes.rb} +22 -22
  28. data/lib/picky/loader.rb +17 -22
  29. data/lib/picky/query/base.rb +1 -1
  30. data/lib/picky/rack/harakiri.rb +9 -2
  31. data/lib/picky/signals.rb +1 -1
  32. data/lib/picky/sources/base.rb +14 -14
  33. data/lib/picky/sources/couch.rb +8 -7
  34. data/lib/picky/sources/csv.rb +10 -10
  35. data/lib/picky/sources/db.rb +8 -8
  36. data/lib/picky/sources/delicious.rb +2 -2
  37. data/lib/picky/sources/wrappers/location.rb +3 -3
  38. data/lib/picky/tokenizers/base.rb +1 -11
  39. data/lib/picky/tokenizers/index.rb +0 -1
  40. data/lib/picky/tokenizers/query.rb +0 -1
  41. data/lib/tasks/index.rake +4 -4
  42. data/lib/tasks/shortcuts.rake +4 -4
  43. data/lib/tasks/try.rake +8 -8
  44. data/project_prototype/Gemfile +1 -1
  45. data/project_prototype/app/application.rb +13 -12
  46. data/spec/lib/application_spec.rb +10 -38
  47. data/spec/lib/cacher/partial/{subtoken_spec.rb → substring_spec.rb} +0 -0
  48. data/spec/lib/{character_substitution/european_spec.rb → character_substituters/west_european_spec.rb} +6 -2
  49. data/spec/lib/configuration/index_spec.rb +80 -0
  50. data/spec/lib/cores_spec.rb +1 -1
  51. data/spec/lib/index/file/text_spec.rb +1 -1
  52. data/spec/lib/index/files_spec.rb +12 -32
  53. data/spec/lib/indexed/bundle_spec.rb +119 -0
  54. data/spec/lib/{indexing → indexed}/categories_spec.rb +13 -14
  55. data/spec/lib/{index → indexed}/category_spec.rb +6 -6
  56. data/spec/lib/{index/type_spec.rb → indexed/index_spec.rb} +3 -3
  57. data/spec/lib/{index → indexed}/wrappers/exact_first_spec.rb +5 -5
  58. data/spec/lib/indexers/serial_spec.rb +62 -0
  59. data/spec/lib/indexing/bundle_partial_generation_speed_spec.rb +7 -5
  60. data/spec/lib/indexing/bundle_spec.rb +9 -14
  61. data/spec/lib/indexing/category_spec.rb +9 -125
  62. data/spec/lib/indexing/{type_spec.rb → index_spec.rb} +3 -3
  63. data/spec/lib/query/base_spec.rb +1 -1
  64. data/spec/lib/query/full_spec.rb +1 -1
  65. data/spec/lib/query/live_spec.rb +2 -4
  66. data/spec/lib/sources/couch_spec.rb +5 -5
  67. data/spec/lib/sources/db_spec.rb +6 -7
  68. data/spec/lib/tokenizers/base_spec.rb +1 -24
  69. data/spec/lib/tokenizers/query_spec.rb +0 -1
  70. metadata +38 -41
  71. data/lib/picky/bundle.rb +0 -33
  72. data/lib/picky/configuration/indexes.rb +0 -51
  73. data/lib/picky/configuration/queries.rb +0 -15
  74. data/lib/picky/indexers/base.rb +0 -85
  75. data/lib/picky/indexers/default.rb +0 -3
  76. data/lib/picky/type.rb +0 -46
  77. data/lib/picky/types.rb +0 -41
  78. data/lib/tasks/cache.rake +0 -46
  79. data/spec/lib/configuration/indexes_spec.rb +0 -28
  80. data/spec/lib/index/bundle_spec.rb +0 -151
  81. data/spec/lib/indexers/base_spec.rb +0 -89
@@ -0,0 +1,61 @@
1
+ # encoding: utf-8
2
+ #
3
+ module Indexed
4
+
5
+ # This is the _actual_ index.
6
+ #
7
+ # Handles exact/partial index, weights index, and similarity index.
8
+ #
9
+ # Delegates file handling and checking to an *Indexed*::*Files* object.
10
+ #
11
+ class Bundle < Index::Bundle
12
+
13
+ # Get the ids for the given symbol.
14
+ #
15
+ def ids sym
16
+ @index[sym] || []
17
+ end
18
+ # Get a weight for the given symbol.
19
+ #
20
+ def weight sym
21
+ @weights[sym]
22
+ end
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
+ # Loads all indexes.
38
+ #
39
+ def load
40
+ load_index
41
+ load_similarity
42
+ load_weights
43
+ end
44
+ # Loads the core index.
45
+ #
46
+ def load_index
47
+ self.index = files.load_index
48
+ end
49
+ # Loads the weights index.
50
+ #
51
+ def load_weights
52
+ self.weights = files.load_weights
53
+ end
54
+ # Loads the similarity index.
55
+ #
56
+ def load_similarity
57
+ self.similarity = files.load_similarity
58
+ end
59
+
60
+ end
61
+ end
@@ -1,4 +1,4 @@
1
- module Index
1
+ module Indexed
2
2
 
3
3
  class Categories
4
4
 
@@ -1,38 +1,41 @@
1
- module Index
1
+ module Indexed
2
2
 
3
- # An index category holds a exact and a partial index for a given field.
3
+ # An index category holds a exact and a partial index for a given category.
4
4
  #
5
5
  # For example an index category for names holds a exact and
6
6
  # a partial index bundle for names.
7
7
  #
8
8
  class Category
9
9
 
10
- attr_reader :name, :type, :exact, :partial
10
+ attr_reader :exact, :partial, :identifier, :name
11
11
 
12
12
  #
13
13
  #
14
- def initialize name, type, options = {}
14
+ def initialize name, index, options = {}
15
15
  @name = name
16
- @type = type
16
+
17
+ configuration = Configuration::Index.new index, self
18
+
19
+ @identifier = configuration.identifier
17
20
 
18
21
  similarity = options[:similarity] || Cacher::Similarity::Default
19
22
 
20
- @exact = options[:exact_index_bundle] || Bundle.new(:exact, self, type, similarity)
21
- @partial = options[:partial_index_bundle] || Bundle.new(:partial, self, type, similarity)
23
+ @exact = options[:exact_index_bundle] || Bundle.new(:exact, configuration, similarity)
24
+ @partial = options[:partial_index_bundle] || Bundle.new(:partial, configuration, similarity)
22
25
 
23
26
  @exact = exact_lambda.call(@exact, @partial) if exact_lambda = options[:exact_lambda]
24
27
  @partial = partial_lambda.call(@exact, @partial) if partial_lambda = options[:partial_lambda]
25
28
 
26
29
  # Extract?
27
30
  #
28
- qualifiers = generate_qualifiers_from options
29
- Query::Qualifiers.add(name, qualifiers) if qualifiers
31
+ qualifiers = generate_qualifiers_from options || [name]
32
+ Query::Qualifiers.add(configuration.category_name, qualifiers) if qualifiers
30
33
  end
31
34
 
32
35
  # TODO Move to Index.
33
36
  #
34
37
  def generate_qualifiers_from options
35
- options[:qualifiers] || options[:qualifier] && [options[:qualifier]] || [name]
38
+ options[:qualifiers] || options[:qualifier] && [options[:qualifier]]
36
39
  end
37
40
 
38
41
  # Loads the index from cache.
@@ -43,12 +46,6 @@ module Index
43
46
  partial.load
44
47
  end
45
48
 
46
- # TODO Move to initializer?
47
- #
48
- def identifier
49
- @identifier ||= "#{type.name} #{name}"
50
- end
51
-
52
49
  # Gets the weight for this token's text.
53
50
  #
54
51
  def weight token
@@ -1,10 +1,8 @@
1
- module Index
1
+ module Indexed
2
2
 
3
- # This class is for multiple types.
4
3
  #
5
- # For example, you could have types books, isbn.
6
4
  #
7
- class Type
5
+ class Index
8
6
 
9
7
  attr_reader :name, :result_type, :combinator, :categories
10
8
 
@@ -22,8 +20,10 @@ module Index
22
20
 
23
21
  # TODO Spec. Doc.
24
22
  #
25
- def add_category name, options = {}
26
- categories << Category.new(name, self, options)
23
+ def add_category category_name, options = {}
24
+ new_category = Category.new category_name, self, options
25
+ categories << new_category
26
+ new_category
27
27
  end
28
28
 
29
29
  #
@@ -1,11 +1,11 @@
1
- module Index
1
+ module Indexed
2
2
 
3
- class Types
3
+ class Indexes
4
4
 
5
- attr_reader :types, :type_mapping
5
+ attr_reader :indexes, :index_mapping
6
6
 
7
7
  each_delegate :load_from_cache,
8
- :to => :types
8
+ :to => :indexes
9
9
 
10
10
  def initialize
11
11
  clear
@@ -14,8 +14,8 @@ module Index
14
14
  # TODO Spec.
15
15
  #
16
16
  def clear
17
- @types = []
18
- @type_mapping = {}
17
+ @indexes = []
18
+ @index_mapping = {}
19
19
  end
20
20
 
21
21
  # TODO Spec.
@@ -26,14 +26,14 @@ module Index
26
26
 
27
27
  # TODO Spec
28
28
  #
29
- def register type
30
- self.types << type
31
- self.type_mapping[type.name] = type
29
+ def register index
30
+ self.indexes << index
31
+ self.index_mapping[index.name] = index
32
32
  end
33
33
  def [] name
34
34
  name = name.to_sym
35
35
 
36
- type_mapping[name]
36
+ index_mapping[name]
37
37
  end
38
38
 
39
39
  end
@@ -1,13 +1,13 @@
1
1
  # encoding: utf-8
2
2
  #
3
- module Index
3
+ module Indexed
4
4
 
5
5
  # FIXME and spec
6
6
  #
7
7
  module Wrappers
8
8
 
9
9
  # This index combines an exact and partial index.
10
- # It serves to order the results such that exact hits are found first.
10
+ # It serves to order the results such that exact hits are found first.
11
11
  #
12
12
  # TODO Need to use the right subtokens. Bake in?
13
13
  #
@@ -17,7 +17,7 @@ module Index
17
17
  :identifier,
18
18
  :name,
19
19
  :to => :@exact
20
- delegate :type,
20
+ delegate :index,
21
21
  :category,
22
22
  :weight,
23
23
  :generate_partial_from,
@@ -32,12 +32,12 @@ module Index
32
32
  @partial = category.partial
33
33
  end
34
34
 
35
- def self.wrap type_or_category
36
- if type_or_category.respond_to? :categories
37
- wrap_each_of type_or_category.categories
38
- type_or_category
35
+ def self.wrap index_or_category
36
+ if index_or_category.respond_to? :categories
37
+ wrap_each_of index_or_category.categories
38
+ index_or_category
39
39
  else
40
- new type_or_category
40
+ new index_or_category
41
41
  end
42
42
  end
43
43
  # TODO Do not extract categories!
@@ -1,6 +1,6 @@
1
1
  module Indexers
2
2
 
3
- # Raised if no source is available on a field.
3
+ # Raised if no source is available on a category.
4
4
  #
5
5
  class NoSourceSpecifiedException < StandardError; end
6
6
 
@@ -0,0 +1,64 @@
1
+ # encoding: utf-8
2
+ #
3
+ module Indexers
4
+
5
+ # The indexer defines the control flow.
6
+ #
7
+ class Serial
8
+
9
+ attr_accessor :tokenizer, :source
10
+
11
+ def initialize configuration, source, tokenizer
12
+ @configuration = configuration
13
+ @source = source || raise_no_source
14
+ @tokenizer = tokenizer
15
+ end
16
+
17
+ # Raise a no source exception.
18
+ #
19
+ def raise_no_source
20
+ raise NoSourceSpecifiedException.new("No source given for #{@configuration.identifier}.")
21
+ end
22
+
23
+ # Selects the original id (indexed id) and a column to process. The column data is called "token".
24
+ #
25
+ # Note: Puts together the parts first in an array, then releasing the array from time to time by joining.
26
+ #
27
+ def index
28
+ indexing_message
29
+ process
30
+ end
31
+ def process
32
+ comma = ?,
33
+ newline = ?\n
34
+
35
+ # TODO Move open to config?
36
+ #
37
+ # @category.prepared_index do |file|
38
+ # source.harvest(@index, @category) do |indexed_id, text|
39
+ # tokenizer.tokenize(text).each do |token_text|
40
+ # next unless token_text
41
+ # file.buffer indexed_id << comma << token_text << newline
42
+ # end
43
+ # file.write_maybe
44
+ # end
45
+ # end
46
+ #
47
+ @configuration.prepared_index_file do |file|
48
+ result = []
49
+ source.harvest(@configuration.index, @configuration.category) do |indexed_id, text|
50
+ tokenizer.tokenize(text).each do |token_text|
51
+ next unless token_text
52
+ result << indexed_id << comma << token_text << newline
53
+ end
54
+ file.write(result.join) && result.clear if result.size > 100_000
55
+ end
56
+ file.write result.join
57
+ end
58
+ end
59
+ def indexing_message
60
+ timed_exclaim "INDEX #{@configuration.identifier}"
61
+ end
62
+
63
+ end
64
+ end
@@ -2,9 +2,7 @@
2
2
  #
3
3
  require 'rsolr'
4
4
  module Indexers
5
- # This is an indexer in its own right.
6
- #
7
- # TODO Perhaps merge with the existing indexer.
5
+ # TODO Totally deprecated. This should be a source.
8
6
  #
9
7
  class Solr
10
8
 
@@ -0,0 +1,41 @@
1
+ # Comfortable API convenience class, splits methods to indexes.
2
+ #
3
+ class IndexesAPI
4
+
5
+ attr_reader :indexes, :index_mapping
6
+
7
+ delegate :reload,
8
+ :load_from_cache,
9
+ :to => :@indexed
10
+
11
+ delegate :check_caches,
12
+ :find,
13
+ :generate_cache_only,
14
+ :generate_index_only,
15
+ :index,
16
+ :index_for_tests,
17
+ :to => :@indexing
18
+
19
+ def initialize
20
+ @indexes = []
21
+ @index_mapping = {}
22
+
23
+ @indexed = Indexed::Indexes.new
24
+ @indexing = Indexing::Indexes.new
25
+ end
26
+
27
+ def register index
28
+ self.indexes << index
29
+ self.index_mapping[index.name] = index
30
+
31
+ @indexing.register index.indexing
32
+ @indexed.register index.indexed # TODO Even necessary?
33
+ end
34
+
35
+ def [] name
36
+ name = name.to_sym
37
+
38
+ self.index_mapping[name]
39
+ end
40
+
41
+ end
@@ -6,17 +6,15 @@ module Indexing
6
6
  # It does all menial tasks that have nothing to do
7
7
  # with the actual index running etc.
8
8
  #
9
- # TODO Superclass?
10
- #
11
- class Bundle < ::Bundle
9
+ class Bundle < Index::Bundle
12
10
 
13
11
  attr_accessor :partial_strategy, :weights_strategy
14
12
  attr_reader :files
15
13
 
16
14
  # Path is in which directory the cache is located.
17
15
  #
18
- def initialize name, category, type, similarity_strategy, partial_strategy, weights_strategy
19
- super name, category, type, similarity_strategy
16
+ def initialize name, configuration, similarity_strategy, partial_strategy, weights_strategy
17
+ super name, configuration, similarity_strategy
20
18
 
21
19
  @partial_strategy = partial_strategy
22
20
  @weights_strategy = weights_strategy
@@ -63,7 +61,11 @@ module Indexing
63
61
  def load_from_index_generation_message
64
62
  timed_exclaim "LOAD INDEX #{identifier}."
65
63
  end
66
- # Retrieves the data into the index.
64
+ # Retrieves the prepared index data into the index.
65
+ #
66
+ # This is in preparation for generating
67
+ # derived indexes (like weights, similarity)
68
+ # and later dumping the optimized index.
67
69
  #
68
70
  def retrieve
69
71
  files.retrieve do |id, token|
@@ -71,6 +73,8 @@ module Indexing
71
73
  index[token] << id
72
74
  end
73
75
  end
76
+ # Sets up a piece of the index for the given token.
77
+ #
74
78
  def initialize_index_for token
75
79
  index[token] ||= []
76
80
  end
@@ -81,12 +85,14 @@ module Indexing
81
85
  #
82
86
 
83
87
  # Generates a new index (writes its index) using the
84
- # given partial caching strategy.
88
+ # partial caching strategy of this bundle.
85
89
  #
86
90
  def generate_partial
87
91
  generator = Cacher::PartialGenerator.new self.index
88
92
  self.index = generator.generate self.partial_strategy
89
93
  end
94
+ # Generate a partial index from the given exact index.
95
+ #
90
96
  def generate_partial_from exact_index
91
97
  timed_exclaim "PARTIAL GENERATE #{identifier}."
92
98
  self.index = exact_index
@@ -108,25 +114,31 @@ module Indexing
108
114
  self.weights = generator.generate self.weights_strategy
109
115
  end
110
116
 
111
- # Saves the index in a dump file.
117
+ # Saves the indexes in a dump file.
112
118
  #
113
119
  def dump
114
120
  dump_index
115
121
  dump_similarity
116
122
  dump_weights
117
123
  end
124
+ # Dumps the core index.
125
+ #
118
126
  def dump_index
119
127
  timed_exclaim "DUMP INDEX #{identifier}."
120
128
  files.dump_index index
121
129
  end
122
- def dump_similarity
123
- timed_exclaim "DUMP SIMILARITY #{identifier}."
124
- files.dump_similarity similarity
125
- end
130
+ # Dumps the weights index.
131
+ #
126
132
  def dump_weights
127
133
  timed_exclaim "DUMP WEIGHTS #{identifier}."
128
134
  files.dump_weights weights
129
135
  end
136
+ # Dumps the similarity index.
137
+ #
138
+ def dump_similarity
139
+ timed_exclaim "DUMP SIMILARITY #{identifier}."
140
+ files.dump_similarity similarity
141
+ end
130
142
 
131
143
  # Alerts the user if an index is missing.
132
144
  #
@@ -134,38 +146,56 @@ module Indexing
134
146
  raise_unless_index_exists
135
147
  raise_unless_similarity_exists
136
148
  end
149
+ # Alerts the user if one of the necessary indexes
150
+ # (core, weights) is missing.
151
+ #
137
152
  def raise_unless_index_exists
138
153
  if partial_strategy.saved?
139
154
  warn_if_index_small
140
155
  raise_unless_index_ok
141
156
  end
142
157
  end
158
+ # Alerts the user if the similarity
159
+ # index is missing (given that it's used).
160
+ #
143
161
  def raise_unless_similarity_exists
144
162
  if similarity_strategy.saved?
145
163
  warn_if_similarity_small
146
164
  raise_unless_similarity_ok
147
165
  end
148
166
  end
167
+ # Warns the user if the similarity index is small.
168
+ #
149
169
  def warn_if_similarity_small
150
170
  warn_cache_small :similarity if files.similarity_cache_small?
151
171
  end
172
+ # Alerts the user if the similarity index is not there.
173
+ #
152
174
  def raise_unless_similarity_ok
153
175
  raise_cache_missing :similarity unless files.similarity_cache_ok?
154
176
  end
177
+
155
178
  # TODO Spec on down.
156
179
  #
180
+
181
+ # Warns the user if the core or weights indexes are small.
182
+ #
157
183
  def warn_if_index_small
158
184
  warn_cache_small :index if files.index_cache_small?
159
185
  warn_cache_small :weights if files.weights_cache_small?
160
186
  end
187
+ # Alerts the user if the core or weights indexes are not there.
188
+ #
161
189
  def raise_unless_index_ok
162
190
  raise_cache_missing :index unless files.index_cache_ok?
163
191
  raise_cache_missing :weights unless files.weights_cache_ok?
164
192
  end
193
+ # Outputs a warning for the given cache.
194
+ #
165
195
  def warn_cache_small what
166
196
  puts "Warning: #{what} cache for #{identifier} smaller than 16 bytes."
167
197
  end
168
- # Raises an appropriate error message.
198
+ # Raises an appropriate error message for the given cache.
169
199
  #
170
200
  def raise_cache_missing what
171
201
  raise "#{what} cache for #{identifier} missing."
@@ -2,20 +2,17 @@ module Indexing
2
2
 
3
3
  class Category
4
4
 
5
- attr_reader :name, :type, :indexed_as, :virtual, :tokenizer, :source, :exact, :partial
5
+ attr_reader :exact, :partial, :name, :configuration, :indexer
6
6
 
7
- # TODO Dup the options?
8
- #
9
- def initialize name, type, options = {}
7
+ def initialize name, index, options = {}
10
8
  @name = name
11
- @type = type
12
9
 
13
- @source = options[:source]
10
+ # Now we have enough info to combine the index and the category.
11
+ #
12
+ @configuration = Configuration::Index.new index, self
14
13
 
15
- @tokenizer = options[:tokenizer] || Tokenizers::Index.default
16
- @indexer_class = options[:indexer] || Indexers::Default
17
- @indexed_as = options[:as] || name
18
- @virtual = options[:virtual] || false # TODO What is this again?
14
+ @tokenizer = options[:tokenizer] || Tokenizers::Index.default
15
+ @indexer = Indexers::Serial.new configuration, options[:source], @tokenizer #, :as => options[:as] # TODO option as.
19
16
 
20
17
  # TODO Push into Bundle.
21
18
  #
@@ -23,28 +20,12 @@ module Indexing
23
20
  weights = options[:weights] || Cacher::Weights::Default
24
21
  similarity = options[:similarity] || Cacher::Similarity::Default
25
22
 
26
- @exact = options[:exact_indexing_bundle] || Bundle.new(:exact, self, type, similarity, Cacher::Partial::None.new, weights)
27
- @partial = options[:partial_indexing_bundle] || Bundle.new(:partial, self, type, Cacher::Similarity::None.new, partial, weights)
28
-
29
- # TODO Move to Query.
30
- #
31
- # @remove = options[:remove] || false
32
- # @filter = options[:filter] || true
33
-
34
- @options = options # TODO Remove?
23
+ @exact = options[:exact_indexing_bundle] || Bundle.new(:exact, configuration, similarity, Cacher::Partial::None.new, weights)
24
+ @partial = options[:partial_indexing_bundle] || Bundle.new(:partial, configuration, Cacher::Similarity::None.new, partial, weights)
35
25
  end
36
26
 
37
- # TODO Move to initializer?
38
- #
39
- def identifier
40
- @identifier ||= "#{type.name} #{name}"
41
- end
42
-
43
- # Note: Most of the time the source of the type is used.
44
- #
45
- def source
46
- @source || type.source
47
- end
27
+ delegate :identifier, :prepare_index_directory, :to => :configuration
28
+ delegate :source, :source=, :tokenizer, :tokenizer=, :to => :indexer
48
29
 
49
30
  # TODO Spec.
50
31
  #
@@ -68,16 +49,16 @@ module Indexing
68
49
  exact.delete
69
50
  partial.delete
70
51
  end
71
- # def create_directory_structure
72
- # timed_exclaim "Creating directory structure for #{identifier}."
73
- # exact.create_directory
74
- # partial.create_directory
75
- # end
52
+
53
+ def index
54
+ prepare_index_directory
55
+ indexer.index
56
+ end
76
57
 
77
58
  # Generates all caches for this category.
78
59
  #
79
60
  def cache
80
- prepare_cache_directory
61
+ prepare_index_directory
81
62
  generate_caches
82
63
  end
83
64
  def generate_caches
@@ -101,34 +82,6 @@ module Indexing
101
82
  partial.dump
102
83
  end
103
84
 
104
- # TODO Partially move to type. Duplicate Code in indexers/field.rb.
105
- #
106
- # TODO Use the Files object.
107
- #
108
- def search_index_root
109
- File.join PICKY_ROOT, 'index'
110
- end
111
- def cache_directory
112
- File.join search_index_root, PICKY_ENVIRONMENT, type.name.to_s
113
- end
114
- def search_index_file_name
115
- File.join cache_directory, "prepared_#{name}_index.txt"
116
- end
117
- def index
118
- prepare_cache_directory
119
- # files.create_directory # TODO Make this possible!
120
- indexer.index
121
- end
122
- def prepare_cache_directory
123
- FileUtils.mkdir_p cache_directory
124
- end
125
- def indexer
126
- @indexer || @indexer = @indexer_class.new(type, self)
127
- end
128
- def virtual?
129
- !!virtual
130
- end
131
-
132
85
  end
133
86
 
134
87
  end
@@ -1,6 +1,6 @@
1
1
  module Indexing
2
2
 
3
- class Type
3
+ class Index
4
4
 
5
5
  attr_reader :name, :source, :categories, :after_indexing
6
6
 
@@ -30,8 +30,18 @@ module Indexing
30
30
 
31
31
  # TODO Spec. Doc.
32
32
  #
33
- def add_category name, options = {}
34
- categories << Category.new(name, self, options)
33
+ def add_category category_name, options = {}
34
+ options = default_category_options.merge options
35
+
36
+ new_category = Category.new category_name, self, options
37
+ categories << new_category
38
+ new_category
39
+ end
40
+
41
+ # By default, the category uses the index's source.
42
+ #
43
+ def default_category_options
44
+ { :source => @source }
35
45
  end
36
46
 
37
47
  # Indexing.