@Override
  public boolean visitWhere(EJBQLExpression expression) {
    // "WHERE" is appended via a marker as it may have been already appended when an
    // entity inheritance qualifier was applied.
    context.pushMarker(context.makeWhereMarker(), true);
    context.append(" WHERE");
    context.popMarker();

    if (context.findOrCreateMarkedBuffer(context.makeEntityQualifierMarker()).length() > 0) {
      context.append(" AND");
    }

    expression.visit(context.getTranslatorFactory().getConditionTranslator(context));
    return false;
  }
 @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 visitDistinct(EJBQLExpression expression) {
   // "distinct" is appended via a marker as sometimes a later match on to-many would
   // require a DISTINCT insertion.
   context.pushMarker(context.makeDistinctMarker(), true);
   context.append(" DISTINCT");
   context.popMarker();
   return true;
 }
  @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;
 }
 @Override
 public boolean visitOrderBy(EJBQLExpression expression) {
   context.append(" ORDER BY");
   expression.visit(context.getTranslatorFactory().getOrderByTranslator(context));
   return false;
 }
 @Override
 public boolean visitHaving(EJBQLExpression expression) {
   context.append(" HAVING");
   expression.visit(context.getTranslatorFactory().getConditionTranslator(context));
   return false;
 }
 @Override
 public boolean visitGroupBy(EJBQLExpression expression) {
   context.append(" GROUP BY");
   expression.visit(context.getTranslatorFactory().getGroupByTranslator(context));
   return false;
 }