public
Description: a maintained fork of Evan Weaver's Ultrasphinx code -- see the escape_sql branch
Homepage: http://blog.evanweaver.com/files/doc/fauna/ultrasphinx/files/README.html
Clone URL: git://github.com/DrMark/ultrasphinx.git
Use a migration generator for installing Postgres stored procedures (Lang 
Riley).


git-svn-id: svn://rubyforge.org/var/svn/fauna/ultrasphinx/trunk@1790 
c1ad287d-65d5-445d-b84c-e64f8492f1e6
evanweaver (author)
Sun Mar 30 22:25:52 -0700 2008
commit  72c199c2ec448fd620d33ff19454c93caec22215
tree    f2d5b0e7cd97739ef840553e95c861fd15890ea8
parent  0aef4531038ff7e9c79e2a38782fef782220e231
...
1
 
 
2
3
4
...
1
2
3
4
5
6
0
@@ -1,4 +1,6 @@
0
 
0
+v1.9.3. Move Postgres stored procedures into a migration generator (Lang Riley).
0
+
0
 v1.9.2. Add geodistance support (Jeremy Seitz, Mark Lane).
0
 
0
 v1.9.1. Add ultrasphinx:index:merge task for index merging, and a note in DEPLOYMENT_NOTES about how to use it.
0
...
125
126
127
128
 
129
130
131
...
125
126
127
 
128
129
130
131
0
@@ -125,7 +125,7 @@ See DEPLOYMENT_NOTES[link:files/DEPLOYMENT_NOTES.html].
0
 
0
 Note that since Ultrasphinx preloads indexed models, you need to make sure those models have their own dependencies in place early in the boot process. This may require adjusting the general plugin load order or moving monkey-patches from <tt>lib/</tt> to <tt>vendor/plugins/</tt>.
0
 
0
-PostgreSQL 8.2 and higher are well supported. However, make sure you have executed <tt>CREATE LANGUAGE plpgsql;</tt> at least once. This step does not need to be repeated, so depending on your DB permissions, you might be able to put it in a migration.
0
+PostgreSQL 8.2 and higher are well supported. However, make sure the stored procedure migration gets generated correctly. If you did not install the plugin via <tt>script/install</tt>, run <tt>script/generate ultrasphinx_migration</tt> by hand.
0
 
0
 == Reporting problems
0
 
...
231
232
233
234
235
 
 
 
 
 
 
 
 
236
237
238
...
231
232
233
 
 
234
235
236
237
238
239
240
241
242
243
244
0
@@ -231,8 +231,14 @@ module Ultrasphinx
0
       
0
 
0
       def build_regular_fields(klass, fields, entries, column_strings, join_strings, group_bys, remaining_columns)
0
- entries.to_a.each do |entry|
0
- source_string = "#{entry['table_alias']}.#{entry['field']}"
0
+ entries.to_a.each do |entry|
0
+
0
+ source_string = if entry['sortable']
0
+ entry['field'] # Use the alias
0
+ else
0
+ "#{entry['table_alias']}.#{entry['field']}" # Use the column
0
+ end
0
+
0
           group_bys << source_string
0
           column_strings, remaining_columns = install_field(fields, source_string, entry['as'], entry['function_sql'], entry['facet'], column_strings, remaining_columns)
0
         end
...
99
100
101
102
103
104
105
106
107
108
...
99
100
101
 
102
 
 
103
104
105
0
@@ -99,10 +99,7 @@ This is a special singleton configuration class that stores the index field conf
0
         begin
0
         
0
           # Fields are from the model
0
- # We destructively canonicize them back onto the configuration hash
0
           options['fields'] = options['fields'].to_a.map do |entry|
0
- entry = {'field' => entry} unless entry.is_a? Hash
0
-
0
             extract_table_alias!(entry, klass)
0
             extract_field_alias!(entry, klass)
0
             
...
198
199
200
201
 
 
202
203
204
...
219
220
221
 
 
 
 
 
 
 
 
 
 
 
 
222
223
224
...
198
199
200
 
201
202
203
204
205
...
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
0
@@ -198,7 +198,8 @@ If the associations weren't just <tt>has_many</tt> and <tt>belongs_to</tt>, you
0
           entry.assert_valid_keys ['field', 'as', 'facet', 'function_sql', 'sortable']
0
           entry
0
         else
0
- entry.to_s
0
+ # Single strings
0
+ {'field' => entry.to_s}
0
         end
0
       end
0
       
0
@@ -219,6 +220,18 @@ If the associations weren't just <tt>has_many</tt> and <tt>belongs_to</tt>, you
0
         entry._stringify_all!('sortable', 'facet')
0
         entry.assert_valid_keys ['class_name', 'association_name', 'field', 'as', 'association_sql', 'facet', 'function_sql', 'sortable']
0
       end
0
+
0
+ # Add special alias columns for text sortables so that the original column doesn't get
0
+ # removed, since Sphinx will either store stems or ordinals but not both. We use the
0
+ # original alias as source so that the query doesn't get repeated in case it is
0
+ # resource-intensive.
0
+ opts.slice('fields', 'concatenate', 'include').values._flatten_once.each do |entry|
0
+ if entry['sortable']
0
+ entry.delete('sortable')
0
+ name = "#{entry['as'] || entry['field']}"
0
+ opts['fields'] << {'field' => name, 'as' => "#{name}_sortable", 'sortable' => true}
0
+ end
0
+ end
0
             
0
       Ultrasphinx::MODEL_CONFIGURATION[self.name] = opts
0
     end
...
1
2
3
4
 
5
6
7
8
 
 
9
10
11
...
1
2
3
 
4
5
6
 
 
7
8
9
10
11
0
@@ -1,11 +1,11 @@
0
 
0
 /* http://osdir.com/ml/db.postgresql.admIN/2003-08/msg00057.html */
0
 
0
-CREATE OR REPLACE FUNCTION MAKE_CONCAT_WS() RETURNS text AS '
0
+CREATE FUNCTION MAKE_CONCAT_WS() RETURNS text AS '
0
 declare
0
   v_args int := 32;
