pg_search 0.7.3 → 0.7.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -28,20 +28,26 @@ module PgSearch
28
28
  model.connection
29
29
  end
30
30
 
31
- REBUILD_SQL_TEMPLATE = <<-SQL.strip_heredoc
32
- INSERT INTO :documents_table (searchable_type, searchable_id, content, created_at, updated_at)
33
- SELECT :model_name AS searchable_type,
34
- :model_table.id AS searchable_id,
35
- (
36
- :content_expressions
37
- ) AS content,
38
- :current_time AS created_at,
39
- :current_time AS updated_at
40
- FROM :model_table
41
- SQL
31
+ def primary_key
32
+ model.primary_key
33
+ end
34
+
35
+ def rebuild_sql_template
36
+ <<-SQL.strip_heredoc
37
+ INSERT INTO :documents_table (searchable_type, searchable_id, content, created_at, updated_at)
38
+ SELECT :model_name AS searchable_type,
39
+ :model_table.#{primary_key} AS searchable_id,
40
+ (
41
+ :content_expressions
42
+ ) AS content,
43
+ :current_time AS created_at,
44
+ :current_time AS updated_at
45
+ FROM :model_table
46
+ SQL
47
+ end
42
48
 
43
49
  def rebuild_sql
44
- replacements.inject(REBUILD_SQL_TEMPLATE) do |sql, key|
50
+ replacements.inject(rebuild_sql_template) do |sql, key|
45
51
  sql.gsub ":#{key}", send(key)
46
52
  end
47
53
  end
@@ -23,7 +23,10 @@ module PgSearch
23
23
  unless_conditions.all? { |condition| !condition.to_proc.call(self) }
24
24
 
25
25
  if should_have_document
26
- pg_search_document ? pg_search_document.save : create_pg_search_document
26
+ unless pg_search_document.present?
27
+ build_pg_search_document.searchable_type = self.class.name
28
+ end
29
+ pg_search_document.save
27
30
  else
28
31
  pg_search_document.destroy if pg_search_document
29
32
  end
@@ -1,3 +1,3 @@
1
1
  module PgSearch
2
- VERSION = "0.7.3".freeze
2
+ VERSION = "0.7.4".freeze
3
3
  end
@@ -1052,6 +1052,49 @@ describe "an Active Record model which includes PgSearch" do
1052
1052
  it { should_not include(soundalike_record) }
1053
1053
  end
1054
1054
  end
1055
+
1056
+ context "on an STI subclass" do
1057
+ with_model :ASuperclassModel do
1058
+ table do |t|
1059
+ t.text 'content'
1060
+ t.string 'type'
1061
+ end
1062
+ end
1063
+
1064
+ before do
1065
+
1066
+ class SearchableSubclassModel < ASuperclassModel
1067
+ include PgSearch
1068
+ multisearchable :against => :content
1069
+ end
1070
+
1071
+ class NonSearchableSubclassModel < ASuperclassModel
1072
+ end
1073
+ end
1074
+
1075
+ it "returns only results for that subclass" do
1076
+ included = [
1077
+ SearchableSubclassModel.create!(:content => "foo bar")
1078
+ ]
1079
+ excluded = [
1080
+ SearchableSubclassModel.create!(:content => "baz"),
1081
+ ASuperclassModel.create!(:content => "foo bar"),
1082
+ ASuperclassModel.create!(:content => "baz"),
1083
+ NonSearchableSubclassModel.create!(:content => "foo bar"),
1084
+ NonSearchableSubclassModel.create!(:content => "baz")
1085
+ ]
1086
+
1087
+ expect(ASuperclassModel.count).to be 6
1088
+ expect(SearchableSubclassModel.count).to be 2
1089
+
1090
+ results = PgSearch.multisearch("foo bar")
1091
+
1092
+ expect(results.map(&:searchable_id)).to include(*included.map(&:id))
1093
+ expect(results.map(&:searchable_id)).not_to include(*excluded.map(&:id))
1094
+ expect(results.map(&:searchable_type)).to include(*%w[SearchableSubclassModel])
1095
+ expect(results.map(&:searchable_type)).not_to include(*%w[ASuperclassModel NonSearchableSubclassModel])
1096
+ end
1097
+ end
1055
1098
  end
1056
1099
 
1057
1100
  describe ".disable_multisearch" do
@@ -99,11 +99,10 @@ describe PgSearch::Multisearch::Rebuilder do
99
99
  "2001-01-01 00:00:00"
