pg_ltree 1.1.7 → 1.1.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 986a93b7129f617950f44c6d325b4f38ab5757a5
4
- data.tar.gz: 45642210715e826c762f982cb1855e4b512b4da8
2
+ SHA256:
3
+ metadata.gz: af73780dad2653e9068d80d56ad53a1cac86f88968cbe9f697bc832e42aedcf6
4
+ data.tar.gz: a4bea89ea088fe18ce1a5d5ce9606bceecb1833a36b9ec4ce7b252bcde5e7f83
5
5
  SHA512:
6
- metadata.gz: cf09fa17e06130bee8bcf299eb2c1ed515d09dc9b97a91fe70fb9e8c39256af092a6c1cc16da48e5ca25aed3f4b7e5c4a67d7b3f0206cef74e6e7821c6577041
7
- data.tar.gz: 2537834b75a706e1b540e7bbe11925935cc60b83b6e535f040949e7c2658055940ce90194e360c1c9598b8b84c3deabbd7985a03a7e930ae05990e816912b0a7
6
+ metadata.gz: '086bcf6439fdfd185d738ab1c120c41192567f8d3e9c1ee456c0ef82bf28d0e6c921d9c9a397ff5cacd7735dfc21605c078ade8927266e6685ef7fefbc1d0b58'
7
+ data.tar.gz: 9317b961bd9ae4f6ff781c3aa72bf2b5ee0c5136bb6b2a28482853a8c0262278f5a00daf6d8b4dfd71302d4e2b52975abc8e4f2b0629fffdb03037d95ca51ced
data/Rakefile CHANGED
@@ -30,6 +30,8 @@ namespace :test do
30
30
  activerecord_42_pg_017 activerecord_42_pg_018
31
31
  activerecord_50_pg_018 activerecord_51_pg_020
32
32
  activerecord_51_pg_021 activerecord_52_pg_100
33
+ activerecord_60_pg_021 activerecord_60_pg_100
34
+ activerecord_60_pg_110
33
35
  ).freeze
34
36
 
35
37
  AVAILABLE_CASES.each do |version|
@@ -1,3 +1,4 @@
1
+ require 'active_record'
1
2
  require 'pg_ltree/ltree'
2
3
  require 'pg_ltree/scoped_for'
3
4
  require 'pg_ltree/version'
@@ -9,7 +10,8 @@ if defined?(ActiveRecord)
9
10
 
10
11
  # The behavior of _was changes in Rails 5.1
11
12
  # http://blog.toshima.ru/2017/04/06/saved-change-to-attribute.html
12
- if ActiveRecord::VERSION::MAJOR > 5 || (ActiveRecord::VERSION::MAJOR == 5 && ActiveRecord::VERSION::MINOR >= 1)
13
- ActiveRecord::Base.extend(PgLtree::Versions::Rails51)
13
+ # This is for backward compability
14
+ if ActiveRecord::VERSION::MAJOR < 5 || (ActiveRecord::VERSION::MAJOR == 5 && ActiveRecord::VERSION::MINOR < 1)
15
+ ActiveRecord::Base.extend(PgLtree::Versions::RailsOlderThan51)
14
16
  end
15
17
  end
@@ -44,12 +44,12 @@ module PgLtree
44
44
  #
45
45
  # @return [ActiveRecord::Relation] relations of node's leaves
46
46
  def leaves
47
- subquery =
48
- unscoped.select("COUNT(subquery.#{ltree_path_column}) = 1")
49
- .from("#{table_name} AS subquery")
50
- .where("subquery.#{ltree_path_column} <@ #{table_name}.#{ltree_path_column}")
51
- subquery = subquery.where(subquery: current_scope.where_values_hash) if current_scope
52
- where subquery.to_sql
47
+ subquery = unscoped.select("#{table_name}.#{ltree_path_column}")
48
+ .from("#{table_name} AS subquery")
49
+ .where("#{table_name}.#{ltree_path_column} <> subquery.#{ltree_path_column}")
50
+ .where("#{table_name}.#{ltree_path_column} @> subquery.#{ltree_path_column}")
51
+
52
+ where.not ltree_path_column => subquery
53
53
  end