0
- v_first text := ''CREATE OR REPLACE FUNCTION CONCAT_WS(text,text,text) RETURNS text AS ''''SELECT CASE WHEN $1 IS NULL THEN NULL WHEN $3 IS NULL THEN $2 ELSE $2 || $1 || $3 END'''' LANGUAGE sql IMMUTABLE'';
0
- v_part1 text := ''CREATE OR REPLACE FUNCTION CONCAT_WS(text,text'';
0
+ v_first text := ''CREATE FUNCTION CONCAT_WS(text,text,text) RETURNS text AS ''''SELECT CASE WHEN $1 IS NULL THEN NULL WHEN $3 IS NULL THEN $2 ELSE $2 || $1 || $3 END'''' LANGUAGE sql IMMUTABLE'';
0
+ v_part1 text := ''CREATE FUNCTION CONCAT_WS(text,text'';
0
   v_part2 text := '') RETURNS text AS ''''SELECT CONCAT_WS($1,CONCAT_WS($1,$2'';
0
   v_part3 text := '')'''' LANGUAGE sql IMMUTABLE'';
0
   v_sql text;
...
1
2
3
4
 
5
6
7
...
1
2
3
 
4
5
6
7
0
@@ -1,7 +1,7 @@
0
 
0
 /* Fake CRC32 */
0
 
0
-CREATE OR REPLACE FUNCTION crc32(text)
0
+CREATE FUNCTION crc32(text)
0
 RETURNS bigint AS $$
0
   DECLARE
0
     tmp bigint;
...
6
7
8
9
 
10
11
12
...
15
16
17
18
19
20
21
22
...
6
7
8
 
9
10
11
12
...
15
16
17
 
 
18
19
20
0
@@ -6,7 +6,7 @@
0
  Note: For DISTINCT and ORDER BY a subquery is required
0
 */
0
 
0
-CREATE OR REPLACE FUNCTION _group_concat(text, text)
0
+CREATE FUNCTION _group_concat(text, text)
0
 RETURNS text AS $$
0
   SELECT CASE
0
     WHEN $2 IS NULL THEN $1
0
@@ -15,8 +15,6 @@ RETURNS text AS $$
0
   END
0
 $$ IMMUTABLE LANGUAGE SQL;
0
 
0
-DROP AGGREGATE IF EXISTS group_concat(text);
0
-
0
 CREATE AGGREGATE group_concat (
0
   BASETYPE = text,
0
   SFUNC = _group_concat,
...
1
2
 
3
4
5
...
1
 
2
3
4
5
0
@@ -1,5 +1,5 @@
0
 
0
-CREATE OR REPLACE FUNCTION hex_to_int(varchar) RETURNS int4 AS '
0
+CREATE FUNCTION hex_to_int(varchar) RETURNS int4 AS '
0
   DECLARE
0
     h alias for $1;
0
     exec varchar;
...
6
7
8
9
 
10
11
12
...
6
7
8
 
9
10
11
12
0
@@ -6,7 +6,7 @@
0
  UNIX_TIMESTAMP(date)
0
 */
0
 
0
-CREATE OR REPLACE FUNCTION unix_timestamp(timestamp without time zone)
0
+CREATE FUNCTION unix_timestamp(timestamp without time zone)
0
 RETURNS bigint AS $$
0
   SELECT EXTRACT(EPOCH FROM $1)::bigint
0
 $$ VOLATILE LANGUAGE SQL;
...
83
84
85
86
 
87
88
89
...
83
84
85
 
86
87
88
89
0
@@ -83,7 +83,7 @@ Note that Sphinx expects lat/long to be indexed as radians. If you have degrees
0
 
0
 Then, set <tt>Ultrasphinx::Search.client_options[:location][:units] = 'degrees'</tt>.
0
 
0
-The <tt>:double</tt> column type is recommended for storing location data.
0
+The MySQL <tt>:double</tt> column type is recommended for storing location data. For Postgres, use <tt>:float</tt.
0
 
0
 == Interlock integration
0
   
...
48
49
50
 
 
 
51
52
53
...
124
125
126
127
 
128
129
130
...
258
259
260
261
 
 
 
 
262
263
264
...
48
49
50
51
52
53
54
55
56
...
127
128
129
 
130
131
132
133
...
261
262
263
 
264
265
266
267
268
269
270
0
@@ -48,6 +48,9 @@ module Ultrasphinx
0
           end
0
         end
0
         
0
+ # Use the additional sortable column if it is a text type
0
+ sort_by += "_sortable" if Fields.instance.types[sort_by] == "text"
0
+
0
         unless sort_by.blank?
0
           if opts['sort_mode'].to_s == 'relevance'
0
             # If you're sorting by a field you don't want 'relevance' order
0
@@ -124,7 +127,7 @@ module Ultrasphinx
0
                 raise NoMethodError
0
             end
0
           rescue NoMethodError => e
0
- raise UsageError, "filter value #{value.inspect} for field #{field.inspect} is invalid"
0
+ raise UsageError, "Filter value #{value.inspect} for field #{field.inspect} is invalid"
0
           end
0
         end
0
         
0
@@ -258,7 +261,10 @@ module Ultrasphinx
0
             
0
       # Inverse-modulus map the Sphinx ids to the table-specific ids
0
       def convert_sphinx_ids(sphinx_ids)
0
- number_of_models = IDS_TO_MODELS.size
0
+
0
+ number_of_models = IDS_TO_MODELS.size
0
+ raise ConfigurationError, "No model mappings were found. Your #{RAILS_ENV}.conf file is corrupted, or your application container needs to be restarted." if number_of_models == 0
0
+
0
         sphinx_ids.sort_by do |item|
0
           item[:index]
0
         end.map do |item|
...
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
...
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
0
@@ -67,43 +67,30 @@ module Ultrasphinx
0
       'group_concat' => "CAST(GROUP_CONCAT(DISTINCT ? ? SEPARATOR ' ') AS CHAR)",
0
       'delta' => "DATE_SUB(NOW(), INTERVAL ? SECOND)",
0
       'hash' => "CAST(CRC32(?) AS unsigned)",
0
- 'range_cast' => "?",
0
- 'stored_procedures' => {}
0
+ 'range_cast' => "?"
0
     },
0
     'postgresql' => {
0
       'group_concat' => "GROUP_CONCAT(?)",
0
       'delta' => "(NOW() - '? SECOND'::interval)",
0
       'range_cast' => "cast(coalesce(?,1) AS integer)",
0
- 'hash' => "CRC32(?)",
0
- 'stored_procedures' => Hash[*(
0
- ['hex_to_int', 'group_concat', 'concat_ws', 'unix_timestamp', 'crc32'].map do |name|
0
- [name, load_stored_procedure(name)]
0
- end.flatten
0
- )
0
- ]
0
+ 'hash' => "CRC32(?)"
0
     }
0
   }
0
   
0
   DEFAULTS = {
0
     'mysql' => %(
0
-type = mysql
0
-sql_query_pre = SET SESSION group_concat_max_len = 65535
0
-sql_query_pre = SET NAMES utf8
0
- ),
0
+ type = mysql
0
+ sql_query_pre = SET SESSION group_concat_max_len = 65535
0
+ sql_query_pre = SET NAMES utf8
0
+ ),
0
     'postgresql' => %(
0
-type = pgsql
0
-sql_query_pre = ) + SQL_FUNCTIONS['postgresql']['stored_procedures'].values.join(' ') + %(
0
- )
0
-}
0
+ type = pgsql
0
+ sql_query_pre =
0
+ )
0
+ }
0
     
0
   ADAPTER = ActiveRecord::Base.connection.instance_variable_get("@config")[:adapter] rescue 'mysql'
0
-
0
- # Install the stored procedures.
0
- # XXX This shouldn't be done at every index, say the Postgres people.
0
- SQL_FUNCTIONS[ADAPTER]['stored_procedures'].each do |key, value|
0
- ActiveRecord::Base.connection.execute(value)
0
- end
0
-
0
+
0
   # Warn-mode logger. Also called from rake tasks.
