simple_nested_set 0.0.30 → 0.1.0

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.
@@ -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