simple_nested_set 0.0.28 → 0.0.29

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.
@@ -53,12 +53,26 @@ module SimpleNestedSet
53
53
  end
54
54
  end
55
55
 
56
+ # FIXME This needs to be abstracted away into the SqlAbstraction module
56
57
  # FIXME we don't always want to call this on after_save, do we? it's only relevant when
57
58
  # either the structure or the slug has changed
58
59
  def denormalize!
59
60
  sql = []
60
- sql << denormalize_level_query if node.has_attribute?(:level)
61
- sql << denormalize_path_query if node.has_attribute?(:path)
61
+
62
+ case db_adapter
63
+ when :mysql, :mysql2
64
+ sql << denormalize_query_mysql(:level) do |table|
65
+ table[:id].count.to_sql
66
+ end if node.has_attribute?(:level)
67
+
68
+ sql << denormalize_query_mysql(:path) do |table|
69
+ group_concat(db_adapter, :slug)
70
+ end if node.has_attribute?(:path)
71
+ else
72
+ sql << denormalize_level_query if node.has_attribute?(:level)
73
+ sql << denormalize_path_query if node.has_attribute?(:path)
74
+ end
75
+
62
76
  update_all(sql.join(',')) unless sql.blank?
63
77
  end
64
78
 
@@ -129,10 +143,11 @@ module SimpleNestedSet
129
143
  Rebuild::FromPaths.new.run(self)
130
144
  end
131
145
 
132
- def rebuild_from_parents!(sort_order = nil)
146
+ def rebuild_from_parents!(sort_order = :id)
133
147
  Rebuild::FromParents.new.run(self, sort_order)
134
148
  end
135
149
 
150
+ # sqlite3, postgresql
136
151
  def denormalize_level_query
137
152
  aliaz = arel_table.as(:l)
138
153
  query = aliaz.project(aliaz[:id].count).
@@ -142,6 +157,7 @@ module SimpleNestedSet
142
157
  "level = (#{query.join(' AND ')})"
143
158
  end
144
159
 
160
+ # sqlite3, postgresql
145
161
  def denormalize_path_query
146
162
  aliaz = arel_table.as(:l)
147
163
  query = aliaz.project(group_concat(db_adapter, :slug)).
@@ -151,6 +167,28 @@ module SimpleNestedSet
151
167
  "path = (#{query.join(' AND ')})"
152
168
  end
153
169
 
170
+ def denormalize_query_mysql(field)
171
+ synonym = field.to_s.reverse.to_sym
172
+ aliaz = arel_table.as("table_#{synonym}")
173
+
174
+ field_sql = yield aliaz
175
+
176
+ query = [
177
+ aliaz.project("#{field_sql} AS field_#{synonym}", aliaz[:lft], aliaz[:rgt]).to_sql,
178
+ ' WHERE ',
179
+ where_clauses.map { |clause| clause.gsub(arel_table.name, aliaz.table_alias.to_s) }.join(' AND ')
180
+ ].join
181
+
182
+ <<-sql
183
+ #{field} = (
184
+ SELECT #{aliaz.table_alias.to_s}.field_#{synonym}
185
+ FROM (#{query}) AS #{aliaz.table_alias.to_s}
186
+ WHERE #{aliaz[:lft].lt(arel_table[:lft]).to_sql}
187
+ AND #{aliaz[:rgt].gt(arel_table[:rgt]).to_sql}
188
+ )
189
+ sql
190
+ end
191
+
154
192
  def db_adapter
155
193
  node.class.connection.instance_variable_get('@config')[:adapter].to_sym
156
194
  end
@@ -67,8 +67,8 @@ when '1.0.1'
67
67
  end
68
68
  end
69
69
  end
70
- when '2.0.6'
71
- Gem.patching('arel', '2.0.6') do
70
+ when /2\.0\.[5-7]/
71
+ Gem.patching('arel', Arel::VERSION) do
72
72
  Arel::Table.class_eval do
73
73
  attr_reader :options # this line is added
74
74
 
@@ -9,7 +9,7 @@ module SimpleNestedSet
9
9
  @num = 0
10
10
  end
11
11
 
12
- def run(nested_set, sort_order = nil)
12
+ def run(nested_set, sort_order = :id)
13
13
  order_columns = ([:parent_id] + Array[sort_order]).uniq.compact
