-
Notifications
You must be signed in to change notification settings - Fork 49
/
index_indexing.rb
120 lines (106 loc) · 3.1 KB
/
index_indexing.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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
module Picky
#
#
class Index
include Helpers::Indexing
forward :cache,
:clear,
:to => :categories
# Define an index tokenizer on the index.
#
# Parameters are the exact same as for indexing.
#
def indexing options = {}
@tokenizer = Tokenizer.from options
end
# Calling prepare on an index will call prepare
# on every category.
#
# Decides whether to use a parallel indexer or whether to
# forward to each category to prepare themselves.
#
# TODO Do a critical reading of this on the blog.
#
def prepare scheduler = Scheduler.new
if source.respond_to?(:each)
check_source_empty
prepare_in_parallel scheduler
else
with_data_snapshot { categories.prepare scheduler }
end
end
# Check if the given enumerable source is empty.
#
# Note: Checking as early as possible to tell the
# user as early as possible.
#
def check_source_empty
Picky.logger.warn %Q{\n\033[1mWarning\033[m, source for index "#{name}" is empty: #{source} (responds true to empty?).\n} if source.respond_to?(:empty?) && source.empty?
end
# Indexes the categories in parallel.
#
# Only use where the category does have a #each source defined.
#
def prepare_in_parallel scheduler
indexer = Indexers::Parallel.new self
indexer.prepare categories, scheduler
end
# Note: Duplicated in category_indexing.rb.
#
# Take a data snapshot if the source offers it.
#
def with_data_snapshot
if source.respond_to? :with_snapshot
source.with_snapshot(self) do
yield
end
else
yield
end
end
# Returns the installed tokenizer or the default.
#
def tokenizer
@tokenizer || Indexes.tokenizer
end
# Define a source on the index.
#
# Parameter is a source, either one of the standard sources or
# anything responding to #each and returning objects that
# respond to id and the category names (or the category from option).
#
def source some_source = nil, &block
some_source ||= block
some_source ? (@source = Source.from(some_source, false, name)) : unblock_source
end
# Get the actual source if it is wrapped in a time
# capsule, ie. a block/lambda.
#
def unblock_source
@source.respond_to?(:call) ? @source.call : @source
end
# API method.
#
# Defines the name of the ID method to use on the indexed object.
#
# === Parameters
# * name: Method name of the ID.
#
def id name = nil
@id_name = name || @id_name || :id
end
# Define a key_format on the index.
#
# Parameter is a method name to use on the key (e.g. :to_i, :to_s, :strip, :split).
#
def key_format key_format = nil
key_format ? (@key_format = key_format) : @key_format
end
# Define what to do after indexing.
# (Only used in the Sources::DB)
#
def after_indexing after_indexing = nil
after_indexing ? (@after_indexing = after_indexing) : @after_indexing
end
end
end