pg_search 2.3.6 → 2.3.7
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 +4 -4
- data/.github/workflows/ci.yml +21 -16
- data/.standard.yml +6 -0
- data/CHANGELOG.md +11 -0
- data/Gemfile +19 -6
- data/LICENSE +1 -1
- data/README.md +49 -32
- data/Rakefile +4 -7
- data/lib/pg_search/configuration/column.rb +6 -4
- data/lib/pg_search/configuration/foreign_column.rb +1 -1
- data/lib/pg_search/configuration.rb +1 -1
- data/lib/pg_search/document.rb +8 -8
- data/lib/pg_search/features/dmetaphone.rb +1 -1
- data/lib/pg_search/features/trigram.rb +4 -4
- data/lib/pg_search/features/tsearch.rb +14 -13
- data/lib/pg_search/migration/dmetaphone_generator.rb +2 -2
- data/lib/pg_search/migration/generator.rb +5 -5
- data/lib/pg_search/migration/multisearch_generator.rb +2 -2
- data/lib/pg_search/model.rb +6 -6
- data/lib/pg_search/multisearch.rb +4 -2
- data/lib/pg_search/multisearchable.rb +7 -7
- data/lib/pg_search/normalizer.rb +5 -5
- data/lib/pg_search/scope_options.rb +26 -5
- data/lib/pg_search/tasks.rb +2 -2
- data/lib/pg_search/version.rb +1 -1
- data/lib/pg_search.rb +3 -3
- data/pg_search.gemspec +16 -31
- data/spec/.rubocop.yml +20 -7
- data/spec/integration/.rubocop.yml +2 -2
- data/spec/integration/associations_spec.rb +106 -106
- data/spec/integration/deprecation_spec.rb +7 -8
- data/spec/integration/pg_search_spec.rb +314 -298
- data/spec/integration/single_table_inheritance_spec.rb +5 -5
- data/spec/lib/pg_search/configuration/association_spec.rb +15 -15
- data/spec/lib/pg_search/configuration/column_spec.rb +13 -1
- data/spec/lib/pg_search/configuration/foreign_column_spec.rb +4 -4
- data/spec/lib/pg_search/features/dmetaphone_spec.rb +4 -4
- data/spec/lib/pg_search/features/trigram_spec.rb +29 -29
- data/spec/lib/pg_search/features/tsearch_spec.rb +57 -39
- data/spec/lib/pg_search/multisearch/rebuilder_spec.rb +17 -17
- data/spec/lib/pg_search/multisearch_spec.rb +6 -6
- data/spec/lib/pg_search/multisearchable_spec.rb +26 -26
- data/spec/lib/pg_search/normalizer_spec.rb +7 -7
- data/spec/lib/pg_search_spec.rb +18 -18
- data/spec/spec_helper.rb +7 -9
- data/spec/support/database.rb +6 -6
- metadata +10 -214
- data/.codeclimate.yml +0 -17
- data/.rubocop.yml +0 -137
- data/.travis.yml +0 -37
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 103352d5afaf431080a49411b6e7bce5c2d1edec6aa88da55913fb179ef02367
|
4
|
+
data.tar.gz: fea6642ba781bb1916f32d46fe25f829c34d27564c23674dde4c80f97a5a43db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d550e544579fddb2ef4b2667a93624f9b293102db705e304b048bd0eaa328d908c3415028324a35e038353e7a47ac334e53e2a6f381abe2456de835c4d04c359
|
7
|
+
data.tar.gz: b896f972762290dda0d9e744680c707223188e6a5ceb05329cdc3479f302c1a18dd11b20bcd5ebffe66cc36143c182318b51e9e88e63463cfb55d7d0d8890d6b
|
data/.github/workflows/ci.yml
CHANGED
@@ -8,6 +8,9 @@ on:
|
|
8
8
|
pull_request:
|
9
9
|
branches:
|
10
10
|
- master
|
11
|
+
schedule:
|
12
|
+
- cron: "0 18 * * 6" # Saturdays at 12pm CST
|
13
|
+
workflow_dispatch:
|
11
14
|
|
12
15
|
jobs:
|
13
16
|
test:
|
@@ -33,33 +36,35 @@ jobs:
|
|
33
36
|
strategy:
|
34
37
|
fail-fast: false
|
35
38
|
matrix:
|
36
|
-
ruby-version: ['
|
39
|
+
ruby-version: ['3.0', '3.1', '3.2', '3.3']
|
37
40
|
active-record-version-env:
|
38
|
-
- ACTIVE_RECORD_VERSION="~> 5.2.0"
|
39
|
-
- ACTIVE_RECORD_VERSION="~> 6.0.0"
|
40
41
|
- ACTIVE_RECORD_VERSION="~> 6.1.0"
|
41
42
|
- ACTIVE_RECORD_VERSION="~> 7.0.0"
|
43
|
+
- ACTIVE_RECORD_VERSION="~> 7.1.0"
|
44
|
+
- ACTIVE_RECORD_VERSION="~> 7.2.0"
|
42
45
|
allow-failure: [false]
|
46
|
+
exclude:
|
47
|
+
- ruby-version: '3.0'
|
48
|
+
active-record-version-env: ACTIVE_RECORD_VERSION="~> 7.2.0"
|
43
49
|
include:
|
44
|
-
- ruby-version: '3.
|
50
|
+
- ruby-version: '3.3'
|
51
|
+
active-record-version-env: ACTIVE_RECORD_BRANCH="main"
|
52
|
+
allow-failure: true
|
53
|
+
- ruby-version: '3.3'
|
54
|
+
active-record-version-env: ACTIVE_RECORD_BRANCH="7-2-stable"
|
55
|
+
allow-failure: true
|
56
|
+
- ruby-version: '3.3'
|
57
|
+
active-record-version-env: ACTIVE_RECORD_BRANCH="7-1-stable"
|
58
|
+
allow-failure: true
|
59
|
+
- ruby-version: '3.3'
|
45
60
|
active-record-version-env: ACTIVE_RECORD_BRANCH="7-0-stable"
|
46
61
|
allow-failure: true
|
47
|
-
- ruby-version: '3.
|
62
|
+
- ruby-version: '3.3'
|
48
63
|
active-record-version-env: ACTIVE_RECORD_BRANCH="6-1-stable"
|
49
64
|
allow-failure: true
|
50
|
-
exclude:
|
51
|
-
- ruby-version: '3.0'
|
52
|
-
active-record-version-env: ACTIVE_RECORD_VERSION="~> 5.2.0"
|
53
|
-
allow-failure: false
|
54
|
-
- ruby-version: '3.1'
|
55
|
-
active-record-version-env: ACTIVE_RECORD_VERSION="~> 5.2.0"
|
56
|
-
allow-failure: false
|
57
|
-
- ruby-version: '2.6'
|
58
|
-
active-record-version-env: ACTIVE_RECORD_VERSION="~> 7.0.0"
|
59
|
-
allow-failure: false
|
60
65
|
continue-on-error: ${{ matrix.allow-failure }}
|
61
66
|
steps:
|
62
|
-
- uses: actions/checkout@
|
67
|
+
- uses: actions/checkout@v4
|
63
68
|
- name: Set up Ruby
|
64
69
|
uses: ruby/setup-ruby@v1
|
65
70
|
with:
|
data/.standard.yml
ADDED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
# pg_search changelog
|
2
2
|
|
3
|
+
## 2.3.7
|
4
|
+
|
5
|
+
* Drop support for Ruby 2.6 and 2.7
|
6
|
+
* Drop support for Active Record 6.0 and earlier
|
7
|
+
* Support Ruby 3.2 and 3.3
|
8
|
+
* Support Active Record 7.1
|
9
|
+
* Support Active Record 7.2 (fatkodima)
|
10
|
+
* Add U+02BB/U+02BC to disallowed tsquery characters (Vital Ryabchinskiy)
|
11
|
+
* add support for Arel::Nodes::SqlLiteral columns (Kyle Fazzari)
|
12
|
+
* Improve documentation (Prima Aulia Gusta, Ross Baird, Andy Atkinson)
|
13
|
+
|
3
14
|
## 2.3.6
|
4
15
|
|
5
16
|
* Drop support for Ruby 2.5
|
data/Gemfile
CHANGED
@@ -1,15 +1,28 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
source
|
3
|
+
source "https://rubygems.org"
|
4
4
|
|
5
5
|
gemspec
|
6
6
|
|
7
|
-
gem
|
7
|
+
gem "pg", ">= 0.21.0", platform: :ruby
|
8
8
|
gem "activerecord-jdbcpostgresql-adapter", ">= 1.3.1", platform: :jruby
|
9
9
|
|
10
|
-
if ENV[
|
11
|
-
gem
|
12
|
-
gem
|
10
|
+
if ENV["ACTIVE_RECORD_BRANCH"]
|
11
|
+
gem "activerecord", git: "https://github.com/rails/rails.git", branch: ENV.fetch("ACTIVE_RECORD_BRANCH", nil)
|
12
|
+
gem "arel", git: "https://github.com/rails/arel.git" if ENV.fetch("ACTIVE_RECORD_BRANCH", nil) == "master"
|
13
13
|
end
|
14
14
|
|
15
|
-
gem
|
15
|
+
gem "activerecord", ENV.fetch("ACTIVE_RECORD_VERSION", nil) if ENV["ACTIVE_RECORD_VERSION"] # standard:disable Bundler/DuplicatedGem
|
16
|
+
|
17
|
+
gem "debug"
|
18
|
+
gem "irb"
|
19
|
+
gem "rake"
|
20
|
+
gem "rspec"
|
21
|
+
gem "simplecov"
|
22
|
+
gem "simplecov-lcov"
|
23
|
+
gem "standard", require: false
|
24
|
+
gem "standard-rails", require: false
|
25
|
+
gem "standard-rspec", require: false
|
26
|
+
gem "undercover"
|
27
|
+
gem "warning"
|
28
|
+
gem "with_model"
|
data/LICENSE
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Copyright (c) 2010
|
1
|
+
Copyright (c) 2010–2022 Casebook, PBC <http://www.casebook.net>
|
2
2
|
|
3
3
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
4
|
of this software and associated documentation files (the "Software"), to deal
|
data/README.md
CHANGED
@@ -13,8 +13,8 @@ Read the blog post introducing PgSearch at https://tanzu.vmware.com/content/blog
|
|
13
13
|
|
14
14
|
## REQUIREMENTS
|
15
15
|
|
16
|
-
* Ruby
|
17
|
-
*
|
16
|
+
* Ruby 3.0+
|
17
|
+
* Active Record 6.1+
|
18
18
|
* PostgreSQL 9.2+
|
19
19
|
* [PostgreSQL extensions](https://github.com/Casecommons/pg_search/wiki/Installing-PostgreSQL-Extensions) for certain features
|
20
20
|
|
@@ -48,7 +48,7 @@ To add PgSearch to an Active Record model, simply include the PgSearch module.
|
|
48
48
|
class Shape < ActiveRecord::Base
|
49
49
|
include PgSearch::Model
|
50
50
|
end
|
51
|
-
```
|
51
|
+
```
|
52
52
|
|
53
53
|
### Contents
|
54
54
|
* [Multi-search vs. search scopes](#multi-search-vs-search-scopes)
|
@@ -198,17 +198,22 @@ problematic_record.published? # => true
|
|
198
198
|
PgSearch.multisearch("timestamp") # => Includes problematic_record
|
199
199
|
```
|
200
200
|
|
201
|
-
#### More Options
|
201
|
+
#### More Options
|
202
202
|
|
203
203
|
**Conditionally update pg_search_documents**
|
204
204
|
|
205
|
-
You can
|
205
|
+
You can also use the `:update_if` option to pass a Proc or method name to call
|
206
|
+
to determine whether or not a particular record should be updated.
|
207
|
+
|
208
|
+
Note that the Proc or method name is called in an `after_save` hook, so if you
|
209
|
+
are relying on ActiveRecord dirty flags use `*_previously_changed?`.
|
206
210
|
|
207
211
|
```ruby
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
+
class Message < ActiveRecord::Base
|
213
|
+
include PgSearch::Model
|
214
|
+
multisearchable against: [:body],
|
215
|
+
update_if: :body_previously_changed?
|
216
|
+
end
|
212
217
|
```
|
213
218
|
|
214
219
|
**Specify additional attributes to be saved on the pg_search_documents table**
|
@@ -241,7 +246,8 @@ This allows much faster searches without joins later on by doing something like:
|
|
241
246
|
PgSearch.multisearch(params['search']).where(author_id: 2)
|
242
247
|
```
|
243
248
|
|
244
|
-
*NOTE: You must currently manually call `record.update_pg_search_document` for
|
249
|
+
*NOTE: You must currently manually call `record.update_pg_search_document` for
|
250
|
+
the additional attribute to be included in the pg_search_documents table*
|
245
251
|
|
246
252
|
#### Multi-search associations
|
247
253
|
|
@@ -353,15 +359,11 @@ pg_search_documents tables. The following will set the schema search path to
|
|
353
359
|
|
354
360
|
$ rake pg_search:multisearch:rebuild[BlogPost,my_schema]
|
355
361
|
|
356
|
-
For models that are multisearchable
|
362
|
+
For models that are multisearchable `:against` methods that directly map to
|
357
363
|
Active Record attributes, an efficient single SQL statement is run to update
|
358
|
-
the pg_search_documents table all at once. However, if you call any dynamic
|
359
|
-
methods in
|
360
|
-
|
361
|
-
```ruby
|
362
|
-
PgSearch::Document.delete_all(searchable_type: "Ingredient")
|
363
|
-
Ingredient.find_each { |record| record.update_pg_search_document }
|
364
|
-
```
|
364
|
+
the `pg_search_documents` table all at once. However, if you call any dynamic
|
365
|
+
methods in `:against` then `update_pg_search_document` will be called on the
|
366
|
+
individual records being indexed in batches.
|
365
367
|
|
366
368
|
You can also provide a custom implementation for rebuilding the documents by
|
367
369
|
adding a class method called `rebuild_pg_search_documents` to your model.
|
@@ -550,6 +552,21 @@ class Beer < ActiveRecord::Base
|
|
550
552
|
end
|
551
553
|
```
|
552
554
|
|
555
|
+
Here's an example if you pass multiple :using options with additional configurations.
|
556
|
+
|
557
|
+
```ruby
|
558
|
+
class Beer < ActiveRecord::Base
|
559
|
+
include PgSearch::Model
|
560
|
+
pg_search_scope :search_name,
|
561
|
+
against: :name,
|
562
|
+
using: {
|
563
|
+
:trigram => {},
|
564
|
+
:dmetaphone => {},
|
565
|
+
:tsearch => { :prefix => true }
|
566
|
+
}
|
567
|
+
end
|
568
|
+
```
|
569
|
+
|
553
570
|
The currently implemented features are
|
554
571
|
|
555
572
|
* :tsearch - [Full text search](http://www.postgresql.org/docs/current/static/textsearch-intro.html), which is built-in to PostgreSQL
|
@@ -662,7 +679,7 @@ Animal.with_name_matching("fish !red !blue") # => [one_fish, two_fish]
|
|
662
679
|
|
663
680
|
PostgreSQL full text search also support multiple dictionaries for stemming.
|
664
681
|
You can learn more about how dictionaries work by reading the [PostgreSQL
|
665
|
-
documention](http://www.postgresql.org/docs/current/static/textsearch-dictionaries.html).
|
682
|
+
documention](http://www.postgresql.org/docs/current/static/textsearch-dictionaries.html).
|
666
683
|
If you use one of the language dictionaries, such as "english",
|
667
684
|
then variants of words (e.g. "jumping" and "jumped") will match each other. If
|
668
685
|
you don't want stemming, you should pick the "simple" dictionary which does
|
@@ -684,12 +701,12 @@ class BoringTweet < ActiveRecord::Base
|
|
684
701
|
}
|
685
702
|
end
|
686
703
|
|
687
|
-
|
704
|
+
sleep = BoringTweet.create! text: "I snoozed my alarm for fourteen hours today. I bet I can beat that tomorrow! #sleep"
|
688
705
|
sleeping = BoringTweet.create! text: "You know what I like? Sleeping. That's what. #enjoyment"
|
689
|
-
|
706
|
+
sleeps = BoringTweet.create! text: "In the jungle, the mighty jungle, the lion sleeps #tonight"
|
690
707
|
|
691
|
-
BoringTweet.kinda_matching("sleeping") # => [
|
692
|
-
BoringTweet.literally_matching("
|
708
|
+
BoringTweet.kinda_matching("sleeping") # => [sleep, sleeping, sleeps]
|
709
|
+
BoringTweet.literally_matching("sleeps") # => [sleeps]
|
693
710
|
```
|
694
711
|
|
695
712
|
##### :normalization
|
@@ -834,7 +851,7 @@ used for searching.
|
|
834
851
|
Double Metaphone support is currently available as part of the [fuzzystrmatch
|
835
852
|
extension](http://www.postgresql.org/docs/current/static/fuzzystrmatch.html)
|
836
853
|
that must be installed before this feature can be used. In addition to the
|
837
|
-
extension, you must install a utility function into your database. To generate
|
854
|
+
extension, you must install a utility function into your database. To generate
|
838
855
|
and run a migration for this, run:
|
839
856
|
|
840
857
|
$ rails g pg_search:migration:dmetaphone
|
@@ -869,7 +886,7 @@ Trigram search works by counting how many three-letter substrings (or
|
|
869
886
|
Trigram search has some ability to work even with typos and misspellings in
|
870
887
|
the query or text.
|
871
888
|
|
872
|
-
Trigram support is currently available as part of the
|
889
|
+
Trigram support is currently available as part of the
|
873
890
|
[pg_trgm extension](http://www.postgresql.org/docs/current/static/pgtrgm.html) that must be installed before this
|
874
891
|
feature can be used.
|
875
892
|
|
@@ -933,7 +950,7 @@ Vegetable.strictly_spelled_like("collyflower") # => []
|
|
933
950
|
Allows you to match words in longer strings.
|
934
951
|
By default, trigram searches use `%` or `similarity()` as a similarity value.
|
935
952
|
Set `word_similarity` to `true` to opt for `<%` and `word_similarity` instead.
|
936
|
-
This causes the trigram search to use the similarity of the query term
|
953
|
+
This causes the trigram search to use the similarity of the query term
|
937
954
|
and the word with greatest similarity.
|
938
955
|
|
939
956
|
```ruby
|
@@ -959,12 +976,12 @@ Sentence.similarity_like("word") # => []
|
|
959
976
|
Sentence.word_similarity_like("word") # => [sentence]
|
960
977
|
```
|
961
978
|
|
962
|
-
### Limiting Fields When Combining Features
|
979
|
+
### Limiting Fields When Combining Features
|
963
980
|
|
964
|
-
Sometimes when doing queries combining different features you
|
965
|
-
might want to
|
981
|
+
Sometimes when doing queries combining different features you
|
982
|
+
might want to search against only some of the fields with certain features.
|
966
983
|
For example perhaps you want to only do a trigram search against the shorter fields
|
967
|
-
so that you don't need to reduce the threshold excessively. You can specify
|
984
|
+
so that you don't need to reduce the threshold excessively. You can specify
|
968
985
|
which fields using the 'only' option:
|
969
986
|
|
970
987
|
```ruby
|
@@ -983,7 +1000,7 @@ class Image < ActiveRecord::Base
|
|
983
1000
|
end
|
984
1001
|
```
|
985
1002
|
|
986
|
-
Now you can succesfully retrieve an Image with a file_name: 'image_foo.jpg'
|
1003
|
+
Now you can succesfully retrieve an Image with a file_name: 'image_foo.jpg'
|
987
1004
|
and long_description: 'This description is so long that it would make a trigram search
|
988
1005
|
fail any reasonable threshold limit' with:
|
989
1006
|
|
@@ -1201,5 +1218,5 @@ for discussing pg_search and other Casebook PBC open source projects.
|
|
1201
1218
|
|
1202
1219
|
## LICENSE
|
1203
1220
|
|
1204
|
-
Copyright © 2010–
|
1221
|
+
Copyright © 2010–2022 [Casebook PBC](http://www.casebook.net).
|
1205
1222
|
Licensed under the MIT license, see [LICENSE](/LICENSE) file.
|
data/Rakefile
CHANGED
@@ -1,15 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "bundler"
|
4
4
|
Bundler::GemHelper.install_tasks
|
5
5
|
|
6
|
-
require
|
6
|
+
require "rspec/core/rake_task"
|
7
7
|
RSpec::Core::RakeTask.new(:spec)
|
8
8
|
|
9
|
-
require "
|
10
|
-
RuboCop::RakeTask.new do |t|
|
11
|
-
t.options = %w[--display-cop-names]
|
12
|
-
end
|
9
|
+
require "standard/rake"
|
13
10
|
|
14
11
|
desc "Check test coverage"
|
15
12
|
task :undercover do
|
@@ -17,4 +14,4 @@ task :undercover do
|
|
17
14
|
exit(1) unless system("bin/undercover --compare origin/master")
|
18
15
|
end
|
19
16
|
|
20
|
-
task default: %w[spec
|
17
|
+
task default: %w[spec standard undercover]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "digest"
|
4
4
|
|
5
5
|
module PgSearch
|
6
6
|
class Configuration
|
@@ -9,18 +9,20 @@ module PgSearch
|
|
9
9
|
|
10
10
|
def initialize(column_name, weight, model)
|
11
11
|
@name = column_name.to_s
|
12
|
-
@column_name = column_name
|
12
|
+
@column_name = column_name
|
13
13
|
@weight = weight
|
14
14
|
@model = model
|
15
15
|
@connection = model.connection
|
16
16
|
end
|
17
17
|
|
18
18
|
def full_name
|
19
|
+
return @column_name if @column_name.is_a?(Arel::Nodes::SqlLiteral)
|
20
|
+
|
19
21
|
"#{table_name}.#{column_name}"
|
20
22
|
end
|
21
23
|
|
22
24
|
def to_sql
|
23
|
-
"coalesce(#{expression}::text, '')"
|
25
|
+
"coalesce((#{expression})::text, '')"
|
24
26
|
end
|
25
27
|
|
26
28
|
private
|
@@ -30,7 +32,7 @@ module PgSearch
|
|
30
32
|
end
|
31
33
|
|
32
34
|
def column_name
|
33
|
-
@connection.quote_column_name(@
|
35
|
+
@connection.quote_column_name(@name)
|
34
36
|
end
|
35
37
|
|
36
38
|
def expression
|
data/lib/pg_search/document.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "logger"
|
4
4
|
|
5
5
|
module PgSearch
|
6
|
-
class Document < ActiveRecord::Base
|
6
|
+
class Document < ActiveRecord::Base # standard:disable Rails/ApplicationRecord
|
7
7
|
include PgSearch::Model
|
8
8
|
|
9
|
-
self.table_name =
|
9
|
+
self.table_name = "pg_search_documents"
|
10
10
|
belongs_to :searchable, polymorphic: true
|
11
11
|
|
12
12
|
# The logger might not have loaded yet.
|
@@ -17,12 +17,12 @@ module PgSearch
|
|
17
17
|
|
18
18
|
pg_search_scope :search, lambda { |*args|
|
19
19
|
options = if PgSearch.multisearch_options.respond_to?(:call)
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
PgSearch.multisearch_options.call(*args)
|
21
|
+
else
|
22
|
+
{query: args.first}.merge(PgSearch.multisearch_options)
|
23
|
+
end
|
24
24
|
|
25
|
-
{
|
25
|
+
{against: :content}.merge(options)
|
26
26
|
}
|
27
27
|
end
|
28
28
|
end
|
@@ -7,7 +7,7 @@ module PgSearch
|
|
7
7
|
class DMetaphone
|
8
8
|
def initialize(query, options, columns, model, normalizer)
|
9
9
|
dmetaphone_normalizer = Normalizer.new(normalizer)
|
10
|
-
options = (options || {}).merge(dictionary:
|
10
|
+
options = (options || {}).merge(dictionary: "simple")
|
11
11
|
@tsearch = TSearch.new(query, options, columns, model, dmetaphone_normalizer)
|
12
12
|
end
|
13
13
|
|
@@ -35,17 +35,17 @@ module PgSearch
|
|
35
35
|
|
36
36
|
def similarity_function
|
37
37
|
if word_similarity?
|
38
|
-
|
38
|
+
"word_similarity"
|
39
39
|
else
|
40
|
-
|
40
|
+
"similarity"
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
44
|
def infix_operator
|
45
45
|
if word_similarity?
|
46
|
-
|
46
|
+
"<%"
|
47
47
|
else
|
48
|
-
|
48
|
+
"%"
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
@@ -1,11 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "active_support/core_ext/module/delegation"
|
4
|
-
require
|
4
|
+
require "active_support/deprecation"
|
5
5
|
|
6
6
|
module PgSearch
|
7
7
|
module Features
|
8
|
-
class TSearch < Feature
|
8
|
+
class TSearch < Feature
|
9
9
|
def self.valid_options
|
10
10
|
super + %i[dictionary prefix negation any_word normalization tsvector_column highlight]
|
11
11
|
end
|
@@ -36,12 +36,11 @@ module PgSearch
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def ts_headline_options
|
39
|
-
return
|
39
|
+
return "" unless options[:highlight].is_a?(Hash)
|
40
40
|
|
41
41
|
headline_options
|
42
42
|
.merge(deprecated_headline_options)
|
43
|
-
.
|
44
|
-
.compact
|
43
|
+
.filter_map { |key, value| "#{key} = #{value}" unless value.nil? }
|
45
44
|
.join(", ")
|
46
45
|
end
|
47
46
|
|
@@ -59,7 +58,7 @@ module PgSearch
|
|
59
58
|
end
|
60
59
|
end
|
61
60
|
|
62
|
-
def deprecated_headline_options
|
61
|
+
def deprecated_headline_options
|
63
62
|
indifferent_options = options.with_indifferent_access
|
64
63
|
|
65
64
|
%w[
|
@@ -71,9 +70,11 @@ module PgSearch
|
|
71
70
|
unless value.nil?
|
72
71
|
key = deprecated_key.camelize
|
73
72
|
|
74
|
-
|
73
|
+
warn(
|
75
74
|
"pg_search 3.0 will no longer accept :#{deprecated_key} as an argument to :ts_headline, " \
|
76
|
-
"use :#{key} instead."
|
75
|
+
"use :#{key} instead.",
|
76
|
+
category: :deprecated,
|
77
|
+
uplevel: 1
|
77
78
|
)
|
78
79
|
|
79
80
|
hash[key] = ts_headline_option_value(value)
|
@@ -95,11 +96,11 @@ module PgSearch
|
|
95
96
|
end
|
96
97
|
end
|
97
98
|
|
98
|
-
DISALLOWED_TSQUERY_CHARACTERS = /['
|
99
|
+
DISALLOWED_TSQUERY_CHARACTERS = /['?\\:‘’ʻʼ]/
|
99
100
|
|
100
101
|
def tsquery_for_term(unsanitized_term)
|
101
102
|
if options[:negation] && unsanitized_term.start_with?("!")
|
102
|
-
unsanitized_term[0] =
|
103
|
+
unsanitized_term[0] = ""
|
103
104
|
negated = true
|
104
105
|
end
|
105
106
|
|
@@ -117,7 +118,7 @@ module PgSearch
|
|
117
118
|
# If :negated is true, then the term will have ! prepended to the front.
|
118
119
|
def tsquery_expression(term_sql, negated:, prefix:)
|
119
120
|
terms = [
|
120
|
-
(Arel::Nodes.build_quoted(
|
121
|
+
(Arel::Nodes.build_quoted("!") if negated),
|
121
122
|
Arel::Nodes.build_quoted("' "),
|
122
123
|
term_sql,
|
123
124
|
Arel::Nodes.build_quoted(" '"),
|
@@ -134,7 +135,7 @@ module PgSearch
|
|
134
135
|
|
135
136
|
query_terms = query.split.compact
|
136
137
|
tsquery_terms = query_terms.map { |term| tsquery_for_term(term) }
|
137
|
-
tsquery_terms.join(options[:any_word] ?
|
138
|
+
tsquery_terms.join(options[:any_word] ? " || " : " && ")
|
138
139
|
end
|
139
140
|
|
140
141
|
def tsdocument
|
@@ -152,7 +153,7 @@ module PgSearch
|
|
152
153
|
end
|
153
154
|
end
|
154
155
|
|
155
|
-
tsdocument_terms.join(
|
156
|
+
tsdocument_terms.join(" || ")
|
156
157
|
end
|
157
158
|
|
158
159
|
# From http://www.postgresql.org/docs/8.3/static/textsearch-controls.html
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "pg_search/migration/generator"
|
4
4
|
|
5
5
|
module PgSearch
|
6
6
|
module Migration
|
7
7
|
class DmetaphoneGenerator < Generator
|
8
8
|
def migration_name
|
9
|
-
|
9
|
+
"add_pg_search_dmetaphone_support_functions"
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "active_record"
|
4
|
+
require "rails/generators/base"
|
5
5
|
|
6
6
|
module PgSearch
|
7
7
|
module Migration
|
@@ -10,19 +10,19 @@ module PgSearch
|
|
10
10
|
|
11
11
|
def self.inherited(subclass)
|
12
12
|
super
|
13
|
-
subclass.source_root File.expand_path(
|
13
|
+
subclass.source_root File.expand_path("templates", __dir__)
|
14
14
|
end
|
15
15
|
|
16
16
|
def create_migration
|
17
17
|
now = Time.now.utc
|
18
|
-
filename = "#{now.strftime(
|
18
|
+
filename = "#{now.strftime("%Y%m%d%H%M%S")}_#{migration_name}.rb"
|
19
19
|
template "#{migration_name}.rb.erb", "db/migrate/#{filename}", migration_version
|
20
20
|
end
|
21
21
|
|
22
22
|
private
|
23
23
|
|
24
24
|
def read_sql_file(filename)
|
25
|
-
sql_directory = File.expand_path(
|
25
|
+
sql_directory = File.expand_path("../../../sql", __dir__)
|
26
26
|
source_path = File.join(sql_directory, "#{filename}.sql")
|
27
27
|
File.read(source_path).strip
|
28
28
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "pg_search/migration/generator"
|
4
4
|
|
5
5
|
module PgSearch
|
6
6
|
module Migration
|
7
7
|
class MultisearchGenerator < Generator
|
8
8
|
def migration_name
|
9
|
-
|
9
|
+
"create_pg_search_documents"
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
data/lib/pg_search/model.rb
CHANGED
@@ -7,12 +7,12 @@ module PgSearch
|
|
7
7
|
module ClassMethods
|
8
8
|
def pg_search_scope(name, options)
|
9
9
|
options_proc = if options.respond_to?(:call)
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
10
|
+
options
|
11
|
+
elsif options.respond_to?(:merge)
|
12
|
+
->(query) { {query: query}.merge(options) }
|
13
|
+
else
|
14
|
+
raise ArgumentError, "pg_search_scope expects a Hash or Proc"
|
15
|
+
end
|
16
16
|
|
17
17
|
define_singleton_method(name) do |*args|
|
18
18
|
config = Configuration.new(options_proc.call(*args), self)
|