54
54
 
55
55
  # Get all with nodes when path liked the lquery
@@ -92,11 +92,22 @@ module PgLtree
92
92
  public_send ltree_path_column
93
93
  end
94
94
 
95
- # Get lTree previous value
95
+ # Get ltree original value before the save just occurred
96
+ # https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Dirty.html#method-i-attribute_before_last_save
96
97
  #
97
98
  # @return [String] ltree previous value
98
- def ltree_path_was
99
- public_send :"#{ltree_path_column}_was"
99
+ def ltree_path_before_last_save
100
+ public_send :attribute_before_last_save, ltree_path_column
101
+ end
102
+
103
+ # Get lTree previous value
104
+ # originally +attribute_was+ used in before create/update, destroy won't call +save+ so this work
105
+ # https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Dirty.html#method-i-attribute_in_database
106
+ #
107
+ # @return [String] ltree value in database
108
+
109
+ def ltree_path_in_database
110
+ public_send :attribute_in_database, ltree_path_column
100
111
  end
101
112
 
102
113
  # Check what current node is root
@@ -226,15 +237,15 @@ module PgLtree
226
237
  #
227
238
  # @return [ActiveRecord::Relation]
228
239
  def cascade_update
229
- ltree_scope.where(["#{ltree_scope.table_name}.#{ltree_path_column} <@ ?", ltree_path_was]).where(["#{ltree_scope.table_name}.#{ltree_path_column} != ?", ltree_path])
230
- .update_all ["#{ltree_path_column} = ? || subpath(#{ltree_path_column}, nlevel(?))", ltree_path, ltree_path_was]
240
+ ltree_scope.where(["#{ltree_scope.table_name}.#{ltree_path_column} <@ ?", ltree_path_before_last_save]).where(["#{ltree_scope.table_name}.#{ltree_path_column} != ?", ltree_path])
241
+ .update_all ["#{ltree_path_column} = ? || subpath(#{ltree_path_column}, nlevel(?))", ltree_path, ltree_path_before_last_save]
231
242
  end
232
243
 
233
244
  # Delete all children for current path
234
245
  #
235
246
  # @return [ActiveRecord::Relation]
236
247
  def cascade_destroy
237
- ltree_scope.where("#{ltree_scope.table_name}.#{ltree_path_column} <@ ?", ltree_path_was).delete_all
248
+ ltree_scope.where("#{ltree_scope.table_name}.#{ltree_path_column} <@ ?", ltree_path_in_database).delete_all
238
249
  end
239
250
  end
240
251
  end
@@ -3,5 +3,5 @@
3
3
  # @author a.ponomarenko
4
4
  module PgLtree
5
5
  # Gem Version
6
- VERSION = '1.1.7'.freeze
6
+ VERSION = '1.1.8'.freeze
7
7
  end
@@ -0,0 +1,28 @@
1
+ module PgLtree
2
+ module Versions
3
+ module RailsOlderThan51
4
+ def ltree(column = :path, options: { cascade: true })
5
+ super
6
+ include InstanceMethods
7
+ end
8
+
9
+ module InstanceMethods
10
+ # Get lTree previous value
11
+ #
12
+ # Related changes in > Rails 5.1.0
13
+ # https://github.com/rails/rails/pull/25337
14
+ #
15
+ # @return [String] Rails 5.1 replace attribute_was method with two methods, this is a wrapper for older rails
16
+ def ltree_path_before_last_save
17
+ public_send :attribute_was, ltree_path_column
18
+ end
19
+
20
+ #
21
+ # @return [String] Rails 5.1 replace attribute_was method with two methods, this is a wrapper for older rails
22
+ def ltree_path_in_database
23
+ public_send :attribute_was, ltree_path_column
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -53,6 +53,16 @@ class PgLtree::LtreeTest < BaseTest
53
53
  )