0
   def self.say msg
0
     # XXX Method name is stupid.
...
3
4
5
6
 
7
8
9
...
3
4
5
 
6
7
8
9
0
@@ -3,7 +3,7 @@ class Seller < ActiveRecord::Base
0
   delegate :address, :to => :user
0
   
0
   is_indexed :fields => [
0
- {:field => :company_name, :facet => true},
0
+ {:field => :company_name, :facet => true, :sortable => true},
0
     {:field => 'mission_statement', :sortable => true},
0
     'created_at',
0
     :capitalization,
...
1
2
 
3
4
 
5
6
7
...
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
...
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
...
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
...
128
129
130
131
132
133
134
 
 
 
 
135
136
137
138
139
140
 
141
142
143
144
145
 
146
147
148
149
150
151
 
152
153
154
...
162
163
164
165
166
167
168
 
 
 
 
169
170
171
172
173
174
 
175
176
177
178
179
 
180
181
182
183
184
185
 
186
187
188
...
219
220
221
222
223
224
225
 
 
 
 
226
227
228
229
230
231
 
232
233
234
235
236
 
237
238
239
240
241
242
 
243
244
245
...
253
254
255
256
257
258
259
 
 
 
 
260
261
262
263
264
265
 
266
267
268
269
270
 
271
272
273
274
275
276
 
277
278
279
...
287
288
289
290
291
292
293
 
 
 
 
294
295
296
297
298
299
 
300
301
302
303
304
 
305
306
307
308
309
310
 
311
312
313
...
1
 
2
3
 
4
5
6
7
...
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
...
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
...
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
121
122
123
...
131
132
133
 
 
 
 
134
135
136
137
138
139
140
141
142
 
143
144
145
146
147
148
149
150
151
152
153
154
 
155
156
157
158
...
166
167
168
 
 
 
 
169
170
171
172
173
174
175
176
177
 
178
179
180
181
182
183
184
185
186
187
188
189
 
190
191
192
193
...
224
225
226
 
 
 
 
227
228
229
230
231
232
233
234
235
 
236
237
238
239
240
241
242
243
244
245
246
247
 
248
249
250
251
...
259
260
261
 
 
 
 
262
263
264
265
266
267
268
269
270
 
271
272
273
274
275
276
277
278
279
280
281
282
 
283
284
285
286
...
294
295
296
 
 
 
 
297
298
299
300
301
302
303
304
305
 
306
307
308
309
310
311
312
313
314
315
316
317
 
318
319
320
321
0
@@ -1,7 +1,7 @@
0
 
0
-# Auto-generated at Fri Mar 28 00:16:11 -0400 2008.
0
+# Auto-generated at Mon Mar 31 00:50:43 -0400 2008.
0
 # Hand modifications will be overwritten.
0
-# /Users/eweaver/Desktop/projects/fauna/ultrasphinx/trunk/test/integration/app/config/ultrasphinx/default.base
0
+# /Users/eweaver/Desktop/projects/ub/vendor/plugins/ultrasphinx/test/integration/app/config/ultrasphinx/default.base
0
 indexer {
0
   mem_limit = 256M
0
 }
0
@@ -26,27 +26,28 @@ source geo__states_main
0
   sql_query_post =
0
   sql_ranged_throttle = 0
0
 
0
-type = mysql
0
-sql_query_pre = SET SESSION group_concat_max_len = 65535
0
-sql_query_pre = SET NAMES utf8
0
-
0
+ type = mysql
0
+ sql_query_pre = SET SESSION group_concat_max_len = 65535
0
+ sql_query_pre = SET NAMES utf8
0
+
0
 sql_db = ultrasphinx_development
0
 sql_host = localhost
0
 sql_pass =
0
 sql_user = root
0
 sql_query_range = SELECT MIN(id) , MAX(id) FROM states
0
-sql_query = SELECT (states.id * 5 + 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, 0 AS company_facet, '' AS company_name, 0 AS company_name_facet, '' AS company_two, 0 AS company_two_facet, '' AS content, 18000 AS created_at, 0 AS deleted, '' AS email, 0 AS lat, 0 AS lng, '' 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 states.id
0
+sql_query = SELECT (states.id * 5 + 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, 0 AS company_facet, '' AS company_name, 0 AS company_name_facet, '' AS company_name_sortable, '' AS company_two, 0 AS company_two_facet, '' AS content, 18000 AS created_at, 0 AS deleted, '' AS email, 0 AS lat, 0 AS lng, '' AS login, '' AS mission_statement, '' AS mission_statement_sortable, '' 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 states.id
0
 
0
 sql_attr_float = capitalization
0
 sql_attr_uint = class_id
0
 sql_attr_uint = company_facet
0
 sql_attr_uint = company_name_facet
0
+sql_attr_str2ordinal = company_name_sortable
0
 sql_attr_uint = company_two_facet
0
 sql_attr_timestamp = created_at
0
 sql_attr_bool = deleted
0
 sql_attr_float = lat
0
 sql_attr_float = lng
0
-sql_attr_str2ordinal = mission_statement
0
+sql_attr_str2ordinal = mission_statement_sortable
0
 sql_attr_uint = user_id
0
 sql_query_info = SELECT * FROM states WHERE states.id = (($id - 0) / 5)
0
 }
0
@@ -60,27 +61,28 @@ source sellers_main
0
   sql_query_post =
0
   sql_ranged_throttle = 0
0
 
0
-type = mysql
0
-sql_query_pre = SET SESSION group_concat_max_len = 65535
0
-sql_query_pre = SET NAMES utf8
0
-
0
+ type = mysql
0
+ sql_query_pre = SET SESSION group_concat_max_len = 65535
0
+ sql_query_pre = SET NAMES utf8
0
+
0
 sql_db = ultrasphinx_development
0
 sql_host = localhost
0
 sql_pass =
0
 sql_user = root
0
 sql_query_range = SELECT MIN(id) , MAX(id) FROM sellers
0
-sql_query = SELECT (sellers.id * 5 + 1) AS id, '' AS address_name, sellers.capitalization AS capitalization, 'Seller' AS class, 1 AS class_id, '' AS company, 0 AS company_facet, sellers.company_name AS company_name, CAST(CRC32(sellers.company_name) AS unsigned) AS company_name_facet, '' AS company_two, 0 AS company_two_facet, '' AS content, UNIX_TIMESTAMP(sellers.created_at) AS created_at, 0 AS deleted, '' AS email, 0 AS lat, 0 AS lng, '' 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 sellers.id
0
+sql_query = SELECT (sellers.id * 5 + 1) AS id, '' AS address_name, sellers.capitalization AS capitalization, 'Seller' AS class, 1 AS class_id, '' AS company, 0 AS company_facet, sellers.company_name AS company_name, CAST(CRC32(sellers.company_name) AS unsigned) AS company_name_facet, company_name AS company_name_sortable, '' AS company_two, 0 AS company_two_facet, '' AS content, UNIX_TIMESTAMP(sellers.created_at) AS created_at, 0 AS deleted, '' AS email, 0 AS lat, 0 AS lng, '' AS login, sellers.mission_statement AS mission_statement, mission_statement AS mission_statement_sortable, '' AS name, '' AS state, sellers.user_id AS user_id FROM sellers WHERE sellers.id >= $start AND sellers.id <= $end GROUP BY sellers.id
0
 
0
 sql_attr_float = capitalization
0
 sql_attr_uint = class_id
0
 sql_attr_uint = company_facet
0
 sql_attr_uint = company_name_facet
0
+sql_attr_str2ordinal = company_name_sortable
0
 sql_attr_uint = company_two_facet
0
 sql_attr_timestamp = created_at
0
 sql_attr_bool = deleted
0
 sql_attr_float = lat
0
 sql_attr_float = lng
0
-sql_attr_str2ordinal = mission_statement
0
+sql_attr_str2ordinal = mission_statement_sortable
0
 sql_attr_uint = user_id
0
 sql_query_info = SELECT * FROM sellers WHERE sellers.id = (($id - 1) / 5)
0
 }
0
@@ -94,27 +96,28 @@ source geo__addresses_main
0
   sql_query_post =
0
   sql_ranged_throttle = 0
0
 
0
-type = mysql
0
-sql_query_pre = SET SESSION group_concat_max_len = 65535
0
-sql_query_pre = SET NAMES utf8
0
-
0
+ type = mysql
0
+ sql_query_pre = SET SESSION group_concat_max_len = 65535
0
+ sql_query_pre = SET NAMES utf8
0
+
0
 sql_db = ultrasphinx_development
0
 sql_host = localhost
0
 sql_pass =
0
 sql_user = root
0
 sql_query_range = SELECT MIN(id) , MAX(id) FROM addresses
0
-sql_query = SELECT (addresses.id * 5 + 2) AS id, '' AS address_name, 0 AS capitalization, 'Geo::Address' AS class, 2 AS class_id, '' AS company, 0 AS company_facet, '' AS company_name, 0 AS company_name_facet, '' AS company_two, 0 AS company_two_facet, CONCAT_WS(' ', addresses.line_1, addresses.line_2, addresses.city, addresses.province_region, addresses.zip_postal_code) AS content, 18000 AS created_at, 0 AS deleted, '' AS email, RADIANS(addresses.lat) AS lat, RADIANS(addresses.lng) AS lng, '' AS login, '' AS mission_statement, addresses.name AS name, state.name AS state, 0 AS user_id FROM addresses LEFT OUTER JOIN states AS state ON state.id = addresses.state_id WHERE addresses.id >= $start AND addresses.id <= $end GROUP BY addresses.id
0
+sql_query = SELECT (addresses.id * 5 + 2) AS id, '' AS address_name, 0 AS capitalization, 'Geo::Address' AS class, 2 AS class_id, '' AS company, 0 AS company_facet, '' AS company_name, 0 AS company_name_facet, '' AS company_name_sortable, '' AS company_two, 0 AS company_two_facet, CONCAT_WS(' ', addresses.line_1, addresses.line_2, addresses.city, addresses.province_region, addresses.zip_postal_code) AS content, 18000 AS created_at, 0 AS deleted, '' AS email, RADIANS(addresses.lat) AS lat, RADIANS(addresses.lng) AS lng, '' AS login, '' AS mission_statement, '' AS mission_statement_sortable, addresses.name AS name, state.name AS state, 0 AS user_id FROM addresses LEFT OUTER JOIN states AS state ON state.id = addresses.state_id WHERE addresses.id >= $start AND addresses.id <= $end GROUP BY addresses.id
0
 
0
 sql_attr_float = capitalization
0
 sql_attr_uint = class_id
0
 sql_attr_uint = company_facet
0
 sql_attr_uint = company_name_facet
0
+sql_attr_str2ordinal = company_name_sortable
0
 sql_attr_uint = company_two_facet
0
 sql_attr_timestamp = created_at
0
 sql_attr_bool = deleted
0
 sql_attr_float = lat
0
 sql_attr_float = lng
0
-sql_attr_str2ordinal = mission_statement
0
+sql_attr_str2ordinal = mission_statement_sortable
0
 sql_attr_uint = user_id
0
 sql_query_info = SELECT * FROM addresses WHERE addresses.id = (($id - 2) / 5)
0
 }
