ultrasphinx 1.8 → 1.9

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.
Files changed (60) hide show
  1. data.tar.gz.sig +1 -3
  2. data/CHANGELOG +4 -0
  3. data/DEPLOYMENT_NOTES +7 -3
  4. data/Manifest +10 -0
  5. data/RAKE_TASKS +4 -2
  6. data/README +35 -18
  7. data/TODO +0 -1
  8. data/examples/default.base +24 -19
  9. data/lib/ultrasphinx.rb +1 -1
  10. data/lib/ultrasphinx/configure.rb +66 -25
  11. data/lib/ultrasphinx/core_extensions.rb +10 -1
  12. data/lib/ultrasphinx/is_indexed.rb +49 -6
  13. data/lib/ultrasphinx/search.rb +81 -69
  14. data/lib/ultrasphinx/search/internals.rb +61 -38
  15. data/lib/ultrasphinx/search/parser.rb +17 -7
  16. data/lib/ultrasphinx/ultrasphinx.rb +69 -16
  17. data/tasks/ultrasphinx.rake +47 -29
  18. data/test/config/ultrasphinx/test.base +50 -21
  19. data/test/integration/app/app/models/geo/address.rb +2 -1
  20. data/test/integration/app/app/models/person/user.rb +12 -3
  21. data/test/integration/app/app/models/seller.rb +2 -1
  22. data/test/integration/app/config/environment.rb +2 -0
  23. data/test/integration/app/config/ultrasphinx/default.base +16 -8
  24. data/test/integration/app/config/ultrasphinx/development.conf +319 -0
  25. data/test/integration/app/config/ultrasphinx/development.conf.canonical +152 -24
  26. data/test/integration/app/db/schema.rb +56 -0
  27. data/test/integration/app/test/fixtures/sellers.yml +1 -1
  28. data/test/integration/app/test/fixtures/users.yml +1 -1
  29. data/test/integration/app/test/unit/country_test.rb +8 -0
  30. data/test/integration/delta_test.rb +39 -0
  31. data/test/integration/search_test.rb +60 -1
  32. data/test/integration/spell_test.rb +6 -2
  33. data/test/profile/benchmark.rb +44 -0
  34. data/test/test_helper.rb +6 -1
  35. data/test/unit/parser_test.rb +21 -2
  36. data/ultrasphinx.gemspec +4 -4
  37. data/vendor/riddle/README +2 -2
  38. data/vendor/riddle/lib/riddle.rb +1 -1
  39. data/vendor/riddle/lib/riddle/client.rb +45 -10
  40. data/vendor/riddle/spec/fixtures/data/anchor.bin +0 -0
  41. data/vendor/riddle/spec/fixtures/data/any.bin +0 -0
  42. data/vendor/riddle/spec/fixtures/data/boolean.bin +0 -0
  43. data/vendor/riddle/spec/fixtures/data/distinct.bin +0 -0
  44. data/vendor/riddle/spec/fixtures/data/field_weights.bin +0 -0
  45. data/vendor/riddle/spec/fixtures/data/filter.bin +0 -0
  46. data/vendor/riddle/spec/fixtures/data/group.bin +0 -0
  47. data/vendor/riddle/spec/fixtures/data/index.bin +0 -0
  48. data/vendor/riddle/spec/fixtures/data/index_weights.bin +0 -0
  49. data/vendor/riddle/spec/fixtures/data/phrase.bin +0 -0
  50. data/vendor/riddle/spec/fixtures/data/rank_mode.bin +0 -0
  51. data/vendor/riddle/spec/fixtures/data/simple.bin +0 -0
  52. data/vendor/riddle/spec/fixtures/data/sort.bin +0 -0
  53. data/vendor/riddle/spec/fixtures/data/update_simple.bin +0 -0
  54. data/vendor/riddle/spec/fixtures/data/weights.bin +0 -0
  55. data/vendor/riddle/spec/fixtures/data_generator.php +130 -0
  56. data/vendor/riddle/spec/fixtures/sphinxapi.php +1066 -0
  57. data/vendor/riddle/spec/spec_helper.rb +1 -0
  58. data/vendor/riddle/spec/unit/client_spec.rb +18 -4
  59. metadata +12 -2
  60. metadata.gz.sig +0 -0
@@ -0,0 +1,56 @@
1
+ # This file is auto-generated from the current state of the database. Instead of editing this file,
2
+ # please use the migrations feature of ActiveRecord to incrementally modify your database, and
3
+ # then regenerate this schema definition.
4
+ #
5
+ # Note that this schema.rb definition is the authoritative source for your database schema. If you need
6
+ # to create the application database on another system, you should be using db:schema:load, not running
7
+ # all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
8
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
9
+ #
10
+ # It's strongly recommended to check this file into your version control system.
11
+
12
+ ActiveRecord::Schema.define(:version => 9) do
13
+
14
+ create_table "addresses", :force => true do |t|
15
+ t.integer "user_id", :null => false
16
+ t.string "name"
17
+ t.string "line_1", :default => "", :null => false
18
+ t.string "line_2"
19
+ t.string "city", :default => "", :null => false
20
+ t.integer "state_id", :null => false
21
+ t.string "province_region"
22
+ t.string "zip_postal_code"
23
+ t.integer "country_id", :null => false
24
+ t.float "lat"
25
+ t.float "long"
26
+ end
27
+
28
+ create_table "countries", :force => true do |t|
29
+ t.string "name", :default => "", :null => false
30
+ end
31
+
32
+ create_table "sellers", :force => true do |t|
33
+ t.integer "user_id", :null => false
34
+ t.string "company_name"
35
+ t.datetime "created_at"
36
+ t.datetime "updated_at"
37
+ t.float "capitalization", :default => 0.0
38
+ t.string "mission_statement"
39
+ end
40
+
41
+ create_table "states", :force => true do |t|
42
+ t.string "name", :default => "", :null => false
43
+ t.string "abbreviation", :default => "", :null => false
44
+ end
45
+
46
+ create_table "users", :force => true do |t|
47
+ t.string "login", :limit => 64, :default => "", :null => false
48
+ t.string "email", :default => "", :null => false
49
+ t.string "crypted_password", :limit => 64, :default => "", :null => false
50
+ t.string "salt", :limit => 64, :default => "", :null => false
51
+ t.datetime "created_at"
52
+ t.datetime "updated_at"
53
+ t.boolean "deleted", :default => false
54
+ end
55
+
56
+ end
@@ -5,7 +5,7 @@
5
5
  company_name: <%= "seller#{num}" %>
6
6
  capitalization: <%= num * 1.548 %>
7
7
  mission_statement: <%= %w(Add value through developing superior products.).sort_by(&:rand).join(" ") %>
8
- updated_at: <%= ((time = Time.parse("Tue Oct 23 04:28:11")) - num.days).to_s(:db) %>
8
+ updated_at: <%= ((time = Time.parse("Tue Oct 23 04:28:11 2007")) - num.days).to_s(:db) %>
9
9
  created_at: <%= (time - num.weeks).to_s(:db) %>
10
10
  <% end %>
11
11
 
@@ -5,7 +5,7 @@
5
5
  crypted_password: "2fdefe5c83d80a03a828dd65e90cfff65f0fb42d043a254ca2cad6af968d0e15" #password
6
6
  email: <%= "user#{num}@test.com" %>
7
7
  salt: "1000"
8
- updated_at: <%= (time = Time.parse("Tue Oct 23 04:28:11")).to_s(:db) %>
8
+ updated_at: <%= (time = Time.parse("Tue Oct 23 04:28:11 2007")).to_s(:db) %>
9
9
  created_at: <%= (time - 180).to_s(:db) %>
10
10
  deleted: <%= num == 41 ? true : false %>
11
11
  <% end %>
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class CountryTest < ActiveSupport::TestCase
4
+ # Replace this with your real tests.
5
+ def test_truth
6
+ assert true
7
+ end
8
+ end
@@ -0,0 +1,39 @@
1
+
2
+ require "#{File.dirname(__FILE__)}/../test_helper"
3
+
4
+ class DeltaTest < Test::Unit::TestCase
5
+
6
+ S = Ultrasphinx::Search
7
+ E = Ultrasphinx::UsageError
8
+ STRFTIME = "%b %d %Y %H:%M:%S" # Chronic can't parse the default date .to_s
9
+
10
+ def test_delta_update
11
+
12
+ # XXX Not really necessary?
13
+ Dir.chdir "#{HERE}/integration/app" do
14
+ Echoe.silence do
15
+ system("rake db:fixtures:load")
16
+ system("rake ultrasphinx:index")
17
+ end
18
+ end
19
+
20
+ @count = S.new.total_entries
21
+
22
+ @new = User.new
23
+ @new.save!
24
+ User.find(2).update_attribute(:created_at, Time.now)
25
+
26
+ Dir.chdir "#{HERE}/integration/app" do
27
+ Echoe.silence { system("rake ultrasphinx:index:delta") }
28
+ end
29
+
30
+ assert_equal @count + 1, S.new.total_entries
31
+ @new.destroy
32
+
33
+ Dir.chdir "#{HERE}/integration/app" do
34
+ Echoe.silence { system("rake ultrasphinx:index:delta") }
35
+ end
36
+
37
+ assert_equal @count, S.new.total_entries
38
+ end
39
+ end
@@ -16,8 +16,20 @@ class SearchTest < Test::Unit::TestCase
16
16
 
17
17
  def test_with_subtotals_option
18
18
  S.client_options['with_subtotals'] = true
19
- @s = S.new.run
19
+
20
+ # No delta index; accurate subtotals sum
21
+ @s = S.new(:indexes => Ultrasphinx::MAIN_INDEX).run
20
22
  assert_equal @s.total_entries, @s.subtotals.values._sum
23
+
24
+ # With delta; subtotals sum not less than total sum
25
+ @s = S.new.run
26
+ assert @s.subtotals.values._sum >= @s.total_entries
27
+
28
+ # With delta and filter; request class gets accurate count regardless
29
+ @s = S.new(:class_names => 'Seller').run
30
+ assert_equal @s.total_entries, @s.subtotals['Seller']
31
+ assert @s.subtotals.values._sum >= @s.total_entries
32
+
21
33
  S.client_options['with_subtotals'] = false
22
34
  end
23
35
 
@@ -84,6 +96,34 @@ class SearchTest < Test::Unit::TestCase
84
96
  )
85
97
  end
86
98
 
