cuatlan-activerecord-hierarchical_query 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ pg:
2
+ adapter: postgresql
3
+ database: hierarchical_query_test
4
+ username: postgres
5
+ min_messages: ERROR
@@ -0,0 +1,8 @@
1
+ pg:
2
+ adapter: postgresql
3
+ encoding: unicode
4
+ database: cuatlan_development
5
+ host: /Users/kshrubb/dev/cuatlan/cuatlan-devkit/postgresql
6
+ port: 5432
7
+ pool: 6
8
+ min_messages: ERROR
@@ -0,0 +1,21 @@
1
+ ActiveRecord::Migration.verbose = false
2
+
3
+ ActiveRecord::Schema.define(version: 0) do
4
+ create_table :categories, force: true do |t|
5
+ t.column :parent_id, :integer
6
+ t.column :trait_id, :string
7
+ t.column :name, :string
8
+ t.column :depth, :integer
9
+ t.column :position, :integer
10
+ end
11
+
12
+ create_table :articles, force: true do |t|
13
+ t.column :category_id, :integer
14
+ t.column :title, :string
15
+ end
16
+
17
+ create_table :model_with_default_scopes, force: true do |t|
18
+ t.column :parent_id, :integer
19
+ t.column :name, :string
20
+ end
21
+ end
@@ -0,0 +1,54 @@
1
+ # coding: utf-8
2
+ require 'pathname'
3
+ require 'logger'
4
+
5
+ ENV['TZ'] = 'UTC'
6
+
7
+ SPEC_ROOT = Pathname.new(File.dirname(__FILE__))
8
+
9
+ require 'bundler'
10
+ Bundler.setup(:default, ENV['TRAVIS'] ? :travis : :local)
11
+
12
+ require 'rspec'
13
+ require 'database_cleaner'
14
+ require 'active_record'
15
+
16
+ ActiveRecord::Base.configurations = YAML.load(SPEC_ROOT.join('database.yml').read)
17
+ ActiveRecord::Base.establish_connection(:pg)
18
+ ActiveRecord::Base.logger = Logger.new(ENV['DEBUG'] ? $stderr : '/dev/null')
19
+ ActiveRecord::Base.logger.formatter = proc do |severity, datetime, progname, msg|
20
+ "#{datetime.strftime('%H:%M:%S.%L')}: #{msg}\n"
21
+ end
22
+
23
+ load SPEC_ROOT.join('schema.rb')
24
+ require SPEC_ROOT.join('support', 'models').to_s
25
+
26
+ DatabaseCleaner.strategy = :transaction
27
+
28
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
29
+ RSpec.configure do |config|
30
+ config.run_all_when_everything_filtered = true
31
+ config.filter_run :focus
32
+
33
+ # Run specs in random order to surface order dependencies. If you find an
34
+ # order dependency and want to debug it, you can fix the order by providing
35
+ # the seed, which is printed after each run.
36
+ # --seed 1234
37
+ config.order = 'random'
38
+
39
+ config.around(:each) do |example|
40
+ DatabaseCleaner.start
41
+ example.run
42
+ DatabaseCleaner.clean
43
+ end
44
+ end
45
+
46
+ if ENV['TRAVIS']
47
+ require 'coveralls'
48
+ Coveralls.wear!
49
+ else
50
+ require 'simplecov'
51
+ SimpleCov.start
52
+ end
53
+
54
+ require 'active_record/hierarchical_query'
@@ -0,0 +1,50 @@
1
+ class Category < ActiveRecord::Base
2
+ @@generator = Enumerator.new do |y|
3
+ abc = ('a'..'z').to_a
4
+ sequence = abc.product(abc, abc).map(&:join).to_enum
5
+
6
+ loop do
7
+ # category aaa
8
+ # category aab
9
+ # ...
10
+ # category aaz
11
+ # category aba
12
+ # ...
13
+ y << "category #{sequence.next}"
14
+ end
15
+ end
16
+
17
+ belongs_to :parent, class_name: 'Category'
18
+ has_many :children, class_name: 'Category'
19
+ has_many :articles
20
+
21
+ before_save :generate_name, unless: :name?
22
+ before_save :count_depth
23
+ before_save :count_position
24
+
25
+ def generate_name
26
+ self.name = @@generator.next
27
+ end
28
+
29
+ def count_depth
30
+ self.depth = ancestors.count
31
+ end
32
+
33
+ def count_position
34
+ self.position = (self.class.where(parent_id: parent_id).maximum(:position) || 0) + 1
35
+ end
36
+
37
+ def ancestors
38
+ parent ? parent.ancestors + [parent] : []
39
+ end
40
+ end
41
+
42
+ class Article < ActiveRecord::Base
43
+ belongs_to :category
44
+ end
45
+
46
+ class ModelWithDefaultScope < ActiveRecord::Base
47
+ belongs_to :parent, class_name: 'ModelWithDefaultScope'
48
+
49
+ default_scope -> { order('name ASC') }
50
+ end
metadata ADDED
@@ -0,0 +1,127 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cuatlan-activerecord-hierarchical_query
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Karl Shrubb
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-06-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: pg
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activerecord
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '5.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '5.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: arel
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '9.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '9.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.12'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.12'
69
+ description:
70
+ email:
71
+ - kshrubb@cuatlan.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - LICENSE.txt
77
+ - README.md
78
+ - lib/active_record/hierarchical_query.rb
79
+ - lib/active_record/hierarchical_query/cte/columns.rb
80
+ - lib/active_record/hierarchical_query/cte/cycle_detector.rb
81
+ - lib/active_record/hierarchical_query/cte/non_recursive_term.rb
82
+ - lib/active_record/hierarchical_query/cte/query_builder.rb
83
+ - lib/active_record/hierarchical_query/cte/recursive_term.rb
84
+ - lib/active_record/hierarchical_query/cte/union_term.rb
85
+ - lib/active_record/hierarchical_query/join_builder.rb
86
+ - lib/active_record/hierarchical_query/orderings.rb
87
+ - lib/active_record/hierarchical_query/query.rb
88
+ - lib/active_record/hierarchical_query/version.rb
89
+ - lib/activerecord-hierarchical_query.rb
90
+ - lib/arel/nodes/postgresql.rb
91
+ - spec/active_record/hierarchical_query_spec.rb
92
+ - spec/database.travis.yml
93
+ - spec/database.yml
94
+ - spec/schema.rb
95
+ - spec/spec_helper.rb
96
+ - spec/support/models.rb
97
+ homepage: https://gitlab.com/cuatlan/cuatlan-activerecord-hierarchical_query
98
+ licenses:
99
+ - MIT
100
+ metadata: {}
101
+ post_install_message:
102
+ rdoc_options: []
103
+ require_paths:
104
+ - lib
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ requirements: []
116
+ rubyforge_project:
117
+ rubygems_version: 2.7.6
118
+ signing_key:
119
+ specification_version: 4
120
+ summary: Recursively traverse trees using a single SQL query
121
+ test_files:
122
+ - spec/active_record/hierarchical_query_spec.rb
123
+ - spec/database.travis.yml
124
+ - spec/database.yml
125
+ - spec/schema.rb
126
+ - spec/spec_helper.rb
127
+ - spec/support/models.rb