dm-sphinx-adapter 0.3 → 0.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/Manifest.txt +2 -0
- data/Rakefile +1 -1
- data/dm-sphinx-adapter.gemspec +7 -5
- data/lib/dm-sphinx-adapter/sphinx_adapter.rb +5 -5
- data/lib/dm-sphinx-adapter/sphinx_client.rb +9 -4
- data/lib/dm-sphinx-adapter/sphinx_config.rb +20 -20
- data/test/fixtures/item.rb +4 -21
- data/test/fixtures/item.sql +5 -7
- data/test/fixtures/item_resource_explicit.rb +26 -0
- data/test/fixtures/item_resource_only.rb +20 -0
- data/test/helper.rb +3 -0
- data/test/test_search.rb +16 -1
- metadata +4 -2
data/Manifest.txt
CHANGED
@@ -14,6 +14,8 @@ lib/dm-sphinx-adapter/sphinx_resource.rb
|
|
14
14
|
test/data/sphinx.conf
|
15
15
|
test/fixtures/item.rb
|
16
16
|
test/fixtures/item.sql
|
17
|
+
test/fixtures/item_resource_explicit.rb
|
18
|
+
test/fixtures/item_resource_only.rb
|
17
19
|
test/helper.rb
|
18
20
|
test/test_client.rb
|
19
21
|
test/test_config.rb
|
data/Rakefile
CHANGED
data/dm-sphinx-adapter.gemspec
CHANGED
@@ -1,20 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
1
3
|
Gem::Specification.new do |s|
|
2
4
|
s.name = %q{dm-sphinx-adapter}
|
3
|
-
s.version = "0.
|
5
|
+
s.version = "0.4"
|
4
6
|
|
5
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
6
8
|
s.authors = ["Shane Hanna"]
|
7
|
-
s.date = %q{2008-11-
|
9
|
+
s.date = %q{2008-11-20}
|
8
10
|
s.description = %q{}
|
9
11
|
s.email = ["shane.hanna@gmail.com"]
|
10
12
|
s.extra_rdoc_files = ["History.txt", "LICENCE.txt", "Manifest.txt", "README.txt"]
|
11
|
-
s.files = ["History.txt", "LICENCE.txt", "Manifest.txt", "README.txt", "Rakefile", "dm-sphinx-adapter.gemspec", "lib/dm-sphinx-adapter.rb", "lib/dm-sphinx-adapter/sphinx_adapter.rb", "lib/dm-sphinx-adapter/sphinx_attribute.rb", "lib/dm-sphinx-adapter/sphinx_client.rb", "lib/dm-sphinx-adapter/sphinx_config.rb", "lib/dm-sphinx-adapter/sphinx_index.rb", "lib/dm-sphinx-adapter/sphinx_resource.rb", "test/data/sphinx.conf", "test/fixtures/item.rb", "test/fixtures/item.sql", "test/helper.rb", "test/test_client.rb", "test/test_config.rb", "test/test_search.rb"]
|
13
|
+
s.files = ["History.txt", "LICENCE.txt", "Manifest.txt", "README.txt", "Rakefile", "dm-sphinx-adapter.gemspec", "lib/dm-sphinx-adapter.rb", "lib/dm-sphinx-adapter/sphinx_adapter.rb", "lib/dm-sphinx-adapter/sphinx_attribute.rb", "lib/dm-sphinx-adapter/sphinx_client.rb", "lib/dm-sphinx-adapter/sphinx_config.rb", "lib/dm-sphinx-adapter/sphinx_index.rb", "lib/dm-sphinx-adapter/sphinx_resource.rb", "test/data/sphinx.conf", "test/fixtures/item.rb", "test/fixtures/item.sql", "test/fixtures/item_resource_explicit.rb", "test/fixtures/item_resource_only.rb", "test/helper.rb", "test/test_client.rb", "test/test_config.rb", "test/test_search.rb"]
|
12
14
|
s.has_rdoc = true
|
13
15
|
s.homepage = %q{A Sphinx DataMapper adapter.}
|
14
16
|
s.rdoc_options = ["--main", "README.txt"]
|
15
17
|
s.require_paths = ["lib"]
|
16
18
|
s.rubyforge_project = %q{dm-sphinx-adapter}
|
17
|
-
s.rubygems_version = %q{1.
|
19
|
+
s.rubygems_version = %q{1.3.0}
|
18
20
|
s.summary = %q{}
|
19
21
|
s.test_files = ["test/test_client.rb", "test/test_config.rb", "test/test_search.rb"]
|
20
22
|
|
@@ -22,7 +24,7 @@ Gem::Specification.new do |s|
|
|
22
24
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
23
25
|
s.specification_version = 2
|
24
26
|
|
25
|
-
if
|
27
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
26
28
|
s.add_runtime_dependency(%q<dm-core>, ["~> 0.9.7"])
|
27
29
|
s.add_runtime_dependency(%q<riddle>, ["~> 0.9"])
|
28
30
|
s.add_development_dependency(%q<hoe>, [">= 1.8.2"])
|
@@ -87,8 +87,7 @@ module DataMapper
|
|
87
87
|
def indexes(model)
|
88
88
|
indexes = model.sphinx_indexes(repository(self.name).name) if model.respond_to?(:sphinx_indexes)
|
89
89
|
if indexes.nil? or indexes.empty?
|
90
|
-
|
91
|
-
indexes = [SphinxIndex.new(model, Extlib::Inflection.tableize(model.name))]
|
90
|
+
indexes = [SphinxIndex.new(model, model.storage_name)]
|
92
91
|
end
|
93
92
|
indexes
|
94
93
|
end
|
@@ -110,10 +109,11 @@ module DataMapper
|
|
110
109
|
search = search_query(query)
|
111
110
|
options = {
|
112
111
|
:match_mode => :extended, # TODO: Modes!
|
113
|
-
:limit => (query.limit ? query.limit.to_i : 0),
|
114
|
-
:offset => (query.offset ? query.offset.to_i : 0),
|
115
112
|
:filters => search_filters(query) # By attribute.
|
116
113
|
}
|
114
|
+
options[:limit] = query.limit.to_i if query.limit
|
115
|
+
options[:offset] = query.offset.to_i if query.offset
|
116
|
+
|
117
117
|
if order = search_order(query)
|
118
118
|
options.update(
|
119
119
|
:sort_mode => :extended,
|
@@ -127,7 +127,7 @@ module DataMapper
|
|
127
127
|
DataMapper.logger.info(
|
128
128
|
%q{Sphinx (%.3f): search '%s' in '%s' found %d documents} % [res[:time], search, from, res[:total]]
|
129
129
|
)
|
130
|
-
res[:matches].map{|doc| doc[:doc]}
|
130
|
+
res[:matches].map{|doc| {:id => doc[:doc]}}
|
131
131
|
end
|
132
132
|
|
133
133
|
##
|
@@ -6,10 +6,17 @@ require 'riddle'
|
|
6
6
|
module DataMapper
|
7
7
|
class SphinxClient
|
8
8
|
def initialize(uri_or_options)
|
9
|
+
# TODO: Documentation.
|
9
10
|
@config = SphinxConfig.new(uri_or_options)
|
10
11
|
end
|
11
12
|
|
12
|
-
|
13
|
+
##
|
14
|
+
# Search one or more indexes.
|
15
|
+
#
|
16
|
+
# @param [String] query The sphinx query string.
|
17
|
+
# @param [Array, String] indexes A string or array of indexes to search. Default is '*' (all).
|
18
|
+
# @param [Hash] options Any options you'd like to pass through to Riddle::Client.
|
19
|
+
# @see Riddle::Client
|
13
20
|
def search(query, indexes = '*', options = {})
|
14
21
|
indexes = indexes.join(' ') if indexes.kind_of?(Array)
|
15
22
|
|
@@ -64,9 +71,7 @@ module DataMapper
|
|
64
71
|
end
|
65
72
|
|
66
73
|
def search(*args)
|
67
|
-
@client.connect
|
68
|
-
super *args
|
69
|
-
end
|
74
|
+
@client.connect{super}
|
70
75
|
end
|
71
76
|
|
72
77
|
def stop
|
@@ -13,7 +13,20 @@ module DataMapper
|
|
13
13
|
# This class just gives you access to handy searchd {} configuration options. It does not validate your
|
14
14
|
# configuration file beyond basic syntax checking.
|
15
15
|
def initialize(uri_or_options = {})
|
16
|
-
@config
|
16
|
+
@config = []
|
17
|
+
@searchd = {
|
18
|
+
'address' => '0.0.0.0',
|
19
|
+
'log' => 'searchd.log',
|
20
|
+
'max_children' => 0,
|
21
|
+
'max_matches' => 1000,
|
22
|
+
'pid_file' => nil,
|
23
|
+
'port' => 3312,
|
24
|
+
'preopen_indexes' => 0,
|
25
|
+
'query_log' => '',
|
26
|
+
'read_timeout' => 5,
|
27
|
+
'seamless_rotate' => 1,
|
28
|
+
'unlink_old' => 1
|
29
|
+
}
|
17
30
|
|
18
31
|
path = case uri_or_options
|
19
32
|
when Addressable::URI, DataObjects::URI then uri_or_options.path
|
@@ -75,26 +88,8 @@ module DataMapper
|
|
75
88
|
##
|
76
89
|
# Searchd configuration options.
|
77
90
|
#
|
78
|
-
# Defaults will be applied but no validation is done.
|
79
|
-
#
|
80
91
|
# @see http://www.sphinxsearch.com/doc.html#confgroup-searchd
|
81
92
|
def searchd
|
82
|
-
unless @searchd
|
83
|
-
searchd = @blocks.find{|c| c['type'] =~ /searchd/i} || {}
|
84
|
-
@searchd = {
|
85
|
-
'address' => '0.0.0.0',
|
86
|
-
'log' => 'searchd.log',
|
87
|
-
'max_children' => 0,
|
88
|
-
'max_matches' => 1000,
|
89
|
-
'pid_file' => nil,
|
90
|
-
'port' => 3312,
|
91
|
-
'preopen_indexes' => 0,
|
92
|
-
'query_log' => '',
|
93
|
-
'read_timeout' => 5,
|
94
|
-
'seamless_rotate' => 1,
|
95
|
-
'unlink_old' => 1
|
96
|
-
}.update(searchd)
|
97
|
-
end
|
98
93
|
@searchd
|
99
94
|
end
|
100
95
|
|
@@ -105,6 +100,7 @@ module DataMapper
|
|
105
100
|
#
|
106
101
|
# @param [String] path Searches path, ./path, /path, /usr/local/etc/sphinx.conf, ./sphinx.conf in that order.
|
107
102
|
def parse(path = '')
|
103
|
+
# TODO: Three discrete things going on here, should be three subs.
|
108
104
|
paths = [
|
109
105
|
path,
|
110
106
|
path.gsub(%r{^/}, './'),
|
@@ -121,7 +117,11 @@ module DataMapper
|
|
121
117
|
source.gsub!(/\r\n|\r|\n/, "\n") # Everything in \n
|
122
118
|
source.gsub!(/\s*\\\n\s*/, ' ') # Remove unixy line wraps.
|
123
119
|
@in = StringScanner.new(source)
|
124
|
-
blocks(
|
120
|
+
blocks(blocks = [])
|
121
|
+
@in = nil
|
122
|
+
|
123
|
+
searchd = blocks.find{|c| c['type'] =~ /searchd/i} || {}
|
124
|
+
@searchd.update(searchd)
|
125
125
|
end
|
126
126
|
|
127
127
|
private
|
data/test/fixtures/item.rb
CHANGED
@@ -4,27 +4,10 @@ require 'zlib'
|
|
4
4
|
|
5
5
|
class Item
|
6
6
|
include DataMapper::Resource
|
7
|
-
|
8
|
-
|
9
|
-
property :
|
10
|
-
property :name, String, :nullable => false, :length => 50
|
11
|
-
property :likes, Text
|
7
|
+
property :id, Serial
|
8
|
+
property :name, String, :nullable => false, :length => 50
|
9
|
+
property :likes, Text
|
12
10
|
property :updated_on, DateTime
|
13
11
|
|
14
12
|
is :searchable
|
15
|
-
|
16
|
-
index :items
|
17
|
-
index :items_delta, :delta => true
|
18
|
-
|
19
|
-
# TODO: More attributes.
|
20
|
-
attribute :updated, DateTime
|
21
|
-
end
|
22
|
-
|
23
|
-
# I'm using my own (unreleased) Digest::CRC32 DataMapper::Type normally.
|
24
|
-
after :name, :set_id
|
25
|
-
|
26
|
-
protected
|
27
|
-
def set_id
|
28
|
-
attribute_set(:id, Zlib.crc32(name))
|
29
|
-
end
|
30
|
-
end
|
13
|
+
end # Item
|
data/test/fixtures/item.sql
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
drop table if exists delta;
|
2
|
-
|
3
2
|
create table delta (
|
4
3
|
name varchar(50) not null,
|
5
4
|
updated_on datetime,
|
@@ -7,9 +6,8 @@ create table delta (
|
|
7
6
|
) engine=innodb default charset=utf8;
|
8
7
|
|
9
8
|
drop table if exists items;
|
10
|
-
|
11
9
|
create table items (
|
12
|
-
id int(11) not null,
|
10
|
+
id int(11) not null auto_increment,
|
13
11
|
name varchar(50) not null,
|
14
12
|
likes text not null,
|
15
13
|
updated_on datetime,
|
@@ -17,7 +15,7 @@ create table items (
|
|
17
15
|
index (updated_on)
|
18
16
|
) engine=innodb default charset=utf8;
|
19
17
|
|
20
|
-
insert into items (
|
21
|
-
(
|
22
|
-
(
|
23
|
-
(
|
18
|
+
insert into items (name, likes, updated_on) values
|
19
|
+
('foo', 'I really like foo!', now()),
|
20
|
+
('bar', 'I really like bar!', now()),
|
21
|
+
('baz', 'I really like baz!', now());
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'dm-is-searchable'
|
3
|
+
require 'zlib'
|
4
|
+
|
5
|
+
class ItemResourceExplicit
|
6
|
+
include DataMapper::Resource
|
7
|
+
include DataMapper::SphinxResource
|
8
|
+
|
9
|
+
property :id, Serial
|
10
|
+
property :name, String, :nullable => false, :length => 50
|
11
|
+
property :likes, Text
|
12
|
+
property :updated_on, DateTime
|
13
|
+
|
14
|
+
is :searchable
|
15
|
+
repository(:search) do
|
16
|
+
properties(:search).clear
|
17
|
+
index :items
|
18
|
+
index :items_delta, :delta => true
|
19
|
+
property :name, String
|
20
|
+
attribute :updated, DateTime
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.default_storage_name
|
24
|
+
'item'
|
25
|
+
end
|
26
|
+
end # ItemResourceExplicit
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'dm-is-searchable'
|
3
|
+
require 'zlib'
|
4
|
+
|
5
|
+
class ItemResourceOnly
|
6
|
+
include DataMapper::Resource
|
7
|
+
include DataMapper::SphinxResource
|
8
|
+
|
9
|
+
property :id, Serial
|
10
|
+
property :name, String, :nullable => false, :length => 50
|
11
|
+
property :likes, Text
|
12
|
+
property :updated_on, DateTime
|
13
|
+
|
14
|
+
is :searchable
|
15
|
+
|
16
|
+
def self.default_storage_name
|
17
|
+
'item'
|
18
|
+
end
|
19
|
+
end # ItemResourceOnly
|
20
|
+
|
data/test/helper.rb
CHANGED
data/test/test_search.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
|
+
|
3
4
|
class TestSearch < Test::Unit::TestCase
|
4
5
|
def setup
|
5
6
|
# TODO: A little too brutal for me.
|
@@ -27,11 +28,25 @@ class TestSearch < Test::Unit::TestCase
|
|
27
28
|
def test_search
|
28
29
|
assert_nothing_raised{ Item.search }
|
29
30
|
assert_nothing_raised{ Item.search(:name => 'foo') }
|
31
|
+
assert !Item.search(:name => 'foo').empty?
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_search_resource_only
|
35
|
+
assert_nothing_raised{ ItemResourceOnly.search }
|
36
|
+
assert_nothing_raised{ ItemResourceOnly.search(:name => 'foo') }
|
37
|
+
assert !ItemResourceOnly.search(:name => 'foo').empty?
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_search_resource_explicit
|
41
|
+
assert_nothing_raised{ ItemResourceExplicit.search }
|
42
|
+
assert_nothing_raised{ ItemResourceExplicit.search(:name => 'foo') }
|
43
|
+
assert !ItemResourceExplicit.search(:name => 'foo').empty?
|
30
44
|
end
|
31
45
|
|
32
46
|
def test_search_attributes
|
47
|
+
# Attributes that exist only in :search and the sphinx.
|
33
48
|
assert_nothing_raised do
|
34
|
-
|
49
|
+
ItemResourceExplicit.search(:updated => (Time.now - 10 .. Time.now + 10))
|
35
50
|
end
|
36
51
|
end
|
37
52
|
end # TestSearch
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dm-sphinx-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "0.
|
4
|
+
version: "0.4"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shane Hanna
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-11-
|
12
|
+
date: 2008-11-20 00:00:00 +11:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -71,6 +71,8 @@ files:
|
|
71
71
|
- test/data/sphinx.conf
|
72
72
|
- test/fixtures/item.rb
|
73
73
|
- test/fixtures/item.sql
|
74
|
+
- test/fixtures/item_resource_explicit.rb
|
75
|
+
- test/fixtures/item_resource_only.rb
|
74
76
|
- test/helper.rb
|
75
77
|
- test/test_client.rb
|
76
78
|
- test/test_config.rb
|