Sha256: c94f680b34c30d71bdda68ea8dc6c7c18fc7e2070429bf860affce5f7359562a

Contents?: true

Size: 1.39 KB

Versions: 6

Compression:

Stored size: 1.39 KB

Contents

module ClosureTree
  module HashTreeSupport
    def default_tree_scope(scope, limit_depth = nil)
        # Deepest generation, within limit, for each descendant
        # NOTE: Postgres requires HAVING clauses to always contains aggregate functions (!!)
        having_clause = limit_depth ? "HAVING MAX(generations) <= #{limit_depth - 1}" : ''
        generation_depth = <<-SQL.strip_heredoc
          INNER JOIN (
            SELECT descendant_id, MAX(generations) as depth
            FROM #{quoted_hierarchy_table_name}
            GROUP BY descendant_id
            #{having_clause}
          ) AS generation_depth
            ON #{quoted_table_name}.#{model_class.primary_key} = generation_depth.descendant_id
        SQL
        scope_with_order(scope.joins(generation_depth), 'generation_depth.depth')
      end

    def hash_tree(tree_scope, limit_depth = nil)
      limited_scope = limit_depth ? tree_scope.where("#{quoted_hierarchy_table_name}.generations <= #{limit_depth - 1}") : tree_scope
      build_hash_tree(limited_scope)
    end

    # Builds nested hash structure using the scope returned from the passed in scope
    def build_hash_tree(tree_scope)
      tree = ActiveSupport::OrderedHash.new
      id_to_hash = {}

      tree_scope.each do |ea|
        h = id_to_hash[ea.id] = ActiveSupport::OrderedHash.new
        (id_to_hash[ea._ct_parent_id] || tree)[ea] = h
      end
      tree
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
closure_tree-6.6.0 lib/closure_tree/hash_tree_support.rb
closure_tree-6.5.0 lib/closure_tree/hash_tree_support.rb
closure_tree-6.4.0 lib/closure_tree/hash_tree_support.rb
closure_tree-6.3.0 lib/closure_tree/hash_tree_support.rb
closure_tree-6.2.0 lib/closure_tree/hash_tree_support.rb
closure_tree-6.1.0 lib/closure_tree/hash_tree_support.rb