shanna-dm-sphinx-adapter 0.6.2 → 0.7

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,7 @@
1
+ === 0.7 / 2009-02-21
2
+
3
+ * Explicit repository names everywhere I can. DM ~> 0.9.10 and dm-sphinx-adapter 0.6.2 couldn't guess the default repository name.
4
+
1
5
  === 0.6.2 / 2008-12-16
2
6
 
3
7
  * Fixed shallow .dup of riddle client errors. You need to upgrade if you are running 0.6.1.
data/Manifest.txt CHANGED
@@ -16,8 +16,8 @@ lib/riddle/client/filter.rb
16
16
  lib/riddle/client/message.rb
17
17
  lib/riddle/client/response.rb
18
18
  test/files/model.rb
19
- test/files/mysql5.sphinx.conf
20
- test/files/mysql5.sql
19
+ test/files/source.xml
20
+ test/files/sphinx.conf
21
21
  test/helper.rb
22
22
  test/test_adapter.rb
23
23
  test/test_attribute.rb
data/Rakefile CHANGED
@@ -3,10 +3,10 @@
3
3
  require 'rubygems'
4
4
  require 'hoe'
5
5
 
6
- Hoe.new('dm-sphinx-adapter', '0.6.2') do |p|
6
+ Hoe.new('dm-sphinx-adapter', '0.7') do |p|
7
7
  p.developer('Shane Hanna', 'shane.hanna@gmail.com')
8
8
  p.extra_deps = [
9
- ['dm-core', '~> 0.9.7']
9
+ ['dm-core', '~> 0.9.10']
10
10
  ]
11
11
  end
12
12
 
@@ -2,21 +2,21 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{dm-sphinx-adapter}
5
- s.version = "0.6.2"
5
+ s.version = "0.7"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Shane Hanna"]
9
- s.date = %q{2008-12-16}
9
+ s.date = %q{2009-02-21}
10
10
  s.description = %q{A DataMapper Sphinx adapter.}
11
11
  s.email = ["shane.hanna@gmail.com"]
12
12
  s.extra_rdoc_files = ["History.txt", "LICENCE.txt", "Manifest.txt", "README.txt"]
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/adapter.rb", "lib/dm-sphinx-adapter/attribute.rb", "lib/dm-sphinx-adapter/index.rb", "lib/dm-sphinx-adapter/query.rb", "lib/dm-sphinx-adapter/resource.rb", "lib/riddle.rb", "lib/riddle/client.rb", "lib/riddle/client/filter.rb", "lib/riddle/client/message.rb", "lib/riddle/client/response.rb", "test/files/model.rb", "test/files/mysql5.sphinx.conf", "test/files/mysql5.sql", "test/helper.rb", "test/test_adapter.rb", "test/test_attribute.rb", "test/test_index.rb", "test/test_query.rb", "test/test_resource.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/adapter.rb", "lib/dm-sphinx-adapter/attribute.rb", "lib/dm-sphinx-adapter/index.rb", "lib/dm-sphinx-adapter/query.rb", "lib/dm-sphinx-adapter/resource.rb", "lib/riddle.rb", "lib/riddle/client.rb", "lib/riddle/client/filter.rb", "lib/riddle/client/message.rb", "lib/riddle/client/response.rb", "test/files/model.rb", "test/files/source.xml", "test/files/sphinx.conf", "test/helper.rb", "test/test_adapter.rb", "test/test_attribute.rb", "test/test_index.rb", "test/test_query.rb", "test/test_resource.rb"]
14
14
  s.has_rdoc = true
15
15
  s.homepage = %q{http://dm-sphinx.rubyforge.org}
16
16
  s.rdoc_options = ["--main", "README.txt"]
17
17
  s.require_paths = ["lib"]
18
18
  s.rubyforge_project = %q{dm-sphinx-adapter}
19
- s.rubygems_version = %q{1.3.0}
19
+ s.rubygems_version = %q{1.3.1}
20
20
  s.summary = %q{A DataMapper Sphinx adapter.}
21
21
  s.test_files = ["test/test_adapter.rb", "test/test_attribute.rb", "test/test_index.rb", "test/test_query.rb", "test/test_resource.rb"]
22
22
 
@@ -25,14 +25,14 @@ Gem::Specification.new do |s|
25
25
  s.specification_version = 2
26
26
 
27
27
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
28
- s.add_runtime_dependency(%q<dm-core>, ["~> 0.9.7"])
29
- s.add_development_dependency(%q<hoe>, [">= 1.8.2"])
28
+ s.add_runtime_dependency(%q<dm-core>, ["~> 0.9.10"])
29
+ s.add_development_dependency(%q<hoe>, [">= 1.8.3"])
30
30
  else
31
- s.add_dependency(%q<dm-core>, ["~> 0.9.7"])
32
- s.add_dependency(%q<hoe>, [">= 1.8.2"])
31
+ s.add_dependency(%q<dm-core>, ["~> 0.9.10"])
32
+ s.add_dependency(%q<hoe>, [">= 1.8.3"])
33
33
  end
34
34
  else
35
- s.add_dependency(%q<dm-core>, ["~> 0.9.7"])
36
- s.add_dependency(%q<hoe>, [">= 1.8.2"])
35
+ s.add_dependency(%q<dm-core>, ["~> 0.9.10"])
36
+ s.add_dependency(%q<hoe>, [">= 1.8.3"])
37
37
  end
38
38
  end
@@ -98,10 +98,10 @@ module DataMapper
98
98
  #
99
99
  # ==== Returns
100
100
  # Array<DataMapper::Adapters::Sphinx::Index>:: Index objects from the model.
101
- def indexes(model)
102
- indexes = model.sphinx_indexes(repository(self.name).name) if model.respond_to?(:sphinx_indexes)
101
+ def indexes(query)
102
+ indexes = query.model.sphinx_indexes(query.repository.name) if query.model.respond_to?(:sphinx_indexes)
103
103
  if indexes.nil? or indexes.empty?
104
- indexes = [Index.new(model, model.storage_name)]
104
+ indexes = [Index.new(query.model, query.model.storage_name(query.repository.name))]
105
105
  end
106
106
  indexes
107
107
  end
@@ -115,7 +115,7 @@ module DataMapper
115
115
  # Array<Hash>:: An array of document hashes. <tt>[{:id => 1, ...}, {:id => 2, ...}]</tt>
116
116
  # Array<>:: An empty array if no documents match.
117
117
  def read(query)
118
- from = indexes(query.model).map{|index| index.name}.join(', ')
118
+ from = indexes(query).map{|index| index.name}.join(', ')
119
119
  search = Sphinx::Query.new(query).to_s
120
120
  client = Riddle::Client.new(@options[:host], @options[:port])
121
121
 
@@ -31,10 +31,11 @@ module DataMapper
31
31
  query.conditions.each do |operator, property, value|
32
32
  next if property.kind_of? Sphinx::Attribute # Filters are added elsewhere.
33
33
  normalized = normalize_value(value)
34
+ field = property.field(query.repository.name) unless operator == :raw
34
35
  @query << case operator
35
- when :eql, :like then '@%s "%s"' % [property.field.to_s, normalized.join(' ')]
36
- when :not then '@%s -"%s"' % [property.field.to_s, normalized.join(' ')]
37
- when :in then '@%s (%s)' % [property.field.to_s, normalized.map{|v| %{"#{v}"}}.join(' | ')]
36
+ when :eql, :like then '@%s "%s"' % [field.to_s, normalized.join(' ')]
37
+ when :not then '@%s -"%s"' % [field.to_s, normalized.join(' ')]
38
+ when :in then '@%s (%s)' % [field.to_s, normalized.map{|v| %{"#{v}"}}.join(' | ')]
38
39
  when :raw then "#{property}"
39
40
  else raise NotImplementedError.new("Sphinx: Query fields do not support the #{operator} operator")
40
41
  end
data/test/files/model.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  class Item
2
+ include DataMapper::Resource
2
3
  include DataMapper::SphinxResource
3
4
  property :id, Serial
4
5
  property :t_string, String
@@ -0,0 +1,39 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <sphinx:docset xmlns:sphinx="sphinx">
3
+ <sphinx:schema>
4
+ <sphinx:field name="t_string"/>
5
+ <sphinx:field name="t_text"/>
6
+ <sphinx:attr name="t_decimal" type="float"/>
7
+ <sphinx:attr name="t_float" type="float"/>
8
+ <sphinx:attr name="t_integer" type="int"/>
9
+ <sphinx:attr name="t_datetime" type="timestamp"/>
10
+ </sphinx:schema>
11
+
12
+ <sphinx:document id="1">
13
+ <t_string>one</t_string>
14
+ <t_text>text one!</t_text>
15
+ <t_decimal>10.5</t_decimal>
16
+ <t_float>100.5</t_float>
17
+ <t_integer>1000</t_integer>
18
+ <t_datetime>1235183682</t_datetime>
19
+ </sphinx:document>
20
+
21
+ <sphinx:document id="2">
22
+ <t_string>two</t_string>
23
+ <t_text>text two!</t_text>
24
+ <t_decimal>20.5</t_decimal>
25
+ <t_float>200.5</t_float>
26
+ <t_integer>2000</t_integer>
27
+ <t_datetime>1235183682</t_datetime>
28
+ </sphinx:document>
29
+
30
+ <sphinx:document id="3">
31
+ <t_string>three</t_string>
32
+ <t_text>text three!</t_text>
33
+ <t_decimal>30.5</t_decimal>
34
+ <t_float>300.5</t_float>
35
+ <t_integer>3000</t_integer>
36
+ <t_datetime>1235183682</t_datetime>
37
+ </sphinx:document>
38
+ </sphinx:docset>
39
+
@@ -0,0 +1,36 @@
1
+ # searchd and indexer must be run from the root directory of this lib.
2
+
3
+ indexer
4
+ {
5
+ mem_limit = 64M
6
+ }
7
+
8
+ searchd
9
+ {
10
+ address = localhost
11
+ port = 3312
12
+ log = test/files/tmp/sphinx.log
13
+ query_log = test/files/tmp/sphinx.query.log
14
+ read_timeout = 5
15
+ pid_file = test/files/tmp/sphinx.pid
16
+ max_matches = 1000
17
+ }
18
+
19
+ source items
20
+ {
21
+ type = xmlpipe2
22
+ xmlpipe_command = cat test/files/source.xml
23
+ }
24
+
25
+ index items_main
26
+ {
27
+ source = items
28
+ charset_type = utf-8
29
+ path = test/files/tmp/items
30
+ }
31
+
32
+ index items
33
+ {
34
+ type = distributed
35
+ local = items_main
36
+ }
data/test/helper.rb CHANGED
@@ -6,37 +6,32 @@ require 'pathname'
6
6
  require 'shoulda'
7
7
  require 'test/unit'
8
8
 
9
- base = Pathname.new(__FILE__).dirname + '..'
9
+ base = Pathname.new(__FILE__).dirname + '..'
10
+ files = base + 'test' + 'files'
10
11
  %w{lib test}.each{|p| $:.unshift base + p}
11
12
 
12
13
  require 'dm-sphinx-adapter'
13
14
 
14
15
  # Sphinx runner.
15
16
  Dir.chdir(base)
16
- config = base + 'test' + 'files' + 'mysql5.sphinx.conf'
17
17
  begin
18
18
  TCPSocket.new('localhost', '3312')
19
19
  rescue
20
20
  puts 'Starting Sphinx...'
21
- system("searchd --config #{config}") || exit
21
+ system("searchd --config #{files + 'sphinx.conf'}") || exit
22
22
  system('ps aux | grep searchd')
23
23
  end
24
24
 
25
- class Test::Unit::TestCase
26
- include Extlib::Hook
27
-
28
- before :setup do
29
- files = Pathname.new(__FILE__).dirname + 'files'
30
-
31
- mysql = `mysql5 dm_sphinx_adapter_test < #{files + 'mysql5.sql'} 2>&1`
32
- raise %{Re-create database failed:\n #{mysql}} unless mysql.blank?
25
+ indexer = `indexer --config #{files + 'sphinx.conf'} --all --rotate`
26
+ raise %{Re-create index failed:\n #{indexer}} if indexer =~ /error|fatal/i
27
+ sleep 1
33
28
 
34
- indexer = `indexer --config #{files + 'mysql5.sphinx.conf'} --all --rotate`
35
- raise %{Re-create index failed:\n #{indexer}} if indexer =~ /error|fatal/i
29
+ # :default is unused at the moment.
30
+ DataMapper.setup(:default, :adapter => 'in_memory', :database => 'dm_sphinx_adapter_test')
31
+ DataMapper.setup(:search, :adapter => 'sphinx')
36
32
 
37
- DataMapper.setup(:default, :adapter => 'mysql', :database => 'dm_sphinx_adapter_test')
38
- sleep 1; # Give sphinx a chance to catch up before test runs.
39
- end
33
+ class Test::Unit::TestCase
34
+ include Extlib::Hook
40
35
 
41
36
  # after :teardown do
42
37
  def teardown
data/test/test_adapter.rb CHANGED
@@ -3,9 +3,8 @@ require File.join(File.dirname(__FILE__), 'helper')
3
3
  class TestAdapter < Test::Unit::TestCase
4
4
  context 'DM::A::Sphinx::Adapter' do
5
5
  setup do
6
- DataMapper.setup(:adapter, :adapter => 'sphinx')
7
6
  load File.join(File.dirname(__FILE__), 'files', 'model.rb')
8
- @it = repository(:adapter)
7
+ @it = repository(:search)
9
8
  @resource = Item
10
9
  end
11
10
 
@@ -25,18 +24,6 @@ class TestAdapter < Test::Unit::TestCase
25
24
  end
26
25
  end
27
26
 
28
- context '#create' do
29
- should 'return zero records created' do
30
- assert_equal 0, @it.create(create_resource)
31
- end
32
- end
33
-
34
- context '#delete' do
35
- should 'return zero records deleted' do
36
- assert_equal 0, @it.delete(create_resource)
37
- end
38
- end
39
-
40
27
  context '#read_many' do
41
28
  context 'conditions' do
42
29
  should 'return all objects when nil' do
@@ -76,25 +63,6 @@ class TestAdapter < Test::Unit::TestCase
76
63
 
77
64
  protected
78
65
  def query(conditions = {})
79
- DataMapper::Query.new(repository(:adapter), @resource, conditions)
80
- end
81
-
82
- def resource(options = {})
83
- now = Time.now
84
- attributes = {
85
- :t_string => now.to_s,
86
- :t_text => "text #{now.to_s}!",
87
- :t_decimal => now.to_i * 0.001,
88
- :t_float => now.to_i * 0.0001,
89
- :t_integer => now.to_i,
90
- :t_datetime => now
91
- }.update(options)
92
- @resource.new(attributes)
93
- end
94
-
95
- def create_resource(options = {})
96
- repository(:adapter) do
97
- @resource.create(resource(options).attributes.except(:id))
98
- end
66
+ DataMapper::Query.new(repository(:search), @resource, conditions)
99
67
  end
100
68
  end
data/test/test_query.rb CHANGED
@@ -3,9 +3,8 @@ require File.join(File.dirname(__FILE__), 'helper')
3
3
  class TestQuery < Test::Unit::TestCase
4
4
  context 'DM::A::Sphinx::Query conditions' do
5
5
  setup do
6
- DataMapper.setup(:adapter, :adapter => 'sphinx')
7
6
  load File.join(File.dirname(__FILE__), 'files', 'model.rb')
8
- @adapter = repository(:adapter)
7
+ @adapter = repository(:search)
9
8
  @resource = Item
10
9
  end
11
10
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shanna-dm-sphinx-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: "0.7"
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shane Hanna
@@ -9,26 +9,28 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-12-16 00:00:00 -08:00
12
+ date: 2009-02-21 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: dm-core
17
+ type: :runtime
17
18
  version_requirement:
18
19
  version_requirements: !ruby/object:Gem::Requirement
19
20
  requirements:
20
21
  - - ~>
21
22
  - !ruby/object:Gem::Version
22
- version: 0.9.7
23
+ version: 0.9.10
23
24
  version:
24
25
  - !ruby/object:Gem::Dependency
25
26
  name: hoe
27
+ type: :development
26
28
  version_requirement:
27
29
  version_requirements: !ruby/object:Gem::Requirement
28
30
  requirements:
29
31
  - - ">="
30
32
  - !ruby/object:Gem::Version
31
- version: 1.8.2
33
+ version: 1.8.3
32
34
  version:
33
35
  description: A DataMapper Sphinx adapter.
34
36
  email:
@@ -61,8 +63,8 @@ files:
61
63
  - lib/riddle/client/message.rb
62
64
  - lib/riddle/client/response.rb
63
65
  - test/files/model.rb
64
- - test/files/mysql5.sphinx.conf
65
- - test/files/mysql5.sql
66
+ - test/files/source.xml
67
+ - test/files/sphinx.conf
66
68
  - test/helper.rb
67
69
  - test/test_adapter.rb
68
70
  - test/test_attribute.rb
@@ -1,97 +0,0 @@
1
- # searchd and indexer must be run from the root directory of this lib.
2
-
3
- indexer
4
- {
5
- mem_limit = 64M
6
- }
7
-
8
- searchd
9
- {
10
- address = localhost
11
- port = 3312
12
- log = test/files/tmp/sphinx.log
13
- query_log = test/files/tmp/sphinx.query.log
14
- read_timeout = 5
15
- pid_file = test/files/tmp/sphinx.pid
16
- max_matches = 1000
17
- }
18
-
19
- source items
20
- {
21
- type = mysql
22
- sql_host = localhost
23
- sql_user = root
24
- sql_pass =
25
- sql_db = dm_sphinx_adapter_test
26
-
27
- sql_query_pre = set names utf8
28
- sql_query_pre = \
29
- replace into delta (name, updated_on) ( \
30
- select 'items', t_datetime \
31
- from items \
32
- order by t_datetime desc \
33
- limit 1\
34
- )
35
- sql_query_info = select * from items where id = $id
36
-
37
- sql_query_pre = set names utf8
38
- sql_query = \
39
- select \
40
- id, \
41
- t_string, \
42
- t_text, \
43
- t_decimal, \
44
- t_float, \
45
- t_integer, \
46
- unix_timestamp(t_datetime) as t_datetime \
47
- from items \
48
- where t_datetime <= ( \
49
- select updated_on \
50
- from delta \
51
- where name = 'items' \
52
- )
53
-
54
- sql_attr_float = t_decimal
55
- sql_attr_float = t_float
56
- sql_attr_uint = t_integer
57
- sql_attr_timestamp = t_datetime
58
- }
59
-
60
- source items_delta : items {
61
- sql_query_pre = set names utf8
62
- sql_query_pre =
63
- sql_query = \
64
- select \
65
- id, \
66
- t_string, \
67
- t_text, \
68
- t_decimal, \
69
- t_float, \
70
- t_integer, \
71
- unix_timestamp(t_datetime) as t_datetime \
72
- from items \
73
- where t_datetime > ( \
74
- select updated_on \
75
- from delta \
76
- where name = 'items' \
77
- )
78
- }
79
-
80
- index items_main
81
- {
82
- source = items
83
- path = test/files/tmp/items_main
84
- }
85
-
86
- index items_delta : items_main
87
- {
88
- source = items_delta
89
- path = test/files/tmp/items_delta
90
- }
91
-
92
- index items
93
- {
94
- type = distributed
95
- local = items_main
96
- local = items_delta
97
- }
@@ -1,26 +0,0 @@
1
- drop table if exists delta;
2
- create table delta (
3
- name varchar(50) not null,
4
- updated_on datetime,
5
- primary key (name)
6
- ) engine=innodb default charset=utf8;
7
-
8
- insert into delta (name, updated_on) values
9
- ('items', now());
10
-
11
- drop table if exists items;
12
- create table items (
13
- id int(11) not null auto_increment,
14
- t_string varchar(50),
15
- t_text text,
16
- t_decimal decimal(30,10),
17
- t_float float,
18
- t_integer int,
19
- t_datetime datetime,
20
- primary key (id)
21
- ) engine=innodb default charset=utf8;
22
-
23
- insert into items (t_string, t_text, t_decimal, t_float, t_integer, t_datetime) values
24
- ('one', 'text one!', '10.50', '100.50', '1000', now()),
25
- ('two', 'text two!', '20.50', '200.50', '2000', now()),
26
- ('three', 'text three!', '30.50', '300.50', '3000', now());