100
100
  end
101
101
 
102
-
103
102
  expected_sql = <<-SQL.strip_heredoc
104
103
  INSERT INTO "pg_search_documents" (searchable_type, searchable_id, content, created_at, updated_at)
105
104
  SELECT 'Model' AS searchable_type,
106
- #{Model.quoted_table_name}.id AS searchable_id,
105
+ #{Model.quoted_table_name}.#{Model.primary_key} AS searchable_id,
107
106
  (
108
107
  coalesce(#{Model.quoted_table_name}.name::text, '')
109
108
  ) AS content,
@@ -115,7 +114,7 @@ describe PgSearch::Multisearch::Rebuilder do
115
114
  executed_sql = []
116
115
 
117
116
  notifier = ActiveSupport::Notifications.subscribe("sql.active_record") do |name, start, finish, id, payload|
118
- executed_sql << payload[:sql]
117
+ executed_sql << payload[:sql] if payload[:sql].include?(%Q{INSERT INTO "pg_search_documents"})
119
118
  end
120
119
 
121
120
  rebuilder.rebuild
@@ -124,6 +123,63 @@ describe PgSearch::Multisearch::Rebuilder do
124
123
  executed_sql.length.should == 1
125
124
  executed_sql.first.should == expected_sql
126
125
  end
126
+
127
+ context "for a model with a non-standard primary key" do
128
+ with_model :ModelWithNonStandardPrimaryKey do
129
+ table primary_key: :non_standard_primary_key do |t|
130
+ t.string :name
131
+ end
132
+
133
+ model do
134
+ include PgSearch
135
+ multisearchable :against => :name
136
+ end
137
+ end
138
+
139
+ it "generates SQL with the correct primary key" do
140
+ time = DateTime.parse("2001-01-01")
141
+ rebuilder = PgSearch::Multisearch::Rebuilder.new(ModelWithNonStandardPrimaryKey, lambda { time } )
142
+
143
+ # Handle change in precision of DateTime objects in SQL in Active Record 4.0.1
144
+ # https://github.com/rails/rails/commit/17f5d8e062909f1fcae25351834d8e89967b645e
145
+ version_4_0_1_or_newer = (
146
+ (ActiveRecord::VERSION::MAJOR > 4) ||
147
+ (ActiveRecord::VERSION::MAJOR == 4 && ActiveRecord::VERSION::MINOR >= 1) ||
148
+ (ActiveRecord::VERSION::MAJOR == 4 && ActiveRecord::VERSION::MINOR == 0 && ActiveRecord::VERSION::TINY >= 1)
149
+ )
150
+
151
+ expected_timestamp =
152
+ if version_4_0_1_or_newer
153
+ "2001-01-01 00:00:00.000000"
154
+ else
155
+ "2001-01-01 00:00:00"
156
+ end
157
+
158
+ expected_sql = <<-SQL.strip_heredoc
159
+ INSERT INTO "pg_search_documents" (searchable_type, searchable_id, content, created_at, updated_at)
160
+ SELECT 'ModelWithNonStandardPrimaryKey' AS searchable_type,
161
+ #{ModelWithNonStandardPrimaryKey.quoted_table_name}.non_standard_primary_key AS searchable_id,
162
+ (
163
+ coalesce(#{ModelWithNonStandardPrimaryKey.quoted_table_name}.name::text, '')
164
+ ) AS content,
165
+ '#{expected_timestamp}' AS created_at,
166
+ '#{expected_timestamp}' AS updated_at
167
+ FROM #{ModelWithNonStandardPrimaryKey.quoted_table_name}
168
+ SQL
169
+
170
+ executed_sql = []
171
+
172
+ notifier = ActiveSupport::Notifications.subscribe("sql.active_record") do |name, start, finish, id, payload|
173
+ executed_sql << payload[:sql] if payload[:sql].include?(%Q{INSERT INTO "pg_search_documents"})
174
+ end
175
+
176
+ rebuilder.rebuild
177
+ ActiveSupport::Notifications.unsubscribe(notifier)
178
+
179
+ executed_sql.length.should == 1
180
+ executed_sql.first.should == expected_sql
181
+ end
182
+ end
127
183
  end
128
184
 
129
185
  context "when multisearchable is conditional" do
data/spec/spec_helper.rb CHANGED
@@ -9,16 +9,16 @@ if ENV["TRAVIS"]
9
9
  end
10
10
  end
11
11
 
12
- begin
13
- if defined? JRUBY_VERSION
14
- require 'activerecord-jdbcpostgresql-adapter'
15
- error_class = ActiveRecord::JDBCError
16
- else
17
- require "pg"
18
- error_class = PGError
19
- end
12
+ if defined? JRUBY_VERSION
13
+ require 'activerecord-jdbcpostgresql-adapter'
14
+ error_classes = [ActiveRecord::JDBCError]
15
+ else
16
+ require "pg"
17
+ error_classes = [PGError]
20
18
  end
21
19
 
20
+ error_classes << ActiveRecord::NoDatabaseError if defined? ActiveRecord::NoDatabaseError
21
+
22
22
  begin
23
23
  database_user = if ENV["TRAVIS"]
24
24
  "postgres"
@@ -33,7 +33,7 @@ begin
33
33
  connection = ActiveRecord::Base.connection
34
34
  postgresql_version = connection.send(:postgresql_version)
35
35
  connection.execute("SELECT 1")
36
- rescue error_class
36
+ rescue *error_classes
37
37
  at_exit do
38
38
  puts "-" * 80
39
39
  puts "Unable to connect to database. Please run:"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_search
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.3
4
+ version: 0.7.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Grant Hutchins
@@ -9,104 +9,104 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-01-26 00:00:00.000000000 Z
12
+ date: 2014-05-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - '>='
18
+ - - ">="
19
19
  - !ruby/object:Gem::Version
20
20
  version: '3.1'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - '>='
25
+ - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  version: '3.1'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: activesupport
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - '>='
32
+ - - ">="
33
33
  - !ruby/object:Gem::Version
34
34
  version: '3.1'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - '>='
39
+ - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '3.1'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: arel
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - '>='
46
+ - - ">="
47
47
  - !ruby/object:Gem::Version
48
48
  version: '0'
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - '>='
53
+ - - ">="
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: rake
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - '>='
60
+ - - ">="
61
61
  - !ruby/object:Gem::Version
62
62
  version: '0'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - '>='
67
+ - - ">="
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: pry
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - '>='
74
+ - - ">="
75
75
  - !ruby/object:Gem::Version
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - '>='
81
+ - - ">="
82
82
  - !ruby/object:Gem::Version
83
83
  version: '0'
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: rspec
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - '>='
88
+ - - ">="
89
89
  - !ruby/object:Gem::Version
90
90
  version: '2.14'
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - '>='
95
+ - - ">="
96
96
  - !ruby/object:Gem::Version
97
97
  version: '2.14'
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: with_model
100
100
  requirement: !ruby/object:Gem::Requirement
101
101
  requirements:
102
- - - '>='
102
+ - - ">="
103
103
  - !ruby/object:Gem::Version
104
104
  version: '0'
105
105
  type: :development
106
106
  prerelease: false
107
107
  version_requirements: !ruby/object:Gem::Requirement
108
108
  requirements:
109
- - - '>='
109
+ - - ">="
110
110
  - !ruby/object:Gem::Version
111
111
  version: '0'
112
112
  description: PgSearch builds Active Record named scopes that take advantage of PostgreSQL's
@@ -118,10 +118,10 @@ executables: []
118
118
  extensions: []
119
119
  extra_rdoc_files: []
120
120
  files:
121
- - .autotest
122
- - .gitignore
123
- - .rspec
124
- - .travis.yml
121
+ - ".autotest"
122
+ - ".gitignore"
123
+ - ".rspec"
124
+ - ".travis.yml"
125
125
  - CHANGELOG.md
126
126
  - CONTRIBUTING.md
127
127
  - Gemfile
@@ -188,17 +188,17 @@ require_paths:
188
188
  - lib
189
189
  required_ruby_version: !ruby/object:Gem::Requirement
190
190
  requirements:
191
- - - '>='
191
+ - - ">="
192
192
  - !ruby/object:Gem::Version
193
193
  version: 1.9.2
194
194
  required_rubygems_version: !ruby/object:Gem::Requirement
195
195
  requirements:
196
- - - '>='
196
+ - - ">="
197
197
  - !ruby/object:Gem::Version
198
198
  version: '0'
199
199
  requirements: []
200
200
  rubyforge_project:
201
- rubygems_version: 2.0.14
201
+ rubygems_version: 2.2.2
202
202
  signing_key:
203
203
  specification_version: 4
204
204
  summary: PgSearch builds Active Record named scopes that take advantage of PostgreSQL's