0
@@ -128,27 +131,28 @@ source users_main
0
   sql_query_post =
0
   sql_ranged_throttle = 0
0
 
0
-type = mysql
0
-sql_query_pre = SET SESSION group_concat_max_len = 65535
0
-sql_query_pre = SET NAMES utf8
0
-
0
+ type = mysql
0
+ sql_query_pre = SET SESSION group_concat_max_len = 65535
0
+ sql_query_pre = SET NAMES utf8
0
+
0
 sql_db = ultrasphinx_development
0
 sql_host = localhost
0
 sql_pass =
0
 sql_user = root
0
 sql_query_range = SELECT MIN(id) , MAX(id) FROM users
0
-sql_query = SELECT (users.id * 5 + 3) AS id, '' AS address_name, 0 AS capitalization, 'User' AS class, 3 AS class_id, specific_seller.company_name AS company, CAST(CRC32(specific_seller.company_name) AS unsigned) AS company_facet, '' AS company_name, 0 AS company_name_facet, REPLACE(sellers_two.company_name, '6', ' replacement ') AS company_two, CAST(CRC32(REPLACE(sellers_two.company_name, '6', ' replacement ')) AS unsigned) AS company_two_facet, '' AS content, 18000 AS created_at, users.deleted AS deleted, users.email AS email, 0 AS lat, 0 AS lng, users.login AS login, '' AS mission_statement, '' AS name, '' AS state, 0 AS user_id FROM users LEFT OUTER JOIN sellers AS specific_seller ON users.id = specific_seller.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 users.id
0
+sql_query = SELECT (users.id * 5 + 3) AS id, '' AS address_name, 0 AS capitalization, 'User' AS class, 3 AS class_id, specific_seller.company_name AS company, CAST(CRC32(specific_seller.company_name) AS unsigned) AS company_facet, '' AS company_name, 0 AS company_name_facet, '' AS company_name_sortable, REPLACE(sellers_two.company_name, '6', ' replacement ') AS company_two, CAST(CRC32(REPLACE(sellers_two.company_name, '6', ' replacement ')) AS unsigned) AS company_two_facet, '' AS content, 18000 AS created_at, users.deleted AS deleted, users.email AS email, 0 AS lat, 0 AS lng, users.login AS login, '' AS mission_statement, '' AS mission_statement_sortable, '' AS name, '' AS state, 0 AS user_id FROM users LEFT OUTER JOIN sellers AS specific_seller ON users.id = specific_seller.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 users.id
0
 