14
14
 
15
15
  db_adapter = nested_set.first.class.connection.instance_variable_get('@config')[:adapter].to_sym
@@ -1,3 +1,3 @@
1
1
  module SimpleNestedSet
2
- VERSION = "0.0.28"
2
+ VERSION = "0.0.29"
3
3
  end
metadata CHANGED
@@ -1,21 +1,22 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_nested_set
3
3
  version: !ruby/object:Gem::Version
4
- hash: 39
4
+ hash: 37
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 28
10
- version: 0.0.28
9
+ - 29
10
+ version: 0.0.29
11
11
  platform: ruby
12
12
  authors:
13
13
  - Sven Fuchs
14
+ - Matthias Viehweger
14
15
  autorequire:
15
16
  bindir: bin
16
17
  cert_chain: []
17
18
 
18
- date: 2010-12-13 00:00:00 +01:00
19
+ date: 2011-01-25 00:00:00 +01:00
19
20
  default_executable:
20
21
  dependencies:
21
22
  - !ruby/object:Gem::Dependency
@@ -63,7 +64,7 @@ dependencies:
63
64
  type: :development
64
65
  version_requirements: *id003
65
66
  - !ruby/object:Gem::Dependency
66
- name: sqlite3-ruby
67
+ name: ruby-debug
67
68
  prerelease: false
68
69
  requirement: &id004 !ruby/object:Gem::Requirement
69
70
  none: false
@@ -77,23 +78,21 @@ dependencies:
77
78
  type: :development
78
79
  version_requirements: *id004
79
80
  - !ruby/object:Gem::Dependency
80
- name: database_cleaner
81
+ name: rake
81
82
  prerelease: false
82
83
  requirement: &id005 !ruby/object:Gem::Requirement
83
84
  none: false
84
85
  requirements:
85
- - - "="
86
+ - - ">="
86
87
  - !ruby/object:Gem::Version
87
- hash: 15
88
+ hash: 3
88
89
  segments:
89
90
  - 0
90
- - 5
91
- - 2
92
- version: 0.5.2
91
+ version: "0"
93
92
  type: :development
94
93
  version_requirements: *id005
95
94
  - !ruby/object:Gem::Dependency
96
- name: ruby-debug
95
+ name: sqlite3-ruby
97
96
  prerelease: false
98
97
  requirement: &id006 !ruby/object:Gem::Requirement
99
98
  none: false
@@ -106,6 +105,54 @@ dependencies:
106
105
  version: "0"
107
106
  type: :development
108
107
  version_requirements: *id006
108
+ - !ruby/object:Gem::Dependency
109
+ name: pg
110
+ prerelease: false
111
+ requirement: &id007 !ruby/object:Gem::Requirement
112
+ none: false
113
+ requirements:
114
+ - - "="
115
+ - !ruby/object:Gem::Version
116
+ hash: 59
117
+ segments:
118
+ - 0
119
+ - 9
120
+ - 0
121
+ version: 0.9.0
122
+ type: :development
123
+ version_requirements: *id007
124
+ - !ruby/object:Gem::Dependency
125
+ name: mysql2
126
+ prerelease: false
127
+ requirement: &id008 !ruby/object:Gem::Requirement
128
+ none: false
129
+ requirements:
130
+ - - "="
131
+ - !ruby/object:Gem::Version
132
+ hash: 27
133
+ segments:
134
+ - 0
135
+ - 2
136
+ - 6
137
+ version: 0.2.6
138
+ type: :development
139
+ version_requirements: *id008
140
+ - !ruby/object:Gem::Dependency
141
+ name: database_cleaner
142
+ prerelease: false
143
+ requirement: &id009 !ruby/object:Gem::Requirement
144
+ none: false
145
+ requirements:
146
+ - - "="
147
+ - !ruby/object:Gem::Version
148
+ hash: 7
149
+ segments:
150
+ - 0
151
+ - 6
152
+ - 0
153
+ version: 0.6.0
154
+ type: :development
155
+ version_requirements: *id009
109
156
  description: simple_nested_set allows to easily handle nested sets in ActiveRecord
110
157
  email: svenfuchs@artweb-design.de
111
158
  executables: []