99
+ def test_individual_totals_with_pagination
100
+ Ultrasphinx::MODEL_CONFIGURATION.keys.each do |class_name|
101
+ if class_name == "User"
102
+ assert_equal User.count(:conditions => {:deleted => false }),
103
+ S.new(:class_names => class_name, :page => 2).total_entries
104
+ else
105
+ assert_equal class_name.constantize.count,
106
+ S.new(:class_names => class_name, :page => 2).total_entries
107
+ end
108
+ end
109
+ end
110
+
111
+ def test_individual_totals_without_pagination
112
+ Ultrasphinx::MODEL_CONFIGURATION.keys.each do |class_name|
113
+ begin
114
+ if class_name == "User"
115
+ assert_equal User.count(:conditions => {:deleted => false }),
116
+ S.new(:class_names => class_name).total_entries
117
+ else
118
+ assert_equal class_name.constantize.count,
119
+ S.new(:class_names => class_name).total_entries
120
+ end
121
+ rescue Object
122
+ raise class_name
123
+ end
124
+ end
125
+ end
126
+
87
127
  def test_sort_by_date
88
128
  assert_equal(
89
129
  Seller.find(:all, :limit => 5, :order => 'created_at DESC').map(&:created_at),
@@ -211,6 +251,25 @@ class SearchTest < Test::Unit::TestCase
211
251
  @s.facets['company_name'].size
212
252
  )
213
253
  end
254
+
255
+ def test_included_text_facet_without_association_sql
256
+ # there are 40 users, but only 20 sellers. So you get 20 facets + 1 nil with 20 items
257
+ @s = Ultrasphinx::Search.new(:class_names => 'User', :facets => ['company']).run
258
+ assert_equal(
259
+ (Seller.count + 1),
260
+ @s.facets['company'].size
261
+ )
262
+ end
263
+
264
+ def test_included_text_facet_with_association_sql
265
+ # XXX there are 40 users but only 20 sellers, but the replace function from user deletes
266
+ # User #6 and 16 (why?). There is also a nil facet that gets added for a total of 19 objects
267
+ @s = Ultrasphinx::Search.new(:class_names => 'User', :facets => ['company_two']).run
268
+ assert_equal(
269
+ (Seller.count - 1),
270
+ @s.facets['company_two'].size
271
+ )
272
+ end
214
273
 
215
274
  def test_numeric_facet
216
275
  @user_id_count = Seller.find(:all).map(&:user_id).uniq.size
@@ -8,8 +8,12 @@ class SpellTest < Test::Unit::TestCase
8
8
  end
9
9
 
10
10
  def test_spelling
11
- assert_equal nil, Ultrasphinx::Spell.correct("correct words")
12
- assert_equal "garbled words", Ultrasphinx::Spell.correct("glarbled words")
11
+ if defined?(Aspell)
12
+ assert_equal nil, Ultrasphinx::Spell.correct("correct words")
13
+ assert_equal "garbled words", Ultrasphinx::Spell.correct("glarbled words")
14
+ else
15
+ STDERR.puts "No Aspell found"
16
+ end
13
17
  end
14
18
 
15
19
  end
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "#{File.dirname(__FILE__)}/../test_helper"
4
+ require 'benchmark'
5
+ require 'ruby-prof'
6
+
7
+ #def debugger; end
8
+ # require 'ruby-debug'
9
+
10
+ PROF = ENV['PROF']
11
+ TIMES = 50
12
+
13
+ $options = [{:query => 'seller'}]
14
+
15
+ #$search = Ultrasphinx::Search.new(*$options).run
16
+ #$sellers = Seller.find_all_by_id($search.results.select{|o| o.is_a? Seller}.map(&:id))
17
+ #$users = User.find_all_by_id($search.results.select{|o| o.is_a? User}.map(&:id))
18
+ #
19
+ ## Mocha didn't work; don't know why
20
+ #class Riddle::Client
21
+ # def query(*args); $search.response; end
22
+ #end
23
+ #class Seller
24
+ # def self.find_all_by_id(*args); $sellers; end
25
+ #end
26
+ #class User
27
+ # def self.find_all_by_id(*args); $users; end
28
+ #end
29
+
30
+ Benchmark.bm(20) do |x|
31
+ x.report("simple") do
32
+ TIMES.times do
33
+ Ultrasphinx::Search.new(*$options).run
34
+ end
35
+ end
36
+ x.report("excerpt") do
37
+ RubyProf.start if PROF
38
+ TIMES.times do
39
+ Ultrasphinx::Search.new(*$options).excerpt
40
+ end
41
+ RubyProf::GraphPrinter.new(RubyProf.stop).print(STDOUT, 0) if PROF
42
+ end
43
+ end
44
+
data/test/test_helper.rb CHANGED
@@ -2,7 +2,12 @@
2
2
  require 'rubygems'
3
3
  require 'test/unit'
4
4
  require 'echoe'
5
- require 'multi_rails_init'
5
+
6
+ begin
7
+ require 'multi_rails_init'
8
+ rescue LoadError
9
+ STDERR.puts "No multi_rails found"
10
+ end
6
11
 
7
12
  if defined? ENV['MULTIRAILS_RAILS_VERSION']
8
13
  ENV['RAILS_GEM_VERSION'] = ENV['MULTIRAILS_RAILS_VERSION']
@@ -7,7 +7,7 @@ class ParserTest < Test::Unit::TestCase
7
7
  @s = Ultrasphinx::Search.new
8
8
  end
9
9
 
