riddle 2.1.0 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +8 -5
- data/Gemfile +10 -0
- data/HISTORY +4 -0
- data/README.markdown +1 -1
- data/lib/riddle.rb +1 -0
- data/lib/riddle/0.9.9/configuration/searchd.rb +1 -1
- data/lib/riddle/client.rb +4 -1
- data/lib/riddle/client/message.rb +15 -14
- data/lib/riddle/configuration/parser.rb +1 -0
- data/lib/riddle/configuration/section.rb +9 -9
- data/lib/riddle/configuration/source.rb +5 -5
- data/lib/riddle/query/select.rb +3 -2
- data/riddle.gemspec +2 -4
- metadata +4 -329
- data/spec/fixtures/.gitignore +0 -2
- data/spec/fixtures/data/0.9.9/anchor.bin +0 -0
- data/spec/fixtures/data/0.9.9/any.bin +0 -0
- data/spec/fixtures/data/0.9.9/boolean.bin +0 -0
- data/spec/fixtures/data/0.9.9/comment.bin +0 -0
- data/spec/fixtures/data/0.9.9/distinct.bin +0 -0
- data/spec/fixtures/data/0.9.9/field_weights.bin +0 -0
- data/spec/fixtures/data/0.9.9/filter.bin +0 -0
- data/spec/fixtures/data/0.9.9/filter_array.bin +0 -0
- data/spec/fixtures/data/0.9.9/filter_array_exclude.bin +0 -0
- data/spec/fixtures/data/0.9.9/filter_boolean.bin +0 -0
- data/spec/fixtures/data/0.9.9/filter_floats.bin +0 -0
- data/spec/fixtures/data/0.9.9/filter_floats_exclude.bin +0 -0
- data/spec/fixtures/data/0.9.9/filter_range.bin +0 -0
- data/spec/fixtures/data/0.9.9/filter_range_exclude.bin +0 -0
- data/spec/fixtures/data/0.9.9/group.bin +0 -0
- data/spec/fixtures/data/0.9.9/index.bin +0 -0
- data/spec/fixtures/data/0.9.9/index_weights.bin +0 -0
- data/spec/fixtures/data/0.9.9/keywords_with_hits.bin +0 -0
- data/spec/fixtures/data/0.9.9/keywords_without_hits.bin +0 -0
- data/spec/fixtures/data/0.9.9/overrides.bin +0 -0
- data/spec/fixtures/data/0.9.9/phrase.bin +0 -0
- data/spec/fixtures/data/0.9.9/rank_mode.bin +0 -0
- data/spec/fixtures/data/0.9.9/select.bin +0 -0
- data/spec/fixtures/data/0.9.9/simple.bin +0 -0
- data/spec/fixtures/data/0.9.9/sort.bin +0 -0
- data/spec/fixtures/data/0.9.9/update_simple.bin +0 -0
- data/spec/fixtures/data/0.9.9/weights.bin +0 -0
- data/spec/fixtures/data/1.10/anchor.bin +0 -0
- data/spec/fixtures/data/1.10/any.bin +0 -0
- data/spec/fixtures/data/1.10/boolean.bin +0 -0
- data/spec/fixtures/data/1.10/comment.bin +0 -0
- data/spec/fixtures/data/1.10/distinct.bin +0 -0
- data/spec/fixtures/data/1.10/field_weights.bin +0 -0
- data/spec/fixtures/data/1.10/filter.bin +0 -0
- data/spec/fixtures/data/1.10/filter_array.bin +0 -0
- data/spec/fixtures/data/1.10/filter_array_exclude.bin +0 -0
- data/spec/fixtures/data/1.10/filter_boolean.bin +0 -0
- data/spec/fixtures/data/1.10/filter_floats.bin +0 -0
- data/spec/fixtures/data/1.10/filter_floats_exclude.bin +0 -0
- data/spec/fixtures/data/1.10/filter_range.bin +0 -0
- data/spec/fixtures/data/1.10/filter_range_exclude.bin +0 -0
- data/spec/fixtures/data/1.10/group.bin +0 -0
- data/spec/fixtures/data/1.10/index.bin +0 -0
- data/spec/fixtures/data/1.10/index_weights.bin +0 -0
- data/spec/fixtures/data/1.10/keywords_with_hits.bin +0 -0
- data/spec/fixtures/data/1.10/keywords_without_hits.bin +0 -0
- data/spec/fixtures/data/1.10/overrides.bin +0 -0
- data/spec/fixtures/data/1.10/phrase.bin +0 -0
- data/spec/fixtures/data/1.10/rank_mode.bin +0 -0
- data/spec/fixtures/data/1.10/select.bin +0 -0
- data/spec/fixtures/data/1.10/simple.bin +0 -0
- data/spec/fixtures/data/1.10/sort.bin +0 -0
- data/spec/fixtures/data/1.10/update_simple.bin +0 -0
- data/spec/fixtures/data/1.10/weights.bin +0 -0
- data/spec/fixtures/data/2.0.1/anchor.bin +0 -0
- data/spec/fixtures/data/2.0.1/any.bin +0 -0
- data/spec/fixtures/data/2.0.1/boolean.bin +0 -0
- data/spec/fixtures/data/2.0.1/comment.bin +0 -0
- data/spec/fixtures/data/2.0.1/distinct.bin +0 -0
- data/spec/fixtures/data/2.0.1/field_weights.bin +0 -0
- data/spec/fixtures/data/2.0.1/filter.bin +0 -0
- data/spec/fixtures/data/2.0.1/filter_array.bin +0 -0
- data/spec/fixtures/data/2.0.1/filter_array_exclude.bin +0 -0
- data/spec/fixtures/data/2.0.1/filter_boolean.bin +0 -0
- data/spec/fixtures/data/2.0.1/filter_floats.bin +0 -0
- data/spec/fixtures/data/2.0.1/filter_floats_exclude.bin +0 -0
- data/spec/fixtures/data/2.0.1/filter_range.bin +0 -0
- data/spec/fixtures/data/2.0.1/filter_range_exclude.bin +0 -0
- data/spec/fixtures/data/2.0.1/group.bin +0 -0
- data/spec/fixtures/data/2.0.1/index.bin +0 -0
- data/spec/fixtures/data/2.0.1/index_weights.bin +0 -0
- data/spec/fixtures/data/2.0.1/keywords_with_hits.bin +0 -0
- data/spec/fixtures/data/2.0.1/keywords_without_hits.bin +0 -0
- data/spec/fixtures/data/2.0.1/overrides.bin +0 -0
- data/spec/fixtures/data/2.0.1/phrase.bin +0 -0
- data/spec/fixtures/data/2.0.1/rank_mode.bin +0 -0
- data/spec/fixtures/data/2.0.1/select.bin +0 -0
- data/spec/fixtures/data/2.0.1/simple.bin +0 -0
- data/spec/fixtures/data/2.0.1/sort.bin +0 -0
- data/spec/fixtures/data/2.0.1/update_simple.bin +0 -0
- data/spec/fixtures/data/2.0.1/weights.bin +0 -0
- data/spec/fixtures/data/2.1.0/anchor.bin +0 -0
- data/spec/fixtures/data/2.1.0/any.bin +0 -0
- data/spec/fixtures/data/2.1.0/boolean.bin +0 -0
- data/spec/fixtures/data/2.1.0/comment.bin +0 -0
- data/spec/fixtures/data/2.1.0/distinct.bin +0 -0
- data/spec/fixtures/data/2.1.0/field_weights.bin +0 -0
- data/spec/fixtures/data/2.1.0/filter.bin +0 -0
- data/spec/fixtures/data/2.1.0/filter_array.bin +0 -0
- data/spec/fixtures/data/2.1.0/filter_array_exclude.bin +0 -0
- data/spec/fixtures/data/2.1.0/filter_boolean.bin +0 -0
- data/spec/fixtures/data/2.1.0/filter_floats.bin +0 -0
- data/spec/fixtures/data/2.1.0/filter_floats_exclude.bin +0 -0
- data/spec/fixtures/data/2.1.0/filter_range.bin +0 -0
- data/spec/fixtures/data/2.1.0/filter_range_exclude.bin +0 -0
- data/spec/fixtures/data/2.1.0/group.bin +0 -0
- data/spec/fixtures/data/2.1.0/index.bin +0 -0
- data/spec/fixtures/data/2.1.0/index_weights.bin +0 -0
- data/spec/fixtures/data/2.1.0/keywords_with_hits.bin +0 -0
- data/spec/fixtures/data/2.1.0/keywords_without_hits.bin +0 -0
- data/spec/fixtures/data/2.1.0/overrides.bin +0 -0
- data/spec/fixtures/data/2.1.0/phrase.bin +0 -0
- data/spec/fixtures/data/2.1.0/rank_mode.bin +0 -0
- data/spec/fixtures/data/2.1.0/select.bin +0 -0
- data/spec/fixtures/data/2.1.0/simple.bin +0 -0
- data/spec/fixtures/data/2.1.0/sort.bin +0 -0
- data/spec/fixtures/data/2.1.0/update_simple.bin +0 -0
- data/spec/fixtures/data/2.1.0/weights.bin +0 -0
- data/spec/fixtures/data_generator.0.9.8.php +0 -208
- data/spec/fixtures/data_generator.0.9.9.php +0 -5
- data/spec/fixtures/data_generator.1.10.php +0 -5
- data/spec/fixtures/data_generator.2.0.1.php +0 -5
- data/spec/fixtures/data_generator.2.1.0.php +0 -5
- data/spec/fixtures/data_generator.php +0 -223
- data/spec/fixtures/sphinxapi.0.9.8.php +0 -1228
- data/spec/fixtures/sphinxapi.0.9.9.php +0 -1646
- data/spec/fixtures/sphinxapi.1.10.php +0 -1728
- data/spec/fixtures/sphinxapi.2.0.1.php +0 -1731
- data/spec/fixtures/sphinxapi.2.1.0.php +0 -1752
- data/spec/fixtures/sql/conf.example.yml +0 -3
- data/spec/fixtures/sql/data.sql +0 -25000
- data/spec/fixtures/sql/data.tsv +0 -25000
- data/spec/fixtures/sql/structure.sql +0 -16
- data/spec/functional/connection_spec.rb +0 -64
- data/spec/functional/escaping_spec.rb +0 -49
- data/spec/functional/excerpt_spec.rb +0 -139
- data/spec/functional/keywords_spec.rb +0 -40
- data/spec/functional/persistance_spec.rb +0 -17
- data/spec/functional/search_spec.rb +0 -67
- data/spec/functional/status_spec.rb +0 -21
- data/spec/functional/update_spec.rb +0 -41
- data/spec/riddle/auto_version_spec.rb +0 -95
- data/spec/riddle/client_spec.rb +0 -11
- data/spec/riddle/configuration_spec.rb +0 -28
- data/spec/riddle/controller_spec.rb +0 -39
- data/spec/riddle/query/delete_spec.rb +0 -18
- data/spec/riddle/query/insert_spec.rb +0 -25
- data/spec/riddle/query/select_spec.rb +0 -226
- data/spec/riddle/query_spec.rb +0 -97
- data/spec/riddle_spec.rb +0 -27
- data/spec/spec_helper.rb +0 -34
- data/spec/support/binary_fixtures.rb +0 -18
- data/spec/support/sphinx.rb +0 -137
- data/spec/unit/client_spec.rb +0 -290
- data/spec/unit/configuration/common_spec.rb +0 -60
- data/spec/unit/configuration/distributed_index_spec.rb +0 -58
- data/spec/unit/configuration/index_spec.rb +0 -124
- data/spec/unit/configuration/indexer_spec.rb +0 -73
- data/spec/unit/configuration/realtime_index_spec.rb +0 -65
- data/spec/unit/configuration/searchd_spec.rb +0 -228
- data/spec/unit/configuration/source_spec.rb +0 -5
- data/spec/unit/configuration/sql_source_spec.rb +0 -137
- data/spec/unit/configuration/template_index_spec.rb +0 -91
- data/spec/unit/configuration/tsv_source_spec.rb +0 -53
- data/spec/unit/configuration/xml_source_spec.rb +0 -51
- data/spec/unit/configuration_spec.rb +0 -25
- data/spec/unit/filter_spec.rb +0 -38
- data/spec/unit/message_spec.rb +0 -94
- data/spec/unit/response_spec.rb +0 -64
- data/spec/unit/riddle_spec.rb +0 -17
data/spec/riddle/query_spec.rb
DELETED
@@ -1,97 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Riddle::Query, :live => true do
|
4
|
-
describe '.connection' do
|
5
|
-
let(:connection) { Riddle::Query.connection 'localhost', 9306 }
|
6
|
-
|
7
|
-
it "returns a MySQL Client" do
|
8
|
-
connection.should be_a(Mysql2::Client)
|
9
|
-
end
|
10
|
-
|
11
|
-
it "should handle search requests" do
|
12
|
-
connection.query(Riddle::Query.tables).to_a[0].should == {
|
13
|
-
'Index' => 'people', 'Type' => 'local'
|
14
|
-
}
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end unless RUBY_PLATFORM == 'java' || Riddle.loaded_version.to_i < 2
|
18
|
-
|
19
|
-
describe Riddle::Query do
|
20
|
-
describe '.set' do
|
21
|
-
it 'handles a single value' do
|
22
|
-
Riddle::Query.set('foo', 'bar').should == 'SET GLOBAL foo = bar'
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'handles multiple values' do
|
26
|
-
Riddle::Query.set('foo', [1, 2, 3]).should == 'SET GLOBAL foo = (1, 2, 3)'
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'handles non-global settings' do
|
30
|
-
Riddle::Query.set('foo', 'bar', false).should == 'SET foo = bar'
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
describe '.snippets' do
|
35
|
-
it 'handles a basic request' do
|
36
|
-
Riddle::Query.snippets('foo bar baz', 'foo_core', 'foo').
|
37
|
-
should == "CALL SNIPPETS('foo bar baz', 'foo_core', 'foo')"
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'handles a request with options' do
|
41
|
-
Riddle::Query.snippets('foo bar baz', 'foo_core', 'foo', :around => 5).
|
42
|
-
should == "CALL SNIPPETS('foo bar baz', 'foo_core', 'foo', 5 AS around)"
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'handles string options' do
|
46
|
-
Riddle::Query.snippets('foo bar baz', 'foo_core', 'foo',
|
47
|
-
:before_match => '<strong>').should == "CALL SNIPPETS('foo bar baz', 'foo_core', 'foo', '<strong>' AS before_match)"
|
48
|
-
end
|
49
|
-
|
50
|
-
it "handles boolean options" do
|
51
|
-
Riddle::Query.snippets('foo bar baz', 'foo_core', 'foo',
|
52
|
-
:exact_phrase => true).should == "CALL SNIPPETS('foo bar baz', 'foo_core', 'foo', 1 AS exact_phrase)"
|
53
|
-
end
|
54
|
-
|
55
|
-
it "escapes quotes in the text data" do
|
56
|
-
Riddle::Query.snippets("foo bar 'baz", 'foo_core', 'foo').
|
57
|
-
should == "CALL SNIPPETS('foo bar \\'baz', 'foo_core', 'foo')"
|
58
|
-
end
|
59
|
-
|
60
|
-
it "escapes quotes in the query data" do
|
61
|
-
Riddle::Query.snippets("foo bar baz", 'foo_core', "foo'").
|
62
|
-
should == "CALL SNIPPETS('foo bar baz', 'foo_core', 'foo\\'')"
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
describe '.create_function' do
|
67
|
-
it 'handles a basic create request' do
|
68
|
-
Riddle::Query.create_function('foo', :bigint, 'foo.sh').
|
69
|
-
should == "CREATE FUNCTION foo RETURNS BIGINT SONAME 'foo.sh'"
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
describe '.update' do
|
74
|
-
it 'handles a basic update request' do
|
75
|
-
Riddle::Query.update('foo_core', 5, :deleted => 1).
|
76
|
-
should == 'UPDATE foo_core SET deleted = 1 WHERE id = 5'
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
describe '.escape' do
|
81
|
-
%w(( ) | - ! @ ~ / ^ $ " > < ?).each do |reserved|
|
82
|
-
it "escapes #{reserved}" do
|
83
|
-
Riddle::Query.escape(reserved).should == "\\#{reserved}"
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
it "escapes word-operators correctly" do
|
88
|
-
operators = ['MAYBE', 'NEAR', 'PARAGRAPH', 'SENTENCE', 'ZONE', 'ZONESPAN']
|
89
|
-
operators.each do |operator|
|
90
|
-
base = "string with #{operator} operator"
|
91
|
-
Riddle::Query.escape(base).should == base.gsub(operator, "\\#{operator}")
|
92
|
-
end
|
93
|
-
|
94
|
-
Riddle::Query.escape("FIND THE ZONES").should == "FIND THE ZONES"
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
data/spec/riddle_spec.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Riddle do
|
4
|
-
describe '.version_warning' do
|
5
|
-
before :each do
|
6
|
-
@existing_version = Riddle.loaded_version
|
7
|
-
end
|
8
|
-
|
9
|
-
after :each do
|
10
|
-
Riddle.loaded_version = @existing_version
|
11
|
-
end
|
12
|
-
|
13
|
-
it "should do nothing if there is a Sphinx version loaded" do
|
14
|
-
STDERR.should_not_receive(:puts)
|
15
|
-
|
16
|
-
Riddle.loaded_version = '0.9.8'
|
17
|
-
Riddle.version_warning
|
18
|
-
end
|
19
|
-
|
20
|
-
it "should output a warning if no version is loaded" do
|
21
|
-
STDERR.should_receive(:puts)
|
22
|
-
|
23
|
-
Riddle.loaded_version = nil
|
24
|
-
Riddle.version_warning
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'bundler'
|
3
|
-
|
4
|
-
$:.unshift File.dirname(__FILE__) + '/../lib'
|
5
|
-
$:.unshift File.dirname(__FILE__) + '/..'
|
6
|
-
|
7
|
-
Dir['spec/support/**/*.rb'].each { |f| require f }
|
8
|
-
|
9
|
-
Bundler.require :default, :development
|
10
|
-
|
11
|
-
require 'riddle'
|
12
|
-
|
13
|
-
RSpec.configure do |config|
|
14
|
-
config.include BinaryFixtures
|
15
|
-
|
16
|
-
sphinx = Sphinx.new
|
17
|
-
sphinx.setup_mysql
|
18
|
-
sphinx.generate_configuration
|
19
|
-
sphinx.index
|
20
|
-
|
21
|
-
BinaryFixtures.build_fixtures Riddle.loaded_version
|
22
|
-
|
23
|
-
config.before :all do |group|
|
24
|
-
sphinx.start if group.class.metadata[:live]
|
25
|
-
end
|
26
|
-
|
27
|
-
config.after :all do |group|
|
28
|
-
sphinx.stop if group.class.metadata[:live]
|
29
|
-
end
|
30
|
-
|
31
|
-
# enable filtering for examples
|
32
|
-
config.filter_run :wip => true
|
33
|
-
config.run_all_when_everything_filtered = true
|
34
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
module BinaryFixtures
|
2
|
-
def self.build_fixtures(version = nil)
|
3
|
-
return if ENV['TRAVIS']
|
4
|
-
|
5
|
-
version ||= %w(0.9.9 1.10 2.0.1 2.1.0)
|
6
|
-
Array(version).each do |version|
|
7
|
-
FileUtils.mkdir_p "spec/fixtures/data/#{version}"
|
8
|
-
`php -f spec/fixtures/data_generator.#{version}.php`
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def query_contents(key)
|
13
|
-
path = "spec/fixtures/data/#{Riddle.loaded_version}/#{key}.bin"
|
14
|
-
contents = open(path) { |f| f.read }
|
15
|
-
contents.respond_to?(:encoding) ?
|
16
|
-
contents.force_encoding('ASCII-8BIT') : contents
|
17
|
-
end
|
18
|
-
end
|
data/spec/support/sphinx.rb
DELETED
@@ -1,137 +0,0 @@
|
|
1
|
-
require 'erb'
|
2
|
-
require 'yaml'
|
3
|
-
|
4
|
-
if RUBY_PLATFORM == 'java'
|
5
|
-
require 'java'
|
6
|
-
require 'jdbc/mysql'
|
7
|
-
end
|
8
|
-
|
9
|
-
class Sphinx
|
10
|
-
attr_accessor :host, :username, :password
|
11
|
-
|
12
|
-
def initialize
|
13
|
-
self.host = 'localhost'
|
14
|
-
self.username = 'root'
|
15
|
-
self.password = ''
|
16
|
-
|
17
|
-
if File.exist?('spec/fixtures/sql/conf.yml')
|
18
|
-
config = YAML.load(File.open('spec/fixtures/sql/conf.yml'))
|
19
|
-
self.host = config['host']
|
20
|
-
self.username = config['username']
|
21
|
-
self.password = config['password']
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def setup_mysql
|
26
|
-
return setup_mysql_on_jruby if RUBY_PLATFORM == 'java'
|
27
|
-
|
28
|
-
client = Mysql2::Client.new(
|
29
|
-
:host => host,
|
30
|
-
:username => username,
|
31
|
-
:password => password
|
32
|
-
)
|
33
|
-
|
34
|
-
databases = client.query('SHOW DATABASES', :as => :array).to_a.flatten
|
35
|
-
unless databases.include?('riddle')
|
36
|
-
client.query 'CREATE DATABASE riddle'
|
37
|
-
end
|
38
|
-
|
39
|
-
client.query 'USE riddle'
|
40
|
-
|
41
|
-
structure = File.open('spec/fixtures/sql/structure.sql') { |f| f.read }
|
42
|
-
structure.split(/;/).each { |sql| client.query sql }
|
43
|
-
client.query <<-SQL
|
44
|
-
LOAD DATA INFILE '#{fixtures_path}/sql/data.tsv' INTO TABLE
|
45
|
-
`riddle`.`people` FIELDS TERMINATED BY ',' ENCLOSED BY "'" (gender,
|
46
|
-
first_name, middle_initial, last_name, street_address, city, state,
|
47
|
-
postcode, email, birthday)
|
48
|
-
SQL
|
49
|
-
|
50
|
-
client.close
|
51
|
-
end
|
52
|
-
|
53
|
-
def setup_mysql_on_jruby
|
54
|
-
address = "jdbc:mysql://#{host}"
|
55
|
-
client = java.sql.DriverManager.getConnection(address, username, password)
|
56
|
-
|
57
|
-
set = client.createStatement.executeQuery('SHOW DATABASES')
|
58
|
-
databases = []
|
59
|
-
databases << set.getString(1) while set.next
|
60
|
-
|
61
|
-
unless databases.include?('riddle')
|
62
|
-
client.createStatement.execute 'CREATE DATABASE riddle'
|
63
|
-
end
|
64
|
-
|
65
|
-
client.createStatement.execute 'USE riddle'
|
66
|
-
|
67
|
-
structure = File.open('spec/fixtures/sql/structure.sql') { |f| f.read }
|
68
|
-
structure.split(/;/).each { |sql| client.createStatement.execute sql }
|
69
|
-
client.createStatement.execute <<-SQL
|
70
|
-
LOAD DATA INFILE '#{fixtures_path}/sql/data.tsv' INTO TABLE
|
71
|
-
`riddle`.`people` FIELDS TERMINATED BY ',' ENCLOSED BY "'" (gender,
|
72
|
-
first_name, middle_initial, last_name, street_address, city, state,
|
73
|
-
postcode, email, birthday)
|
74
|
-
SQL
|
75
|
-
end
|
76
|
-
|
77
|
-
def generate_configuration
|
78
|
-
template = File.open('spec/fixtures/sphinx/configuration.erb') { |f| f.read }
|
79
|
-
File.open('spec/fixtures/sphinx/spec.conf', 'w') { |f|
|
80
|
-
f.puts ERB.new(template).result(binding)
|
81
|
-
}
|
82
|
-
|
83
|
-
FileUtils.mkdir_p "spec/fixtures/sphinx/binlog"
|
84
|
-
end
|
85
|
-
|
86
|
-
def index
|
87
|
-
cmd = "#{bin_path}indexer --config #{fixtures_path}/sphinx/spec.conf --all"
|
88
|
-
cmd << ' --rotate' if running?
|
89
|
-
`#{cmd}`
|
90
|
-
end
|
91
|
-
|
92
|
-
def start
|
93
|
-
return if running?
|
94
|
-
|
95
|
-
`#{bin_path}searchd --config #{fixtures_path}/sphinx/spec.conf`
|
96
|
-
|
97
|
-
sleep(1)
|
98
|
-
|
99
|
-
unless running?
|
100
|
-
puts 'Failed to start searchd daemon. Check fixtures/sphinx/searchd.log.'
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
def stop
|
105
|
-
return unless running?
|
106
|
-
|
107
|
-
stop_flag = '--stopwait'
|
108
|
-
stop_flag = '--stop' if Riddle.loaded_version.to_i < 1
|
109
|
-
`#{bin_path}searchd --config #{fixtures_path}/sphinx/spec.conf #{stop_flag}`
|
110
|
-
end
|
111
|
-
|
112
|
-
private
|
113
|
-
|
114
|
-
def pid
|
115
|
-
if File.exists?("#{fixtures_path}/sphinx/searchd.pid")
|
116
|
-
`cat #{fixtures_path}/sphinx/searchd.pid`[/\d+/]
|
117
|
-
else
|
118
|
-
nil
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
def running?
|
123
|
-
pid && `ps #{pid} | wc -l`.to_i > 1
|
124
|
-
end
|
125
|
-
|
126
|
-
def fixtures_path
|
127
|
-
File.expand_path File.join(File.dirname(__FILE__), '..', 'fixtures')
|
128
|
-
end
|
129
|
-
|
130
|
-
def bin_path
|
131
|
-
@bin_path ||= begin
|
132
|
-
path = (ENV['SPHINX_BIN'] || '').dup
|
133
|
-
path.insert -1, '/' if path.length > 0 && path[/\/$/].nil?
|
134
|
-
path
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
data/spec/unit/client_spec.rb
DELETED
@@ -1,290 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Riddle::Client do
|
4
|
-
it "should have the same keys for both commands and versions, except persist" do
|
5
|
-
|
6
|
-
(Riddle::Client::Commands.keys - [:persist]).should == Riddle::Client::Versions.keys
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should default to localhost as the server" do
|
10
|
-
Riddle::Client.new.server.should == "localhost"
|
11
|
-
end
|
12
|
-
|
13
|
-
it "should default to port 9312" do
|
14
|
-
Riddle::Client.new.port.should == 9312
|
15
|
-
end
|
16
|
-
|
17
|
-
it "should accept an array of servers" do
|
18
|
-
servers = ["1.1.1.1", "2.2.2.2", "3.3.3.3"]
|
19
|
-
client = Riddle::Client.new(servers)
|
20
|
-
client.servers.should == servers
|
21
|
-
end
|
22
|
-
|
23
|
-
it "should translate anchor arguments correctly" do
|
24
|
-
client = Riddle::Client.new
|
25
|
-
client.set_anchor "latitude", 10.0, "longitude", 95.0
|
26
|
-
client.anchor.should == {
|
27
|
-
:latitude_attribute => "latitude",
|
28
|
-
:latitude => 10.0,
|
29
|
-
:longitude_attribute => "longitude",
|
30
|
-
:longitude => 95.0
|
31
|
-
}
|
32
|
-
end
|
33
|
-
|
34
|
-
it "should add queries to the queue" do
|
35
|
-
client = Riddle::Client.new
|
36
|
-
client.queue.should be_empty
|
37
|
-
client.append_query "spec"
|
38
|
-
client.queue.should_not be_empty
|
39
|
-
end
|
40
|
-
|
41
|
-
describe 'query contents' do
|
42
|
-
it "should build a basic search message correctly" do
|
43
|
-
client = Riddle::Client.new
|
44
|
-
client.append_query "test "
|
45
|
-
client.queue.first.should == query_contents(:simple)
|
46
|
-
end
|
47
|
-
|
48
|
-
it "should build a message with a specified index correctly" do
|
49
|
-
client = Riddle::Client.new
|
50
|
-
client.append_query "test ", "edition"
|
51
|
-
client.queue.first.should == query_contents(:index)
|
52
|
-
end
|
53
|
-
|
54
|
-
it "should build a message using match mode :any correctly" do
|
55
|
-
client = Riddle::Client.new
|
56
|
-
client.match_mode = :any
|
57
|
-
client.append_query "test this "
|
58
|
-
client.queue.first.should == query_contents(:any)
|
59
|
-
end
|
60
|
-
|
61
|
-
it "should build a message using sort by correctly" do
|
62
|
-
client = Riddle::Client.new
|
63
|
-
client.sort_by = 'id'
|
64
|
-
client.sort_mode = :extended
|
65
|
-
client.append_query "testing "
|
66
|
-
client.queue.first.should == query_contents(:sort)
|
67
|
-
end
|
68
|
-
|
69
|
-
it "should build a message using match mode :boolean correctly" do
|
70
|
-
client = Riddle::Client.new
|
71
|
-
client.match_mode = :boolean
|
72
|
-
client.append_query "test "
|
73
|
-
client.queue.first.should == query_contents(:boolean)
|
74
|
-
end
|
75
|
-
|
76
|
-
it "should build a message using match mode :phrase correctly" do
|
77
|
-
client = Riddle::Client.new
|
78
|
-
client.match_mode = :phrase
|
79
|
-
client.append_query "testing this "
|
80
|
-
client.queue.first.should == query_contents(:phrase)
|
81
|
-
end
|
82
|
-
|
83
|
-
it "should build a message with a filter correctly" do
|
84
|
-
client = Riddle::Client.new
|
85
|
-
client.filters << Riddle::Client::Filter.new("id", [10, 100, 1000])
|
86
|
-
client.append_query "test "
|
87
|
-
client.queue.first.should == query_contents(:filter)
|
88
|
-
end
|
89
|
-
|
90
|
-
it "should build a message with group values correctly" do
|
91
|
-
client = Riddle::Client.new
|
92
|
-
client.group_by = "id"
|
93
|
-
client.group_function = :attr
|
94
|
-
client.group_clause = "id"
|
95
|
-
client.append_query "test "
|
96
|
-
client.queue.first.should == query_contents(:group)
|
97
|
-
end
|
98
|
-
|
99
|
-
it "should build a message with group distinct value correctly" do
|
100
|
-
client = Riddle::Client.new
|
101
|
-
client.group_distinct = "id"
|
102
|
-
client.append_query "test "
|
103
|
-
client.queue.first.should == query_contents(:distinct)
|
104
|
-
end
|
105
|
-
|
106
|
-
it "should build a message with weights correctly" do
|
107
|
-
client = Riddle::Client.new
|
108
|
-
client.weights = [100, 1]
|
109
|
-
client.append_query "test "
|
110
|
-
client.queue.first.should == query_contents(:weights)
|
111
|
-
end
|
112
|
-
|
113
|
-
it "should build a message with an anchor correctly" do
|
114
|
-
client = Riddle::Client.new
|
115
|
-
client.set_anchor "latitude", 10.0, "longitude", 95.0
|
116
|
-
client.append_query "test "
|
117
|
-
client.queue.first.should == query_contents(:anchor)
|
118
|
-
end
|
119
|
-
|
120
|
-
it "should build a message with index weights correctly" do
|
121
|
-
client = Riddle::Client.new
|
122
|
-
client.index_weights = {"people" => 101}
|
123
|
-
client.append_query "test "
|
124
|
-
client.queue.first.should == query_contents(:index_weights)
|
125
|
-
end
|
126
|
-
|
127
|
-
it "should build a message with field weights correctly" do
|
128
|
-
client = Riddle::Client.new
|
129
|
-
client.field_weights = {"city" => 101}
|
130
|
-
client.append_query "test "
|
131
|
-
client.queue.first.should == query_contents(:field_weights)
|
132
|
-
end
|
133
|
-
|
134
|
-
it "should build a message with a comment correctly" do
|
135
|
-
client = Riddle::Client.new
|
136
|
-
client.append_query "test ", "*", "commenting"
|
137
|
-
client.queue.first.should == query_contents(:comment)
|
138
|
-
end
|
139
|
-
|
140
|
-
if Riddle.loaded_version == '0.9.9' || Riddle.loaded_version == '1.10'
|
141
|
-
it "should build a message with overrides correctly" do
|
142
|
-
client = Riddle::Client.new
|
143
|
-
client.add_override("rating", :float, {1 => 10.0})
|
144
|
-
client.append_query "test "
|
145
|
-
client.queue.first.should == query_contents(:overrides)
|
146
|
-
end
|
147
|
-
|
148
|
-
it "should build a message with selects correctly" do
|
149
|
-
client = Riddle::Client.new
|
150
|
-
client.select = "selecting"
|
151
|
-
client.append_query "test "
|
152
|
-
client.queue.first.should == query_contents(:select)
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
it "should keep multiple messages in the queue" do
|
157
|
-
client = Riddle::Client.new
|
158
|
-
client.weights = [100, 1]
|
159
|
-
client.append_query "test "
|
160
|
-
client.append_query "test "
|
161
|
-
client.queue.length.should == 2
|
162
|
-
client.queue.each { |item| item.should == query_contents(:weights) }
|
163
|
-
end
|
164
|
-
|
165
|
-
it "should keep multiple messages in the queue with different params" do
|
166
|
-
client = Riddle::Client.new
|
167
|
-
client.weights = [100, 1]
|
168
|
-
client.append_query "test "
|
169
|
-
client.weights = []
|
170
|
-
client.append_query "test ", "edition"
|
171
|
-
client.queue.first.should == query_contents(:weights)
|
172
|
-
client.queue.last.should == query_contents(:index)
|
173
|
-
end
|
174
|
-
|
175
|
-
it "should build a basic update message correctly" do
|
176
|
-
client = Riddle::Client.new
|
177
|
-
client.send(
|
178
|
-
:update_message,
|
179
|
-
"people",
|
180
|
-
["birthday"],
|
181
|
-
{1 => [191163600]}
|
182
|
-
).should == query_contents(:update_simple)
|
183
|
-
end
|
184
|
-
|
185
|
-
it "should build a keywords request without hits correctly" do
|
186
|
-
client = Riddle::Client.new
|
187
|
-
client.send(
|
188
|
-
:keywords_message,
|
189
|
-
"pat",
|
190
|
-
"people",
|
191
|
-
false
|
192
|
-
).should == query_contents(:keywords_without_hits)
|
193
|
-
end
|
194
|
-
|
195
|
-
it "should build a keywords request with hits correctly" do
|
196
|
-
client = Riddle::Client.new
|
197
|
-
client.send(
|
198
|
-
:keywords_message,
|
199
|
-
"pat",
|
200
|
-
"people",
|
201
|
-
true
|
202
|
-
).should == query_contents(:keywords_with_hits)
|
203
|
-
end
|
204
|
-
end
|
205
|
-
|
206
|
-
it "should timeout after a specified time" do
|
207
|
-
client = Riddle::Client.new
|
208
|
-
client.port = 9314
|
209
|
-
client.timeout = 1
|
210
|
-
|
211
|
-
server = TCPServer.new "localhost", 9314
|
212
|
-
|
213
|
-
lambda {
|
214
|
-
client.send(:connect) { |socket| }
|
215
|
-
}.should raise_error(Riddle::ConnectionError)
|
216
|
-
|
217
|
-
server.close
|
218
|
-
end unless RUBY_PLATFORM == 'java' # JRuby doesn't like Timeout
|
219
|
-
|
220
|
-
context "connection retrying" do
|
221
|
-
it "should try fives time when connection refused" do
|
222
|
-
client = Riddle::Client.new
|
223
|
-
client.port = 3314
|
224
|
-
|
225
|
-
TCPSocket.should_receive(:new).with('localhost', 3314).exactly(5).times.
|
226
|
-
and_raise(Errno::ECONNREFUSED)
|
227
|
-
|
228
|
-
lambda {
|
229
|
-
client.send(:connect) { |socket| }
|
230
|
-
}.should raise_error(Riddle::ConnectionError)
|
231
|
-
end
|
232
|
-
end
|
233
|
-
|
234
|
-
context "connection fail over" do
|
235
|
-
it "should try each of several server addresses after timeouts" do
|
236
|
-
client = Riddle::Client.new
|
237
|
-
client.port = 3314
|
238
|
-
client.servers = %w[localhost 127.0.0.1 0.0.0.0]
|
239
|
-
client.timeout = 1
|
240
|
-
|
241
|
-
TCPSocket.should_receive(:new).with(
|
242
|
-
an_instance_of(String), 3314
|
243
|
-
).exactly(3).and_raise Timeout::Error
|
244
|
-
|
245
|
-
lambda {
|
246
|
-
client.send(:connect) { |socket| }
|
247
|
-
}.should raise_error(Riddle::ConnectionError)
|
248
|
-
end unless RUBY_PLATFORM == 'java' # JRuby doesn't like Timeout
|
249
|
-
|
250
|
-
it "should try each of several server addresses after a connection refused" do
|
251
|
-
client = Riddle::Client.new
|
252
|
-
client.port = 3314
|
253
|
-
client.servers = %w[localhost 127.0.0.1 0.0.0.0]
|
254
|
-
client.timeout = 1
|
255
|
-
|
256
|
-
# initialise_socket will retry 5 times before failing,
|
257
|
-
# these combined with the multiple server failover should result in 15
|
258
|
-
# calls to TCPSocket.new
|
259
|
-
TCPSocket.should_receive(:new).with(
|
260
|
-
an_instance_of(String), 3314
|
261
|
-
).exactly(3 * 5).and_raise Errno::ECONNREFUSED
|
262
|
-
|
263
|
-
lambda {
|
264
|
-
client.send(:connect) { |socket| }
|
265
|
-
}.should raise_error(Riddle::ConnectionError)
|
266
|
-
end unless RUBY_PLATFORM == 'java' # JRuby doesn't like Timeout
|
267
|
-
end
|
268
|
-
|
269
|
-
it "should fail if the server has the wrong version" do
|
270
|
-
client = Riddle::Client.new
|
271
|
-
client.port = 9314
|
272
|
-
client.timeout = 1
|
273
|
-
|
274
|
-
server = TCPServer.new "localhost", 9314
|
275
|
-
|
276
|
-
thread = Thread.new do
|
277
|
-
client = server.accept
|
278
|
-
client.send [0].pack("N"), 0
|
279
|
-
client.close
|
280
|
-
end
|
281
|
-
|
282
|
-
lambda {
|
283
|
-
client.send(:connect) { |socket| }
|
284
|
-
}.should raise_error(Riddle::VersionError)
|
285
|
-
|
286
|
-
thread.exit
|
287
|
-
server.close
|
288
|
-
end
|
289
|
-
|
290
|
-
end
|