pg_search 2.3.5 → 2.3.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +80 -0
  3. data/.standard.yml +6 -0
  4. data/CHANGELOG.md +20 -0
  5. data/Gemfile +19 -6
  6. data/LICENSE +1 -1
  7. data/README.md +61 -39
  8. data/Rakefile +9 -6
  9. data/lib/pg_search/configuration/column.rb +6 -4
  10. data/lib/pg_search/configuration/foreign_column.rb +1 -1
  11. data/lib/pg_search/configuration.rb +13 -3
  12. data/lib/pg_search/document.rb +8 -8
  13. data/lib/pg_search/features/dmetaphone.rb +1 -1
  14. data/lib/pg_search/features/feature.rb +1 -1
  15. data/lib/pg_search/features/trigram.rb +4 -4
  16. data/lib/pg_search/features/tsearch.rb +15 -14
  17. data/lib/pg_search/migration/dmetaphone_generator.rb +2 -2
  18. data/lib/pg_search/migration/generator.rb +5 -5
  19. data/lib/pg_search/migration/multisearch_generator.rb +2 -2
  20. data/lib/pg_search/model.rb +6 -6
  21. data/lib/pg_search/multisearch.rb +16 -6
  22. data/lib/pg_search/multisearchable.rb +7 -7
  23. data/lib/pg_search/normalizer.rb +5 -5
  24. data/lib/pg_search/scope_options.rb +28 -10
  25. data/lib/pg_search/tasks.rb +2 -2
  26. data/lib/pg_search/version.rb +1 -1
  27. data/lib/pg_search.rb +5 -5
  28. data/pg_search.gemspec +17 -29
  29. data/spec/.rubocop.yml +20 -7
  30. data/spec/integration/.rubocop.yml +2 -2
  31. data/spec/integration/associations_spec.rb +106 -106
  32. data/spec/integration/deprecation_spec.rb +7 -8
  33. data/spec/integration/pg_search_spec.rb +339 -292
  34. data/spec/integration/single_table_inheritance_spec.rb +5 -5
  35. data/spec/lib/pg_search/configuration/association_spec.rb +15 -15
  36. data/spec/lib/pg_search/configuration/column_spec.rb +13 -1
  37. data/spec/lib/pg_search/configuration/foreign_column_spec.rb +4 -4
  38. data/spec/lib/pg_search/features/dmetaphone_spec.rb +4 -4
  39. data/spec/lib/pg_search/features/trigram_spec.rb +28 -28
  40. data/spec/lib/pg_search/features/tsearch_spec.rb +57 -39
  41. data/spec/lib/pg_search/multisearch/rebuilder_spec.rb +17 -17
  42. data/spec/lib/pg_search/multisearch_spec.rb +15 -6
  43. data/spec/lib/pg_search/multisearchable_spec.rb +26 -26
  44. data/spec/lib/pg_search/normalizer_spec.rb +7 -7
  45. data/spec/lib/pg_search_spec.rb +20 -20
  46. data/spec/spec_helper.rb +15 -9
  47. data/spec/support/database.rb +9 -7
  48. metadata +13 -188
  49. data/.autotest +0 -5
  50. data/.codeclimate.yml +0 -17
  51. data/.rubocop.yml +0 -134
  52. data/.travis.yml +0 -42
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c2c29f81bcee1e1547d17ae1eda7c5a71e1f43d4891cc1e66ec8e7f648473698
4
- data.tar.gz: 68e7d896513f774004f9259fcc2aa88cb6fc687783be02bd9abbb21466e6c989
3
+ metadata.gz: 103352d5afaf431080a49411b6e7bce5c2d1edec6aa88da55913fb179ef02367
4
+ data.tar.gz: fea6642ba781bb1916f32d46fe25f829c34d27564c23674dde4c80f97a5a43db
5
5
  SHA512:
6
- metadata.gz: b1a224c8783e84a25aea02720ab06cb191c9a175c2416a9a1584e4a088845bc9b4d5e6a80eb73d06b7f4cabd933c770f386131b9cd52988626f200954770fa5b
7
- data.tar.gz: 0744e0552c490b4e334334a23044d19aeae2cea28106fe09528add0a91c80bd9c7f507acb7a3c017df5d375cbf1a7bf590f6cb405ba066b8e4cc13b99f19904d
6
+ metadata.gz: d550e544579fddb2ef4b2667a93624f9b293102db705e304b048bd0eaa328d908c3415028324a35e038353e7a47ac334e53e2a6f381abe2456de835c4d04c359
7
+ data.tar.gz: b896f972762290dda0d9e744680c707223188e6a5ceb05329cdc3479f302c1a18dd11b20bcd5ebffe66cc36143c182318b51e9e88e63463cfb55d7d0d8890d6b
@@ -0,0 +1,80 @@
1
+ name: build
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ - github-actions
8
+ pull_request:
9
+ branches:
10
+ - master
11
+ schedule:
12
+ - cron: "0 18 * * 6" # Saturdays at 12pm CST
13
+ workflow_dispatch:
14
+
15
+ jobs:
16
+ test:
17
+ runs-on: ubuntu-latest
18
+ services:
19
+ postgres:
20
+ image: postgres:latest
21
+ env:
22
+ POSTGRES_USER: postgres
23
+ POSTGRES_PASSWORD: postgres
24
+ options: >-
25
+ --health-cmd pg_isready
26
+ --health-interval 10s
27
+ --health-timeout 5s
28
+ --health-retries 5
29
+ ports:
30
+ - 5432:5432
31
+ env:
32
+ CI: true
33
+ PGHOST: 127.0.0.1
34
+ PGUSER: postgres
35
+ PGPASS: postgres
36
+ strategy:
37
+ fail-fast: false
38
+ matrix:
39
+ ruby-version: ['3.0', '3.1', '3.2', '3.3']
40
+ active-record-version-env:
41
+ - ACTIVE_RECORD_VERSION="~> 6.1.0"
42
+ - ACTIVE_RECORD_VERSION="~> 7.0.0"
43
+ - ACTIVE_RECORD_VERSION="~> 7.1.0"
44
+ - ACTIVE_RECORD_VERSION="~> 7.2.0"
45
+ allow-failure: [false]
46
+ exclude:
47
+ - ruby-version: '3.0'
48
+ active-record-version-env: ACTIVE_RECORD_VERSION="~> 7.2.0"
49
+ include:
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'
60
+ active-record-version-env: ACTIVE_RECORD_BRANCH="7-0-stable"
61
+ allow-failure: true
62
+ - ruby-version: '3.3'
63
+ active-record-version-env: ACTIVE_RECORD_BRANCH="6-1-stable"
64
+ allow-failure: true
65
+ continue-on-error: ${{ matrix.allow-failure }}
66
+ steps:
67
+ - uses: actions/checkout@v4
68
+ - name: Set up Ruby
69
+ uses: ruby/setup-ruby@v1
70
+ with:
71
+ ruby-version: ${{ matrix.ruby-version }}
72
+ bundler-cache: true
73
+ - name: Set up test database
74
+ env:
75
+ PGPASSWORD: postgres
76
+ run: createdb pg_search_test
77
+ - name: Update bundle
78
+ run: ${{ matrix.active-record-version-env }} bundle update
79
+ - name: Run tests
80
+ run: ${{ matrix.active-record-version-env }} bundle exec rake
data/.standard.yml ADDED
@@ -0,0 +1,6 @@
1
+ ruby_version: 3.0
2
+
3
+ plugins:
4
+ - standard-performance
5
+ - standard-rails:
6
+ target_rails_version: 6.1
data/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
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
+
14
+ ## 2.3.6
15
+
16
+ * Drop support for Ruby 2.5
17
+ * Support Ruby 3.1
18
+ * Support Active Record 7.0
19
+ * Don't require `:against` if `:tsvector_column` is specified (Travis Hunter)
20
+ * Optionally disable transaction when rebuilding documents (Travis Hunter)
21
+ * Preserve columns when chaining ::with_pg_search_highlight (jcsanti)
22
+
3
23
  ## 2.3.5
4
24
 
5
25
  * Add table of contents to README (Barry Woolgar)
data/Gemfile CHANGED
@@ -1,15 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- source 'https://rubygems.org'
3
+ source "https://rubygems.org"
4
4
 
