@Override
  public Expression getAllowingNull(String attributeName) {
    ObjectExpression exp = existingDerivedExpressionNamed(attributeName);

    // The same (aliased) table cannot participate in a normal join and an outer join.
    // To help enforce this, if the node already exists
    if (exp != null) {
      return exp;
    }
    ObjectExpression result = derivedExpressionNamed(attributeName);
    result.doUseOuterJoin();
    return result;
  }
 /** Defines a join between this expression and the target expression based on the ON clause. */
 @Override
 public Expression leftJoin(Expression target, Expression onClause) {
   join(target, onClause);
   ((ObjectExpression) target).doUseOuterJoin();
   return this;
 }