freelancing-god-thinking-sphinx 1.1.3 → 1.1.4
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/README +3 -1
- data/lib/thinking_sphinx.rb +2 -1
- data/lib/thinking_sphinx/adapters/abstract_adapter.rb +3 -2
- data/lib/thinking_sphinx/adapters/postgresql_adapter.rb +1 -1
- data/lib/thinking_sphinx/attribute.rb +6 -2
- data/lib/thinking_sphinx/collection.rb +9 -1
- data/lib/thinking_sphinx/facet.rb +58 -0
- data/lib/thinking_sphinx/facet_collection.rb +44 -0
- data/lib/thinking_sphinx/field.rb +1 -1
- data/lib/thinking_sphinx/index.rb +11 -10
- data/lib/thinking_sphinx/index/builder.rb +9 -0
- data/lib/thinking_sphinx/search.rb +12 -10
- data/lib/thinking_sphinx/tasks.rb +128 -0
- data/spec/unit/thinking_sphinx/attribute_spec.rb +1 -1
- data/tasks/rails.rake +1 -0
- data/vendor/riddle/lib/riddle.rb +1 -1
- data/vendor/riddle/lib/riddle/client.rb +1 -1
- data/vendor/riddle/lib/riddle/configuration/section.rb +7 -2
- data/vendor/riddle/lib/riddle/controller.rb +1 -1
- metadata +6 -4
data/README
CHANGED
|
@@ -48,7 +48,7 @@ database, causing the next run to have failures. Let that run complete and then
|
|
|
48
48
|
Since I first released this library, there's been quite a few people who have submitted patches, to my immense gratitude. Others have suggested syntax changes and general improvements. So my thanks to the following people:
|
|
49
49
|
|
|
50
50
|
- Joost Hietbrink
|
|
51
|
-
-
|
|
51
|
+
- Jonathan Conway
|
|
52
52
|
- Gregory Mirzayantz
|
|
53
53
|
- Tung Nguyen
|
|
54
54
|
- Sean Cribbs
|
|
@@ -103,3 +103,5 @@ Since I first released this library, there's been quite a few people who have su
|
|
|
103
103
|
- Lachie Cox
|
|
104
104
|
- Lourens Naude
|
|
105
105
|
- Tom Davies
|
|
106
|
+
- Dan Pickett
|
|
107
|
+
- Alex Caudill
|
data/lib/thinking_sphinx.rb
CHANGED
|
@@ -13,6 +13,7 @@ require 'thinking_sphinx/attribute'
|
|
|
13
13
|
require 'thinking_sphinx/collection'
|
|
14
14
|
require 'thinking_sphinx/configuration'
|
|
15
15
|
require 'thinking_sphinx/facet'
|
|
16
|
+
require 'thinking_sphinx/facet_collection'
|
|
16
17
|
require 'thinking_sphinx/field'
|
|
17
18
|
require 'thinking_sphinx/index'
|
|
18
19
|
require 'thinking_sphinx/rails_additions'
|
|
@@ -33,7 +34,7 @@ module ThinkingSphinx
|
|
|
33
34
|
module Version #:nodoc:
|
|
34
35
|
Major = 1
|
|
35
36
|
Minor = 1
|
|
36
|
-
Tiny =
|
|
37
|
+
Tiny = 4
|
|
37
38
|
|
|
38
39
|
String = [Major, Minor, Tiny].join('.')
|
|
39
40
|
end
|
|
@@ -11,7 +11,8 @@ module ThinkingSphinx
|
|
|
11
11
|
|
|
12
12
|
def self.detect(model)
|
|
13
13
|
case model.connection.class.name
|
|
14
|
-
when "ActiveRecord::ConnectionAdapters::MysqlAdapter"
|
|
14
|
+
when "ActiveRecord::ConnectionAdapters::MysqlAdapter",
|
|
15
|
+
"ActiveRecord::ConnectionAdapters::MysqlplusAdapter"
|
|
15
16
|
ThinkingSphinx::MysqlAdapter.new model
|
|
16
17
|
when "ActiveRecord::ConnectionAdapters::PostgreSQLAdapter"
|
|
17
18
|
ThinkingSphinx::PostgreSQLAdapter.new model
|
|
@@ -30,4 +31,4 @@ module ThinkingSphinx
|
|
|
30
31
|
@connection ||= @model.connection
|
|
31
32
|
end
|
|
32
33
|
end
|
|
33
|
-
end
|
|
34
|
+
end
|
|
@@ -140,7 +140,7 @@ module ThinkingSphinx
|
|
|
140
140
|
# actual column's datatype is and returns that.
|
|
141
141
|
def type
|
|
142
142
|
@type ||= case
|
|
143
|
-
when is_many?
|
|
143
|
+
when is_many?, is_many_ints?
|
|
144
144
|
:multi
|
|
145
145
|
when @associations.values.flatten.length > 1
|
|
146
146
|
:string
|
|
@@ -152,7 +152,7 @@ module ThinkingSphinx
|
|
|
152
152
|
def to_facet
|
|
153
153
|
return nil unless @faceted
|
|
154
154
|
|
|
155
|
-
ThinkingSphinx::Facet.new(
|
|
155
|
+
ThinkingSphinx::Facet.new(self)
|
|
156
156
|
end
|
|
157
157
|
|
|
158
158
|
private
|
|
@@ -206,6 +206,10 @@ module ThinkingSphinx
|
|
|
206
206
|
associations.values.flatten.any? { |assoc| assoc.is_many? }
|
|
207
207
|
end
|
|
208
208
|
|
|
209
|
+
def is_many_ints?
|
|
210
|
+
concat_ws? && all_ints?
|
|
211
|
+
end
|
|
212
|
+
|
|
209
213
|
# Returns true if any of the columns are string values, instead of database
|
|
210
214
|
# column references.
|
|
211
215
|
def is_string?
|
|
@@ -130,5 +130,13 @@ module ThinkingSphinx
|
|
|
130
130
|
yield self[index], match[:weight]
|
|
131
131
|
end
|
|
132
132
|
end
|
|
133
|
+
|
|
134
|
+
def inject_with_groupby_and_count(initial = nil, &block)
|
|
135
|
+
index = -1
|
|
136
|
+
results[:matches].inject(initial) do |memo, match|
|
|
137
|
+
index += 1
|
|
138
|
+
yield memo, self[index], match[:attributes]["@groupby"], match[:attributes]["@count"]
|
|
139
|
+
end
|
|
140
|
+
end
|
|
133
141
|
end
|
|
134
|
-
end
|
|
142
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
module ThinkingSphinx
|
|
2
|
+
class Facet
|
|
3
|
+
attr_reader :reference
|
|
4
|
+
|
|
5
|
+
def initialize(reference)
|
|
6
|
+
@reference = reference
|
|
7
|
+
|
|
8
|
+
if reference.columns.length != 1
|
|
9
|
+
raise "Can't translate Facets on multiple-column field or attribute"
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def name
|
|
14
|
+
reference.unique_name
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def attribute_name
|
|
18
|
+
@attribute_name ||= case @reference
|
|
19
|
+
when Attribute
|
|
20
|
+
@reference.unique_name.to_s
|
|
21
|
+
when Field
|
|
22
|
+
@reference.unique_name.to_s + "_sort"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def value(object, attribute_value)
|
|
27
|
+
return translate(object, attribute_value) if @reference.is_a?(Field)
|
|
28
|
+
|
|
29
|
+
case @reference.type
|
|
30
|
+
when :string, :multi
|
|
31
|
+
translate(object, attribute_value)
|
|
32
|
+
when :datetime
|
|
33
|
+
Time.at(attribute_value)
|
|
34
|
+
when :boolean
|
|
35
|
+
attribute_value > 0
|
|
36
|
+
else
|
|
37
|
+
attribute_value
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def to_s
|
|
42
|
+
name
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
def translate(object, attribute_value)
|
|
48
|
+
column.__stack.each { |method|
|
|
49
|
+
object = object.send(method)
|
|
50
|
+
}
|
|
51
|
+
object.send(column.__name)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def column
|
|
55
|
+
@reference.columns.first
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
module ThinkingSphinx
|
|
2
|
+
class FacetCollection < Hash
|
|
3
|
+
attr_accessor :arguments
|
|
4
|
+
|
|
5
|
+
def initialize(arguments)
|
|
6
|
+
@arguments = arguments.clone
|
|
7
|
+
@attribute_values = {}
|
|
8
|
+
@facets = []
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def add_from_results(facet, results)
|
|
12
|
+
self[facet.name] = {}
|
|
13
|
+
@attribute_values[facet.name] = {}
|
|
14
|
+
@facets << facet
|
|
15
|
+
|
|
16
|
+
results.each_with_groupby_and_count { |result, group, count|
|
|
17
|
+
facet_value = facet.value(result, group)
|
|
18
|
+
|
|
19
|
+
self[facet.name][facet_value] = count
|
|
20
|
+
@attribute_values[facet.name][facet_value] = group
|
|
21
|
+
}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def for(hash = {})
|
|
25
|
+
arguments = @arguments.clone
|
|
26
|
+
options = arguments.extract_options!
|
|
27
|
+
options[:with] ||= {}
|
|
28
|
+
|
|
29
|
+
hash.each do |key, value|
|
|
30
|
+
attrib = facet_for_key(key).attribute_name
|
|
31
|
+
options[:with][attrib] = @attribute_values[key][value]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
arguments << options
|
|
35
|
+
ThinkingSphinx::Search.search *arguments
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
private
|
|
39
|
+
|
|
40
|
+
def facet_for_key(key)
|
|
41
|
+
@facets.detect { |facet| facet.name == key }
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -159,21 +159,22 @@ module ThinkingSphinx
|
|
|
159
159
|
stored_class = @model.store_full_sti_class ? @model.name : @model.name.demodulize
|
|
160
160
|
builder.where("#{@model.quoted_table_name}.#{quote_column(@model.inheritance_column)} = '#{stored_class}'")
|
|
161
161
|
end
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
162
|
+
|
|
163
|
+
set_model = Proc.new { |item| item.model = @model }
|
|
164
|
+
|
|
165
|
+
@fields = builder.fields &set_model
|
|
166
|
+
@attributes = builder.attributes.each &set_model
|
|
165
167
|
@conditions = builder.conditions
|
|
166
168
|
@groupings = builder.groupings
|
|
167
169
|
@delta_object = ThinkingSphinx::Deltas.parse self, builder.properties
|
|
168
170
|
@options = builder.properties
|
|
169
171
|
|
|
172
|
+
is_faceted = Proc.new { |item| item.faceted }
|
|
173
|
+
add_facet = Proc.new { |item| @model.sphinx_facets << item.to_facet }
|
|
174
|
+
|
|
170
175
|
@model.sphinx_facets ||= []
|
|
171
|
-
@fields.select
|
|
172
|
-
|
|
173
|
-
}
|
|
174
|
-
@attributes.select { |attrib| attrib.faceted }.each { |attrib|
|
|
175
|
-
@model.sphinx_facets << attrib.to_facet
|
|
176
|
-
}
|
|
176
|
+
@fields.select( &is_faceted).each &add_facet
|
|
177
|
+
@attributes.select(&is_faceted).each &add_facet
|
|
177
178
|
|
|
178
179
|
# We want to make sure that if the database doesn't exist, then Thinking
|
|
179
180
|
# Sphinx doesn't mind when running non-TS tasks (like db:create, db:drop
|
|
@@ -277,7 +278,7 @@ module ThinkingSphinx
|
|
|
277
278
|
config = @model.connection.instance_variable_get(:@config)
|
|
278
279
|
|
|
279
280
|
source.sql_host = config[:host] || "localhost"
|
|
280
|
-
source.sql_user = config[:username] || config[:user]
|
|
281
|
+
source.sql_user = config[:username] || config[:user] || ""
|
|
281
282
|
source.sql_pass = (config[:password].to_s || "").gsub('#', '\#')
|
|
282
283
|
source.sql_db = config[:database]
|
|
283
284
|
source.sql_port = config[:port]
|
|
@@ -147,6 +147,15 @@ module ThinkingSphinx
|
|
|
147
147
|
end
|
|
148
148
|
alias_method :attribute, :has
|
|
149
149
|
|
|
150
|
+
def facet(*args)
|
|
151
|
+
options = args.extract_options!
|
|
152
|
+
options[:facet] = true
|
|
153
|
+
|
|
154
|
+
args.each do |columns|
|
|
155
|
+
attributes << Attribute.new(FauxColumn.coerce(columns), options)
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
150
159
|
# Use this method to add some manual SQL conditions for your index
|
|
151
160
|
# request. You can pass in as many strings as you like, they'll get
|
|
152
161
|
# joined together with ANDs later on.
|
|
@@ -21,7 +21,7 @@ module ThinkingSphinx
|
|
|
21
21
|
|
|
22
22
|
options = args.extract_options!
|
|
23
23
|
page = options[:page] ? options[:page].to_i : 1
|
|
24
|
-
|
|
24
|
+
|
|
25
25
|
ThinkingSphinx::Collection.ids_from_results(results, page, client.limit, options)
|
|
26
26
|
end
|
|
27
27
|
|
|
@@ -353,18 +353,13 @@ module ThinkingSphinx
|
|
|
353
353
|
end
|
|
354
354
|
|
|
355
355
|
def facets(*args)
|
|
356
|
-
|
|
356
|
+
hash = ThinkingSphinx::FacetCollection.new args
|
|
357
|
+
options = args.extract_options!.clone.merge! :group_function => :attr
|
|
357
358
|
|
|
358
|
-
options[:class].sphinx_facets.inject(
|
|
359
|
-
facet_result = {}
|
|
359
|
+
options[:class].sphinx_facets.inject(hash) do |hash, facet|
|
|
360
360
|
options[:group_by] = facet.attribute_name
|
|
361
361
|
|
|
362
|
-
|
|
363
|
-
results.each_with_groupby_and_count do |result, group, count|
|
|
364
|
-
facet_result[facet.value(result, group)] = count
|
|
365
|
-
end
|
|
366
|
-
hash[facet.name] = facet_result
|
|
367
|
-
|
|
362
|
+
hash.add_from_results facet, search(*(args + [options]))
|
|
368
363
|
hash
|
|
369
364
|
end
|
|
370
365
|
end
|
|
@@ -474,6 +469,13 @@ module ThinkingSphinx
|
|
|
474
469
|
Riddle::Client::Filter.new attr.to_s, filter_value(val), true
|
|
475
470
|
} if options[:without]
|
|
476
471
|
|
|
472
|
+
# every-match attribute filters
|
|
473
|
+
client.filters += options[:with_all].collect { |attr,vals|
|
|
474
|
+
Array(vals).collect { |val|
|
|
475
|
+
Riddle::Client::Filter.new attr.to_s, filter_value(val)
|
|
476
|
+
}
|
|
477
|
+
}.flatten if options[:with_all]
|
|
478
|
+
|
|
477
479
|
# exclusive attribute filter on primary key
|
|
478
480
|
client.filters += Array(options[:without_ids]).collect { |id|
|
|
479
481
|
Riddle::Client::Filter.new 'sphinx_internal_id', filter_value(id), true
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
|
|
3
|
+
namespace :thinking_sphinx do
|
|
4
|
+
task :app_env do
|
|
5
|
+
Rake::Task[:environment].invoke if defined?(RAILS_ROOT)
|
|
6
|
+
Rake::Task[:merb_env].invoke if defined?(Merb)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
desc "Stop if running, then start a Sphinx searchd daemon using Thinking Sphinx's settings"
|
|
10
|
+
task :running_start => :app_env do
|
|
11
|
+
Rake::Task["thinking_sphinx:stop"].invoke if sphinx_running?
|
|
12
|
+
Rake::Task["thinking_sphinx:start"].invoke
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
desc "Start a Sphinx searchd daemon using Thinking Sphinx's settings"
|
|
16
|
+
task :start => :app_env do
|
|
17
|
+
config = ThinkingSphinx::Configuration.instance
|
|
18
|
+
|
|
19
|
+
FileUtils.mkdir_p config.searchd_file_path
|
|
20
|
+
raise RuntimeError, "searchd is already running." if sphinx_running?
|
|
21
|
+
|
|
22
|
+
Dir["#{config.searchd_file_path}/*.spl"].each { |file| File.delete(file) }
|
|
23
|
+
|
|
24
|
+
cmd = "#{config.bin_path}searchd --pidfile --config #{config.config_file}"
|
|
25
|
+
puts cmd
|
|
26
|
+
system cmd
|
|
27
|
+
|
|
28
|
+
sleep(2)
|
|
29
|
+
|
|
30
|
+
if sphinx_running?
|
|
31
|
+
puts "Started successfully (pid #{sphinx_pid})."
|
|
32
|
+
else
|
|
33
|
+
puts "Failed to start searchd daemon. Check #{config.searchd_log_file}."
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
desc "Stop Sphinx using Thinking Sphinx's settings"
|
|
38
|
+
task :stop => :app_env do
|
|
39
|
+
raise RuntimeError, "searchd is not running." unless sphinx_running?
|
|
40
|
+
config = ThinkingSphinx::Configuration.instance
|
|
41
|
+
pid = sphinx_pid
|
|
42
|
+
system "searchd --stop --config #{config.config_file}"
|
|
43
|
+
puts "Stopped search daemon (pid #{pid})."
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
desc "Restart Sphinx"
|
|
47
|
+
task :restart => [:app_env, :stop, :start]
|
|
48
|
+
|
|
49
|
+
desc "Generate the Sphinx configuration file using Thinking Sphinx's settings"
|
|
50
|
+
task :configure => :app_env do
|
|
51
|
+
config = ThinkingSphinx::Configuration.instance
|
|
52
|
+
puts "Generating Configuration to #{config.config_file}"
|
|
53
|
+
config.build
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
desc "Index data for Sphinx using Thinking Sphinx's settings"
|
|
57
|
+
task :index => :app_env do
|
|
58
|
+
ThinkingSphinx::Deltas::Job.cancel_thinking_sphinx_jobs
|
|
59
|
+
|
|
60
|
+
config = ThinkingSphinx::Configuration.instance
|
|
61
|
+
unless ENV["INDEX_ONLY"] == "true"
|
|
62
|
+
puts "Generating Configuration to #{config.config_file}"
|
|
63
|
+
config.build
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
FileUtils.mkdir_p config.searchd_file_path
|
|
67
|
+
cmd = "#{config.bin_path}indexer --config #{config.config_file} --all"
|
|
68
|
+
cmd << " --rotate" if sphinx_running?
|
|
69
|
+
puts cmd
|
|
70
|
+
system cmd
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
namespace :index do
|
|
74
|
+
task :delta => :app_env do
|
|
75
|
+
ThinkingSphinx.indexed_models.select { |model|
|
|
76
|
+
model.constantize.sphinx_indexes.any? { |index| index.delta? }
|
|
77
|
+
}.each do |model|
|
|
78
|
+
model.constantize.sphinx_indexes.select { |index|
|
|
79
|
+
index.delta? && index.delta_object.respond_to?(:delayed_index)
|
|
80
|
+
}.each { |index|
|
|
81
|
+
index.delta_object.delayed_index(index.model)
|
|
82
|
+
}
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
desc "Process stored delta index requests"
|
|
88
|
+
task :delayed_delta => :app_env do
|
|
89
|
+
require 'delayed/worker'
|
|
90
|
+
|
|
91
|
+
Delayed::Worker.new(
|
|
92
|
+
:min_priority => ENV['MIN_PRIORITY'],
|
|
93
|
+
:max_priority => ENV['MAX_PRIORITY']
|
|
94
|
+
).start
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
namespace :ts do
|
|
99
|
+
desc "Stop if running, then start a Sphinx searchd daemon using Thinking Sphinx's settings"
|
|
100
|
+
task :run => "thinking_sphinx:running_start"
|
|
101
|
+
desc "Start a Sphinx searchd daemon using Thinking Sphinx's settings"
|
|
102
|
+
task :start => "thinking_sphinx:start"
|
|
103
|
+
desc "Stop Sphinx using Thinking Sphinx's settings"
|
|
104
|
+
task :stop => "thinking_sphinx:stop"
|
|
105
|
+
desc "Index data for Sphinx using Thinking Sphinx's settings"
|
|
106
|
+
task :in => "thinking_sphinx:index"
|
|
107
|
+
namespace :in do
|
|
108
|
+
desc "Index Thinking Sphinx datetime delta indexes"
|
|
109
|
+
task :delta => "thinking_sphinx:index:delta"
|
|
110
|
+
end
|
|
111
|
+
task :index => "thinking_sphinx:index"
|
|
112
|
+
desc "Restart Sphinx"
|
|
113
|
+
task :restart => "thinking_sphinx:restart"
|
|
114
|
+
desc "Generate the Sphinx configuration file using Thinking Sphinx's settings"
|
|
115
|
+
task :conf => "thinking_sphinx:configure"
|
|
116
|
+
desc "Generate the Sphinx configuration file using Thinking Sphinx's settings"
|
|
117
|
+
task :config => "thinking_sphinx:configure"
|
|
118
|
+
desc "Process stored delta index requests"
|
|
119
|
+
task :dd => "thinking_sphinx:delayed_delta"
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def sphinx_pid
|
|
123
|
+
ThinkingSphinx.sphinx_pid
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def sphinx_running?
|
|
127
|
+
ThinkingSphinx.sphinx_running?
|
|
128
|
+
end
|
|
@@ -157,7 +157,7 @@ describe ThinkingSphinx::Attribute do
|
|
|
157
157
|
end
|
|
158
158
|
|
|
159
159
|
it "should return :string if there's more than one association" do
|
|
160
|
-
@attribute.associations = {:a => :assoc, :b => :assoc}
|
|
160
|
+
@attribute.associations = {:a => [:assoc], :b => [:assoc]}
|
|
161
161
|
@attribute.send(:type).should == :string
|
|
162
162
|
end
|
|
163
163
|
|
data/tasks/rails.rake
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '/../lib/thinking_sphinx/tasks')
|
data/vendor/riddle/lib/riddle.rb
CHANGED
|
@@ -18,7 +18,7 @@ module Riddle #:nodoc:
|
|
|
18
18
|
Rev = 1533
|
|
19
19
|
# Release number to mark my own fixes, beyond feature parity with
|
|
20
20
|
# Sphinx itself.
|
|
21
|
-
Release =
|
|
21
|
+
Release = 4
|
|
22
22
|
|
|
23
23
|
String = [Major, Minor, Tiny].join('.')
|
|
24
24
|
GemVersion = [Major, Minor, Tiny, Rev, Release].join('.')
|
|
@@ -456,7 +456,7 @@ module Riddle
|
|
|
456
456
|
header = socket.recv(8)
|
|
457
457
|
status, version, length = header.unpack('n2N')
|
|
458
458
|
|
|
459
|
-
while response.length < length
|
|
459
|
+
while response.length < (length || 0)
|
|
460
460
|
part = socket.recv(length - response.length)
|
|
461
461
|
response << part if part
|
|
462
462
|
end
|
|
@@ -20,13 +20,18 @@ module Riddle
|
|
|
20
20
|
if send(setting) == ""
|
|
21
21
|
conf = " #{setting} = "
|
|
22
22
|
else
|
|
23
|
-
conf =
|
|
23
|
+
conf = setting_to_array(setting).collect { |set|
|
|
24
24
|
" #{setting} = #{set}"
|
|
25
25
|
}
|
|
26
26
|
end
|
|
27
27
|
conf.length == 0 ? nil : conf
|
|
28
28
|
}.flatten.compact
|
|
29
29
|
end
|
|
30
|
+
|
|
31
|
+
def setting_to_array(setting)
|
|
32
|
+
value = send(setting)
|
|
33
|
+
value.is_a?(Array) ? value : [value]
|
|
34
|
+
end
|
|
30
35
|
end
|
|
31
36
|
end
|
|
32
|
-
end
|
|
37
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: freelancing-god-thinking-sphinx
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.1.
|
|
4
|
+
version: 1.1.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Pat Allan
|
|
@@ -9,7 +9,7 @@ autorequire:
|
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
11
|
|
|
12
|
-
date: 2009-
|
|
12
|
+
date: 2009-02-04 00:00:00 -08:00
|
|
13
13
|
default_executable:
|
|
14
14
|
dependencies: []
|
|
15
15
|
|
|
@@ -41,19 +41,21 @@ files:
|
|
|
41
41
|
- lib/thinking_sphinx/deltas/delayed_delta/job.rb
|
|
42
42
|
- lib/thinking_sphinx/deltas/delayed_delta.rb
|
|
43
43
|
- lib/thinking_sphinx/deltas.rb
|
|
44
|
+
- lib/thinking_sphinx/facet.rb
|
|
45
|
+
- lib/thinking_sphinx/facet_collection.rb
|
|
44
46
|
- lib/thinking_sphinx/field.rb
|
|
45
47
|
- lib/thinking_sphinx/index/builder.rb
|
|
46
48
|
- lib/thinking_sphinx/index/faux_column.rb
|
|
47
49
|
- lib/thinking_sphinx/index.rb
|
|
48
50
|
- lib/thinking_sphinx/rails_additions.rb
|
|
49
51
|
- lib/thinking_sphinx/search.rb
|
|
52
|
+
- lib/thinking_sphinx/tasks.rb
|
|
50
53
|
- lib/thinking_sphinx.rb
|
|
51
54
|
- LICENCE
|
|
52
55
|
- README
|
|
53
56
|
- tasks/distribution.rb
|
|
54
57
|
- tasks/testing.rb
|
|
55
|
-
- tasks/
|
|
56
|
-
- tasks/thinking_sphinx_tasks.rake
|
|
58
|
+
- tasks/rails.rake
|
|
57
59
|
- vendor/after_commit
|
|
58
60
|
- vendor/after_commit/init.rb
|
|
59
61
|
- vendor/after_commit/lib
|