10
- def test_parsing
10
+ def test_valid_queries
11
11
  [
12
12
  'artichokes',
13
13
  'artichokes',
@@ -88,12 +88,31 @@ class ParserTest < Test::Unit::TestCase
88
88
  '"traditional"',
89
89
 
90
90
  'cuisine:"american (traditional"',
91
- '@cuisine "american traditional"'
91
+ '@cuisine "american traditional"',
92
+
93
+ 'title:cats OR user:john',
94
+ '@title cats | @user john',
95
+
96
+ 'user:john OR title:cats',
97
+ '@title cats | @user john',
92
98
 
93
99
  ].in_groups_of(2).each do |query, result|
94
100
  assert_equal result, @s.send(:parse, query)
95
101
  end
96
102
  end
103
+
104
+ def test_invalid_queries
105
+ [
106
+ "\"",
107
+ "(",
108
+ ")",
109
+ " \" "
110
+ ].each do |query|
111
+ assert_raises(Ultrasphinx::Search::Parser::Error) do
112
+ @s.send(:parse, query)
113
+ end
114
+ end
115
+ end
97
116
 
98
117
  end
99
118
 
data/ultrasphinx.gemspec CHANGED
@@ -1,19 +1,19 @@
1
1
 
2
- # Gem::Specification for Ultrasphinx-1.8
2
+ # Gem::Specification for Ultrasphinx-1.9
3
3
  # Originally generated by Echoe
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = %q{ultrasphinx}
7
- s.version = "1.8"
7
+ s.version = "1.9"
8
8
 
9
9
  s.specification_version = 2 if s.respond_to? :specification_version=
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.authors = [""]
13
- s.date = %q{2008-02-05}
13
+ s.date = %q{2008-03-08}
14
14
  s.description = %q{Ruby on Rails configurator and client to the Sphinx fulltext search engine.}
15
15
  s.email = %q{}
