@Override
 public boolean visitFrom(EJBQLExpression expression, int finishedChildIndex) {
   context.append(" FROM");
   context.setAppendingResultColumns(false);
   expression.visit(context.getTranslatorFactory().getFromTranslator(context));
   context.markCurrentPosition(context.makeWhereMarker());
   context.markCurrentPosition(context.makeEntityQualifierMarker());
   return false;
 }
 @Override
 public boolean visitOuterJoin(EJBQLJoin join) {
   joinAppender.appendOuterJoin(
       null,
       new EJBQLTableId(join.getLeftHandSideId()),
       new EJBQLTableId(join.getRightHandSideId()));
   context.markCurrentPosition(EJBQLJoinAppender.makeJoinTailMarker(join.getRightHandSideId()));
   return false;
 }
  @Override
  public boolean visitFrom(EJBQLExpression expression, int finishedChildIndex) {
    if (finishedChildIndex + 1 == expression.getChildrenCount()) {
      if (lastId != null) {
        context.markCurrentPosition(EJBQLJoinAppender.makeJoinTailMarker(lastId));
      }
    }

    return true;
  }
  @Override
  public boolean visitInnerJoin(EJBQLJoin join) {
    joinAppender.appendInnerJoin(
        null,
        new EJBQLTableId(join.getLeftHandSideId()),
        new EJBQLTableId(join.getRightHandSideId()));

    // fix 1341-mark current join position for probable future joins to this join
    context.markCurrentPosition(EJBQLJoinAppender.makeJoinTailMarker(join.getRightHandSideId()));
    return false;
  }
  @Override
  public boolean visitFromItem(EJBQLFromItem expression, int finishedChildIndex) {

    String id = expression.getId();

    if (lastId != null) {
      context.append(',');
      context.markCurrentPosition(EJBQLJoinAppender.makeJoinTailMarker(lastId));
    }

    this.lastId = id;
    joinAppender.appendTable(new EJBQLTableId(id));
    return false;
  }
 @Override
 public boolean visitSelectClause(EJBQLExpression expression) {
   context.append("SELECT");
   context.markCurrentPosition(context.makeDistinctMarker());
   return true;
 }