linguisticexplorer/Linguistic-Explorer

View on GitHub
app/presenters/search_columns.rb

Summary

Maintainability
A
1 hr
Test Coverage
module SearchColumns
  PARENT_COLUMNS = [
      :ling_0, :property_0, :value_0, :example_0
  ]

  CHILD_COLUMNS = [
      :ling_1, :property_1, :value_1, :example_1
  ]

  CROSS_COLUMNS = [
      :cross_property, :cross_value, :count
  ]

  COMPARE_COMMON_COLUMNS = [
      :compare_property, :common_values
  ]

  COMPARE_DIFF_COLUMNS = [
      :compare_property, :ling_value
  ]

  COLUMNS = PARENT_COLUMNS + CHILD_COLUMNS

  HEADERS = {
      :ling_0           => lambda { |g| g.ling0_name },
      :property_0       => lambda { |g| "#{g.ling0_name} #{g.property_name.pluralize.titleize}" },
      :value_0          => lambda { |g| "#{g.ling0_name} Values" },
      :example_0        => lambda { |g| "#{g.ling0_name} Examples" },
      :ling_1           => lambda { |g| g.ling1_name },
      :property_1       => lambda { |g| "#{g.ling1_name} #{g.property_name.pluralize.titleize}" },
      :value_1          => lambda { |g| "#{g.ling1_name} Values" },
      :example_1        => lambda { |g| "#{g.ling1_name} Examples" },
      # Cross & Implication Search
      :count            => lambda { |g| "Count"},
      :cross_property   => lambda { |g| "Property Name"},
      :cross_value      => lambda { |g| "Property Value" },
      # Compare Search
      :compare_property => lambda { |g| "Property Name" },
      :common_values    => lambda { |g| "Common Value"},
      :ling_value       => lambda { |v| v ? "#{v.name} Value" : ""},
  }

  def columns_to_include
    @columns_to_include ||= @search.included_columns
  end

  def result_headers(entry=nil)
    header_keys ||= result_headers_cross(entry) if @search.cross? || @search.implication?
    header_keys ||= result_headers_compare(entry) if @search.compare?
    if @search.default?
      header_keys ||= columns_to_include
      header_keys -= child_columns unless @search.group.has_depth?
    end
    header_keys.map{ |k| HEADERS[k] }
  end

  def result_headers_lings_cross
    header_keys = cross_lings_columns
    header_keys.map{ |k| HEADERS[k] }
  end

  def result_rows
    @result_rows ||= row_methods.map { |k| row_methods[k] }
  end

  def parent_columns
    @parent_columns ||= columns_to_include & PARENT_COLUMNS
  end

  def child_columns
    @child_columns ||= columns_to_include & CHILD_COLUMNS
  end

  def cross_lings_columns
    @search.implication? ? [PARENT_COLUMNS.first] :
    @search.depth_of_cross_search == Depth::PARENT ? [PARENT_COLUMNS.first] : [CHILD_COLUMNS.first]
  end

  private

  # This method will scale the number of columns based of Property choosen
  def scale_cross_columns
    name, value, count = CROSS_COLUMNS
    props = @search.results.first.parent
    [].tap do |columns_to_show|
      props.each {|p| columns_to_show << [name, value] }
      columns_to_show << count
    end.flatten
  end

  def result_headers_compare(entry)
    # If it is one LingsProperty object then is a Common Property
    entry.size>1 ? COMPARE_DIFF_COLUMNS : COMPARE_COMMON_COLUMNS
  end

  def result_headers_cross(entry=nil)
    scale_cross_columns if entry.nil?
  end

end