16
- s.files = ["CHANGELOG", "DEPLOYMENT_NOTES", "examples/ap.multi", "examples/default.base", "init.rb", "lib/ultrasphinx/associations.rb", "lib/ultrasphinx/autoload.rb", "lib/ultrasphinx/configure.rb", "lib/ultrasphinx/core_extensions.rb", "lib/ultrasphinx/fields.rb", "lib/ultrasphinx/is_indexed.rb", "lib/ultrasphinx/postgresql/concat_ws.sql", "lib/ultrasphinx/postgresql/crc32.sql", "lib/ultrasphinx/postgresql/group_concat.sql", "lib/ultrasphinx/postgresql/hex_to_int.sql", "lib/ultrasphinx/postgresql/language.sql", "lib/ultrasphinx/postgresql/unix_timestamp.sql", "lib/ultrasphinx/search/internals.rb", "lib/ultrasphinx/search/parser.rb", "lib/ultrasphinx/search.rb", "lib/ultrasphinx/spell.rb", "lib/ultrasphinx/ultrasphinx.rb", "lib/ultrasphinx.rb", "LICENSE", "Manifest", "RAKE_TASKS", "README", "tasks/ultrasphinx.rake", "test/config/ultrasphinx/test.base", "test/integration/app/app/controllers/addresses_controller.rb", "test/integration/app/app/controllers/application.rb", "test/integration/app/app/controllers/sellers_controller.rb", "test/integration/app/app/controllers/states_controller.rb", "test/integration/app/app/controllers/users_controller.rb", "test/integration/app/app/helpers/addresses_helper.rb", "test/integration/app/app/helpers/application_helper.rb", "test/integration/app/app/helpers/sellers_helper.rb", "test/integration/app/app/helpers/states_helper.rb", "test/integration/app/app/helpers/users_helper.rb", "test/integration/app/app/models/geo/address.rb", "test/integration/app/app/models/geo/country.rb", "test/integration/app/app/models/geo/state.rb", "test/integration/app/app/models/person/user.rb", "test/integration/app/app/models/seller.rb", "test/integration/app/app/views/addresses/edit.html.erb", "test/integration/app/app/views/addresses/index.html.erb", "test/integration/app/app/views/addresses/new.html.erb", "test/integration/app/app/views/addresses/show.html.erb", "test/integration/app/app/views/layouts/addresses.html.erb", "test/integration/app/app/views/layouts/sellers.html.erb", "test/integration/app/app/views/layouts/states.html.erb", "test/integration/app/app/views/layouts/users.html.erb", "test/integration/app/app/views/sellers/edit.html.erb", "test/integration/app/app/views/sellers/index.html.erb", "test/integration/app/app/views/sellers/new.html.erb", "test/integration/app/app/views/sellers/show.html.erb", "test/integration/app/app/views/states/edit.html.erb", "test/integration/app/app/views/states/index.html.erb", "test/integration/app/app/views/states/new.html.erb", "test/integration/app/app/views/states/show.html.erb", "test/integration/app/app/views/users/edit.html.erb", "test/integration/app/app/views/users/index.html.erb", "test/integration/app/app/views/users/new.html.erb", "test/integration/app/app/views/users/show.html.erb", "test/integration/app/config/boot.rb", "test/integration/app/config/database.yml", "test/integration/app/config/environment.rb", "test/integration/app/config/environments/development.rb", "test/integration/app/config/environments/production.rb", "test/integration/app/config/environments/test.rb", "test/integration/app/config/locomotive.yml", "test/integration/app/config/routes.rb", "test/integration/app/config/ultrasphinx/default.base", "test/integration/app/config/ultrasphinx/development.conf.canonical", "test/integration/app/db/migrate/001_create_users.rb", "test/integration/app/db/migrate/002_create_sellers.rb", "test/integration/app/db/migrate/003_create_addresses.rb", "test/integration/app/db/migrate/004_create_states.rb", "test/integration/app/db/migrate/005_add_capitalization_to_seller.rb", "test/integration/app/db/migrate/006_add_deleted_to_user.rb", "test/integration/app/db/migrate/007_add_lat_and_long_to_address.rb", "test/integration/app/db/migrate/008_add_mission_statement_to_seller.rb", "test/integration/app/db/migrate/009_create_countries.rb", "test/integration/app/doc/README_FOR_APP", "test/integration/app/public/404.html", "test/integration/app/public/500.html", "test/integration/app/public/dispatch.cgi", "test/integration/app/public/dispatch.fcgi", "test/integration/app/public/dispatch.rb", "test/integration/app/public/favicon.ico", "test/integration/app/public/images/rails.png", "test/integration/app/public/index.html", "test/integration/app/public/javascripts/application.js", "test/integration/app/public/javascripts/controls.js", "test/integration/app/public/javascripts/dragdrop.js", "test/integration/app/public/javascripts/effects.js", "test/integration/app/public/javascripts/prototype.js", "test/integration/app/public/robots.txt", "test/integration/app/public/stylesheets/scaffold.css", "test/integration/app/Rakefile", "test/integration/app/README", "test/integration/app/script/about", "test/integration/app/script/breakpointer", "test/integration/app/script/console", "test/integration/app/script/destroy", "test/integration/app/script/generate", "test/integration/app/script/performance/benchmarker", "test/integration/app/script/performance/profiler", "test/integration/app/script/plugin", "test/integration/app/script/process/inspector", "test/integration/app/script/process/reaper", "test/integration/app/script/process/spawner", "test/integration/app/script/runner", "test/integration/app/script/server", "test/integration/app/test/fixtures/addresses.yml", "test/integration/app/test/fixtures/countries.yml", "test/integration/app/test/fixtures/sellers.yml", "test/integration/app/test/fixtures/states.yml", "test/integration/app/test/fixtures/users.yml", "test/integration/app/test/functional/addresses_controller_test.rb", "test/integration/app/test/functional/sellers_controller_test.rb", "test/integration/app/test/functional/states_controller_test.rb", "test/integration/app/test/functional/users_controller_test.rb", "test/integration/app/test/test_helper.rb", "test/integration/app/test/unit/address_test.rb", "test/integration/app/test/unit/seller_test.rb", "test/integration/app/test/unit/state_test.rb", "test/integration/app/test/unit/user_test.rb", "test/integration/configure_test.rb", "test/integration/search_test.rb", "test/integration/server_test.rb", "test/integration/spell_test.rb", "test/setup.rb", "test/teardown.rb", "test/test_all.rb", "test/test_helper.rb", "test/ts.multi", "test/unit/parser_test.rb", "TODO", "vendor/riddle/lib/riddle/client/filter.rb", "vendor/riddle/lib/riddle/client/message.rb", "vendor/riddle/lib/riddle/client/response.rb", "vendor/riddle/lib/riddle/client.rb", "vendor/riddle/lib/riddle.rb", "vendor/riddle/MIT-LICENCE", "vendor/riddle/Rakefile", "vendor/riddle/README", "vendor/riddle/spec/fixtures/data/anchor.bin", "vendor/riddle/spec/fixtures/data/any.bin", "vendor/riddle/spec/fixtures/data/boolean.bin", "vendor/riddle/spec/fixtures/data/distinct.bin", "vendor/riddle/spec/fixtures/data/filter.bin", "vendor/riddle/spec/fixtures/data/filter_array.bin", "vendor/riddle/spec/fixtures/data/filter_array_exclude.bin", "vendor/riddle/spec/fixtures/data/filter_floats.bin", "vendor/riddle/spec/fixtures/data/filter_floats_exclude.bin", "vendor/riddle/spec/fixtures/data/filter_floats_range.bin", "vendor/riddle/spec/fixtures/data/filter_range.bin", "vendor/riddle/spec/fixtures/data/filter_range_exclude.bin", "vendor/riddle/spec/fixtures/data/group.bin", "vendor/riddle/spec/fixtures/data/index.bin", "vendor/riddle/spec/fixtures/data/phrase.bin", "vendor/riddle/spec/fixtures/data/simple.bin", "vendor/riddle/spec/fixtures/data/sort.bin", "vendor/riddle/spec/fixtures/data/update_simple.bin", "vendor/riddle/spec/fixtures/data/weights.bin", "vendor/riddle/spec/fixtures/sphinx/configuration.erb", "vendor/riddle/spec/fixtures/sql/conf.example.yml", "vendor/riddle/spec/fixtures/sql/data.sql", "vendor/riddle/spec/fixtures/sql/structure.sql", "vendor/riddle/spec/functional/excerpt_spec.rb", "vendor/riddle/spec/functional/search_spec.rb", "vendor/riddle/spec/functional/update_spec.rb", "vendor/riddle/spec/spec_helper.rb", "vendor/riddle/spec/sphinx_helper.rb", "vendor/riddle/spec/unit/client_spec.rb", "vendor/riddle/spec/unit/filter_spec.rb", "vendor/riddle/spec/unit/message_spec.rb", "vendor/riddle/spec/unit/response_spec.rb", "vendor/will_paginate/LICENSE", "ultrasphinx.gemspec"]
16
+ s.files = ["CHANGELOG", "DEPLOYMENT_NOTES", "examples/ap.multi", "examples/default.base", "init.rb", "lib/ultrasphinx/associations.rb", "lib/ultrasphinx/autoload.rb", "lib/ultrasphinx/configure.rb", "lib/ultrasphinx/core_extensions.rb", "lib/ultrasphinx/fields.rb", "lib/ultrasphinx/is_indexed.rb", "lib/ultrasphinx/postgresql/concat_ws.sql", "lib/ultrasphinx/postgresql/crc32.sql", "lib/ultrasphinx/postgresql/group_concat.sql", "lib/ultrasphinx/postgresql/hex_to_int.sql", "lib/ultrasphinx/postgresql/language.sql", "lib/ultrasphinx/postgresql/unix_timestamp.sql", "lib/ultrasphinx/search/internals.rb", "lib/ultrasphinx/search/parser.rb", "lib/ultrasphinx/search.rb", "lib/ultrasphinx/spell.rb", "lib/ultrasphinx/ultrasphinx.rb", "lib/ultrasphinx.rb", "LICENSE", "Manifest", "RAKE_TASKS", "README", "tasks/ultrasphinx.rake", "test/config/ultrasphinx/test.base", "test/integration/app/app/controllers/addresses_controller.rb", "test/integration/app/app/controllers/application.rb", "test/integration/app/app/controllers/sellers_controller.rb", "test/integration/app/app/controllers/states_controller.rb", "test/integration/app/app/controllers/users_controller.rb", "test/integration/app/app/helpers/addresses_helper.rb", "test/integration/app/app/helpers/application_helper.rb", "test/integration/app/app/helpers/sellers_helper.rb", "test/integration/app/app/helpers/states_helper.rb", "test/integration/app/app/helpers/users_helper.rb", "test/integration/app/app/models/geo/address.rb", "test/integration/app/app/models/geo/country.rb", "test/integration/app/app/models/geo/state.rb", "test/integration/app/app/models/person/user.rb", "test/integration/app/app/models/seller.rb", "test/integration/app/app/views/addresses/edit.html.erb", "test/integration/app/app/views/addresses/index.html.erb", "test/integration/app/app/views/addresses/new.html.erb", "test/integration/app/app/views/addresses/show.html.erb", "test/integration/app/app/views/layouts/addresses.html.erb", "test/integration/app/app/views/layouts/sellers.html.erb", "test/integration/app/app/views/layouts/states.html.erb", "test/integration/app/app/views/layouts/users.html.erb", "test/integration/app/app/views/sellers/edit.html.erb", "test/integration/app/app/views/sellers/index.html.erb", "test/integration/app/app/views/sellers/new.html.erb", "test/integration/app/app/views/sellers/show.html.erb", "test/integration/app/app/views/states/edit.html.erb", "test/integration/app/app/views/states/index.html.erb", "test/integration/app/app/views/states/new.html.erb", "test/integration/app/app/views/states/show.html.erb", "test/integration/app/app/views/users/edit.html.erb", "test/integration/app/app/views/users/index.html.erb", "test/integration/app/app/views/users/new.html.erb", "test/integration/app/app/views/users/show.html.erb", "test/integration/app/config/boot.rb", "test/integration/app/config/database.yml", "test/integration/app/config/environment.rb", "test/integration/app/config/environments/development.rb", "test/integration/app/config/environments/production.rb", "test/integration/app/config/environments/test.rb", "test/integration/app/config/locomotive.yml", "test/integration/app/config/routes.rb", "test/integration/app/config/ultrasphinx/default.base", "test/integration/app/config/ultrasphinx/development.conf", "test/integration/app/config/ultrasphinx/development.conf.canonical", "test/integration/app/db/migrate/001_create_users.rb", "test/integration/app/db/migrate/002_create_sellers.rb", "test/integration/app/db/migrate/003_create_addresses.rb", "test/integration/app/db/migrate/004_create_states.rb", "test/integration/app/db/migrate/005_add_capitalization_to_seller.rb", "test/integration/app/db/migrate/006_add_deleted_to_user.rb", "test/integration/app/db/migrate/007_add_lat_and_long_to_address.rb", "test/integration/app/db/migrate/008_add_mission_statement_to_seller.rb", "test/integration/app/db/migrate/009_create_countries.rb", "test/integration/app/db/schema.rb", "test/integration/app/doc/README_FOR_APP", "test/integration/app/public/404.html", "test/integration/app/public/500.html", "test/integration/app/public/dispatch.cgi", "test/integration/app/public/dispatch.fcgi", "test/integration/app/public/dispatch.rb", "test/integration/app/public/favicon.ico", "test/integration/app/public/images/rails.png", "test/integration/app/public/index.html", "test/integration/app/public/javascripts/application.js", "test/integration/app/public/javascripts/controls.js", "test/integration/app/public/javascripts/dragdrop.js", "test/integration/app/public/javascripts/effects.js", "test/integration/app/public/javascripts/prototype.js", "test/integration/app/public/robots.txt", "test/integration/app/public/stylesheets/scaffold.css", "test/integration/app/Rakefile", "test/integration/app/README", "test/integration/app/script/about", "test/integration/app/script/breakpointer", "test/integration/app/script/console", "test/integration/app/script/destroy", "test/integration/app/script/generate", "test/integration/app/script/performance/benchmarker", "test/integration/app/script/performance/profiler", "test/integration/app/script/plugin", "test/integration/app/script/process/inspector", "test/integration/app/script/process/reaper", "test/integration/app/script/process/spawner", "test/integration/app/script/runner", "test/integration/app/script/server", "test/integration/app/test/fixtures/addresses.yml", "test/integration/app/test/fixtures/countries.yml", "test/integration/app/test/fixtures/sellers.yml", "test/integration/app/test/fixtures/states.yml", "test/integration/app/test/fixtures/users.yml", "test/integration/app/test/functional/addresses_controller_test.rb", "test/integration/app/test/functional/sellers_controller_test.rb", "test/integration/app/test/functional/states_controller_test.rb", "test/integration/app/test/functional/users_controller_test.rb", "test/integration/app/test/test_helper.rb", "test/integration/app/test/unit/address_test.rb", "test/integration/app/test/unit/country_test.rb", "test/integration/app/test/unit/seller_test.rb", "test/integration/app/test/unit/state_test.rb", "test/integration/app/test/unit/user_test.rb", "test/integration/configure_test.rb", "test/integration/delta_test.rb", "test/integration/search_test.rb", "test/integration/server_test.rb", "test/integration/spell_test.rb", "test/profile/benchmark.rb", "test/setup.rb", "test/teardown.rb", "test/test_all.rb", "test/test_helper.rb", "test/ts.multi", "test/unit/parser_test.rb", "TODO", "vendor/riddle/lib/riddle/client/filter.rb", "vendor/riddle/lib/riddle/client/message.rb", "vendor/riddle/lib/riddle/client/response.rb", "vendor/riddle/lib/riddle/client.rb", "vendor/riddle/lib/riddle.rb", "vendor/riddle/MIT-LICENCE", "vendor/riddle/Rakefile", "vendor/riddle/README", "vendor/riddle/spec/fixtures/data/anchor.bin", "vendor/riddle/spec/fixtures/data/any.bin", "vendor/riddle/spec/fixtures/data/boolean.bin", "vendor/riddle/spec/fixtures/data/distinct.bin", "vendor/riddle/spec/fixtures/data/field_weights.bin", "vendor/riddle/spec/fixtures/data/filter.bin", "vendor/riddle/spec/fixtures/data/filter_array.bin", "vendor/riddle/spec/fixtures/data/filter_array_exclude.bin", "vendor/riddle/spec/fixtures/data/filter_floats.bin", "vendor/riddle/spec/fixtures/data/filter_floats_exclude.bin", "vendor/riddle/spec/fixtures/data/filter_floats_range.bin", "vendor/riddle/spec/fixtures/data/filter_range.bin", "vendor/riddle/spec/fixtures/data/filter_range_exclude.bin", "vendor/riddle/spec/fixtures/data/group.bin", "vendor/riddle/spec/fixtures/data/index.bin", "vendor/riddle/spec/fixtures/data/index_weights.bin", "vendor/riddle/spec/fixtures/data/phrase.bin", "vendor/riddle/spec/fixtures/data/rank_mode.bin", "vendor/riddle/spec/fixtures/data/simple.bin", "vendor/riddle/spec/fixtures/data/sort.bin", "vendor/riddle/spec/fixtures/data/update_simple.bin", "vendor/riddle/spec/fixtures/data/weights.bin", "vendor/riddle/spec/fixtures/data_generator.php", "vendor/riddle/spec/fixtures/sphinx/configuration.erb", "vendor/riddle/spec/fixtures/sphinxapi.php", "vendor/riddle/spec/fixtures/sql/conf.example.yml", "vendor/riddle/spec/fixtures/sql/data.sql", "vendor/riddle/spec/fixtures/sql/structure.sql", "vendor/riddle/spec/functional/excerpt_spec.rb", "vendor/riddle/spec/functional/search_spec.rb", "vendor/riddle/spec/functional/update_spec.rb", "vendor/riddle/spec/spec_helper.rb", "vendor/riddle/spec/sphinx_helper.rb", "vendor/riddle/spec/unit/client_spec.rb", "vendor/riddle/spec/unit/filter_spec.rb", "vendor/riddle/spec/unit/message_spec.rb", "vendor/riddle/spec/unit/response_spec.rb", "vendor/will_paginate/LICENSE", "ultrasphinx.gemspec"]
17
17
  s.has_rdoc = true