0
 sql_attr_float = capitalization
0
 sql_attr_uint = class_id
0
 sql_attr_uint = company_facet
0
 sql_attr_uint = company_name_facet
0
+sql_attr_str2ordinal = company_name_sortable
0
 sql_attr_uint = company_two_facet
0
 sql_attr_timestamp = created_at
0
 sql_attr_bool = deleted
0
 sql_attr_float = lat
0
 sql_attr_float = lng
0
-sql_attr_str2ordinal = mission_statement
0
+sql_attr_str2ordinal = mission_statement_sortable
0
 sql_attr_uint = user_id
0
 sql_query_info = SELECT * FROM users WHERE users.id = (($id - 3) / 5)
0
 }
0
@@ -162,27 +166,28 @@ source geo__countries_main
0
   sql_query_post =
0
   sql_ranged_throttle = 0
0
 
0
-type = mysql
0
-sql_query_pre = SET SESSION group_concat_max_len = 65535
0
-sql_query_pre = SET NAMES utf8
0
-
0
+ type = mysql
0
+ sql_query_pre = SET SESSION group_concat_max_len = 65535
0
+ sql_query_pre = SET NAMES utf8
0
+
0
 sql_db = ultrasphinx_development
0
 sql_host = localhost
0
 sql_pass =
0
 sql_user = root
