friendlyfashion-thinking-sphinx 2.0.13
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY +244 -0
- data/LICENCE +20 -0
- data/README.textile +235 -0
- data/features/abstract_inheritance.feature +10 -0
- data/features/alternate_primary_key.feature +27 -0
- data/features/attribute_transformation.feature +22 -0
- data/features/attribute_updates.feature +77 -0
- data/features/deleting_instances.feature +67 -0
- data/features/direct_attributes.feature +11 -0
- data/features/excerpts.feature +21 -0
- data/features/extensible_delta_indexing.feature +9 -0
- data/features/facets.feature +88 -0
- data/features/facets_across_model.feature +29 -0
- data/features/field_sorting.feature +18 -0
- data/features/handling_edits.feature +94 -0
- data/features/retry_stale_indexes.feature +24 -0
- data/features/searching_across_models.feature +20 -0
- data/features/searching_by_index.feature +40 -0
- data/features/searching_by_model.feature +175 -0
- data/features/searching_with_find_arguments.feature +56 -0
- data/features/sphinx_detection.feature +25 -0
- data/features/sphinx_scopes.feature +68 -0
- data/features/step_definitions/alpha_steps.rb +16 -0
- data/features/step_definitions/beta_steps.rb +7 -0
- data/features/step_definitions/common_steps.rb +201 -0
- data/features/step_definitions/extensible_delta_indexing_steps.rb +7 -0
- data/features/step_definitions/facet_steps.rb +96 -0
- data/features/step_definitions/find_arguments_steps.rb +36 -0
- data/features/step_definitions/gamma_steps.rb +15 -0
- data/features/step_definitions/scope_steps.rb +19 -0
- data/features/step_definitions/search_steps.rb +94 -0
- data/features/step_definitions/sphinx_steps.rb +35 -0
- data/features/sti_searching.feature +19 -0
- data/features/support/env.rb +27 -0
- data/features/support/lib/generic_delta_handler.rb +8 -0
- data/features/thinking_sphinx/database.example.yml +3 -0
- data/features/thinking_sphinx/db/.gitignore +1 -0
- data/features/thinking_sphinx/db/fixtures/alphas.rb +8 -0
- data/features/thinking_sphinx/db/fixtures/authors.rb +1 -0
- data/features/thinking_sphinx/db/fixtures/betas.rb +11 -0
- data/features/thinking_sphinx/db/fixtures/boxes.rb +9 -0
- data/features/thinking_sphinx/db/fixtures/categories.rb +1 -0
- data/features/thinking_sphinx/db/fixtures/cats.rb +3 -0
- data/features/thinking_sphinx/db/fixtures/comments.rb +24 -0
- data/features/thinking_sphinx/db/fixtures/developers.rb +31 -0
- data/features/thinking_sphinx/db/fixtures/dogs.rb +3 -0
- data/features/thinking_sphinx/db/fixtures/extensible_betas.rb +10 -0
- data/features/thinking_sphinx/db/fixtures/foxes.rb +3 -0
- data/features/thinking_sphinx/db/fixtures/gammas.rb +10 -0
- data/features/thinking_sphinx/db/fixtures/music.rb +4 -0
- data/features/thinking_sphinx/db/fixtures/people.rb +1001 -0
- data/features/thinking_sphinx/db/fixtures/post_keywords.txt +1 -0
- data/features/thinking_sphinx/db/fixtures/posts.rb +10 -0
- data/features/thinking_sphinx/db/fixtures/robots.rb +8 -0
- data/features/thinking_sphinx/db/fixtures/tags.rb +27 -0
- data/features/thinking_sphinx/db/migrations/create_alphas.rb +8 -0
- data/features/thinking_sphinx/db/migrations/create_animals.rb +5 -0
- data/features/thinking_sphinx/db/migrations/create_authors.rb +3 -0
- data/features/thinking_sphinx/db/migrations/create_authors_posts.rb +6 -0
- data/features/thinking_sphinx/db/migrations/create_betas.rb +5 -0
- data/features/thinking_sphinx/db/migrations/create_boxes.rb +5 -0
- data/features/thinking_sphinx/db/migrations/create_categories.rb +3 -0
- data/features/thinking_sphinx/db/migrations/create_comments.rb +10 -0
- data/features/thinking_sphinx/db/migrations/create_developers.rb +7 -0
- data/features/thinking_sphinx/db/migrations/create_extensible_betas.rb +5 -0
- data/features/thinking_sphinx/db/migrations/create_gammas.rb +3 -0
- data/features/thinking_sphinx/db/migrations/create_genres.rb +3 -0
- data/features/thinking_sphinx/db/migrations/create_music.rb +6 -0
- data/features/thinking_sphinx/db/migrations/create_people.rb +13 -0
- data/features/thinking_sphinx/db/migrations/create_posts.rb +6 -0
- data/features/thinking_sphinx/db/migrations/create_robots.rb +4 -0
- data/features/thinking_sphinx/db/migrations/create_taggings.rb +5 -0
- data/features/thinking_sphinx/db/migrations/create_tags.rb +4 -0
- data/features/thinking_sphinx/models/alpha.rb +23 -0
- data/features/thinking_sphinx/models/andrew.rb +17 -0
- data/features/thinking_sphinx/models/animal.rb +5 -0
- data/features/thinking_sphinx/models/author.rb +3 -0
- data/features/thinking_sphinx/models/beta.rb +13 -0
- data/features/thinking_sphinx/models/box.rb +8 -0
- data/features/thinking_sphinx/models/cat.rb +3 -0
- data/features/thinking_sphinx/models/category.rb +4 -0
- data/features/thinking_sphinx/models/comment.rb +10 -0
- data/features/thinking_sphinx/models/developer.rb +21 -0
- data/features/thinking_sphinx/models/dog.rb +3 -0
- data/features/thinking_sphinx/models/extensible_beta.rb +9 -0
- data/features/thinking_sphinx/models/fox.rb +5 -0
- data/features/thinking_sphinx/models/gamma.rb +5 -0
- data/features/thinking_sphinx/models/genre.rb +3 -0
- data/features/thinking_sphinx/models/medium.rb +5 -0
- data/features/thinking_sphinx/models/music.rb +10 -0
- data/features/thinking_sphinx/models/person.rb +24 -0
- data/features/thinking_sphinx/models/post.rb +22 -0
- data/features/thinking_sphinx/models/robot.rb +12 -0
- data/features/thinking_sphinx/models/tag.rb +3 -0
- data/features/thinking_sphinx/models/tagging.rb +4 -0
- data/lib/cucumber/thinking_sphinx/external_world.rb +12 -0
- data/lib/cucumber/thinking_sphinx/internal_world.rb +137 -0
- data/lib/cucumber/thinking_sphinx/sql_logger.rb +28 -0
- data/lib/thinking-sphinx.rb +1 -0
- data/lib/thinking_sphinx/action_controller.rb +31 -0
- data/lib/thinking_sphinx/active_record/attribute_updates.rb +53 -0
- data/lib/thinking_sphinx/active_record/collection_proxy.rb +47 -0
- data/lib/thinking_sphinx/active_record/collection_proxy_with_scopes.rb +27 -0
- data/lib/thinking_sphinx/active_record/delta.rb +67 -0
- data/lib/thinking_sphinx/active_record/has_many_association.rb +44 -0
- data/lib/thinking_sphinx/active_record/has_many_association_with_scopes.rb +21 -0
- data/lib/thinking_sphinx/active_record/log_subscriber.rb +61 -0
- data/lib/thinking_sphinx/active_record/scopes.rb +110 -0
- data/lib/thinking_sphinx/active_record.rb +386 -0
- data/lib/thinking_sphinx/adapters/abstract_adapter.rb +87 -0
- data/lib/thinking_sphinx/adapters/mysql_adapter.rb +62 -0
- data/lib/thinking_sphinx/adapters/postgresql_adapter.rb +188 -0
- data/lib/thinking_sphinx/association.rb +230 -0
- data/lib/thinking_sphinx/attribute.rb +405 -0
- data/lib/thinking_sphinx/auto_version.rb +40 -0
- data/lib/thinking_sphinx/bundled_search.rb +44 -0
- data/lib/thinking_sphinx/class_facet.rb +20 -0
- data/lib/thinking_sphinx/configuration.rb +375 -0
- data/lib/thinking_sphinx/context.rb +76 -0
- data/lib/thinking_sphinx/core/string.rb +15 -0
- data/lib/thinking_sphinx/deltas/default_delta.rb +62 -0
- data/lib/thinking_sphinx/deltas.rb +28 -0
- data/lib/thinking_sphinx/deploy/capistrano.rb +99 -0
- data/lib/thinking_sphinx/excerpter.rb +23 -0
- data/lib/thinking_sphinx/facet.rb +135 -0
- data/lib/thinking_sphinx/facet_search.rb +170 -0
- data/lib/thinking_sphinx/field.rb +98 -0
- data/lib/thinking_sphinx/index/builder.rb +315 -0
- data/lib/thinking_sphinx/index/faux_column.rb +118 -0
- data/lib/thinking_sphinx/index.rb +159 -0
- data/lib/thinking_sphinx/join.rb +37 -0
- data/lib/thinking_sphinx/property.rb +187 -0
- data/lib/thinking_sphinx/railtie.rb +43 -0
- data/lib/thinking_sphinx/search.rb +1061 -0
- data/lib/thinking_sphinx/search_methods.rb +439 -0
- data/lib/thinking_sphinx/sinatra.rb +7 -0
- data/lib/thinking_sphinx/source/internal_properties.rb +51 -0
- data/lib/thinking_sphinx/source/sql.rb +174 -0
- data/lib/thinking_sphinx/source.rb +194 -0
- data/lib/thinking_sphinx/tasks.rb +142 -0
- data/lib/thinking_sphinx/test.rb +55 -0
- data/lib/thinking_sphinx/version.rb +3 -0
- data/lib/thinking_sphinx.rb +297 -0
- data/spec/fixtures/data.sql +32 -0
- data/spec/fixtures/database.yml.default +3 -0
- data/spec/fixtures/models.rb +164 -0
- data/spec/fixtures/structure.sql +146 -0
- data/spec/spec_helper.rb +61 -0
- data/spec/sphinx_helper.rb +60 -0
- data/spec/support/rails.rb +25 -0
- data/spec/thinking_sphinx/active_record/delta_spec.rb +122 -0
- data/spec/thinking_sphinx/active_record/has_many_association_spec.rb +173 -0
- data/spec/thinking_sphinx/active_record/scopes_spec.rb +176 -0
- data/spec/thinking_sphinx/active_record_spec.rb +573 -0
- data/spec/thinking_sphinx/adapters/abstract_adapter_spec.rb +145 -0
- data/spec/thinking_sphinx/association_spec.rb +250 -0
- data/spec/thinking_sphinx/attribute_spec.rb +552 -0
- data/spec/thinking_sphinx/auto_version_spec.rb +103 -0
- data/spec/thinking_sphinx/configuration_spec.rb +326 -0
- data/spec/thinking_sphinx/context_spec.rb +126 -0
- data/spec/thinking_sphinx/core/array_spec.rb +9 -0
- data/spec/thinking_sphinx/core/string_spec.rb +9 -0
- data/spec/thinking_sphinx/excerpter_spec.rb +49 -0
- data/spec/thinking_sphinx/facet_search_spec.rb +176 -0
- data/spec/thinking_sphinx/facet_spec.rb +359 -0
- data/spec/thinking_sphinx/field_spec.rb +127 -0
- data/spec/thinking_sphinx/index/builder_spec.rb +532 -0
- data/spec/thinking_sphinx/index/faux_column_spec.rb +36 -0
- data/spec/thinking_sphinx/index_spec.rb +189 -0
- data/spec/thinking_sphinx/search_methods_spec.rb +156 -0
- data/spec/thinking_sphinx/search_spec.rb +1455 -0
- data/spec/thinking_sphinx/source_spec.rb +267 -0
- data/spec/thinking_sphinx/test_spec.rb +20 -0
- data/spec/thinking_sphinx_spec.rb +204 -0
- metadata +524 -0
@@ -0,0 +1,32 @@
|
|
1
|
+
insert into `people` (gender, first_name, middle_initial, last_name, street_address, city, state, postcode, email, birthday, team_id, team_type) values('female','Ellie','K','Ford','38 Mills Street','Eagle Farm Bc','QLD','4009','Ellie.K.Ford@mailinator.com','1970/1/23 00:00:00', 3, 'CricketTeam');
|
2
|
+
insert into `people` (gender, first_name, middle_initial, last_name, street_address, city, state, postcode, email, birthday, team_id, team_type) values('female','Aaliyah','E','Allen','71 Murphy Street','Wyola West','WA','6407','Aaliyah.E.Allen@dodgit.com','1980/3/23 00:00:00', 3, 'CricketTeam');
|
3
|
+
insert into `people` (gender, first_name, middle_initial, last_name, street_address, city, state, postcode, email, birthday, team_id, team_type) values('male','Callum','C','Miah','89 Dalgarno Street','Bullawa Creek','NSW','2390','Callum.C.Miah@trashymail.com','1973/3/25 00:00:00', 3, 'CricketTeam');
|
4
|
+
insert into `people` (gender, first_name, middle_initial, last_name, street_address, city, state, postcode, email, birthday, team_id, team_type) values('male','Finley','L','Buckley','18 Queen Street','Manly Vale','NSW','2093','Finley.L.Buckley@spambob.com','1962/11/20 00:00:00', 3, 'CricketTeam');
|
5
|
+
insert into `people` (gender, first_name, middle_initial, last_name, street_address, city, state, postcode, email, birthday, team_id, team_type) values('female','Poppy','A','Hilton','36 Nerrigundah Drive','Nyora','VIC','3987','Poppy.A.Hilton@dodgit.com','1972/10/30 00:00:00', 3, 'CricketTeam');
|
6
|
+
insert into `people` (gender, first_name, middle_initial, last_name, street_address, city, state, postcode, email, birthday, team_id, team_type) values('female','Eloise','Z','Kennedy','18 Mt Berryman Road','Lilydale','QLD','4344','Eloise.Z.Kennedy@spambob.com','1973/9/28 00:00:00', 3, 'CricketTeam');
|
7
|
+
insert into `people` (gender, first_name, middle_initial, last_name, street_address, city, state, postcode, email, birthday, team_id, team_type) values('female','Shannon','L','Manning','60 Ocean Pde','Greenvale','QLD','4816','Shannon.L.Manning@dodgit.com','1956/6/13 00:00:00', 3, 'FootballTeam');
|
8
|
+
insert into `people` (gender, first_name, middle_initial, last_name, street_address, city, state, postcode, email, birthday, team_id, team_type) values('male','Oscar','C','Lawson','43 Feather Street','Battery Hill','QLD','4551','Oscar.C.Lawson@spambob.com','1979/10/17 00:00:00', 3, 'CricketTeam');
|
9
|
+
insert into `people` (gender, first_name, middle_initial, last_name, street_address, city, state, postcode, email, birthday, team_id, team_type) values('female','Sofia','K','Bray','26 Clifton Street','Pental Island','VIC','3586','Sofia.K.Bray@mailinator.com','1970/5/10 00:00:00', 3, 'CricketTeam');
|
10
|
+
insert into `people` (gender, first_name, middle_initial, last_name, street_address, city, state, postcode, email, birthday, team_id, team_type) values('male','Andrew','N','Byrne','35 Cecil Street','Monash Park','NSW','2111','Andrew.N.Byrne@spambob.com','1983/2/16 00:00:00', 3, 'CricketTeam');
|
11
|
+
|
12
|
+
insert into `alphas` (name) values ('one');
|
13
|
+
insert into `alphas` (name) values ('two');
|
14
|
+
insert into `alphas` (name) values ('three');
|
15
|
+
insert into `alphas` (name) values ('four');
|
16
|
+
insert into `alphas` (name) values ('five');
|
17
|
+
insert into `alphas` (name) values ('six');
|
18
|
+
insert into `alphas` (name) values ('seven');
|
19
|
+
insert into `alphas` (name) values ('eight');
|
20
|
+
insert into `alphas` (name) values ('nine');
|
21
|
+
insert into `alphas` (name) values ('ten');
|
22
|
+
|
23
|
+
insert into `betas` (name) values ('one');
|
24
|
+
insert into `betas` (name) values ('two');
|
25
|
+
insert into `betas` (name) values ('three');
|
26
|
+
insert into `betas` (name) values ('four');
|
27
|
+
insert into `betas` (name) values ('five');
|
28
|
+
insert into `betas` (name) values ('six');
|
29
|
+
insert into `betas` (name) values ('seven');
|
30
|
+
insert into `betas` (name) values ('eight');
|
31
|
+
insert into `betas` (name) values ('nine');
|
32
|
+
insert into `betas` (name) values ('ten');
|
@@ -0,0 +1,164 @@
|
|
1
|
+
class Tag < ActiveRecord::Base
|
2
|
+
belongs_to :person
|
3
|
+
belongs_to :football_team
|
4
|
+
belongs_to :cricket_team
|
5
|
+
end
|
6
|
+
|
7
|
+
class FootballTeam < ActiveRecord::Base
|
8
|
+
has_many :tags
|
9
|
+
has_many :people, :through => :tags
|
10
|
+
end
|
11
|
+
|
12
|
+
class CricketTeam < ActiveRecord::Base
|
13
|
+
has_many :people, :foreign_key => :team_id
|
14
|
+
|
15
|
+
define_index do
|
16
|
+
indexes :name
|
17
|
+
has "SELECT cricket_team_id, id FROM tags", :source => :query, :as => :tags
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Contact < ActiveRecord::Base
|
22
|
+
belongs_to :person
|
23
|
+
end
|
24
|
+
|
25
|
+
class Friendship < ActiveRecord::Base
|
26
|
+
belongs_to :person
|
27
|
+
belongs_to :friend, :class_name => "Person", :foreign_key => :friend_id
|
28
|
+
|
29
|
+
define_index do
|
30
|
+
indexes "'something'", :as => :something
|
31
|
+
has person_id, friend_id
|
32
|
+
|
33
|
+
set_property :latitude_attr => :person_id
|
34
|
+
set_property :longitude_attr => :person_id
|
35
|
+
end
|
36
|
+
|
37
|
+
sphinx_scope(:reverse) {
|
38
|
+
{:order => "@weight ASC"}
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
class Link < ActiveRecord::Base
|
43
|
+
has_and_belongs_to_many :people
|
44
|
+
end
|
45
|
+
|
46
|
+
class Person < ActiveRecord::Base
|
47
|
+
belongs_to :team, :polymorphic => :true
|
48
|
+
belongs_to :source, :polymorphic => :true
|
49
|
+
has_many :contacts
|
50
|
+
|
51
|
+
has_many :friendships
|
52
|
+
has_many :friends, :through => :friendships
|
53
|
+
|
54
|
+
has_many :tags
|
55
|
+
has_many :football_teams, :through => :tags
|
56
|
+
|
57
|
+
has_and_belongs_to_many :links
|
58
|
+
|
59
|
+
define_index do
|
60
|
+
indexes [first_name, middle_initial, last_name], :as => :name
|
61
|
+
indexes team.name, :as => :team_name
|
62
|
+
indexes contacts.phone_number, :as => :phone_numbers
|
63
|
+
indexes city, :prefixes => true, :facet => true
|
64
|
+
indexes state, :infixes => true, :facet => true
|
65
|
+
|
66
|
+
has [first_name, middle_initial, last_name], :as => :name_sort
|
67
|
+
has team.name, :as => :team_name_sort
|
68
|
+
|
69
|
+
has [:id, :team_id], :as => :ids
|
70
|
+
has team(:id), :as => :team_id
|
71
|
+
has football_teams(:id), :as => :football_team_id
|
72
|
+
|
73
|
+
has contacts.phone_number, :as => :phone_number_sort
|
74
|
+
has contacts(:id), :as => :contact_ids
|
75
|
+
|
76
|
+
has birthday, :facet => true
|
77
|
+
|
78
|
+
has friendships.person_id, :as => :friendly_ids
|
79
|
+
|
80
|
+
has :id, :as => :latitude
|
81
|
+
has :id, :as => :longitude
|
82
|
+
|
83
|
+
set_property :delta => true
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
class Parent < Person
|
88
|
+
end
|
89
|
+
|
90
|
+
module Admin
|
91
|
+
class Person < ::Person
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
class Child < Person
|
96
|
+
belongs_to :parent
|
97
|
+
define_index do
|
98
|
+
indexes [parent.first_name, parent.middle_initial, parent.last_name], :as => :parent_name
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
class Teenager < Child
|
103
|
+
end
|
104
|
+
|
105
|
+
class Alpha < ActiveRecord::Base
|
106
|
+
has_many :betas, :class_name => 'Beta'
|
107
|
+
has_many :thetas
|
108
|
+
|
109
|
+
define_index do
|
110
|
+
indexes :name, :sortable => true
|
111
|
+
|
112
|
+
has :id, :as => :lat
|
113
|
+
has :id, :as => :lng
|
114
|
+
|
115
|
+
set_property :field_weights => {"name" => 10}
|
116
|
+
end
|
117
|
+
|
118
|
+
def big_name
|
119
|
+
name.upcase
|
120
|
+
end
|
121
|
+
|
122
|
+
def sphinx_attributes
|
123
|
+
:existing
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
class Beta < ActiveRecord::Base
|
128
|
+
has_many :gammas
|
129
|
+
|
130
|
+
define_index do
|
131
|
+
indexes :name, :sortable => true
|
132
|
+
|
133
|
+
has :id, :as => :lat
|
134
|
+
has :id, :as => :lon
|
135
|
+
|
136
|
+
set_property :delta => true
|
137
|
+
end
|
138
|
+
|
139
|
+
def excerpts
|
140
|
+
false
|
141
|
+
end
|
142
|
+
|
143
|
+
def matching_fields
|
144
|
+
:foo
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
class Gamma < ActiveRecord::Base
|
149
|
+
#
|
150
|
+
end
|
151
|
+
|
152
|
+
class Theta < ActiveRecord::Base
|
153
|
+
#
|
154
|
+
end
|
155
|
+
|
156
|
+
class Search < ActiveRecord::Base
|
157
|
+
#
|
158
|
+
end
|
159
|
+
|
160
|
+
class BigFoo < ActiveRecord::Base
|
161
|
+
define_index do
|
162
|
+
indexes name
|
163
|
+
end
|
164
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
DROP TABLE IF EXISTS `people`;
|
2
|
+
|
3
|
+
CREATE TABLE `people` (
|
4
|
+
`id` int(11) NOT NULL auto_increment,
|
5
|
+
`first_name` varchar(50) NULL,
|
6
|
+
`middle_initial` varchar(10) NULL,
|
7
|
+
`last_name` varchar(50) NULL,
|
8
|
+
`gender` varchar(10) NULL,
|
9
|
+
`street_address` varchar(200) NULL,
|
10
|
+
`city` varchar(100) NULL,
|
11
|
+
`state` varchar(100) NULL,
|
12
|
+
`postcode` varchar(10) NULL,
|
13
|
+
`email` varchar(100) NULL,
|
14
|
+
`birthday` datetime NULL,
|
15
|
+
`team_id` int(11) NULL,
|
16
|
+
`team_type` varchar(50) NULL,
|
17
|
+
`type` varchar(50) NULL,
|
18
|
+
`parent_id` varchar(50) NULL,
|
19
|
+
`source_id` int(11) NULL,
|
20
|
+
`source_type` varchar(50) NULL,
|
21
|
+
`delta` tinyint(1) NOT NULL DEFAULT 0,
|
22
|
+
PRIMARY KEY (`id`)
|
23
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
24
|
+
|
25
|
+
DROP TABLE IF EXISTS `friendships`;
|
26
|
+
|
27
|
+
CREATE TABLE `friendships` (
|
28
|
+
`id` int(11) NOT NULL auto_increment,
|
29
|
+
`person_id` int(11) NOT NULL,
|
30
|
+
`friend_id` int(11) NOT NULL,
|
31
|
+
`created_at` datetime NOT NULL,
|
32
|
+
`created_on` date NULL,
|
33
|
+
`updated_at` datetime NOT NULL,
|
34
|
+
PRIMARY KEY (`id`)
|
35
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
36
|
+
|
37
|
+
DROP TABLE IF EXISTS `football_teams`;
|
38
|
+
|
39
|
+
CREATE TABLE `football_teams` (
|
40
|
+
`id` int(11) NOT NULL auto_increment,
|
41
|
+
`name` varchar(50) NOT NULL,
|
42
|
+
`state` varchar(50) NOT NULL,
|
43
|
+
`league` varchar(50) NOT NULL,
|
44
|
+
PRIMARY KEY (`id`)
|
45
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
46
|
+
|
47
|
+
DROP TABLE IF EXISTS `cricket_teams`;
|
48
|
+
|
49
|
+
CREATE TABLE `cricket_teams` (
|
50
|
+
`id` int(11) NOT NULL auto_increment,
|
51
|
+
`name` varchar(50) NOT NULL,
|
52
|
+
`state` varchar(50) NOT NULL,
|
53
|
+
PRIMARY KEY (`id`)
|
54
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
55
|
+
|
56
|
+
DROP TABLE IF EXISTS `contacts`;
|
57
|
+
|
58
|
+
CREATE TABLE `contacts` (
|
59
|
+
`id` int(11) NOT NULL auto_increment,
|
60
|
+
`phone_number` varchar(50) NOT NULL,
|
61
|
+
`person_id` int(11) NOT NULL,
|
62
|
+
PRIMARY KEY (`id`)
|
63
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
64
|
+
|
65
|
+
DROP TABLE IF EXISTS `alphas`;
|
66
|
+
|
67
|
+
CREATE TABLE `alphas` (
|
68
|
+
`id` int(11) NOT NULL auto_increment,
|
69
|
+
`name` varchar(50) NOT NULL,
|
70
|
+
`value` int(11),
|
71
|
+
`cost` decimal(10,6),
|
72
|
+
PRIMARY KEY (`id`)
|
73
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
74
|
+
|
75
|
+
DROP TABLE IF EXISTS `betas`;
|
76
|
+
|
77
|
+
CREATE TABLE `betas` (
|
78
|
+
`id` int(11) NOT NULL auto_increment,
|
79
|
+
`name` varchar(50) NOT NULL,
|
80
|
+
`alpha_id` int(11),
|
81
|
+
`delta` tinyint(1) NOT NULL DEFAULT 0,
|
82
|
+
PRIMARY KEY (`id`)
|
83
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
84
|
+
|
85
|
+
DROP TABLE IF EXISTS `gammas`;
|
86
|
+
|
87
|
+
CREATE TABLE `gammas` (
|
88
|
+
`id` int(11) NOT NULL auto_increment,
|
89
|
+
`name` varchar(50) NOT NULL,
|
90
|
+
`value` int(11),
|
91
|
+
`beta_id` int(11),
|
92
|
+
PRIMARY KEY (`id`)
|
93
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
94
|
+
|
95
|
+
DROP TABLE IF EXISTS `thetas`;
|
96
|
+
|
97
|
+
CREATE TABLE `thetas` (
|
98
|
+
`id` int(11) NOT NULL auto_increment,
|
99
|
+
`name` varchar(50) NOT NULL,
|
100
|
+
`value` int(11),
|
101
|
+
`alpha_id` int(11),
|
102
|
+
PRIMARY KEY (`id`)
|
103
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
104
|
+
|
105
|
+
DROP TABLE IF EXISTS `searches`;
|
106
|
+
|
107
|
+
CREATE TABLE `searches` (
|
108
|
+
`id` int(11) NOT NULL auto_increment,
|
109
|
+
`name` varchar(50) NOT NULL,
|
110
|
+
PRIMARY KEY (`id`)
|
111
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
112
|
+
|
113
|
+
DROP TABLE IF EXISTS `tags`;
|
114
|
+
|
115
|
+
CREATE TABLE `tags` (
|
116
|
+
`id` int(11) NOT NULL auto_increment,
|
117
|
+
`person_id` int(11) NOT NULL,
|
118
|
+
`football_team_id` int(11) NOT NULL,
|
119
|
+
`cricket_team_id` int(11) NOT NULL,
|
120
|
+
`name` varchar(50) NOT NULL,
|
121
|
+
PRIMARY KEY (`id`)
|
122
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
123
|
+
|
124
|
+
DROP TABLE IF EXISTS `links`;
|
125
|
+
|
126
|
+
CREATE TABLE `links` (
|
127
|
+
`id` int(11) NOT NULL auto_increment,
|
128
|
+
`url` varchar(50) NOT NULL,
|
129
|
+
`description` varchar(200),
|
130
|
+
PRIMARY KEY (`id`)
|
131
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
132
|
+
|
133
|
+
DROP TABLE IF EXISTS `links_people`;
|
134
|
+
|
135
|
+
CREATE TABLE `links_people` (
|
136
|
+
`link_id` int(11) NOT NULL,
|
137
|
+
`person_id` int(11) NOT NULL
|
138
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
139
|
+
|
140
|
+
DROP TABLE IF EXISTS `big_foos`;
|
141
|
+
|
142
|
+
CREATE TABLE `big_foos` (
|
143
|
+
`id` bigint NOT NULL auto_increment,
|
144
|
+
`name` varchar(50) NOT NULL,
|
145
|
+
PRIMARY KEY (`id`)
|
146
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__) + '/../lib'
|
2
|
+
Dir[File.join(File.dirname(__FILE__), '../vendor/*/lib')].each do |path|
|
3
|
+
$:.unshift path
|
4
|
+
end
|
5
|
+
|
6
|
+
require 'fileutils'
|
7
|
+
require 'logger'
|
8
|
+
require 'bundler'
|
9
|
+
|
10
|
+
Bundler.require :default, :development
|
11
|
+
|
12
|
+
require 'active_support/core_ext/module/attribute_accessors'
|
13
|
+
require "#{File.dirname(__FILE__)}/sphinx_helper"
|
14
|
+
|
15
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
16
|
+
|
17
|
+
ThinkingSphinx::Configuration.instance
|
18
|
+
ThinkingSphinx::ActiveRecord::LogSubscriber.logger = Logger.new(StringIO.new)
|
19
|
+
|
20
|
+
RSpec.configure do |config|
|
21
|
+
%w( tmp tmp/config tmp/log tmp/db ).each do |path|
|
22
|
+
FileUtils.mkdir_p "#{Dir.pwd}/#{path}"
|
23
|
+
end
|
24
|
+
|
25
|
+
sphinx = SphinxHelper.new
|
26
|
+
sphinx.setup_mysql
|
27
|
+
|
28
|
+
ActiveRecord::Base.send(:include, ThinkingSphinx::ActiveRecord)
|
29
|
+
|
30
|
+
require "#{File.dirname(__FILE__)}/fixtures/models"
|
31
|
+
ThinkingSphinx.context.define_indexes
|
32
|
+
|
33
|
+
config.before :each do
|
34
|
+
%w( tmp tmp/config tmp/log tmp/db ).each do |path|
|
35
|
+
FileUtils.mkdir_p "#{Dir.pwd}/#{path}"
|
36
|
+
end
|
37
|
+
|
38
|
+
ThinkingSphinx.updates_enabled = true
|
39
|
+
ThinkingSphinx.deltas_enabled = true
|
40
|
+
ThinkingSphinx.suppress_delta_output = true
|
41
|
+
|
42
|
+
ThinkingSphinx::Configuration.instance.reset
|
43
|
+
end
|
44
|
+
|
45
|
+
config.after :all do
|
46
|
+
FileUtils.rm_r "#{Dir.pwd}/tmp" rescue nil
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def minimal_result_hashes(*instances)
|
51
|
+
instances.collect do |instance|
|
52
|
+
{
|
53
|
+
:weight => 21,
|
54
|
+
:attributes => {
|
55
|
+
'sphinx_internal_id' => instance.id,
|
56
|
+
'sphinx_internal_class' => instance.class.name,
|
57
|
+
'class_crc' => instance.class.name.to_crc32
|
58
|
+
}
|
59
|
+
}
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
require 'active_record/connection_adapters/mysql2_adapter'
|
3
|
+
require 'active_record/connection_adapters/postgresql_adapter'
|
4
|
+
require 'yaml'
|
5
|
+
|
6
|
+
class SphinxHelper
|
7
|
+
attr_accessor :host, :username, :password, :socket
|
8
|
+
attr_reader :path
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@host = 'localhost'
|
12
|
+
@username = 'root'
|
13
|
+
@password = ''
|
14
|
+
|
15
|
+
if File.exist?('spec/fixtures/database.yml')
|
16
|
+
config = YAML.load(File.open('spec/fixtures/database.yml'))
|
17
|
+
@host = config['host']
|
18
|
+
@username = config['username']
|
19
|
+
@password = config['password']
|
20
|
+
@socket = config['socket']
|
21
|
+
@sslca = config['sslca']
|
22
|
+
@sslcert = config['sslcert']
|
23
|
+
@sslkey = config['sslkey']
|
24
|
+
end
|
25
|
+
|
26
|
+
@path = File.expand_path(File.dirname(__FILE__))
|
27
|
+
end
|
28
|
+
|
29
|
+
def setup_mysql
|
30
|
+
ActiveRecord::Base.establish_connection(
|
31
|
+
:adapter => mysql_adapter,
|
32
|
+
:database => 'thinking_sphinx',
|
33
|
+
:username => @username,
|
34
|
+
:password => @password,
|
35
|
+
:host => @host,
|
36
|
+
:socket => @socket,
|
37
|
+
:sslca => @sslca,
|
38
|
+
:sslcert => @sslcert,
|
39
|
+
:sslkey => @sslkey
|
40
|
+
)
|
41
|
+
ActiveRecord::Base.logger = Logger.new(File.open('tmp/activerecord.log', 'a'))
|
42
|
+
|
43
|
+
structure = File.open('spec/fixtures/structure.sql') { |f| f.read.chomp }
|
44
|
+
structure.split(';').each { |table|
|
45
|
+
ActiveRecord::Base.connection.execute table
|
46
|
+
}
|
47
|
+
|
48
|
+
File.open('spec/fixtures/data.sql') { |f|
|
49
|
+
while line = f.gets
|
50
|
+
ActiveRecord::Base.connection.execute line unless line.blank?
|
51
|
+
end
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def mysql_adapter
|
58
|
+
defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Rails
|
2
|
+
def self.root
|
3
|
+
File.join(Dir.pwd, 'tmp')
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.env
|
7
|
+
@@environment ||= 'development'
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.env=(env)
|
11
|
+
@@environment = env
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.application
|
15
|
+
@@application ||= begin
|
16
|
+
railties = Struct.new(:engines).new([])
|
17
|
+
Struct.new(:paths, :railties).new(Hash.new([]), railties)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
ActiveSupport::Inflector.inflections do |inflect|
|
23
|
+
inflect.plural /^beta$/i, 'betas'
|
24
|
+
inflect.singular /^betas$/i, 'beta'
|
25
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "ThinkingSphinx::ActiveRecord::Delta" do
|
4
|
+
it "should call the toggle_delta method after a save" do
|
5
|
+
@beta = Beta.new(:name => 'beta')
|
6
|
+
@beta.should_receive(:toggle_delta).at_least(1).times.and_return(true)
|
7
|
+
|
8
|
+
@beta.save
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should call the toggle_delta method after a save!" do
|
12
|
+
@beta = Beta.new(:name => 'beta')
|
13
|
+
@beta.should_receive(:toggle_delta).at_least(1).times.and_return(true)
|
14
|
+
|
15
|
+
@beta.save!
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "suspended_delta method" do
|
19
|
+
before :each do
|
20
|
+
ThinkingSphinx.deltas_suspended = false
|
21
|
+
Person.sphinx_indexes.first.delta_object.stub!(:` => "")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should execute the argument block with deltas disabled" do
|
25
|
+
ThinkingSphinx.should_receive(:deltas_suspended=).once.with(true)
|
26
|
+
ThinkingSphinx.should_receive(:deltas_suspended=).once.with(false)
|
27
|
+
lambda { Person.suspended_delta { raise 'i was called' } }.should(
|
28
|
+
raise_error(Exception)
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should restore deltas_enabled to its original setting" do
|
33
|
+
ThinkingSphinx.deltas_suspended = true
|
34
|
+
ThinkingSphinx.should_receive(:deltas_suspended=).twice.with(true)
|
35
|
+
Person.suspended_delta { 'no-op' }
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should restore deltas_enabled to its original setting even if there was an exception" do
|
39
|
+
ThinkingSphinx.deltas_suspended = true
|
40
|
+
ThinkingSphinx.should_receive(:deltas_suspended=).twice.with(true)
|
41
|
+
lambda { Person.suspended_delta { raise 'bad error' } }.should(
|
42
|
+
raise_error(Exception)
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should reindex by default after the code block is run" do
|
47
|
+
Person.should_receive(:index_delta)
|
48
|
+
Person.suspended_delta { 'no-op' }
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should not reindex after the code block if false is passed in" do
|
52
|
+
Person.should_not_receive(:index_delta)
|
53
|
+
Person.suspended_delta(false) { 'no-op' }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "toggle_delta method" do
|
58
|
+
it "should set the delta value to true" do
|
59
|
+
@person = Person.new
|
60
|
+
|
61
|
+
@person.delta.should be_false
|
62
|
+
@person.send(:toggle_delta)
|
63
|
+
@person.delta.should be_true
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "index_delta method" do
|
68
|
+
before :each do
|
69
|
+
ThinkingSphinx::Configuration.stub!(:environment => "spec")
|
70
|
+
ThinkingSphinx.deltas_enabled = true
|
71
|
+
ThinkingSphinx.updates_enabled = true
|
72
|
+
ThinkingSphinx.stub!(:sphinx_running? => true)
|
73
|
+
Person.delta_objects.first.stub!(:` => "", :toggled => true)
|
74
|
+
|
75
|
+
@person = Person.new
|
76
|
+
Person.stub!(:search_for_id => false)
|
77
|
+
@person.stub!(:sphinx_document_id => 1)
|
78
|
+
|
79
|
+
@client = Riddle::Client.new
|
80
|
+
@client.stub!(:update => true)
|
81
|
+
ThinkingSphinx::Configuration.instance.stub!(:client => @client)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "shouldn't index if delta indexing is disabled" do
|
85
|
+
ThinkingSphinx.deltas_enabled = false
|
86
|
+
Person.sphinx_indexes.first.delta_object.should_not_receive(:`)
|
87
|
+
@client.should_not_receive(:update)
|
88
|
+
|
89
|
+
@person.send(:index_delta)
|
90
|
+
end
|
91
|
+
|
92
|
+
it "shouldn't index if index updating is disabled" do
|
93
|
+
ThinkingSphinx.updates_enabled = false
|
94
|
+
Person.sphinx_indexes.first.delta_object.should_not_receive(:`)
|
95
|
+
|
96
|
+
@person.send(:index_delta)
|
97
|
+
end
|
98
|
+
|
99
|
+
it "shouldn't index if the environment is 'test'" do
|
100
|
+
ThinkingSphinx.deltas_enabled = nil
|
101
|
+
ThinkingSphinx::Configuration.stub!(:environment => "test")
|
102
|
+
Person.sphinx_indexes.first.delta_object.should_not_receive(:`)
|
103
|
+
|
104
|
+
@person.send(:index_delta)
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should call indexer for the delta index" do
|
108
|
+
Person.sphinx_indexes.first.delta_object.should_receive(:`).with(
|
109
|
+
"#{ThinkingSphinx::Configuration.instance.bin_path}indexer --config \"#{ThinkingSphinx::Configuration.instance.config_file}\" --rotate person_delta"
|
110
|
+
)
|
111
|
+
|
112
|
+
@person.send(:index_delta)
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should update the deleted attribute if in the core index" do
|
116
|
+
Person.stub!(:search_for_id => true)
|
117
|
+
@client.should_receive(:update)
|
118
|
+
|
119
|
+
@person.send(:index_delta)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|