54
54
  end
55
55
 
56
+ test '#leaves with a relation' do
57
+ assert_equal TreeNode.where("path <> 'Top.Collections.Pictures.Astronomy.Stars'").leaves.pluck(:path), %w(
58
+ Top.Science.Astronomy.Astrophysics
59
+ Top.Science.Astronomy.Cosmology
60
+ Top.Hobbies.Amateurs_Astronomy
61
+ Top.Collections.Pictures.Astronomy.Galaxies
62
+ Top.Collections.Pictures.Astronomy.Astronauts
63
+ )
64
+ end
65
+
56
66
  test '#where_path_liked' do
57
67
  assert_equal TreeNode.where_path_liked('*{2}.Astronomy|Pictures').pluck(:path), %w(
58
68
  Top.Science.Astronomy
@@ -31,6 +31,13 @@ class BaseTest < ActiveSupport::TestCase
31
31
  exit 0
32
32
  end
33
33
 
34
+ begin
35
+ PG.connect(host: db_connection["host"], user: db_connection["username"], password: db_connection["password"])
36
+ .exec("CREATE DATABASE #{db_connection['database']}")
37
+ rescue
38
+ # Ignore errors on DB:CEATE
39
+ end
40
+
34
41
  ActiveRecord::Base.establish_connection db_connection
35
42
  ActiveRecord::Schema.verbose = false
36
43
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_ltree
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.7
4
+ version: 1.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrei Panamarenka
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-03 00:00:00.000000000 Z
11
+ date: 2019-12-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -17,9 +17,9 @@ dependencies:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 4.0.0
20
- - - "<"
20
+ - - "<="
21
21
  - !ruby/object:Gem::Version
22
- version: '5.3'
22
+ version: 7.0.0.rc1
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -27,9 +27,9 @@ dependencies:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
29
  version: 4.0.0
30
- - - "<"
30
+ - - "<="
31
31
  - !ruby/object:Gem::Version
32
- version: '5.3'
32
+ version: 7.0.0.rc1
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: pg
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -133,7 +133,7 @@ files:
133
133
  - lib/pg_ltree/ltree.rb
134
134
  - lib/pg_ltree/scoped_for.rb
135
135
  - lib/pg_ltree/version.rb
136
- - lib/pg_ltree/versions/rails_5_1.rb
136
+ - lib/pg_ltree/versions/rails_older_than_51.rb
137
137
  - test/database.yml
138
138
  - test/database.yml.sample
139
139
  - test/pg_ltree/ltree_test.rb
@@ -159,8 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
159
159
  - !ruby/object:Gem::Version
160
160
  version: '0'
161
161
  requirements: []
162
- rubyforge_project:
163
- rubygems_version: 2.6.14
162
+ rubygems_version: 3.1.0.pre2
164
163
  signing_key:
165
164
  specification_version: 4
166
165
  summary: Organise ActiveRecord model into a tree structure with PostgreSQL LTree
@@ -1,32 +0,0 @@
1
- module PgLtree
2
- module Versions
3
- module Rails51
4
- def ltree(column = :path, options: { cascade: true })
5
- super
6
-
7
- before_destroy :delete_ltree_column_value if options[:cascade]
8
- include InstanceMethods
9
- end
10
-
11
- module InstanceMethods
12
- # Get lTree previous value
13
- #
14
- # Related changes in > Rails 5.1.0
15
- # https://github.com/rails/rails/pull/25337
16
- #
17
- # @return [String] ltree previous value
18
- def ltree_path_was
19
- public_send :"#{ltree_path_column}_before_last_save"
20
- end
21
-
22
- #
23
- # In order for for cascade_destroy to work with the current callbacks, let's first delete the column :/.
24
- # @author HoyaBoya [https://github.com/HoyaBoya]
25
- #
26
- def delete_ltree_column_value
27
- update!(ltree_path_column => nil)
28
- end
29
- end
30
- end
31
- end
32
- end