0
 sql_query_range = SELECT MIN(id) , MAX(id) FROM countries
0
-sql_query = SELECT (countries.id * 5 + 4) AS id, '' AS address_name, 0 AS capitalization, 'Geo::Country' AS class, 4 AS class_id, '' AS company, 0 AS company_facet, '' AS company_name, 0 AS company_name_facet, '' AS company_two, 0 AS company_two_facet, '' AS content, 18000 AS created_at, 0 AS deleted, '' AS email, 0 AS lat, 0 AS lng, '' AS login, '' AS mission_statement, countries.name AS name, '' AS state, 0 AS user_id FROM countries WHERE countries.id >= $start AND countries.id <= $end GROUP BY countries.id
0
+sql_query = SELECT (countries.id * 5 + 4) AS id, '' AS address_name, 0 AS capitalization, 'Geo::Country' AS class, 4 AS class_id, '' AS company, 0 AS company_facet, '' AS company_name, 0 AS company_name_facet, '' AS company_name_sortable, '' AS company_two, 0 AS company_two_facet, '' AS content, 18000 AS created_at, 0 AS deleted, '' AS email, 0 AS lat, 0 AS lng, '' AS login, '' AS mission_statement, '' AS mission_statement_sortable, countries.name AS name, '' AS state, 0 AS user_id FROM countries WHERE countries.id >= $start AND countries.id <= $end GROUP BY countries.id
0
 
0
 sql_attr_float = capitalization
0
 sql_attr_uint = class_id
0
 sql_attr_uint = company_facet
0
 sql_attr_uint = company_name_facet
0
+sql_attr_str2ordinal = company_name_sortable
0
 sql_attr_uint = company_two_facet
0
 sql_attr_timestamp = created_at
0
 sql_attr_bool = deleted
0
 sql_attr_float = lat
0
 sql_attr_float = lng
0
-sql_attr_str2ordinal = mission_statement
0
+sql_attr_str2ordinal = mission_statement_sortable
0
 sql_attr_uint = user_id
0
 sql_query_info = SELECT * FROM countries WHERE countries.id = (($id - 4) / 5)
0
 }
0
@@ -219,27 +224,28 @@ source sellers_delta
0
   sql_query_post =
0
   sql_ranged_throttle = 0
0
 
0
-type = mysql
0
-sql_query_pre = SET SESSION group_concat_max_len = 65535
0
-sql_query_pre = SET NAMES utf8
0
-
0
+ type = mysql
0
+ sql_query_pre = SET SESSION group_concat_max_len = 65535
0
+ sql_query_pre = SET NAMES utf8
0
+
0
 sql_db = ultrasphinx_development
0
 sql_host = localhost
0
 sql_pass =
0
 sql_user = root
0
 sql_query_range = SELECT MIN(id) , MAX(id) FROM sellers WHERE sellers.updated_at > DATE_SUB(NOW(), INTERVAL 88200 SECOND)
0
-sql_query = SELECT (sellers.id * 5 + 1) AS id, '' AS address_name, sellers.capitalization AS capitalization, 'Seller' AS class, 1 AS class_id, '' AS company, 0 AS company_facet, sellers.company_name AS company_name, CAST(CRC32(sellers.company_name) AS unsigned) AS company_name_facet, '' AS company_two, 0 AS company_two_facet, '' AS content, UNIX_TIMESTAMP(sellers.created_at) AS created_at, 0 AS deleted, '' AS email, 0 AS lat, 0 AS lng, '' 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 AND sellers.updated_at > DATE_SUB(NOW(), INTERVAL 88200 SECOND) GROUP BY sellers.id
0
+sql_query = SELECT (sellers.id * 5 + 1) AS id, '' AS address_name, sellers.capitalization AS capitalization, 'Seller' AS class, 1 AS class_id, '' AS company, 0 AS company_facet, sellers.company_name AS company_name, CAST(CRC32(sellers.company_name) AS unsigned) AS company_name_facet, company_name AS company_name_sortable, '' AS company_two, 0 AS company_two_facet, '' AS content, UNIX_TIMESTAMP(sellers.created_at) AS created_at, 0 AS deleted, '' AS email, 0 AS lat, 0 AS lng, '' AS login, sellers.mission_statement AS mission_statement, mission_statement AS mission_statement_sortable, '' AS name, '' AS state, sellers.user_id AS user_id FROM sellers WHERE sellers.id >= $start AND sellers.id <= $end AND sellers.updated_at > DATE_SUB(NOW(), INTERVAL 88200 SECOND) GROUP BY sellers.id
0
 
0
 sql_attr_float = capitalization
0
 sql_attr_uint = class_id
0
 sql_attr_uint = company_facet
0
 sql_attr_uint = company_name_facet
0
+sql_attr_str2ordinal = company_name_sortable
0
 sql_attr_uint = company_two_facet
0
 sql_attr_timestamp = created_at
0
 sql_attr_bool = deleted
0
 sql_attr_float = lat
0
 sql_attr_float = lng
0
-sql_attr_str2ordinal = mission_statement
0
+sql_attr_str2ordinal = mission_statement_sortable
0
 sql_attr_uint = user_id
0
 sql_query_info = SELECT * FROM sellers WHERE sellers.id = (($id - 1) / 5)
0
 }
0
@@ -253,27 +259,28 @@ source geo__addresses_delta
0
   sql_query_post =
0
   sql_ranged_throttle = 0
0
 
0
-type = mysql
0
-sql_query_pre = SET SESSION group_concat_max_len = 65535
0
-sql_query_pre = SET NAMES utf8
0
-
0
+ type = mysql
0
+ sql_query_pre = SET SESSION group_concat_max_len = 65535
0
+ sql_query_pre = SET NAMES utf8
0
+
0
 sql_db = ultrasphinx_development
0
 sql_host = localhost
0
 sql_pass =
0
 sql_user = root
0
 sql_query_range = SELECT MIN(id) , MAX(id) FROM addresses
0
-sql_query = SELECT (addresses.id * 5 + 2) AS id, '' AS address_name, 0 AS capitalization, 'Geo::Address' AS class, 2 AS class_id, '' AS company, 0 AS company_facet, '' AS company_name, 0 AS company_name_facet, '' AS company_two, 0 AS company_two_facet, CONCAT_WS(' ', addresses.line_1, addresses.line_2, addresses.city, addresses.province_region, addresses.zip_postal_code) AS content, 18000 AS created_at, 0 AS deleted, '' AS email, RADIANS(addresses.lat) AS lat, RADIANS(addresses.lng) AS lng, '' AS login, '' AS mission_statement, addresses.name AS name, state.name AS state, 0 AS user_id FROM addresses LEFT OUTER JOIN states AS state ON state.id = addresses.state_id WHERE addresses.id >= $start AND addresses.id <= $end GROUP BY addresses.id
0
+sql_query = SELECT (addresses.id * 5 + 2) AS id, '' AS address_name, 0 AS capitalization, 'Geo::Address' AS class, 2 AS class_id, '' AS company, 0 AS company_facet, '' AS company_name, 0 AS company_name_facet, '' AS company_name_sortable, '' AS company_two, 0 AS company_two_facet, CONCAT_WS(' ', addresses.line_1, addresses.line_2, addresses.city, addresses.province_region, addresses.zip_postal_code) AS content, 18000 AS created_at, 0 AS deleted, '' AS email, RADIANS(addresses.lat) AS lat, RADIANS(addresses.lng) AS lng, '' AS login, '' AS mission_statement, '' AS mission_statement_sortable, addresses.name AS name, state.name AS state, 0 AS user_id FROM addresses LEFT OUTER JOIN states AS state ON state.id = addresses.state_id WHERE addresses.id >= $start AND addresses.id <= $end GROUP BY addresses.id
0
 
0
 sql_attr_float = capitalization
0
 sql_attr_uint = class_id
0
 sql_attr_uint = company_facet
0
 sql_attr_uint = company_name_facet
0
+sql_attr_str2ordinal = company_name_sortable
0
 sql_attr_uint = company_two_facet
0
 sql_attr_timestamp = created_at
0
 sql_attr_bool = deleted
0
 sql_attr_float = lat
0
 sql_attr_float = lng
0
-sql_attr_str2ordinal = mission_statement
0
+sql_attr_str2ordinal = mission_statement_sortable
0
 sql_attr_uint = user_id
0
 sql_query_info = SELECT * FROM addresses WHERE addresses.id = (($id - 2) / 5)
0
 }