class Scenic::Adapters::Postgres::RefreshDependencies::DependencyParser
Attributes
Public Class Methods
Source
# File lib/scenic/adapters/postgres/refresh_dependencies.rb, line 30 def initialize(raw_dependencies, view_to_refresh) @raw_dependencies = raw_dependencies @view_to_refresh = view_to_refresh end
Public Instance Methods
Source
# File lib/scenic/adapters/postgres/refresh_dependencies.rb, line 50 def to_sorted_array dependency_hash = parse_to_hash(raw_dependencies) sorted_arr = tsort(dependency_hash) idx = sorted_arr.find_index do |dep| if view_to_refresh.to_s.include?(".") dep == view_to_refresh.to_s else dep.ends_with?(".#{view_to_refresh}") end end if idx.present? sorted_arr[0...idx] else [] end end
We’re given an array from the SQL query that looks kind of like this
- [“view_name”, “{‘dependency_1’, ‘dependency_2’}”]
-
We need to parse that into a more easy to understand data type so we can use the Tsort module from the Standard Library to topologically sort those out so we can refresh in the correct order, so we parse that raw data into a hash.
Then, once Tsort has worked it magic, we’re given a sorted 1-D array
- “dependency_1”, “dependency_2”, “view_name”
-
So we then need to slice off just the bit leading up to the view that we’re refreshing, so we find where in the topologically sorted array our given view is, and return all the dependencies up to that point.
Private Instance Methods
Source
# File lib/scenic/adapters/postgres/refresh_dependencies.rb, line 73 def parse_to_hash(dependency_rows) dependency_rows.each_with_object({}) do |row, hash| formatted_dependencies = row.last.tr("{}", "").split(",") formatted_dependencies.each do |dependency| hash[dependency] = [] unless hash[dependency] end hash[row.first] = formatted_dependencies end end
Source
# File lib/scenic/adapters/postgres/refresh_dependencies.rb, line 83 def tsort(hash) each_node = lambda { |&b| hash.each_key(&b) } each_child = lambda { |n, &b| hash[n].each(&b) } TSort.tsort(each_node, each_child) end