function testTree_OuterJoinPredicate_Unaffected() {
  var r = schema.getRegion();
  var c = schema.getCountry();

  var treeBefore =
      'select(value_pred(Country.id eq 1))\n' +
      '-select(join_pred(Region.id eq Country.regionId))\n' +
      '--cross_product\n' +
      '---table_access(Region)\n' +
      '---table_access(Country)\n';

  var constructTree = function() {
    var queryContext = new lf.query.SelectContext(hr.db.getSchema());
    queryContext.from = [r, c];
    var valuePredicate = c.id.eq(1);
    var joinPredicate = r.id.eq(c.regionId);
    queryContext.where = lf.op.and(valuePredicate, joinPredicate);
    queryContext.outerJoinPredicates = lf.structs.set.create();
    queryContext.outerJoinPredicates.add(joinPredicate.getId());

    var selectNode1 = new lf.proc.SelectNode(valuePredicate);
    var selectNode2 = new lf.proc.SelectNode(joinPredicate);
    var crossProductNode = new lf.proc.CrossProductNode();

    selectNode1.addChild(selectNode2);
    selectNode2.addChild(crossProductNode);
    crossProductNode.addChild(new lf.proc.TableAccessNode(r));
    crossProductNode.addChild(new lf.proc.TableAccessNode(c));

    return {queryContext: queryContext, root: selectNode1};
  };

  lf.testing.treeutil.assertTreeTransformation(
      constructTree(), treeBefore, treeBefore, pass);
}
Tests a tree that involves a left outer join and also has an additional
value predicate. It ensures that the value predicate is not pushed below the
join predicate, such that the join operation is performed before the value
predicate is applied.