ultrasphinx 1.5.3 → 1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data.tar.gz.sig +0 -0
- data/CHANGELOG +7 -1
- data/Manifest +6 -6
- data/README +3 -3
- data/TODO +2 -1
- data/examples/default.base +1 -0
- data/lib/ultrasphinx.rb +2 -1
- data/lib/ultrasphinx/configure.rb +10 -11
- data/lib/ultrasphinx/core_extensions.rb +2 -1
- data/lib/ultrasphinx/fields.rb +29 -18
- data/lib/ultrasphinx/search.rb +77 -92
- data/lib/ultrasphinx/search/internals.rb +133 -102
- data/lib/ultrasphinx/ultrasphinx.rb +0 -8
- data/test/integration/app/app/models/geo/state.rb +2 -1
- data/test/integration/app/app/models/person/user.rb +2 -1
- data/test/integration/app/config/environment.rb +0 -2
- data/test/integration/app/config/ultrasphinx/development.conf +6 -6
- data/test/integration/app/config/ultrasphinx/development.conf.canonical +6 -6
- data/test/integration/app/test/fixtures/sellers.yml +2 -2
- data/test/integration/app/test/fixtures/users.yml +2 -2
- data/test/integration/search_test.rb +67 -40
- data/test/setup.rb +3 -0
- data/ultrasphinx.gemspec +18 -17
- data/vendor/riddle/MIT-LICENSE +20 -0
- data/vendor/riddle/riddle.rb +15 -0
- data/vendor/riddle/riddle/client.rb +409 -0
- data/vendor/riddle/riddle/client/filter.rb +42 -0
- data/vendor/riddle/riddle/client/message.rb +54 -0
- data/vendor/riddle/riddle/client/response.rb +67 -0
- metadata +22 -16
- metadata.gz.sig +0 -0
- data/test/ts.multi +0 -2
- data/vendor/sphinx/LICENSE +0 -58
- data/vendor/sphinx/README +0 -40
- data/vendor/sphinx/Rakefile +0 -21
- data/vendor/sphinx/init.rb +0 -1
- data/vendor/sphinx/lib/client.rb +0 -647
@@ -9,66 +9,79 @@ module Ultrasphinx
|
|
9
9
|
|
10
10
|
def build_request_with_options opts
|
11
11
|
|
12
|
-
request =
|
13
|
-
|
14
|
-
|
15
|
-
Ultrasphinx::CLIENT_SETTINGS['
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
12
|
+
request = Riddle::Client.new
|
13
|
+
request.instance_eval do
|
14
|
+
@server = Ultrasphinx::CLIENT_SETTINGS['server_host']
|
15
|
+
@port = Ultrasphinx::CLIENT_SETTINGS['server_port']
|
16
|
+
@match_mode = :extended # Force extended query mode
|
17
|
+
@offset = opts['per_page'] * (opts['page'] - 1)
|
18
|
+
@limit = opts['per_page']
|
19
|
+
@max_matches = [@offset + @limit, MAX_MATCHES].min
|
20
|
+
end
|
21
|
+
|
22
|
+
# Sorting
|
23
|
+
sort_by = opts['sort_by']
|
24
|
+
unless sort_by.blank?
|
25
|
+
if opts['sort_mode'].to_s == 'relevance'
|
26
|
+
# If you're sorting by a field you don't want 'relevance' order
|
27
|
+
raise UsageError, "Sort mode 'relevance' is not valid with a sort_by field"
|
28
|
+
end
|
29
|
+
request.sort_by = sort_by.to_s
|
30
|
+
end
|
25
31
|
|
26
|
-
if SPHINX_CLIENT_PARAMS['sort_mode'][opts['sort_mode']]
|
27
|
-
request.
|
32
|
+
if sort_mode = SPHINX_CLIENT_PARAMS['sort_mode'][opts['sort_mode']]
|
33
|
+
request.sort_mode = sort_mode
|
28
34
|
else
|
29
35
|
raise UsageError, "Sort mode #{opts['sort_mode'].inspect} is invalid"
|
30
|
-
end
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
36
|
+
end
|
37
|
+
|
38
|
+
# Weighting
|
39
|
+
weights = opts['weights']
|
40
|
+
if weights.any?
|
41
|
+
# Order according to the field order for Sphinx, and set the missing fields to 1.0
|
42
|
+
request.weights = (Fields.instance.types.select{|n,t| t == 'text'}.map(&:first).sort.inject([]) do |array, field|
|
35
43
|
array << (weights[field] || 1.0)
|
36
44
|
end)
|
37
45
|
end
|
46
|
+
|
47
|
+
# Class names
|
48
|
+
unless Array(opts['class_names']).empty?
|
49
|
+
request.filters << Riddle::Client::Filter.new(
|
50
|
+
'class_id',
|
51
|
+
(opts['class_names'].map do |model|
|
52
|
+
MODELS_TO_IDS[model.to_s] or
|
53
|
+
MODELS_TO_IDS[model.to_s.constantize.base_class.to_s] or
|
54
|
+
raise UsageError, "Invalid class name #{model.inspect}"
|
55
|
+
end),
|
56
|
+
false)
|
57
|
+
end
|
38
58
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
MODELS_TO_IDS[model.to_s.constantize.base_class.to_s] or
|
43
|
-
raise UsageError, "Invalid class name #{model.inspect}"
|
44
|
-
end))
|
45
|
-
end
|
46
|
-
|
47
|
-
# Extract ranged raw filters
|
48
|
-
# Some of this mangling might not be necessary
|
49
|
-
opts['filters'].each do |field, value|
|
59
|
+
# Extract raw filters
|
60
|
+
# XXX We should coerce based on the Field values, not on the class
|
61
|
+
Array(opts['filters']).each do |field, value|
|
50
62
|
field = field.to_s
|
51
63
|
unless Fields.instance.types[field]
|
52
|
-
raise
|
64
|
+
raise UsageError, "field #{field.inspect} is invalid"
|
53
65
|
end
|
54
66
|
begin
|
55
67
|
case value
|
56
|
-
when
|
57
|
-
|
68
|
+
when Integer, Float, BigDecimal, NilClass, Array
|
69
|
+
# Just bomb the filter in there
|
70
|
+
request.filters << Riddle::Client::Filter.new(field, Array(value), false)
|
58
71
|
when Range
|
59
|
-
|
60
|
-
|
61
|
-
end
|
72
|
+
# Make sure ranges point in the right direction
|
73
|
+
min, max = [value.begin, value.end].map {|x| x._to_numeric }
|
62
74
|
raise NoMethodError unless min <=> max and max <=> min
|
63
75
|
min, max = max, min if min > max
|
64
|
-
request.
|
76
|
+
request.filters << Riddle::Client::Filter.new(field, min..max, false)
|
65
77
|
when String
|
78
|
+
# XXX Hack to move text filters into the query
|
66
79
|
opts['parsed_query'] << " @#{field} #{value}"
|
67
80
|
else
|
68
81
|
raise NoMethodError
|
69
82
|
end
|
70
83
|
rescue NoMethodError => e
|
71
|
-
raise
|
84
|
+
raise UsageError, "filter value #{value.inspect} for field #{field.inspect} is invalid"
|
72
85
|
end
|
73
86
|
end
|
74
87
|
|
@@ -77,7 +90,7 @@ module Ultrasphinx
|
|
77
90
|
|
78
91
|
def get_subtotals(original_request, query)
|
79
92
|
request = original_request._deep_dup
|
80
|
-
request.instance_eval { @filters.delete_if {|
|
93
|
+
request.instance_eval { @filters.delete_if {|filter| filter.attribute == 'class_id'} }
|
81
94
|
|
82
95
|
facets = get_facets(request, query, 'class_id')
|
83
96
|
|
@@ -91,26 +104,37 @@ module Ultrasphinx
|
|
91
104
|
request, facet = original_request._deep_dup, original_facet
|
92
105
|
facet += "_facet" if Fields.instance.types[original_facet] == 'text'
|
93
106
|
|
94
|
-
|
95
|
-
|
107
|
+
unless Fields.instance.types[facet]
|
108
|
+
if facet == original_facet
|
109
|
+
raise UsageError, "Field #{original_facet} does not exist"
|
110
|
+
else
|
111
|
+
raise UsageError, "Field #{original_facet} is a text field, but was not configured for text faceting"
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
96
115
|
# Set the facet query parameter and modify per-page setting so we snag all the facets
|
97
|
-
request.
|
98
|
-
|
99
|
-
|
116
|
+
request.instance_eval do
|
117
|
+
@group_by = facet
|
118
|
+
@group_function = :attr
|
119
|
+
@group_clauses = '@count desc'
|
120
|
+
@offset = 0
|
121
|
+
@limit = Ultrasphinx::Search.client_options['max_facets']
|
122
|
+
@max_matches = [@limit, MAX_MATCHES].min
|
123
|
+
end
|
100
124
|
|
101
125
|
# Run the query
|
102
126
|
begin
|
103
|
-
matches = request.
|
104
|
-
rescue
|
105
|
-
raise ConfigurationError, "Index
|
127
|
+
matches = request.query(query, UNIFIED_INDEX_NAME)[:matches]
|
128
|
+
rescue DaemonError
|
129
|
+
raise ConfigurationError, "Index seems out of date. Run 'rake ultrasphinx:index'"
|
106
130
|
end
|
107
131
|
|
108
132
|
# Map the facets back to something sane
|
109
133
|
facets = {}
|
110
134
|
matches.each do |match|
|
111
|
-
|
112
|
-
raise
|
113
|
-
facets[
|
135
|
+
attributes = match[:attributes]
|
136
|
+
raise DaemonError if facets[attributes['@groupby']]
|
137
|
+
facets[attributes['@groupby']] = attributes['@count']
|
114
138
|
end
|
115
139
|
|
116
140
|
# Invert hash's, if we have them
|
@@ -155,69 +179,76 @@ module Ultrasphinx
|
|
155
179
|
end
|
156
180
|
FACET_CACHE[facet]
|
157
181
|
end
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
ids = Hash.new([])
|
168
|
-
sphinx_ids.each do |id|
|
169
|
-
ids[MODELS_TO_IDS.invert[id % MODELS_TO_IDS.size]] += [id / MODELS_TO_IDS.size] # yay math
|
182
|
+
|
183
|
+
# Inverse-modulus map the Sphinx ids to the table-specific ids
|
184
|
+
def convert_sphinx_ids(sphinx_ids)
|
185
|
+
sphinx_ids.sort_by do |item|
|
186
|
+
item[:index]
|
187
|
+
end.map do |item|
|
188
|
+
class_name = MODELS_TO_IDS.invert[item[:doc] % MODELS_TO_IDS.size]
|
189
|
+
raise DaemonError, "Impossible Sphinx document id #{item[:doc]} in query result" unless class_name
|
190
|
+
[class_name, item[:doc] / MODELS_TO_IDS.size]
|
170
191
|
end
|
171
|
-
|
172
|
-
|
173
|
-
|
192
|
+
end
|
193
|
+
|
194
|
+
# Fetch them for real
|
195
|
+
def reify_results(ids)
|
174
196
|
results = []
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
197
|
+
|
198
|
+
ids.each do |klass_name, id|
|
199
|
+
|
200
|
+
# What class and class method are we using to get the record?
|
201
|
+
klass = klass_name.constantize
|
202
|
+
finder = Ultrasphinx::Search.client_options['finder_methods'].detect do |method_name|
|
179
203
|
klass.respond_to? method_name
|
180
204
|
end
|
181
205
|
|
182
|
-
#
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
else
|
192
|
-
Array(instances)
|
206
|
+
# Load it
|
207
|
+
record = begin
|
208
|
+
# XXX Does not use Memcached's multiget, or MySQL's, for that matter
|
209
|
+
klass.send(finder, id)
|
210
|
+
rescue ActiveRecord::RecordNotFound => e
|
211
|
+
if Ultrasphinx::Search.client_options['ignore_missing_records']
|
212
|
+
# XXX Should maybe adjust the total_found count, etc
|
213
|
+
else
|
214
|
+
raise(e)
|
193
215
|
end
|
194
|
-
|
195
|
-
raise Sphinx::SphinxResponseError, e.inspect
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
# Put them back in order
|
200
|
-
results.sort_by do |r|
|
201
|
-
raise Sphinx::SphinxResponseError, "Bogus ActiveRecord id for #{r.class}:#{r.id}" unless r.id
|
202
|
-
|
203
|
-
model_index = MODELS_TO_IDS[r.class.base_class.name]
|
204
|
-
raise UsageError, "#{r.class.base_class} is not an indexed class. Maybe you indexed an STI child class instead of the base class?" unless model_index
|
205
|
-
|
206
|
-
index = (sphinx_ids.index(sphinx_id = r.id * MODELS_TO_IDS.size + model_index))
|
207
|
-
raise Sphinx::SphinxResponseError, "Bogus reverse id for #{r.class}:#{r.id} (Sphinx:#{sphinx_id})" unless index
|
216
|
+
end
|
208
217
|
|
209
|
-
|
218
|
+
# Add it to the list. Cache_fu does funny things with returned record organization.
|
219
|
+
results += record.is_a?(Hash) ? record.values : Array(record)
|
210
220
|
end
|
211
|
-
|
212
|
-
# Add an accessor for absolute search rank for each record
|
213
|
-
results.each_with_index do |
|
221
|
+
|
222
|
+
# Add an accessor for absolute search rank for each record (does anyone use this?)
|
223
|
+
results.each_with_index do |result, index|
|
214
224
|
i = per_page * (current_page - 1) + index
|
215
|
-
|
225
|
+
result._metaclass.send('define_method', 'result_index') { i }
|
216
226
|
end
|
217
227
|
|
218
228
|
results
|
219
229
|
end
|
220
|
-
|
230
|
+
|
231
|
+
def perform_action_with_retries
|
232
|
+
tries = 0
|
233
|
+
begin
|
234
|
+
yield
|
235
|
+
rescue NoMethodError,
|
236
|
+
Riddle::VersionError,
|
237
|
+
Riddle::ResponseError,
|
238
|
+
Errno::ECONNREFUSED,
|
239
|
+
Errno::ECONNRESET,
|
240
|
+
Errno::EPIPE => e
|
241
|
+
tries += 1
|
242
|
+
if tries <= Ultrasphinx::Search.client_options['max_retries']
|
243
|
+
say "restarting query (#{tries} attempts already) (#{e})"
|
244
|
+
sleep(Ultrasphinx::Search.client_options['retry_sleep_time'])
|
245
|
+
retry
|
246
|
+
else
|
247
|
+
say "query failed"
|
248
|
+
raise DaemonError, e.to_s
|
249
|
+
end
|
250
|
+
end
|
251
|
+
end
|
221
252
|
|
222
253
|
def strip_bogus_characters(s)
|
223
254
|
# Used to remove some garbage before highlighting
|
@@ -225,7 +256,7 @@ module Ultrasphinx
|
|
225
256
|
end
|
226
257
|
|
227
258
|
def strip_query_commands(s)
|
228
|
-
# XXX Hack for query commands, since
|
259
|
+
# XXX Hack for query commands, since Sphinx doesn't intelligently parse the query in excerpt mode
|
229
260
|
# Also removes apostrophes in the middle of words so that they don't get split in two.
|
230
261
|
s.gsub(/(^|\s)(AND|OR|NOT|\@\w+)(\s|$)/i, "").gsub(/(\w)\'(\w)/, '\1\2')
|
231
262
|
end
|
@@ -34,16 +34,8 @@ module Ultrasphinx
|
|
34
34
|
|
35
35
|
MAX_WORDS = 2**16 # maximum number of stopwords built
|
36
36
|
|
37
|
-
EMPTY_SEARCHABLE = "__empty_searchable__"
|
38
|
-
|
39
37
|
UNIFIED_INDEX_NAME = "complete"
|
40
38
|
|
41
|
-
SPHINX_VERSION = if `which indexer` =~ /\/indexer\n/m
|
42
|
-
`indexer`.split("\n").first[7..-1]
|
43
|
-
else
|
44
|
-
"unknown"
|
45
|
-
end
|
46
|
-
|
47
39
|
CONFIG_MAP = {
|
48
40
|
# These must be symbols for key mapping against Rails itself
|
49
41
|
:username => 'sql_user',
|
@@ -1,5 +1,6 @@
|
|
1
1
|
class Geo::State < ActiveRecord::Base
|
2
|
-
has_many :
|
2
|
+
has_many :addresses, :class_name => "Geo::Address"
|
3
3
|
|
4
4
|
is_indexed :concatenate => [{:class_name => 'Geo::Address', :field => 'name', :as => 'address_name'}]
|
5
|
+
#:fields => [{:field => 'abbreviation', :as => 'company_name'}],
|
5
6
|
end
|
@@ -3,7 +3,8 @@ class User < ActiveRecord::Base
|
|
3
3
|
has_one :address, :class_name => "Geo::Address"
|
4
4
|
|
5
5
|
is_indexed :fields => ['login', 'email', 'deleted'],
|
6
|
-
:include => [{:class_name => 'Seller', :field => 'company_name', :as => 'company'}
|
6
|
+
:include => [{:class_name => 'Seller', :field => 'company_name', :as => 'company'},
|
7
|
+
{:class_name => 'Seller', :field => 'sellers_two.company_name', :as => 'company_two', 'association_sql' => 'LEFT OUTER JOIN sellers AS sellers_two ON users.id = sellers_two.user_id', 'function_sql' => "REPLACE(?, '6', ' replacement ')"}],
|
7
8
|
:conditions => 'deleted = 0'
|
8
9
|
|
9
10
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
|
-
# Auto-generated at
|
2
|
+
# Auto-generated at Wed Nov 14 03:32:12 -0500 2007.
|
3
3
|
# Hand modifications will be overwritten.
|
4
|
-
# /Users/eweaver/Desktop/projects/
|
4
|
+
# /Users/eweaver/Desktop/projects/fauna/ultrasphinx/trunk/test/integration/app/config/ultrasphinx/default.base
|
5
5
|
indexer {
|
6
6
|
mem_limit = 256M
|
7
7
|
}
|
@@ -34,7 +34,7 @@ sql_host = localhost
|
|
34
34
|
sql_pass =
|
35
35
|
sql_user = root
|
36
36
|
sql_query_range = SELECT MIN(id), MAX(id) FROM states
|
37
|
-
sql_query = SELECT (states.id * 4 + 0) AS id, CAST(GROUP_CONCAT(addresses.name SEPARATOR ' ') AS CHAR) AS address_name, 0 AS capitalization, 'Geo::State' AS class, 0 AS class_id, '' AS company, '' AS company_name, 0 AS company_name_facet, '' AS content, UNIX_TIMESTAMP('1970-01-01 00:00:00') AS created_at, 0 AS deleted, '' AS email, '
|
37
|
+
sql_query = SELECT (states.id * 4 + 0) AS id, CAST(GROUP_CONCAT(DISTINCT addresses.name SEPARATOR ' ') AS CHAR) AS address_name, 0 AS capitalization, 'Geo::State' AS class, 0 AS class_id, '' AS company, '' AS company_name, 0 AS company_name_facet, '' AS company_two, '' AS content, UNIX_TIMESTAMP('1970-01-01 00:00:00') AS created_at, 0 AS deleted, '' AS email, '' AS login, '' AS mission_statement, '' AS name, '' AS state, 0 AS user_id FROM states LEFT OUTER JOIN addresses AS addresses ON states.id = addresses.state_id WHERE states.id >= $start AND states.id <= $end GROUP BY id
|
38
38
|
|
39
39
|
sql_group_column = capitalization
|
40
40
|
sql_group_column = class_id
|
@@ -65,7 +65,7 @@ sql_host = localhost
|
|
65
65
|
sql_pass =
|
66
66
|
sql_user = root
|
67
67
|
sql_query_range = SELECT MIN(id), MAX(id) FROM sellers
|
68
|
-
sql_query = SELECT (sellers.id * 4 + 1) AS id, '' AS address_name, sellers.capitalization AS capitalization, 'Seller' AS class, 1 AS class_id, '' AS company, sellers.company_name AS company_name, CRC32(sellers.company_name) AS company_name_facet, '' AS content, UNIX_TIMESTAMP(sellers.created_at) AS created_at, 0 AS deleted, '' AS email, '
|
68
|
+
sql_query = SELECT (sellers.id * 4 + 1) AS id, '' AS address_name, sellers.capitalization AS capitalization, 'Seller' AS class, 1 AS class_id, '' AS company, sellers.company_name AS company_name, CRC32(sellers.company_name) AS company_name_facet, '' AS company_two, '' AS content, UNIX_TIMESTAMP(sellers.created_at) AS created_at, 0 AS deleted, '' AS email, '' AS login, sellers.mission_statement AS mission_statement, '' AS name, '' AS state, sellers.user_id AS user_id FROM sellers WHERE sellers.id >= $start AND sellers.id <= $end GROUP BY id
|
69
69
|
|
70
70
|
sql_group_column = capitalization
|
71
71
|
sql_group_column = class_id
|
@@ -96,7 +96,7 @@ sql_host = localhost
|
|
96
96
|
sql_pass =
|
97
97
|
sql_user = root
|
98
98
|
sql_query_range = SELECT MIN(id), MAX(id) FROM addresses
|
99
|
-
sql_query = SELECT (addresses.id * 4 + 2) AS id, '' AS address_name, 0 AS capitalization, 'Geo::Address' AS class, 2 AS class_id, '' AS company, '' AS company_name, 0 AS company_name_facet, CONCAT_WS(' ', addresses.line_1, addresses.line_2, addresses.city, addresses.province_region, addresses.zip_postal_code) AS content, UNIX_TIMESTAMP('1970-01-01 00:00:00') AS created_at, 0 AS deleted, '' AS email, '
|
99
|
+
sql_query = SELECT (addresses.id * 4 + 2) AS id, '' AS address_name, 0 AS capitalization, 'Geo::Address' AS class, 2 AS class_id, '' AS company, '' AS company_name, 0 AS company_name_facet, '' AS company_two, CONCAT_WS(' ', addresses.line_1, addresses.line_2, addresses.city, addresses.province_region, addresses.zip_postal_code) AS content, UNIX_TIMESTAMP('1970-01-01 00:00:00') AS created_at, 0 AS deleted, '' AS email, '' AS login, '' AS mission_statement, addresses.name AS name, states.name AS state, 0 AS user_id FROM addresses LEFT OUTER JOIN states AS states ON states.id = addresses.state_id WHERE addresses.id >= $start AND addresses.id <= $end GROUP BY id
|
100
100
|
|
101
101
|
sql_group_column = capitalization
|
102
102
|
sql_group_column = class_id
|
@@ -127,7 +127,7 @@ sql_host = localhost
|
|
127
127
|
sql_pass =
|
128
128
|
sql_user = root
|
129
129
|
sql_query_range = SELECT MIN(id), MAX(id) FROM users
|
130
|
-
sql_query = SELECT (users.id * 4 + 3) AS id, '' AS address_name, 0 AS capitalization, 'User' AS class, 3 AS class_id, sellers.company_name AS company, '' AS company_name, 0 AS company_name_facet, '' AS content, UNIX_TIMESTAMP('1970-01-01 00:00:00') AS created_at, users.deleted AS deleted, users.email AS email,
|
130
|
+
sql_query = SELECT (users.id * 4 + 3) AS id, '' AS address_name, 0 AS capitalization, 'User' AS class, 3 AS class_id, sellers.company_name AS company, '' AS company_name, 0 AS company_name_facet, REPLACE(sellers_two.company_name, '6', ' replacement ') AS company_two, '' AS content, UNIX_TIMESTAMP('1970-01-01 00:00:00') AS created_at, users.deleted AS deleted, users.email AS email, users.login AS login, '' AS mission_statement, '' AS name, '' AS state, 0 AS user_id FROM users LEFT OUTER JOIN sellers AS sellers ON users.id = sellers.user_id LEFT OUTER JOIN sellers AS sellers_two ON users.id = sellers_two.user_id WHERE users.id >= $start AND users.id <= $end AND (deleted = 0) GROUP BY id
|
131
131
|
|
132
132
|
sql_group_column = capitalization
|
133
133
|
sql_group_column = class_id
|
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
|
-
# Auto-generated at
|
2
|
+
# Auto-generated at Wed Nov 14 03:28:33 -0500 2007.
|
3
3
|
# Hand modifications will be overwritten.
|
4
|
-
# /Users/eweaver/Desktop/projects/
|
4
|
+
# /Users/eweaver/Desktop/projects/fauna/ultrasphinx/trunk/test/integration/app/config/ultrasphinx/default.base
|
5
5
|
indexer {
|
6
6
|
mem_limit = 256M
|
7
7
|
}
|
@@ -34,7 +34,7 @@ sql_host = localhost
|
|
34
34
|
sql_pass =
|
35
35
|
sql_user = root
|
36
36
|
sql_query_range = SELECT MIN(id), MAX(id) FROM states
|
37
|
-
sql_query = SELECT (states.id * 4 + 0) AS id, CAST(GROUP_CONCAT(addresses.name SEPARATOR ' ') AS CHAR) AS address_name, 0 AS capitalization, 'Geo::State' AS class, 0 AS class_id, '' AS company, '' AS company_name, 0 AS company_name_facet, '' AS content, UNIX_TIMESTAMP('1970-01-01 00:00:00') AS created_at, 0 AS deleted, '' AS email, '
|
37
|
+
sql_query = SELECT (states.id * 4 + 0) AS id, CAST(GROUP_CONCAT(DISTINCT addresses.name SEPARATOR ' ') AS CHAR) AS address_name, 0 AS capitalization, 'Geo::State' AS class, 0 AS class_id, '' AS company, '' AS company_name, 0 AS company_name_facet, '' AS company_two, '' AS content, UNIX_TIMESTAMP('1970-01-01 00:00:00') AS created_at, 0 AS deleted, '' AS email, '' AS login, '' AS mission_statement, '' AS name, '' AS state, 0 AS user_id FROM states LEFT OUTER JOIN addresses AS addresses ON states.id = addresses.state_id WHERE states.id >= $start AND states.id <= $end GROUP BY id
|
38
38
|
|
39
39
|
sql_group_column = capitalization
|
40
40
|
sql_group_column = class_id
|
@@ -65,7 +65,7 @@ sql_host = localhost
|
|
65
65
|
sql_pass =
|
66
66
|
sql_user = root
|
67
67
|
sql_query_range = SELECT MIN(id), MAX(id) FROM sellers
|
68
|
-
sql_query = SELECT (sellers.id * 4 + 1) AS id, '' AS address_name, sellers.capitalization AS capitalization, 'Seller' AS class, 1 AS class_id, '' AS company, sellers.company_name AS company_name, CRC32(sellers.company_name) AS company_name_facet, '' AS content, UNIX_TIMESTAMP(sellers.created_at) AS created_at, 0 AS deleted, '' AS email, '
|
68
|
+
sql_query = SELECT (sellers.id * 4 + 1) AS id, '' AS address_name, sellers.capitalization AS capitalization, 'Seller' AS class, 1 AS class_id, '' AS company, sellers.company_name AS company_name, CRC32(sellers.company_name) AS company_name_facet, '' AS company_two, '' AS content, UNIX_TIMESTAMP(sellers.created_at) AS created_at, 0 AS deleted, '' AS email, '' AS login, sellers.mission_statement AS mission_statement, '' AS name, '' AS state, sellers.user_id AS user_id FROM sellers WHERE sellers.id >= $start AND sellers.id <= $end GROUP BY id
|
69
69
|
|
70
70
|
sql_group_column = capitalization
|
71
71
|
sql_group_column = class_id
|
@@ -96,7 +96,7 @@ sql_host = localhost
|
|
96
96
|
sql_pass =
|
97
97
|
sql_user = root
|
98
98
|
sql_query_range = SELECT MIN(id), MAX(id) FROM addresses
|
99
|
-
sql_query = SELECT (addresses.id * 4 + 2) AS id, '' AS address_name, 0 AS capitalization, 'Geo::Address' AS class, 2 AS class_id, '' AS company, '' AS company_name, 0 AS company_name_facet, CONCAT_WS(' ', addresses.line_1, addresses.line_2, addresses.city, addresses.province_region, addresses.zip_postal_code) AS content, UNIX_TIMESTAMP('1970-01-01 00:00:00') AS created_at, 0 AS deleted, '' AS email, '
|
99
|
+
sql_query = SELECT (addresses.id * 4 + 2) AS id, '' AS address_name, 0 AS capitalization, 'Geo::Address' AS class, 2 AS class_id, '' AS company, '' AS company_name, 0 AS company_name_facet, '' AS company_two, CONCAT_WS(' ', addresses.line_1, addresses.line_2, addresses.city, addresses.province_region, addresses.zip_postal_code) AS content, UNIX_TIMESTAMP('1970-01-01 00:00:00') AS created_at, 0 AS deleted, '' AS email, '' AS login, '' AS mission_statement, addresses.name AS name, states.name AS state, 0 AS user_id FROM addresses LEFT OUTER JOIN states AS states ON states.id = addresses.state_id WHERE addresses.id >= $start AND addresses.id <= $end GROUP BY id
|
100
100
|
|
101
101
|
sql_group_column = capitalization
|
102
102
|
sql_group_column = class_id
|
@@ -127,7 +127,7 @@ sql_host = localhost
|
|
127
127
|
sql_pass =
|
128
128
|
sql_user = root
|
129
129
|
sql_query_range = SELECT MIN(id), MAX(id) FROM users
|
130
|
-
sql_query = SELECT (users.id * 4 + 3) AS id, '' AS address_name, 0 AS capitalization, 'User' AS class, 3 AS class_id, sellers.company_name AS company, '' AS company_name, 0 AS company_name_facet, '' AS content, UNIX_TIMESTAMP('1970-01-01 00:00:00') AS created_at, users.deleted AS deleted, users.email AS email,
|
130
|
+
sql_query = SELECT (users.id * 4 + 3) AS id, '' AS address_name, 0 AS capitalization, 'User' AS class, 3 AS class_id, sellers.company_name AS company, '' AS company_name, 0 AS company_name_facet, REPLACE(sellers_two.company_name, '6', ' replacement ') AS company_two, '' AS content, UNIX_TIMESTAMP('1970-01-01 00:00:00') AS created_at, users.deleted AS deleted, users.email AS email, users.login AS login, '' AS mission_statement, '' AS name, '' AS state, 0 AS user_id FROM users LEFT OUTER JOIN sellers AS sellers ON users.id = sellers.user_id LEFT OUTER JOIN sellers AS sellers_two ON users.id = sellers_two.user_id WHERE users.id >= $start AND users.id <= $end AND (deleted = 0) GROUP BY id
|
131
131
|
|
132
132
|
sql_group_column = capitalization
|
133
133
|
sql_group_column = class_id
|
@@ -5,7 +5,7 @@
|
|
5
5
|
company_name: <%= "seller#{num}" %>
|
6
6
|
capitalization: <%= num * 1.548 %>
|
7
7
|
mission_statement: <%= %w(Add value through developing superior products.).sort_by(&:rand).join(" ") %>
|
8
|
-
|
9
|
-
|
8
|
+
updated_at: <%= ((time = Time.parse("Tue Oct 23 04:28:11")) - num.days).to_s(:db) %>
|
9
|
+
created_at: <%= (time - num.weeks).to_s(:db) %>
|
10
10
|
<% end %>
|
11
11
|
|