class Twb::Analysis::CalculatedFields::DotAnalyzer

Attributes

docFileName[R]

Public Class Methods

new(**args) click to toggle source
# File lib/twb/analysis/CalculatedFields/dotanalyzer.rb, line 29
def initialize(**args)
  @args = args
  init
  @funcdoc = {:class=>self.class, :blurb=>'Create Dot files documenting Calculated Fields', :description=>'Analyze Calculated Fields - create Dot files' }
  @metrics = {}
  @imageFiles = Array.new
end

Public Instance Methods

encode(str) click to toggle source
# File lib/twb/analysis/CalculatedFields/dotanalyzer.rb, line 37
def encode str
  str.gsub('"', '\"')
end
processTWB(twb) click to toggle source
# File lib/twb/analysis/CalculatedFields/dotanalyzer.rb, line 41
def processTWB twb
  # twb = File.basename(twb)
  @twb         = twb #Twb::Workbook.new twb
  addDocFile @dotFile, @dotFileName, "Dot file of Calculated fields for Workbook '#{@twb.name}'"
  @twb.datasources.each do |ds|
    unless ds.calculatedFields.empty?
      initDotFile ds.uiname
      # @dotFile.puts "\n ## #{ds.uiname} \n "
      # @dotFile.puts "__has #{ds.calculatedFields.length} calculated fields__\n "
      @cfCnt = 0
      calcFields = Set.new
      refFields  = Set.new
      edges      = Set.new
      ds.calculatedFields.each do |cf|
        @cfCnt += 1
        calcFields << cf.uiname
        edges            << " \"#{encode(ds.uiname)}\" -> \"#{encode(cf.uiname)}\"  [tailport=e, headport=w] "
        puts " \"#{encode(ds.uiname)}\" -> \"#{encode(cf.uiname)}\"  [tailport=e, headport=w] "
        cf.referencedFields.each do |rf|
          refFields << rf.uiname
          edges            << " \"#{encode(cf.uiname)}\" -> \"#{encode(rf.uiname)}\" [tailport=e, headport=w] "
        end
      end # ds.calculatedFields.each
      # "federated.17h7owt0rsacke17cql8o0w2ittk"  ->  "New AO Actuals Query in PP+ (AO Variance Data)::vs Prior Year [YTD]"
      # "federated.01s5lca037ted31gxs9sg0t9mnnt" [label="Controls"    ]
      edges.each do |edge|
        @dotFile.puts "\t #{edge.strip}"
      end
      @dotFile.puts " "
      allFields = calcFields + refFields
      allFields.each do |f|
        @dotFile.puts "\t \"#{encode(f)}\" [label=\"#{encode(f)}\"]"
      end
      endPointFields = allFields - calcFields
      rankSame(endPointFields) unless endPointFields.nil? || endPointFields.empty?
      closeDotFile
      @@imageTypes.each do |type|
        renderDot type
      end
    end
  end  # twb.datasources.each
  finis
end

Private Instance Methods

closeDotFile() click to toggle source
# File lib/twb/analysis/CalculatedFields/dotanalyzer.rb, line 98
def closeDotFile
  # @dotFile.puts "\n # counted #{@cfCnt} calculated fields\n "
  # @dotFile.puts "\n }"
 @dotFile.puts '   }'
  @dotFile.puts ' '
  @dotFile.puts '// -------------------------------------------------------------'
 @dotFile.puts ' '
 @dotFile.puts '   subgraph cluster_1 {'
  #@dotFile.puts '     color=white;'
 @dotFile.puts '     style=invis;'
  #@dotFile.puts '     border=0;'
 @dotFile.puts '     node [border=blue];'
 @dotFile.puts ' '
 @dotFile.puts '     "" [style=invis]'
 @dotFile.puts "     \"Tableau Tools\\nCalculated Fields Map\\nWorkbook '#{@twb.name}'\\n#{Time.new.ctime}\"  [penwidth=0]"
  #@dotFile.puts "     \"Tableau Tools Workbook  Calculated Fields Map\\n#{Time.new.ctime}\"  -> \"\"  [style=invis]"
 @dotFile.puts ' '
 @dotFile.puts '   }'
 @dotFile.puts ' '
 @dotFile.puts '}'
  @dotFile.close
end
initDotFile(dsName) click to toggle source
# File lib/twb/analysis/CalculatedFields/dotanalyzer.rb, line 87
def initDotFile dsName
  @dotFileName = './ttdoc/' + @twb.name + '.' + dsName + '.CalculatedFields.dot'
  @dotFile     = File.open(@dotFileName,'w')
  # @dotFile.puts @@dotHeader
  @dotFile.puts ' digraph g {'
  @dotFile.puts '   graph [rankdir="LR" splines=line];'
  @dotFile.puts '   node  [shape="box"  width="2"];'
  @dotFile.puts ' '
  @dotFile.puts '   subgraph cluster_0 {'
end
rankSame(fields) click to toggle source
# File lib/twb/analysis/CalculatedFields/dotanalyzer.rb, line 121
def rankSame fields
  @dotFile.puts "\n {rank=same "
  fields.each do |f|
    @dotFile.puts "\t \"#{f}\" "
  end
  @dotFile.puts " } "
end
renderDot(format) click to toggle source
# File lib/twb/analysis/CalculatedFields/dotanalyzer.rb, line 129
def renderDot format
  imageType = '-T' + format
  imageFile  = @dotFileName + '.Graph.' + format
  imageParam = '-o"' + imageFile + '"'
  emit "system  #{@@gvDotLocation} #{imageType} #{imageParam} \"#{@dotFileName}\""
  system "#{@@gvDotLocation} #{imageType} #{imageParam} \"#{@dotFileName}\""
  # emit  "           - #{imageFile}"
  @imageFiles << imageFile
  return imageFile
end