simple_nested_set 0.0.7 → 0.0.8

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