5
5
  gemspec
6
6
 
7
- gem 'pg', '>= 0.21.0', platform: :ruby
7
+ gem "pg", ">= 0.21.0", platform: :ruby
8
8
  gem "activerecord-jdbcpostgresql-adapter", ">= 1.3.1", platform: :jruby
9
9
 
10
- if ENV['ACTIVE_RECORD_BRANCH']
11
- gem 'activerecord', git: 'https://github.com/rails/rails.git', branch: ENV['ACTIVE_RECORD_BRANCH']
12
- gem 'arel', git: 'https://github.com/rails/arel.git' if ENV['ACTIVE_RECORD_BRANCH'] == 'master'
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 'activerecord', ENV['ACTIVE_RECORD_VERSION'] if ENV['ACTIVE_RECORD_VERSION']
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-2020 Casebook, PBC <http://www.casebook.net>
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
@@ -1,10 +1,7 @@
1
1
  # [pg_search](http://github.com/Casecommons/pg_search/)
2
2
 
3
3
  [![Gem Version](https://img.shields.io/gem/v/pg_search.svg?style=flat)](https://rubygems.org/gems/pg_search)
4
- [![Build Status](https://secure.travis-ci.org/Casecommons/pg_search.svg?branch=master)](https://travis-ci.org/Casecommons/pg_search)
5
- [![Maintainability](https://api.codeclimate.com/v1/badges/ae1a7c021e473e9b2486/maintainability)](https://codeclimate.com/github/Casecommons/pg_search/maintainability)
6
- [![Test Coverage](https://codeclimate.com/github/Casecommons/pg_search/badges/coverage.svg)](https://codeclimate.com/github/Casecommons/pg_search/coverage)
7
- [![Inline docs](http://inch-ci.org/github/Casecommons/pg_search.svg?branch=master&style=flat)](http://inch-ci.org/github/Casecommons/pg_search)
4
+ [![Build Status](https://github.com/Casecommons/pg_search/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/Casecommons/pg_search/actions/workflows/ci.yml)
8
5
  [![Join the chat at https://gitter.im/Casecommons/pg_search](https://img.shields.io/badge/gitter-join%20chat-blue.svg)](https://gitter.im/Casecommons/pg_search?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
9
6
 
10
7
  ## DESCRIPTION
@@ -12,12 +9,12 @@
12
9
  PgSearch builds named scopes that take advantage of PostgreSQL's full text
13
10
  search.
14
11
 
15
- Read the blog post introducing PgSearch at https://content.pivotal.io/blog/pg-search-how-i-learned-to-stop-worrying-and-love-postgresql-full-text-search
12
+ Read the blog post introducing PgSearch at https://tanzu.vmware.com/content/blog/pg-search-how-i-learned-to-stop-worrying-and-love-postgresql-full-text-search
16
13
 
17
14
  ## REQUIREMENTS
18
15
 
19
- * Ruby 2.5+
20
- * ActiveRecord 5.2+
16
+ * Ruby 3.0+
17
+ * Active Record 6.1+
21
18
  * PostgreSQL 9.2+
22
19
  * [PostgreSQL extensions](https://github.com/Casecommons/pg_search/wiki/Installing-PostgreSQL-Extensions) for certain features
23
20
 
@@ -51,7 +48,7 @@ To add PgSearch to an Active Record model, simply include the PgSearch module.
51
48
  class Shape < ActiveRecord::Base
52
49
  include PgSearch::Model
53
50
  end
54
- ```
51
+ ```
55
52
 
56
53
  ### Contents
57
54
  * [Multi-search vs. search scopes](#multi-search-vs-search-scopes)
@@ -201,17 +198,22 @@ problematic_record.published? # => true
201
198
  PgSearch.multisearch("timestamp") # => Includes problematic_record
202
199
  ```
203
200
 
204
- #### More Options
201
+ #### More Options
205
202
 
206
203
  **Conditionally update pg_search_documents**
207
204
 
208
- You can specify an `:update_if` parameter to conditionally update pg_search documents. For example:
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?`.
209
210
 
210
211
  ```ruby
211
- multisearchable(
212
- against: [:body],
213
- update_if: :body_changed?
214
- )
212
+ class Message < ActiveRecord::Base
213
+ include PgSearch::Model
214
+ multisearchable against: [:body],
215
+ update_if: :body_previously_changed?
216
+ end
215
217
  ```
216
218
 
217
219
  **Specify additional attributes to be saved on the pg_search_documents table**
@@ -244,7 +246,8 @@ This allows much faster searches without joins later on by doing something like:
244
246
  PgSearch.multisearch(params['search']).where(author_id: 2)
245
247
  ```
246
248
 
247
- *NOTE: You must currently manually call `record.update_pg_search_document` for the additional attribute to be included in the pg_search_documents table*
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*
248
251
 
249
252
  #### Multi-search associations
250
253
 
@@ -319,7 +322,7 @@ To remove all of the documents for a given class, you can simply delete all of
319
322
  the PgSearch::Document records.
320
323
 
321
324
  ```ruby
322
- PgSearch::Document.delete_all(searchable_type: "Animal")
325
+ PgSearch::Document.delete_by(searchable_type: "Animal")
323
326
  ```
324
327
 
325
328
  To regenerate the documents for a given class, run:
@@ -338,6 +341,13 @@ like so:
338
341
  PgSearch::Multisearch.rebuild(Product, clean_up: false)
339
342
  ```
340
343
 
344
+ ```rebuild``` runs inside a single transaction. To run outside of a transaction,
345
+ you can pass ```transactional: false``` like so:
346
+
347
+ ```ruby
348
+ PgSearch::Multisearch.rebuild(Product, transactional: false)
349
+ ```
350
+
341
351
  Rebuild is also available as a Rake task, for convenience.
342
352
 
343
353
  $ rake pg_search:multisearch:rebuild[BlogPost]
@@ -349,15 +359,11 @@ pg_search_documents tables. The following will set the schema search path to
349
359
 
350
360
  $ rake pg_search:multisearch:rebuild[BlogPost,my_schema]
351
361
 
352
- For models that are multisearchable :against methods that directly map to
362
+ For models that are multisearchable `:against` methods that directly map to
353
363
  Active Record attributes, an efficient single SQL statement is run to update
354
- the pg_search_documents table all at once. However, if you call any dynamic
355
- methods in :against, the following strategy will be used:
356
-
357
- ```ruby
358
- PgSearch::Document.delete_all(searchable_type: "Ingredient")
359
- Ingredient.find_each { |record| record.update_pg_search_document }
360
- ```
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.
361
367
 
362
368
  You can also provide a custom implementation for rebuilding the documents by
363
369
  adding a class method called `rebuild_pg_search_documents` to your model.
@@ -383,7 +389,7 @@ class Movie < ActiveRecord::Base
383
389
  INSERT INTO pg_search_documents (searchable_type, searchable_id, content, created_at, updated_at)
384
390
  SELECT 'Movie' AS searchable_type,
385
391
  movies.id AS searchable_id,
386
- (movies.name || ' ' || directors.name) AS content,
392
+ CONCAT_WS(' ', movies.name, directors.name) AS content,
387
393
  now() AS created_at,
388
394
  now() AS updated_at
389
395
  FROM movies
@@ -393,6 +399,7 @@ class Movie < ActiveRecord::Base
393
399
  end
394
400
  end
395
401
  ```
402
+ **Note:** If using PostgreSQL before 9.1, replace the `CONCAT_WS()` function call with double-pipe concatenation, eg. `(movies.name || ' ' || directors.name)`. However, now be aware that if *any* of the joined values is NULL then the final `content` value will also be NULL, whereas `CONCAT_WS()` will selectively ignore NULL values.
396
403
 
397
404
  #### Disabling multi-search indexing temporarily
398
405
 
@@ -545,6 +552,21 @@ class Beer < ActiveRecord::Base
545
552
  end
546
553
  ```
547
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
+
548
570
  The currently implemented features are
549
571
 
550
572
  * :tsearch - [Full text search](http://www.postgresql.org/docs/current/static/textsearch-intro.html), which is built-in to PostgreSQL
@@ -657,7 +679,7 @@ Animal.with_name_matching("fish !red !blue") # => [one_fish, two_fish]
657
679
 
658
680
  PostgreSQL full text search also support multiple dictionaries for stemming.
659
681
  You can learn more about how dictionaries work by reading the [PostgreSQL
660
- documention](http://www.postgresql.org/docs/current/static/textsearch-dictionaries.html).
682
+ documention](http://www.postgresql.org/docs/current/static/textsearch-dictionaries.html).
661
683
  If you use one of the language dictionaries, such as "english",
662
684
  then variants of words (e.g. "jumping" and "jumped") will match each other. If
663
685
  you don't want stemming, you should pick the "simple" dictionary which does
@@ -679,12 +701,12 @@ class BoringTweet < ActiveRecord::Base
679
701
  }
680
702
  end
681
703
 
682
- sleepy = BoringTweet.create! text: "I snoozed my alarm for fourteen hours today. I bet I can beat that tomorrow! #sleepy"
704
+ sleep = BoringTweet.create! text: "I snoozed my alarm for fourteen hours today. I bet I can beat that tomorrow! #sleep"
683
705
  sleeping = BoringTweet.create! text: "You know what I like? Sleeping. That's what. #enjoyment"
684
- sleeper = BoringTweet.create! text: "Have you seen Woody Allen's movie entitled Sleeper? Me neither. #boycott"
706
+ sleeps = BoringTweet.create! text: "In the jungle, the mighty jungle, the lion sleeps #tonight"
685
707
 
686
- BoringTweet.kinda_matching("sleeping") # => [sleepy, sleeping, sleeper]
687
- BoringTweet.literally_matching("sleeping") # => [sleeping]
708
+ BoringTweet.kinda_matching("sleeping") # => [sleep, sleeping, sleeps]
709
+ BoringTweet.literally_matching("sleeps") # => [sleeps]
688
710
  ```
689
711
 
690
712
  ##### :normalization
@@ -829,7 +851,7 @@ used for searching.
829
851
  Double Metaphone support is currently available as part of the [fuzzystrmatch
830
852
  extension](http://www.postgresql.org/docs/current/static/fuzzystrmatch.html)
831
853
  that must be installed before this feature can be used. In addition to the
832
- 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
833
855
  and run a migration for this, run:
834
856
 
835
857
  $ rails g pg_search:migration:dmetaphone
@@ -864,7 +886,7 @@ Trigram search works by counting how many three-letter substrings (or
864
886
  Trigram search has some ability to work even with typos and misspellings in
865
887
  the query or text.
866
888
 
867
- Trigram support is currently available as part of the
889
+ Trigram support is currently available as part of the
868
890
  [pg_trgm extension](http://www.postgresql.org/docs/current/static/pgtrgm.html) that must be installed before this
869
891
  feature can be used.
870
892
 
@@ -928,7 +950,7 @@ Vegetable.strictly_spelled_like("collyflower") # => []
928
950
  Allows you to match words in longer strings.
929
951
  By default, trigram searches use `%` or `similarity()` as a similarity value.
930
952
  Set `word_similarity` to `true` to opt for `<%` and `word_similarity` instead.
931
- 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
932
954
  and the word with greatest similarity.
933
955
 
934
956
  ```ruby
@@ -954,12 +976,12 @@ Sentence.similarity_like("word") # => []
954
976
  Sentence.word_similarity_like("word") # => [sentence]
955
977
  ```
956
978
 
957
- ### Limiting Fields When Combining Features
979
+ ### Limiting Fields When Combining Features
958
980
 
959
- Sometimes when doing queries combining different features you
960
- might want to searching against only some of the fields with certain features.
981
+ Sometimes when doing queries combining different features you
982
+ might want to search against only some of the fields with certain features.
961
983
  For example perhaps you want to only do a trigram search against the shorter fields
962
- 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
963
985
  which fields using the 'only' option:
964
986
 
965
987
  ```ruby
@@ -978,7 +1000,7 @@ class Image < ActiveRecord::Base
978
1000
  end
979
1001
  ```
980
1002
 
981
- 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'
982
1004
  and long_description: 'This description is so long that it would make a trigram search
983
1005
  fail any reasonable threshold limit' with:
984
1006
 
@@ -1196,5 +1218,5 @@ for discussing pg_search and other Casebook PBC open source projects.
1196
1218
 
1197
1219
  ## LICENSE
1198
1220
 
1199
- Copyright © 2010–2019 [Casebook PBC](http://www.casebook.net).
1221
+ Copyright © 2010–2022 [Casebook PBC](http://www.casebook.net).
1200
1222
  Licensed under the MIT license, see [LICENSE](/LICENSE) file.
data/Rakefile CHANGED
@@ -1,14 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'bundler'
3
+ require "bundler"
4
4
  Bundler::GemHelper.install_tasks
5
5
 
6
- require 'rspec/core/rake_task'
6
+ require "rspec/core/rake_task"
7
7
  RSpec::Core::RakeTask.new(:spec)
8
8
 
9
- require "rubocop/rake_task"
10
- RuboCop::RakeTask.new do |t|
11
- t.options = %w[--display-cop-names]
9
+ require "standard/rake"
10
+
11
+ desc "Check test coverage"
12
+ task :undercover do
13
+ system("git fetch --unshallow") if ENV["CI"]
14
+ exit(1) unless system("bin/undercover --compare origin/master")
12
15
  end
13
16
 
14
- task default: %w[spec rubocop]
17
+ task default: %w[spec standard undercover]
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'digest'
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.to_s
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(@column_name)
35
+ @connection.quote_column_name(@name)
34
36
  end
35
37
 
36
38
  def expression
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'digest'
3
+ require "digest"
4
4
 
5
5
  module PgSearch
6
6
  class Configuration
@@ -80,7 +80,7 @@ module PgSearch
80
80
  attr_reader :options
81
81
 
82
82
  def default_options
83
- { using: :tsearch }
83
+ {using: :tsearch}
84
84
  end
85
85
 
86
86
  VALID_KEYS = %w[
@@ -92,8 +92,11 @@ module PgSearch
92
92
  }.freeze
93
93
 
94
94
  def assert_valid_options(options)
95
- unless options[:against] || options[:associated_against]
96
- raise ArgumentError, "the search scope #{@name} must have :against or :associated_against in its options"
95
+ unless options[:against] || options[:associated_against] || using_tsvector_column?(options[:using])
96
+ raise(
97
+ ArgumentError,
98
+ "the search scope #{@name} must have :against, :associated_against, or :tsvector_column in its options"
99
+ )
97
100
  end
98
101
 
99
102
  options.assert_valid_keys(VALID_KEYS)
@@ -104,5 +107,12 @@ module PgSearch
104
107
  end
105
108
  end
106
109
  end
110
+
111
+ def using_tsvector_column?(options)
112
+ return unless options.is_a?(Hash)
113
+
114
+ options.dig(:dmetaphone, :tsvector_column).present? ||
115
+ options.dig(:tsearch, :tsvector_column).present?
116
+ end
107
117
  end
108
118
  end
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'logger'
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 = 'pg_search_documents'
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
- PgSearch.multisearch_options.call(*args)
21
- else
22
- { query: args.first }.merge(PgSearch.multisearch_options)
23
- end
20
+ PgSearch.multisearch_options.call(*args)
21
+ else
22
+ {query: args.first}.merge(PgSearch.multisearch_options)
23
+ end
24
24
 
25
- { against: :content }.merge(options)
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: 'simple')
10
+ options = (options || {}).merge(dictionary: "simple")
11
11
  @tsearch = TSearch.new(query, options, columns, model, dmetaphone_normalizer)
12
12
  end
13
13
 
@@ -10,7 +10,7 @@ module PgSearch
10
10
  %i[only sort_only]
11
11
  end
12
12
 
13
- delegate :connection, :quoted_table_name, to: :'@model'
13
+ delegate :connection, :quoted_table_name, to: :@model
14
14
 
15
15
  def initialize(query, options, all_columns, model, normalizer)
16
16
  @query = query
@@ -35,17 +35,17 @@ module PgSearch
35
35
 
36
36
  def similarity_function
37
37
  if word_similarity?
38
- 'word_similarity'
38
+ "word_similarity"
39
39
  else
40
- 'similarity'
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