function checkEvalRelations_OuterInnerJoins(evalFn) {
  var sampleRows = getSampleRows();
  var lessJobs = sampleRows.jobs.slice(0, sampleRows.jobs.length - 1);
  var lessDepartments = sampleRows.departments.slice(0,
      sampleRows.departments.length - 1);
  var numJobsDeleted = 1;
  var numDepartmentsDeleted = 1;
  var numEmployeesPerJob = 10;
  var numEmployeesPerDepartment = 20;

  var employeeRelation = lf.proc.Relation.fromRows(
      sampleRows.employees, [e.getName()]);
  var jobRelation = lf.proc.Relation.fromRows(
      lessJobs, [j.getName()]);
  var departmentRelation = lf.proc.Relation.fromRows(
      lessDepartments, [d.getName()]);

  var joinPredicate1 = e.jobId.eq(j.id);
  var result = evalFn.call(
      joinPredicate1, employeeRelation, jobRelation, false);
  var expectedResults = sampleRows.employees.length - (numJobsDeleted *
      numEmployeesPerJob);
  var expectedResults2 = sampleRows.employees.length - (
      numDepartmentsDeleted * numEmployeesPerDepartment);
  assertEquals(expectedResults, result.entries.length);
  // joinPredicate1 is reversed in previous join.
  joinPredicate1 = e.jobId.eq(j.id);
  result = evalFn.call(joinPredicate1, employeeRelation, jobRelation, true);
  assertEquals(sampleRows.employees.length, result.entries.length);

  // Join employee and job with department.
  var joinPredicate2 = e.departmentId.eq(d.id);
  var result2 = evalFn.call(joinPredicate2, result, departmentRelation, true);
  assertEquals(sampleRows.employees.length, result2.entries.length);
  result2 = evalFn.call(joinPredicate2, result, departmentRelation, false);
  assertEquals(expectedResults2, result2.entries.length);
}
Checks that the given outer join implementation is correct
for two Outer joins, for the case where the join predicate
refers to unique keys.
@param {!function(!lf.proc.Relation, !lf.proc.Relation, boolean)
    :!lf.proc.Relation} evalFn The join implementation method should be
    either evalRelationsNestedLoopJoin_ or evalRelationsHashJoin_.