simple_nested_set 0.0.28 → 0.0.29

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []