simple_nested_set 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -8,6 +8,7 @@ module SimpleNestedSet
8
8
  autoload :ClassMethods, 'simple_nested_set/class_methods'
9
9
  autoload :InstanceMethods, 'simple_nested_set/instance_methods'
10
10
  autoload :NestedSet, 'simple_nested_set/nested_set'
11
+ autoload :SqlAbstraction, 'simple_nested_set/sql_abstraction.rb'
11
12
 
12
13
  module Move
13
14
  autoload :ByAttributes, 'simple_nested_set/move/by_attributes'
@@ -18,4 +19,4 @@ module SimpleNestedSet
18
19
  end
19
20
  end
20
21
 
21
- ActiveRecord::Base.send :extend, SimpleNestedSet::ActMacro
22
+ ActiveRecord::Base.send :extend, SimpleNestedSet::ActMacro
@@ -1,5 +1,7 @@
1
1
  module SimpleNestedSet
2
2
  class NestedSet < ActiveRecord::Relation
3
+ include SqlAbstraction
4
+
3
5
  class_inheritable_accessor :node_class, :scope_names
4
6
 
5
7
  class << self
@@ -36,7 +38,7 @@ module SimpleNestedSet
36
38
  denormalize!
37
39
  end
38
40
 
39
- # FIXME we don't always want to call this on after_save, do we? it's only relevant when
41
+ # FIXME we don't always want to call this on after_save, do we? it's only relevant when
40
42
  # either the structure or the slug has changed
41
43
  def denormalize!
42
44
  sql = []
@@ -106,11 +108,15 @@ module SimpleNestedSet
106
108
 
107
109
  def denormalize_path_query
108
110
  query = arel_table.as(:l)
109
- query = query.project("GROUP_CONCAT(slug, '/')").
111
+ query = query.project(group_concat(db_adapter, :slug)).
110
112
  where(query[:lft].lteq(arel_table[:lft])).
111
113
  where(query[:rgt].gteq(arel_table[:rgt])).
112
114
  where(where_clauses.map { |clause| clause.gsub(table_name, 'l') })
113
115
  "path = (#{query.to_sql})"
114
116
  end
117
+
118
+ def db_adapter
119
+ node.class.connection.instance_variable_get('@config')[:adapter].to_sym
120
+ end
115
121
  end
116
- end
122
+ end
@@ -0,0 +1,18 @@
1
+ module SimpleNestedSet
2
+ module SqlAbstraction
3
+ # return a database-specific 'GROUP_CONCAT'-statement, ready to be
4
+ # inserted into arel.project()
5
+ def group_concat(database, field, separator = '/')
6
+ case database.to_sym
7
+ when :sqlite, :sqlite3
8
+ "GROUP_CONCAT(#{field}, '#{separator}')"
9
+ when :mysql
10
+ "GROUP_CONCAT(`#{field}`, '#{separator}')"
11
+ when :postgresql
12
+ "array_to_string(array_agg(\"#{field}\"), '#{separator}')"
13
+ else
14
+ raise ArgumentError, "#{database} is not supported by SimpleNestedSet::SqlAbstraction#group_concat"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,3 +1,3 @@
1
1
  module SimpleNestedSet
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
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: 17
4
+ hash: 15
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 7
10
- version: 0.0.7
9
+ - 8
10
+ version: 0.0.8
11
11
  platform: ruby
12
12
  authors:
13
13
  - Sven Fuchs
@@ -109,6 +109,7 @@ files:
109
109
  - lib/simple_nested_set/move/protection.rb
110
110
  - lib/simple_nested_set/move/to_target.rb
111
111
  - lib/simple_nested_set/nested_set.rb
112
+ - lib/simple_nested_set/sql_abstraction.rb
112
113
  - lib/simple_nested_set/version.rb
113
114
  has_rdoc: true
114
115
  homepage: http://github.com/svenfuchs/simple_nested_set