18
18
  s.homepage = %q{http://blog.evanweaver.com/files/doc/fauna/ultrasphinx/}
19
19
  s.require_paths = ["lib"]
data/vendor/riddle/README CHANGED
@@ -8,13 +8,13 @@ opting for a more Ruby-like structure.
8
8
  While it doesn't (yet) exist as a gem, you can obtain the sourcecode via subversion. If you
9
9
  are after a specific release, use the tag as follows:
10
10
 
11
- svn co http://rails-oceania.googlecode.com/svn/patallan/riddle/tags/0.9.8-r1065 riddle
11
+ svn co http://rails-oceania.googlecode.com/svn/patallan/riddle/tags/0.9.8-r1112 riddle
12
12
 
13
13
  Or for the most current, just use trunk:
14
14
 
15
15
  svn co http://rails-oceania.googlecode.com/svn/patallan/riddle/trunk riddle
16
16
 
17
- Please note that at the time of writing, only 0.9.8r871, 0.9.8r909, 0.9.8r985 and 0.9.8r1065 are supported.
17
+ Please note that at the time of writing, only 0.9.8r871 through to 0.9.8r1112 are supported.
18
18
 
19
19
  To get started, just instantiate a Client object:
20
20
 
@@ -12,7 +12,7 @@ module Riddle #:nodoc:
12
12
  Major = 0
13
13
  Minor = 9
14
14
  Tiny = 8
15
- Rev = 1065
15
+ Rev = 1112
16
16
 
17
17
  String = [Major, Minor, Tiny].join('.') + "r#{Rev}"
18
18
  end
@@ -57,7 +57,8 @@ module Riddle
57
57
  RankModes = {
58
58
  :proximity_bm25 => 0, # SPH_RANK_PROXIMITY_BM25
59
59
  :bm25 => 1, # SPH_RANK_BM25
60
- :none => 2 # SPH_RANK_NONE
60
+ :none => 2, # SPH_RANK_NONE
61
+ :wordcount => 3 # SPH_RANK_WORDCOUNT
61
62
  }
62
63
 
63
64
  SortModes = {
@@ -65,7 +66,8 @@ module Riddle
65
66
  :attr_desc => 1, # SPH_SORT_ATTR_DESC
66
67
  :attr_asc => 2, # SPH_SORT_ATTR_ASC
67
68
  :time_segments => 3, # SPH_SORT_TIME_SEGMENTS
68
- :extended => 4 # SPH_SORT_EXTENDED
69
+ :extended => 4, # SPH_SORT_EXTENDED
70
+ :expr => 5 # SPH_SORT_EXPR
69
71
  }
70
72
 
71
73
  AttributeTypes = {
@@ -135,17 +137,22 @@ module Riddle
135
137
  end
136
138
 
137
139
  # Set the geo-anchor point - with the names of the attributes that contain
138
- # the latitude and longtitude, and the reference position.
140
+ # the latitude and longitude (in radians), and the reference position.
141
+ # Note that for geocoding to work properly, you must also set
142
+ # match_mode to :extended. To sort results by distance, you will
143
+ # need to set sort_mode to '@geodist asc' for example. Sphinx
144
+ # expects latitude and longitude to be returned from you SQL source
145
+ # in radians.
139
146
  #
140
147
  # Example:
141
- # client.set_anchor('lat', -37.767899, 'lon', 145.002451)
148
+ # client.set_anchor('lat', -0.6591741, 'long', 2.530770)
142
149
  #
143
150
  def set_anchor(lat_attr, lat, long_attr, long)
144
151
  @anchor = {
145
152
  :latitude_attribute => lat_attr,
146
153
  :latitude => lat,
147
- :longtitude_attribute => long_attr,
148
- :longtitude => long
154
+ :longitude_attribute => long_attr,
155
+ :longitude => long
149
156
  }
150
157
  end
151
158
 
@@ -273,7 +280,10 @@ module Riddle
273
280
  self.run.first
274
281
  end
275
282
 
276
- # Grab excerpts from the indexes. As part of the options, you will need to
283
+ # Build excerpts from search terms (the +words+) and the text of documents. Excerpts are bodies of text that have the +words+ highlighted.
284
+ # They may also be abbreviated to fit within a word limit.
285
+ #
286
+ # As part of the options hash, you will need to
277
287
  # define:
278
288
  # * :docs
279
289
  # * :words
@@ -290,6 +300,31 @@ module Riddle
290
300
  #
291
301
  # The defaults differ from the official PHP client, as I've opted for
292
302
  # semantic HTML markup.
303
+ #
304
+ # Example:
305
+ #
306
+ # client.excerpts(:docs => ["Pat Allan, Pat Cash"], :words => 'Pat', :index => 'pats')
307
+ # #=> ["<span class=\"match\">Pat</span> Allan, <span class=\"match\">Pat</span> Cash"]
308
+ #
309
+ # lorem_lipsum = "Lorem ipsum dolor..."
310
+ #
311
+ # client.excerpts(:docs => ["Pat Allan, #{lorem_lipsum} Pat Cash"], :words => 'Pat', :index => 'pats')
312
+ # #=> ["<span class=\"match\">Pat</span> Allan, Lorem ipsum dolor sit amet, consectetur adipisicing
313
+ # elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua &#8230; . Excepteur
314
+ # sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est
315
+ # laborum. <span class=\"match\">Pat</span> Cash"]
316
+ #
317
+ # Workflow:
318
+ #
319
+ # Excerpt creation is completely isolated from searching the index. The nominated index is only used to
320
+ # discover encoding and charset information.
321
+ #
322
+ # Therefore, the workflow goes:
323
+ #
324
+ # 1. Do the sphinx query.
325
+ # 2. Fetch the documents found by sphinx from their repositories.
326
+ # 3. Pass the documents' text to +excerpts+ for marking up of matched terms.
327
+ #
293
328
  def excerpts(options = {})
294
329
  options[:index] ||= '*'
295
330
  options[:before_match] ||= '<span class="match">'
@@ -444,8 +479,8 @@ module Riddle
444
479
  else
445
480
  message.append_int 1
446
481
  message.append_string @anchor[:latitude_attribute]
447
- message.append_string @anchor[:longtitude_attribute]
448
- message.append_floats @anchor[:latitude], @anchor[:longtitude]
482
+ message.append_string @anchor[:longitude_attribute]
483
+ message.append_floats @anchor[:latitude], @anchor[:longitude]
449
484
  end
450
485
 
451
486
  # Per Index Weights
@@ -510,4 +545,4 @@ module Riddle
510
545
  message.to_s
511
546
  end
512
547
  end
513
- end
548
+ end