riddle 1.5.1 → 1.5.2
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/.travis.yml +2 -4
- data/HISTORY +13 -1
- data/README.textile +7 -1
- data/lib/riddle/0.9.9/client.rb +8 -8
- data/lib/riddle/auto_version.rb +2 -2
- data/lib/riddle/client.rb +6 -4
- data/lib/riddle/client/filter.rb +16 -11
- data/lib/riddle/client/response.rb +19 -19
- data/lib/riddle/query.rb +4 -1
- data/lib/riddle/version.rb +1 -1
- 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/index.bin +0 -0
- data/spec/fixtures/data/0.9.9/index_weights.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/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/index.bin +0 -0
- data/spec/fixtures/data/1.10/index_weights.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/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/index.bin +0 -0
- data/spec/fixtures/data/2.0.1/index_weights.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/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/index.bin +0 -0
- data/spec/fixtures/data/2.1.0/index_weights.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/weights.bin +0 -0
- data/spec/fixtures/sphinxapi.0.9.8.php +8 -8
- data/spec/fixtures/sphinxapi.0.9.9.php +26 -26
- data/spec/fixtures/sphinxapi.1.10.php +27 -27
- data/spec/fixtures/sphinxapi.2.0.1.php +27 -27
- data/spec/fixtures/sphinxapi.2.1.0.php +2 -2
- data/spec/riddle/auto_version_spec.rb +14 -0
- data/spec/riddle/query_spec.rb +13 -8
- data/spec/unit/client_spec.rb +22 -0
- metadata +76 -49
data/.travis.yml
CHANGED
data/HISTORY
CHANGED
|
@@ -1,4 +1,16 @@
|
|
|
1
|
-
1.5.
|
|
1
|
+
1.5.2 - May 14th 2012
|
|
2
|
+
- Fixing 64-bit MVA support.
|
|
3
|
+
- Grouped searches now sort by weight instead of by group as a default. You can change this setting via Riddle::Client#group_clause.
|
|
4
|
+
- Use a local array of servers - don't clear the main set (S. Christoffer Eliesen).
|
|
5
|
+
- Fixing VersionError reference for Sphinx 0.9.9 or better (S. Christoffer Eliesen).
|
|
6
|
+
- Consistent documentation for default port: 9312 (Aleksey Morozov).
|
|
7
|
+
- Sphinx 2.0.4 support (Ilia Lobsanov).
|
|
8
|
+
- Handle single-value float filters (by translating them to a range) (Steven Bristol).
|
|
9
|
+
- Sphinx 2.0.2-dev handled as Sphinx 2.0.1.
|
|
10
|
+
- Sphinx 2.0.3 support.
|
|
11
|
+
- String options handled appropriately for SphinxQL excerpts calls.
|
|
12
|
+
|
|
13
|
+
1.5.1 - January 2nd 2012
|
|
2
14
|
- If no known servers work, raise an appropriate error.
|
|
3
15
|
- Sphinx 2.1.0-dev support.
|
|
4
16
|
|
data/README.textile
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
h1. Riddle
|
|
2
2
|
|
|
3
|
+
"!https://secure.travis-ci.org/freelancing-god/riddle.png!":http://travis-ci.org/freelancing-god/riddle
|
|
4
|
+
|
|
3
5
|
This client has been written to interface with "Sphinx":http://sphinxsearch.com/. It is written by "Pat Allan":http://freelancing-gods.com, and has been influenced by both Dmytro Shteflyuk's Ruby client and the original PHP client - credit where credit's due, after all.
|
|
4
6
|
|
|
5
7
|
It does not follow the same syntax as those two, though (not much point writing this otherwise) - opting for a more Ruby-like structure.
|
|
@@ -17,7 +19,7 @@ require 'riddle/0.9.9'</code></pre>
|
|
|
17
19
|
|
|
18
20
|
To get started, just instantiate a Client object:
|
|
19
21
|
|
|
20
|
-
<pre><code>client = Riddle::Client.new # defaults to localhost and port
|
|
22
|
+
<pre><code>client = Riddle::Client.new # defaults to localhost and port 9312
|
|
21
23
|
client = Riddle::Client.new "sphinxserver.domain.tld", 3333 # custom settings</code></pre>
|
|
22
24
|
|
|
23
25
|
And then set the parameters to what you want, before running a query:
|
|
@@ -83,3 +85,7 @@ Thanks to the following people who have contributed to Riddle in some shape or f
|
|
|
83
85
|
* Paul Gibler
|
|
84
86
|
* Ngan Pham
|
|
85
87
|
* Aaron Gilbralter
|
|
88
|
+
* Steven Bristol
|
|
89
|
+
* Ilia Lobsanov
|
|
90
|
+
* Aleksey Morozov
|
|
91
|
+
* S. Christoffer Eliesen
|
data/lib/riddle/0.9.9/client.rb
CHANGED
|
@@ -3,33 +3,33 @@ Riddle::Client::Versions[:update] = 0x102
|
|
|
3
3
|
|
|
4
4
|
class Riddle::Client
|
|
5
5
|
private
|
|
6
|
-
|
|
6
|
+
|
|
7
7
|
def initialise_connection
|
|
8
8
|
socket = initialise_socket
|
|
9
9
|
|
|
10
10
|
# Send version
|
|
11
11
|
socket.send [1].pack('N'), 0
|
|
12
|
-
|
|
12
|
+
|
|
13
13
|
# Checking version
|
|
14
14
|
version = socket.recv(4).unpack('N*').first
|
|
15
15
|
if version < 1
|
|
16
16
|
socket.close
|
|
17
|
-
raise VersionError, "Can only connect to searchd version 1.0 or better, not version #{version}"
|
|
17
|
+
raise Riddle::VersionError, "Can only connect to searchd version 1.0 or better, not version #{version}"
|
|
18
18
|
end
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
socket
|
|
21
21
|
end
|
|
22
|
-
|
|
22
|
+
|
|
23
23
|
def update_message(index, attributes, values_by_doc)
|
|
24
24
|
message = Message.new
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
message.append_string index
|
|
27
27
|
message.append_int attributes.length
|
|
28
28
|
attributes.each_with_index do |attribute, index|
|
|
29
29
|
message.append_string attribute
|
|
30
30
|
message.append_boolean values_by_doc.values.first[index].is_a?(Array)
|
|
31
31
|
end
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
message.append_int values_by_doc.length
|
|
34
34
|
values_by_doc.each do |key,values|
|
|
35
35
|
message.append_64bit_int key # document ID
|
|
@@ -43,7 +43,7 @@ class Riddle::Client
|
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
|
-
|
|
46
|
+
|
|
47
47
|
message.to_s
|
|
48
48
|
end
|
|
49
49
|
end
|
data/lib/riddle/auto_version.rb
CHANGED
data/lib/riddle/client.rb
CHANGED
|
@@ -136,7 +136,7 @@ module Riddle
|
|
|
136
136
|
end
|
|
137
137
|
|
|
138
138
|
# Can instantiate with a specific server and port - otherwise it assumes
|
|
139
|
-
# defaults of localhost and
|
|
139
|
+
# defaults of localhost and 9312 respectively. All other settings can be
|
|
140
140
|
# accessed and changed via the attribute accessors.
|
|
141
141
|
def initialize(servers = nil, port = nil, key = nil)
|
|
142
142
|
Riddle.version_warning
|
|
@@ -165,7 +165,7 @@ module Riddle
|
|
|
165
165
|
@filters = []
|
|
166
166
|
@group_by = ''
|
|
167
167
|
@group_function = :day
|
|
168
|
-
@group_clause = '@
|
|
168
|
+
@group_clause = '@weight DESC'
|
|
169
169
|
@group_distinct = ''
|
|
170
170
|
@cut_off = 0
|
|
171
171
|
@retry_count = 0
|
|
@@ -495,6 +495,8 @@ module Riddle
|
|
|
495
495
|
def open_socket
|
|
496
496
|
raise "Already Connected" unless @socket.nil?
|
|
497
497
|
|
|
498
|
+
available_servers = servers.dup
|
|
499
|
+
|
|
498
500
|
if @timeout == 0
|
|
499
501
|
@socket = initialise_connection
|
|
500
502
|
else
|
|
@@ -502,8 +504,8 @@ module Riddle
|
|
|
502
504
|
Timeout.timeout(@timeout) { @socket = initialise_connection }
|
|
503
505
|
rescue Timeout::Error, Riddle::ConnectionError => e
|
|
504
506
|
failed_servers ||= []
|
|
505
|
-
failed_servers <<
|
|
506
|
-
retry if !
|
|
507
|
+
failed_servers << available_servers.shift
|
|
508
|
+
retry if !available_servers.empty?
|
|
507
509
|
|
|
508
510
|
case e
|
|
509
511
|
when Timeout::Error
|
data/lib/riddle/client/filter.rb
CHANGED
|
@@ -2,21 +2,21 @@ module Riddle
|
|
|
2
2
|
class Client
|
|
3
3
|
class Filter
|
|
4
4
|
attr_accessor :attribute, :values, :exclude
|
|
5
|
-
|
|
5
|
+
|
|
6
6
|
# Attribute name, values (which can be an array or a range), and whether
|
|
7
7
|
# the filter should be exclusive.
|
|
8
8
|
def initialize(attribute, values, exclude=false)
|
|
9
9
|
@attribute, @values, @exclude = attribute, values, exclude
|
|
10
10
|
end
|
|
11
|
-
|
|
11
|
+
|
|
12
12
|
def exclude?
|
|
13
13
|
self.exclude
|
|
14
14
|
end
|
|
15
|
-
|
|
15
|
+
|
|
16
16
|
# Returns the message for this filter to send to the Sphinx service
|
|
17
17
|
def query_message
|
|
18
18
|
message = Message.new
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
message.append_string self.attribute.to_s
|
|
21
21
|
case self.values
|
|
22
22
|
when Range
|
|
@@ -28,21 +28,26 @@ module Riddle
|
|
|
28
28
|
append_integer_range message, self.values
|
|
29
29
|
end
|
|
30
30
|
when Array
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
if self.values.first.is_a?(Float) && self.values.length == 1
|
|
32
|
+
message.append_int FilterTypes[:float_range]
|
|
33
|
+
message.append_floats self.values.first, self.values.first
|
|
34
|
+
else
|
|
35
|
+
message.append_int FilterTypes[:values]
|
|
36
|
+
message.append_int self.values.length
|
|
37
|
+
append_array message, self.values
|
|
38
|
+
end
|
|
34
39
|
end
|
|
35
40
|
message.append_int self.exclude? ? 1 : 0
|
|
36
|
-
|
|
41
|
+
|
|
37
42
|
message.to_s
|
|
38
43
|
end
|
|
39
|
-
|
|
44
|
+
|
|
40
45
|
private
|
|
41
|
-
|
|
46
|
+
|
|
42
47
|
def append_integer_range(message, range)
|
|
43
48
|
message.append_ints self.values.first, self.values.last
|
|
44
49
|
end
|
|
45
|
-
|
|
50
|
+
|
|
46
51
|
# Using to_f is a hack from the PHP client - to workaround 32bit signed
|
|
47
52
|
# ints on x32 platforms
|
|
48
53
|
def append_array(message, array)
|
|
@@ -10,39 +10,39 @@ module Riddle
|
|
|
10
10
|
@str = str
|
|
11
11
|
@marker = 0
|
|
12
12
|
end
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
# Return the next string value in the stream
|
|
15
15
|
def next
|
|
16
16
|
len = next_int
|
|
17
17
|
result = @str[@marker, len]
|
|
18
18
|
@marker += len
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
Riddle.encode(result)
|
|
21
21
|
end
|
|
22
|
-
|
|
22
|
+
|
|
23
23
|
# Return the next integer value from the stream
|
|
24
24
|
def next_int
|
|
25
25
|
int = @str[@marker, 4].unpack('N*').first
|
|
26
26
|
@marker += 4
|
|
27
|
-
|
|
27
|
+
|
|
28
28
|
int
|
|
29
29
|
end
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
def next_64bit_int
|
|
32
32
|
high, low = @str[@marker, 8].unpack('N*N*')[0..1]
|
|
33
33
|
@marker += 8
|
|
34
|
-
|
|
34
|
+
|
|
35
35
|
(high << 32) + low
|
|
36
36
|
end
|
|
37
|
-
|
|
37
|
+
|
|
38
38
|
# Return the next float value from the stream
|
|
39
39
|
def next_float
|
|
40
40
|
float = @str[@marker, 4].unpack('N*').pack('L').unpack('f*').first
|
|
41
41
|
@marker += 4
|
|
42
|
-
|
|
42
|
+
|
|
43
43
|
float
|
|
44
44
|
end
|
|
45
|
-
|
|
45
|
+
|
|
46
46
|
# Returns an array of string items
|
|
47
47
|
def next_array
|
|
48
48
|
count = next_int
|
|
@@ -50,10 +50,10 @@ module Riddle
|
|
|
50
50
|
count.times do
|
|
51
51
|
items << self.next
|
|
52
52
|
end
|
|
53
|
-
|
|
53
|
+
|
|
54
54
|
items
|
|
55
55
|
end
|
|
56
|
-
|
|
56
|
+
|
|
57
57
|
# Returns an array of int items
|
|
58
58
|
def next_int_array
|
|
59
59
|
count = next_int
|
|
@@ -61,30 +61,30 @@ module Riddle
|
|
|
61
61
|
count.times do
|
|
62
62
|
items << self.next_int
|
|
63
63
|
end
|
|
64
|
-
|
|
64
|
+
|
|
65
65
|
items
|
|
66
66
|
end
|
|
67
|
-
|
|
67
|
+
|
|
68
68
|
def next_float_array
|
|
69
69
|
count = next_int
|
|
70
70
|
items = []
|
|
71
71
|
count.times do
|
|
72
72
|
items << self.next_float
|
|
73
73
|
end
|
|
74
|
-
|
|
74
|
+
|
|
75
75
|
items
|
|
76
76
|
end
|
|
77
|
-
|
|
77
|
+
|
|
78
78
|
def next_64bit_int_array
|
|
79
|
-
|
|
79
|
+
byte_count = next_int
|
|
80
80
|
items = []
|
|
81
|
-
|
|
81
|
+
(byte_count / 2).times do
|
|
82
82
|
items << self.next_64bit_int
|
|
83
83
|
end
|
|
84
|
-
|
|
84
|
+
|
|
85
85
|
items
|
|
86
86
|
end
|
|
87
|
-
|
|
87
|
+
|
|
88
88
|
# Returns the length of the streamed data
|
|
89
89
|
def length
|
|
90
90
|
@str.length
|
data/lib/riddle/query.rb
CHANGED
|
@@ -59,7 +59,10 @@ module Riddle::Query
|
|
|
59
59
|
|
|
60
60
|
def self.snippets(data, index, query, options = nil)
|
|
61
61
|
options = ', ' + options.keys.collect { |key|
|
|
62
|
-
|
|
62
|
+
value = options[key]
|
|
63
|
+
value = "'#{value}'" if value.is_a?(String)
|
|
64
|
+
|
|
65
|
+
"#{value} AS #{key}"
|
|
63
66
|
}.join(', ') unless options.nil?
|
|
64
67
|
|
|
65
68
|
"CALL SNIPPETS('#{data}', '#{index}', '#{query}'#{options})"
|
data/lib/riddle/version.rb
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|