 // Using Google Tests "Type Parameterized Tests"
 // Every test defined as TYPED_TEST(JoinTest, *) will be run once for every instance of
 // TestParameters defined below
+// The kind of join is determined by the first template argument to TestParameters
+// The number and types of columns used in both the left and right sets of columns are 
+// determined by the number and types of vectors in the std::tuple<...> that is the second
+// template argument to TestParameters
 typedef ::testing::Types< 
                           // Single column inner join tests for all types
                           TestParameters< join_kind::INNER, std::tuple<std::vector<int32_t>> >,

  LEFT
};

// TODO Can probably just replace this with a std::pair
// Each element of the result will be an index into the left and right columns where
// left_columns[left_index] == right_columns[right_index]
struct result_type 
{
  size_t left_index{};
  size_t right_index{};

  result_type() {}

  result_type(size_t _l, size_t _r) : 
    left_index{_l}, right_index{_r} {}

  // Overload comparison so the result vector can be sorted
  bool operator <(result_type const& rhs){
    return( std::tie(left_index, right_index) < std::tie(rhs.left_index, rhs.right_index) );
  }

  bool operator ==(result_type const& rhs) const{
    return ( std::tie(left_index, right_index) == std::tie(rhs.left_index, rhs.right_index) );
  }

  friend std::ostream& operator<<(std::ostream& os, const result_type& result);

};

// Overload the stream operator to make it easier to print a result 
std::ostream& operator<<(std::ostream& os, const result_type& result)
{
  os << result.left_index << ", " << result.right_index << std::endl;
  return os;
}

// A new instance of this class will be created for each *TEST(JoinTest, ...)

   * @Param sort Option to sort the result. This is required to compare the result against the reference solution
   */
  /* ----------------------------------------------------------------------------*/
  std::vector<result_type> compute_gdf_result(bool print = false, bool sort = true)
  {
    const int num_columns = std::tuple_size<multi_column_t>::value;

