ultrasphinx 1.8 → 1.9

Sign up to get free protection for your applications and to get access to all the features.
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