pg_search 0.7.2 → 0.7.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dc5ae6e460c82b93f20a957e4c5a14454fca1f84
4
- data.tar.gz: 2a262bd65fb27b8efa689dde40c289f3a3ebc4fb
3
+ metadata.gz: 061b1d5b8c2b15a078a7e24519d6ce8431165a89
4
+ data.tar.gz: 5f8d8ad2b97af42fe20a8bcbcfe3b506b865d29a
5
5
  SHA512:
6
- metadata.gz: d9133994756acc700d4cd09e7b9904f1ab89fcc0e3d79e9aff06017a64b96f4ec7239d5267fc1c146f072846de60bf9d36399bfd4171e9a733180a8f7139cfc5
7
- data.tar.gz: efbe3aaab68b0495499a8709b0a5a50454beea08b13f645439d4263fd0df6c538080069665b36e769938d4993414ee9d568c3c8f00cf5099900142bbc3014e5c
6
+ metadata.gz: 8395420354b745b6f31b860637ab36b0d3ade94bbc3fb5745c0d888d5feb7e2ff86a7790cc0f53360b540acfe8c1314d404cd3c48fe118a9bf2771be8210251e
7
+ data.tar.gz: 3e3ee515686fada644a424e3372d6f1891faa3506a4c18993f899684de7450505e174d71abde33c16196e13a378e0673ba9d13727e58bbaa706cf6158aded71d
@@ -3,22 +3,24 @@ language: ruby
3
3
  rvm:
4
4
  - 1.9.3
5
5
  - 2.0.0
6
+ - 2.1.0
6
7
  - jruby-19mode
7
- - rbx-19mode
8
8
 
9
9
  env:
10
10
  - ACTIVE_RECORD_BRANCH="master"
11
11
  - ACTIVE_RECORD_BRANCH="4-0-stable"
12
+ - ACTIVE_RECORD_VERSION="~> 4.1.0.beta1"
12
13
  - ACTIVE_RECORD_VERSION="~> 4.0.0"
13
14
  - ACTIVE_RECORD_VERSION="~> 3.2.0"
14
15
  - ACTIVE_RECORD_VERSION="~> 3.1.0"
15
16
 
16
17
  matrix:
17
18
  allow_failures:
18
- - rvm: rbx-19mode
19
+ - rvm: 2.1.0
19
20
  - rvm: jruby-19mode
20
21
  - env: ACTIVE_RECORD_BRANCH="master"
21
22
  - env: ACTIVE_RECORD_BRANCH="4-0-stable"
23
+ - env: ACTIVE_RECORD_VERSION="~> 4.1.0.beta1"
22
24
 
23
25
  before_script:
24
26
  - "psql -c 'create database pg_search_test;' -U postgres >/dev/null"
@@ -1,5 +1,9 @@
1
1
  # pg_search changelog
2
2
 
3
+ ## 0.7.3
4
+
5
+ * Allow simultaneously searching using `:associated_against` and `:tsvector_column` (Adam Becker)
6
+
3
7
  ## 0.7.2
4
8
 
5
9
  * Add :threshold option for configuring how permissive trigram searches are.
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source "http://rubygems.org"
1
+ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
data/README.md CHANGED
@@ -22,8 +22,8 @@ Read the blog post introducing PgSearch at http://pivotallabs.com/pg-search/
22
22
 
23
23
  ## REQUIREMENTS
24
24
 
25
- * Ruby 1.9.2 or later
26
- * Active Record 3.1 or later
25
+ * Ruby 1.9.2, 2.0, or later
26
+ * Active Record 3.1, 3.2, 4.0 or later
27
27
  * PostgreSQL
28
28
  * [PostgreSQL contrib packages for certain
29
29
  features](https://github.com/Casecommons/pg_search/wiki/Installing-Postgres-Contrib-Modules)
@@ -33,7 +33,7 @@ Read the blog post introducing PgSearch at http://pivotallabs.com/pg-search/
33
33
 
34
34
  gem install pg_search
35
35
 
36
- ### Rails 3.1 or later, Ruby 1.9.2 or later
36
+ ### Rails 3.1, 3.2, 4.0 or later, Ruby 1.9.2, 2.0, or later
37
37
 
38
38
  In Gemfile
39
39
 
@@ -2,19 +2,20 @@ require "active_record"
2
2
  require "active_support/concern"
3
3
  require "active_support/core_ext/module/attribute_accessors"
4
4
  require "active_support/core_ext/string/strip"
5
+
6
+ require "pg_search/compatibility"
7
+ require "pg_search/configuration"
5
8
  require "pg_search/extensions/arel"
9
+ require "pg_search/features"
10
+ require "pg_search/multisearch"
11
+ require "pg_search/multisearchable"
12
+ require "pg_search/normalizer"
13
+ require "pg_search/scope_options"
14
+ require "pg_search/version"
6
15
 
7
16
  module PgSearch
8
- autoload :Configuration, "pg_search/configuration"
9
- autoload :Document, "pg_search/document"
10
- autoload :Features, "pg_search/features"
11
- autoload :Multisearch, "pg_search/multisearch"
12
- autoload :Multisearchable, "pg_search/multisearchable"
13
- autoload :Normalizer, "pg_search/normalizer"
14
- autoload :ScopeOptions, "pg_search/scope_options"
15
- autoload :VERSION, "pg_search/version"
16
-
17
17
  extend ActiveSupport::Concern
18
+ include Compatibility::ActiveRecord3 if ActiveRecord::VERSION::MAJOR == 3
18
19
 
19
20
  mattr_accessor :multisearch_options
20
21
  self.multisearch_options = {}
@@ -53,10 +54,6 @@ module PgSearch
53
54
  end
54
55
  end
55
56
 
56
- def pg_search_rank
57
- read_attribute(:pg_search_rank).to_f
58
- end
59
-
60
57
  class << self
61
58
  def multisearch(*args)
62
59
  PgSearch::Document.search(*args)
@@ -81,4 +78,5 @@ module PgSearch
81
78
  class NotSupportedForPostgresqlVersion < StandardError; end
82
79
  end
83
80
 
81
+ require "pg_search/document"
84
82
  require "pg_search/railtie" if defined?(Rails)
@@ -0,0 +1,9 @@
1
+ module PgSearch
2
+ module Compatibility
3
+ module ActiveRecord3
4
+ def pg_search_rank
5
+ read_attribute(:pg_search_rank).to_f
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,8 +1,9 @@
1
+ require "pg_search/configuration/association"
2
+ require "pg_search/configuration/column"
3
+ require "pg_search/configuration/foreign_column"
4
+
1
5
  module PgSearch
2
6
  class Configuration
3
- autoload :Association, "pg_search/configuration/association"
4
- autoload :Column, "pg_search/configuration/column"
5
- autoload :ForeignColumn, "pg_search/configuration/foreign_column"
6
7
 
7
8
  attr_reader :model
8
9
 
@@ -1,9 +1,10 @@
1
+ require "pg_search/features/feature"
2
+
3
+ require "pg_search/features/dmetaphone"
4
+ require "pg_search/features/trigram"
5
+ require "pg_search/features/tsearch"
6
+
1
7
  module PgSearch
2
8
  module Features
3
- autoload :Feature, "pg_search/features/feature"
4
-
5
- autoload :DMetaphone, "pg_search/features/dmetaphone"
6
- autoload :Trigram, "pg_search/features/trigram"
7
- autoload :TSearch, "pg_search/features/tsearch"
8
9
  end
9
10
  end
@@ -1,3 +1,5 @@
1
+ require "active_support/core_ext/module/delegation"
2
+
1
3
  module PgSearch
2
4
  module Features
3
5
  class Feature
@@ -54,11 +54,14 @@ module PgSearch
54
54
  end
55
55
 
56
56
  def tsdocument
57
- if options[:tsvector_column]
58
- column_name = connection.quote_column_name(options[:tsvector_column])
59
- "#{quoted_table_name}.#{column_name}"
60
- else
61
- columns.map do |search_column|
57
+ tsdocument_terms = []
58
+
59
+ columns_to_use = options[:tsvector_column] ?
60
+ columns.select { |c| c.is_a?(PgSearch::Configuration::ForeignColumn) } :
61
+ columns
62
+
63
+ if columns_to_use.present?
64
+ tsdocument_terms << columns_to_use.map do |search_column|
62
65
  tsvector = Arel::Nodes::NamedFunction.new(
63
66
  "to_tsvector",
64
67
  [dictionary, Arel.sql(normalize(search_column.to_sql))]
@@ -71,6 +74,13 @@ module PgSearch
71
74
  end
72
75
  end.join(" || ")
73
76
  end
77
+
78
+ if options[:tsvector_column]
79
+ column_name = connection.quote_column_name(options[:tsvector_column])
80
+ tsdocument_terms << "#{quoted_table_name}.#{column_name}"
81
+ end
82
+
83
+ tsdocument_terms.join(' || ')
74
84
  end
75
85
 
76
86
  # From http://www.postgresql.org/docs/8.3/static/textsearch-controls.html
@@ -1,6 +1,7 @@
1
+ require "pg_search/multisearch/rebuilder"
2
+
1
3
  module PgSearch
2
4
  module Multisearch
3
- autoload :Rebuilder, "pg_search/multisearch/rebuilder"
4
5
 
5
6
  class << self
6
7
  def rebuild(model, clean_up=true)
@@ -1,18 +1,17 @@
1
- require "active_support/concern"
2
1
  require "active_support/core_ext/class/attribute"
3
2
 
4
3
  module PgSearch
5
4
  module Multisearchable
6
- extend ActiveSupport::Concern
5
+ def self.included mod
6
+ mod.class_eval do
7
+ has_one :pg_search_document,
8
+ :as => :searchable,
9
+ :class_name => "PgSearch::Document",
10
+ :dependent => :delete
7
11
 
8
- included do
9
- has_one :pg_search_document,
10
- :as => :searchable,
11
- :class_name => "PgSearch::Document",
12
- :dependent => :delete
13
-
14
- after_save :update_pg_search_document,
15
- :if => lambda { PgSearch.multisearch_enabled? }
12
+ after_save :update_pg_search_document,
13
+ :if => lambda { PgSearch.multisearch_enabled? }
14
+ end
16
15
  end
17
16
 
18
17
  def update_pg_search_document
@@ -1,3 +1,3 @@
1
1
  module PgSearch
2
- VERSION = "0.7.2"
2
+ VERSION = "0.7.3".freeze
3
3
  end
@@ -151,6 +151,14 @@ describe "an Active Record model which includes PgSearch" do
151
151
  results.should_not include(excluded)
152
152
  end
153
153
 
154
+ it "returns the correct count" do
155
+ ModelWithPgSearch.create!(:content => 'foo')
156
+ ModelWithPgSearch.create!(:content => 'bar')
157
+
158
+ results = ModelWithPgSearch.search_content('foo')
159
+ expect(results.count(:all)).to eq 1
160
+ end
161
+
154
162
  it "returns rows where the column contains all the terms in the query in any order" do
155
163
  included = [ModelWithPgSearch.create!(:content => 'foo bar'),
156
164
  ModelWithPgSearch.create!(:content => 'bar foo')]
@@ -621,7 +629,7 @@ describe "an Active Record model which includes PgSearch" do
621
629
  ModelWithPgSearch.with_trigram(accent_query).should_not include(record)
622
630
  ModelWithPgSearch.with_trigram_and_ignoring_accents(accent_query).should include(record)
623
631
  ModelWithPgSearch.with_tsearch(accent_query).should_not include(record)
624
- ModelWithPgSearch.with_tsearch_and_trigram(accent_query).should be_empty
632
+ ModelWithPgSearch.with_tsearch_and_trigram(accent_query).count(:all).should == 0
625
633
  ModelWithPgSearch.complex_search(accent_query).should include(record)
626
634
 
627
635
  # matches tsearch only
@@ -668,7 +676,66 @@ describe "an Active Record model which includes PgSearch" do
668
676
  end
669
677
  end
670
678
 
671
- context "using a tsvector column" do
679
+ context "using a tsvector column and an association" do
680
+ with_model :Comment do
681
+ table do |t|
682
+ t.integer :post_id
683
+ t.string :body
684
+ end
685
+
686
+ model do
687
+ belongs_to :post
688
+ end
689
+ end
690
+
691
+ with_model :Post do
692
+ table do |t|
693
+ t.text 'content'
694
+ t.tsvector 'content_tsvector'
695
+ end
696
+
697
+ model do
698
+ include PgSearch
699
+ has_many :comments
700
+ end
701
+ end
702
+
703
+ let!(:expected) { Post.create!(content: 'phooey') }
704
+ let!(:unexpected) { Post.create!(content: 'longcat is looooooooong') }
705
+
706
+ before do
707
+ ActiveRecord::Base.connection.execute <<-SQL.strip_heredoc
708
+ UPDATE #{Post.quoted_table_name}
709
+ SET content_tsvector = to_tsvector('english'::regconfig, #{Post.quoted_table_name}."content")
710
+ SQL
711
+
712
+ expected.comments.create(body: 'commentone')
713
+ unexpected.comments.create(body: 'commentwo')
714
+
715
+ Post.pg_search_scope :search_by_content_with_tsvector,
716
+ :associated_against => { comments: [:body] },
717
+ :using => {
718
+ :tsearch => {
719
+ :tsvector_column => 'content_tsvector',
720
+ :dictionary => 'english'
721
+ }
722
+ }
723
+ end
724
+
725
+ it "should find by the tsvector column" do
726
+ Post.search_by_content_with_tsvector("phooey").map(&:id).should == [expected.id]
727
+ end
728
+
729
+ it "should find by the associated record" do
730
+ Post.search_by_content_with_tsvector("commentone").map(&:id).should == [expected.id]
731
+ end
732
+
733
+ it 'should find by a combination of the two' do
734
+ Post.search_by_content_with_tsvector("phooey commentone").map(&:id).should == [expected.id]
735
+ end
736
+ end
737
+
738
+ context "using a tsvector column with" do
672
739
  with_model :ModelWithTsvector do
673
740
  table do |t|
674
741
  t.text 'content'
@@ -877,7 +944,7 @@ describe "an Active Record model which includes PgSearch" do
877
944
  end
878
945
  end
879
946
 
880
- it "should returns only results for that subclass" do
947
+ it "returns only results for that subclass" do
881
948
  included = [
882
949
  SubclassModel.create!(:content => "foo bar")
883
950
  ]
@@ -0,0 +1,76 @@
1
+ require "spec_helper"
2
+
3
+ describe PgSearch::Configuration::Association do
4
+ with_model :AssociatedModel do
5
+ table do |t|
6
+ t.string "title"
7
+ end
8
+ end
9
+
10
+ with_model :Model do
11
+ table do |t|
12
+ t.string "title"
13
+ t.belongs_to :another_model
14
+ end
15
+
16
+ model do
17
+ include PgSearch
18
+ belongs_to :another_model, :class_name => 'AssociatedModel'
19
+
20
+ pg_search_scope :with_another, :associated_against => {:another_model => :title}
21
+ end
22
+ end
23
+
24
+ let(:association) { described_class.new(Model, :another_model, :title) }
25
+
26
+ describe "#table_name" do
27
+ it "returns the table name for the associated model" do
28
+ expect(association.table_name).to eq AssociatedModel.table_name
29
+ end
30
+ end
31
+
32
+ describe "#join" do
33
+ let(:expected_sql) do
34
+ <<-EOS.gsub(/\s+/, ' ').strip
35
+ LEFT OUTER JOIN
36
+ (SELECT model_id AS id,
37
+ #{column_select} AS #{association.columns.first.alias}
38
+ FROM \"#{Model.table_name}\"
39
+ INNER JOIN \"#{association.table_name}\"
40
+ ON \"#{association.table_name}\".\"id\" = \"#{Model.table_name}\".\"another_model_id\"
41
+ GROUP BY model_id) #{association.subselect_alias}
42
+ ON #{association.subselect_alias}.id = model_id
43
+ EOS
44
+ end
45
+
46
+ context "given postgresql_version 0..90_000" do
47
+ let(:column_select) do
48
+ "array_to_string(array_agg(\"#{association.table_name}\".\"title\"::text), ' ')"
49
+ end
50
+
51
+ it "returns the correct SQL join" do
52
+ allow(Model.connection).to receive(:postgresql_version).and_return(1)
53
+ expect(association.join("model_id")).to eq(expected_sql)
54
+ end
55
+ end
56
+
57
+ context "given any other postgresql_version" do
58
+ let(:column_select) do
59
+ "string_agg(\"#{association.table_name}\".\"title\"::text, ' ')"
60
+ end
61
+
62
+ it "returns the correct SQL join" do
63
+ allow(Model.connection).to receive(:postgresql_version).and_return(100_000)
64
+ expect(association.join("model_id")).to eq(expected_sql)
65
+ end
66
+ end
67
+ end
68
+
69
+ describe "#subselect_alias" do
70
+ it "returns a consistent string" do
71
+ subselect_alias = association.subselect_alias
72
+ expect(subselect_alias).to be_a String
73
+ expect(association.subselect_alias).to eq subselect_alias
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,36 @@
1
+ require "spec_helper"
2
+
3
+ describe PgSearch::Configuration::ForeignColumn do
4
+ describe "#alias" do
5
+ with_model :AssociatedModel do
6
+ table do |t|
7
+ t.string "title"
8
+ end
9
+ end
10
+
11
+ with_model :Model do
12
+ table do |t|
13
+ t.string "title"
14
+ t.belongs_to :another_model
15
+ end
16
+
17
+ model do
18
+ include PgSearch
19
+ belongs_to :another_model, :class_name => 'AssociatedModel'
20
+
21
+ pg_search_scope :with_another, :associated_against => {:another_model => :title}
22
+ end
23
+ end
24
+
25
+ it "returns a consistent string" do
26
+ association = PgSearch::Configuration::Association.new(Model,
27
+ :another_model,
28
+ :title)
29
+ foreign_column = described_class.new("title", nil, Model, association)
30
+
31
+ column_alias = foreign_column.alias
32
+ expect(column_alias).to be_a String
33
+ expect(foreign_column.alias).to eq column_alias
34
+ end
35
+ end
36
+ end
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.2
4
+ version: 0.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Grant Hutchins
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-11-20 00:00:00.000000000 Z
12
+ date: 2014-01-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -130,6 +130,7 @@ files:
130
130
  - README.md
131
131
  - Rakefile
132
132
  - lib/pg_search.rb
133
+ - lib/pg_search/compatibility.rb
133
134
  - lib/pg_search/configuration.rb
134
135
  - lib/pg_search/configuration/association.rb
135
136
  - lib/pg_search/configuration/column.rb
@@ -159,7 +160,9 @@ files:
159
160
  - spec/integration/associations_spec.rb
160
161
  - spec/integration/pagination_spec.rb
161
162
  - spec/integration/pg_search_spec.rb
163
+ - spec/lib/pg_search/configuration/association_spec.rb
162
164
  - spec/lib/pg_search/configuration/column_spec.rb
165
+ - spec/lib/pg_search/configuration/foreign_column_spec.rb
163
166
  - spec/lib/pg_search/document_spec.rb
164
167
  - spec/lib/pg_search/features/dmetaphone_spec.rb
165
168
  - spec/lib/pg_search/features/trigram_spec.rb
@@ -195,7 +198,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
195
198
  version: '0'
196
199
  requirements: []
197
200
  rubyforge_project:
198
- rubygems_version: 2.0.3
201
+ rubygems_version: 2.0.14
199
202
  signing_key:
200
203
  specification_version: 4
201
204
  summary: PgSearch builds Active Record named scopes that take advantage of PostgreSQL's
@@ -204,7 +207,9 @@ test_files:
204
207
  - spec/integration/associations_spec.rb
205
208
  - spec/integration/pagination_spec.rb
206
209
  - spec/integration/pg_search_spec.rb
210
+ - spec/lib/pg_search/configuration/association_spec.rb
207
211
  - spec/lib/pg_search/configuration/column_spec.rb
212
+ - spec/lib/pg_search/configuration/foreign_column_spec.rb
208
213
  - spec/lib/pg_search/document_spec.rb
209
214
  - spec/lib/pg_search/features/dmetaphone_spec.rb
210
215
  - spec/lib/pg_search/features/trigram_spec.rb