simple_nested_set 0.0.30 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -62,19 +62,49 @@ module SimpleNestedSet
62
62
 
63
63
  case db_adapter
64
64
  when :mysql, :mysql2
65
- sql << denormalize_query_mysql(:level) do |table|
66
- table[:id].count.to_sql
67
- end if node.has_attribute?(:level)
68
-
69
- sql << denormalize_query_mysql(:path) do |table|
70
- group_concat(db_adapter, :slug)
71
- end if node.has_attribute?(:path)
65
+ sql << <<-sql if node.has_attribute?(:level)
66
+ `level` = (
67
+ SELECT tmp.lev
68
+ FROM (
69
+ SELECT n0.id, count(*) AS lev
70
+ FROM #{arel_table.name} AS n0
71
+ CROSS JOIN #{arel_table.name} AS n1
72
+ WHERE n1.lft < n0.lft AND n1.rgt > n0.rgt
73
+ GROUP BY n0.id
74
+ ) AS tmp
75
+ WHERE ( #{arel_table.name}.id = tmp.id )
76
+ )
77
+ sql
78
+
79
+ scoping = [
80
+ 'n1.lft <= n0.lft AND n1.rgt >= n0.rgt',
81
+ where_clauses.map { |clause| clause.gsub(arel_table.name, 'n1') }
82
+ ].flatten.compact.join(' AND ')
83
+
84
+ sql << <<-sql if node.has_attribute?(:path)
85
+ `path` = (
86
+ SELECT tmp.pat
87
+ FROM (
88
+ SELECT n0.id, #{group_concat(db_adapter, "n1`.`slug" )} AS pat
89
+ FROM #{arel_table.name} AS n0
90
+ CROSS JOIN #{arel_table.name} AS n1
91
+ WHERE #{scoping}
92
+ GROUP BY n0.id
93
+ ) AS tmp
94
+ WHERE ( #{arel_table.name}.id = tmp.id )
95
+ )
96
+ sql
72
97
  else
73
98
  sql << denormalize_level_query if node.has_attribute?(:level)
74
99
  sql << denormalize_path_query if node.has_attribute?(:path)
75
100
  end
76
101
 
77
102
  update_all(sql.join(',')) unless sql.blank?
103
+
104
+ if [:mysql, :mysql2].include?(db_adapter)
105
+ update_all("`level` = 0", "`level` IS NULL")
106
+ update_all("`path` = `slug`", "`path` IS NULL")
107
+ end
78
108
  end
79
109
 
80
110
  # Returns true if the node has the same scope as the given node
@@ -167,27 +197,27 @@ module SimpleNestedSet
167
197
  "path = (#{query.join(' AND ')})"
168
198
  end
169
199
 
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
200
+ # def denormalize_query_mysql(field)
201
+ # synonym = field.to_s.reverse.to_sym
202
+ # aliaz = arel_table.as("table_#{synonym}")
203
+ #
204
+ # field_sql = yield aliaz
205
+ #
206
+ # query = [
207
+ # aliaz.project("#{field_sql} AS field_#{synonym}", aliaz[:lft], aliaz[:rgt]).to_sql,
208
+ # ' WHERE ',
209
+ # where_clauses.map { |clause| clause.gsub(arel_table.name, aliaz.table_alias.to_s) }.join(' AND ')
210
+ # ].join
211
+ #
212
+ # <<-sql
213
+ # #{field} = (
214
+ # SELECT #{aliaz.table_alias.to_s}.field_#{synonym}
215
+ # FROM (#{query}) AS #{aliaz.table_alias.to_s}
216
+ # WHERE #{aliaz[:lft].lt(arel_table[:lft]).to_sql}
217
+ # AND #{aliaz[:rgt].gt(arel_table[:rgt]).to_sql}
218
+ # )
219
+ # sql
220
+ # end
191
221
 
192
222
  def db_adapter
193
223
  node.class.connection.instance_variable_get('@config')[:adapter].to_sym
@@ -7,7 +7,7 @@ module SimpleNestedSet
7
7
  when :sqlite, :sqlite3
8
8
  "GROUP_CONCAT(#{field}, '#{separator}')"
9
9
  when :mysql, :mysql2
10
- "GROUP_CONCAT(`#{field}`, '#{separator}')"
10
+ "GROUP_CONCAT(`#{field}` SEPARATOR '#{separator}')"
11
11
  when :postgresql
12
12
  "array_to_string(array_agg(\"#{field}\"), '#{separator}')"
13
13
  else
@@ -1,3 +1,3 @@
1
1
  module SimpleNestedSet
2
- VERSION = "0.0.30"
2
+ VERSION = "0.1.0"
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_nested_set
3
3
  version: !ruby/object:Gem::Version
4
- hash: 35
4
+ hash: 27
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
+ - 1
8
9
  - 0
9
- - 30
10
- version: 0.0.30
10
+ version: 0.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Sven Fuchs
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-02-23 00:00:00 +01:00
19
+ date: 2011-03-09 00:00:00 +01:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency