/*
 * Copyright (c) 2006, 2021 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation
//
package org.eclipse.persistence.jpa.jpql.tools.model;

import static org.eclipse.persistence.jpa.jpql.parser.Expression.AND;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.AS;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.BETWEEN;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.CASE;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.COALESCE;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.CONCAT;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.DELETE;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.DISTINCT;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.DIVISION;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.ELSE;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.EMPTY;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.END;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.EQUAL;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.ESCAPE;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.EXISTS;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.FROM;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.FUNC;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.GROUP_BY;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.HAVING;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.IN;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.IS;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.LIKE;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.MEMBER;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.MINUS;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.MULTIPLICATION;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.NEW;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.NOT;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.NULL;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.OF;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.OR;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.ORDER_BY;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.PLUS;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.SELECT;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.SET;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.THEN;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.TREAT;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.UPDATE;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.WHEN;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.WHERE;

import java.util.ListIterator;

import org.eclipse.persistence.jpa.jpql.ExpressionTools;
import org.eclipse.persistence.jpa.jpql.parser.AbstractDoubleEncapsulatedExpression;
import org.eclipse.persistence.jpa.jpql.parser.AbstractFromClause;
import org.eclipse.persistence.jpa.jpql.parser.AbstractSelectStatement;
import org.eclipse.persistence.jpa.jpql.parser.AbstractSingleEncapsulatedExpression;
import org.eclipse.persistence.jpa.jpql.parser.AbstractTripleEncapsulatedExpression;
import org.eclipse.persistence.jpa.jpql.parser.AggregateFunction;
import org.eclipse.persistence.jpa.jpql.parser.BetweenExpression;
import org.eclipse.persistence.jpa.jpql.parser.CaseExpression;
import org.eclipse.persistence.jpa.jpql.parser.CoalesceExpression;
import org.eclipse.persistence.jpa.jpql.parser.CollectionMemberDeclaration;
import org.eclipse.persistence.jpa.jpql.parser.CollectionMemberExpression;
import org.eclipse.persistence.jpa.jpql.parser.CompoundExpression;
import org.eclipse.persistence.jpa.jpql.parser.ConcatExpression;
import org.eclipse.persistence.jpa.jpql.parser.ConstructorExpression;
import org.eclipse.persistence.jpa.jpql.parser.DateTime;
import org.eclipse.persistence.jpa.jpql.parser.DeleteClause;
import org.eclipse.persistence.jpa.jpql.parser.EmptyCollectionComparisonExpression;
import org.eclipse.persistence.jpa.jpql.parser.EncapsulatedIdentificationVariableExpression;
import org.eclipse.persistence.jpa.jpql.parser.ExistsExpression;
import org.eclipse.persistence.jpa.jpql.parser.Expression;
import org.eclipse.persistence.jpa.jpql.parser.FunctionExpression;
import org.eclipse.persistence.jpa.jpql.parser.GroupByClause;
import org.eclipse.persistence.jpa.jpql.parser.HavingClause;
import org.eclipse.persistence.jpa.jpql.parser.IdentificationVariableDeclaration;
import org.eclipse.persistence.jpa.jpql.parser.InExpression;
import org.eclipse.persistence.jpa.jpql.parser.Join;
import org.eclipse.persistence.jpa.jpql.parser.KeywordExpression;
import org.eclipse.persistence.jpa.jpql.parser.LikeExpression;
import org.eclipse.persistence.jpa.jpql.parser.NotExpression;
import org.eclipse.persistence.jpa.jpql.parser.NullComparisonExpression;
import org.eclipse.persistence.jpa.jpql.parser.OrderByClause;
import org.eclipse.persistence.jpa.jpql.parser.OrderByItem;
import org.eclipse.persistence.jpa.jpql.parser.RangeVariableDeclaration;
import org.eclipse.persistence.jpa.jpql.parser.ResultVariable;
import org.eclipse.persistence.jpa.jpql.parser.SelectClause;
import org.eclipse.persistence.jpa.jpql.parser.SelectStatement;
import org.eclipse.persistence.jpa.jpql.parser.SimpleSelectClause;
import org.eclipse.persistence.jpa.jpql.parser.TreatExpression;
import org.eclipse.persistence.jpa.jpql.parser.TrimExpression;
import org.eclipse.persistence.jpa.jpql.parser.UpdateClause;
import org.eclipse.persistence.jpa.jpql.parser.UpdateItem;
import org.eclipse.persistence.jpa.jpql.parser.WhenClause;
import org.eclipse.persistence.jpa.jpql.parser.WhereClause;
import org.eclipse.persistence.jpa.jpql.tools.model.query.AbsExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.AbstractDoubleEncapsulatedExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.AbstractFromClauseStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.AbstractIdentificationVariableDeclarationStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.AbstractModifyStatementStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.AbstractPathExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.AbstractRangeVariableDeclarationStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.AbstractSchemaNameStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.AbstractSelectStatementStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.AbstractSingleEncapsulatedExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.AbstractTripleEncapsulatedExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.AdditionExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.AggregateFunctionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.AllOrAnyExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.AndExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.ArithmeticFactorStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.AvgFunctionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.BadExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.BetweenExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.CaseExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.CoalesceExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.CollectionMemberDeclarationStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.CollectionMemberExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.CollectionValuedPathExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.ComparisonExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.CompoundExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.ConcatExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.ConstructorExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.CountFunctionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.DateTimeStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.DeleteClauseStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.DeleteStatementStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.DerivedPathIdentificationVariableDeclarationStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.DerivedPathVariableDeclarationStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.DivisionExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.EmptyCollectionComparisonExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.EncapsulatedIdentificationVariableExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.EntityTypeLiteralStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.EntryExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.EnumTypeStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.ExistsExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.FromClauseStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.FunctionExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.GroupByClauseStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.HavingClauseStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.IdentificationVariableDeclarationStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.IdentificationVariableStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.InExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.IndexExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.InputParameterStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.JPQLQueryStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.JoinStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.KeyExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.KeywordExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.LengthExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.LikeExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.ListHolderStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.LocateExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.LowerExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.MaxFunctionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.MinFunctionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.ModExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.MultiplicationExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.NotExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.NullComparisonExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.NullIfExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.NumericLiteralStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.ObjectExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.OrExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.OrderByClauseStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.OrderByItemStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.RangeVariableDeclarationStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.ResultVariableStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.SelectClauseStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.SelectStatementStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.SimpleFromClauseStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.SimpleSelectClauseStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.SimpleSelectStatementStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.SimpleStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.SizeExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.SqrtExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.StateFieldPathExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.StateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.StringLiteralStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.SubExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.SubstringExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.SubtractionExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.SumFunctionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.TreatExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.TrimExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.TypeExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.UnknownExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.UpdateClauseStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.UpdateItemStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.UpdateStatementStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.UpperExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.ValueExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.WhenClauseStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.WhereClauseStateObject;

/**
 * This {@link IJPQLQueryFormatter} is used to generate a string representation of a {@link
 * StateObject} based on how it was parsed, which means this formatter can only be used when the
 * {@link StateObject} was created by parsing a JPQL query because it needs to retrieve parsing
 * information from the corresponding {@link Expression}.
 * <p>
 * It is possible to partially match the JPQL query that was parsed, the value of <em>exactMatch</em>
 * will determine whether the string representation of any given {@link StateObject} should reflect
 * the exact string that was parsed. <code>true</code> will use every bit of information contained
 * in the corresponding {@link Expression} to perfectly match what was parsed (case of JPQL
 * identifiers and the presence of whitespace); <code>false</code> will only match the case
 * sensitivity of the JPQL identifiers.
 *
 * @version 2.5
 * @since 2.4
 * @author Pascal Filion
 */
@SuppressWarnings("null")
public abstract class AbstractActualJPQLQueryFormatter extends BaseJPQLQueryFormatter {

    /**
     * Determines whether the string representation of any given {@link StateObject} should reflect
     * the exact string that was parsed: <code>true</code> will use every bit of information
     * contained in the corresponding {@link Expression} to perfectly match what was parsed;
     * <code>false</code> will only match the case sensitivity of the JPQL identifiers.
     */
    protected final boolean exactMatch;

    /**
     * Creates a new <code>AbstractActualJPQLQueryFormatter</code>.
     *
     * @param exactMatch Determines whether the string representation of any given {@link StateObject}
     * should reflect the exact string that was parsed: <code>true</code> will use every bit of
     * information contained in the corresponding {@link Expression} to perfectly match what was
     * parsed (case of JPQL identifiers and the presence of whitespace); <code>false</code> will only
     * match the case sensitivity of the JPQL identifiers
     */
    protected AbstractActualJPQLQueryFormatter(boolean exactMatch) {
        super(IdentifierStyle.UPPERCASE);
        this.exactMatch = exactMatch;
    }

    /**
     * Creates a new <code>AbstractActualJPQLQueryFormatter</code>.
     *
     * @param exactMatch Determines whether the string representation of any given {@link StateObject}
     * should reflect the exact string that was parsed: <code>true</code> will use every bit of
     * information contained in the corresponding {@link Expression} to perfectly match what was
     * parsed (case of JPQL identifiers and the presence of whitespace); <code>false</code> will only
     * match the case sensitivity of the JPQL identifiers
     * @param style Determines how the JPQL identifiers are written out, which is used if the
     * {@link StateObject} was modified after its creation
     * @exception NullPointerException The IdentifierStyle cannot be <code>null</code>
     */
    protected AbstractActualJPQLQueryFormatter(boolean exactMatch, IdentifierStyle style) {
        super(style);
        this.exactMatch = exactMatch;
    }

    /**
     * Appends the given actual identifier if it's not an empty string, otherwise the second
     * identifier will be appended.
     *
     * @param actualIdentifier The actual JPQL identifier to append to the writer if it's not an
     * empty string
     * @param identifier The uppercase constant of the JPQL identifier to append if the actual one is
     * an empty string
     */
    protected void appendIdentifier(String actualIdentifier, String identifier) {

        if (!exactMatch || ExpressionTools.stringIsEmpty(actualIdentifier)) {
            actualIdentifier = formatIdentifier(identifier);
        }

        writer.append(actualIdentifier);
    }

    /**
     * Determines whether the string representation of any given {@link StateObject} should reflect
     * the exact string that was parsed.
     *
     * @return <code>true</code> will use every bit of information contained in the corresponding
     * {@link Expression} to perfectly match what was parsed; <code>false</code> will only match the
     * case sensitivity of the JPQL identifiers
     */
    public boolean isUsingExactMatch() {
        return exactMatch;
    }

    protected boolean shouldOutput(Expression expression) {
        return !exactMatch || (expression == null);
    }

    protected void toStringAggregateFunction(AggregateFunctionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            AggregateFunction expression = stateObject.getExpression();

            // Identifier
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : stateObject.getIdentifier(), stateObject.getIdentifier());

            // '('
            if (shouldOutput(expression) || expression.hasLeftParenthesis()) {
                writer.append(formatIdentifier(LEFT_PARENTHESIS));
            }

            // 'DISTINCT'
            if (stateObject.hasDistinct()) {
                appendIdentifier((expression != null) ? expression.getActualDistinctIdentifier() : DISTINCT, DISTINCT);

                if (shouldOutput(expression) || expression.hasSpaceAfterDistinct()) {
                    writer.append(SPACE);
                }
            }

            // Encapsulated expression
            if (stateObject.hasStateObject()) {
                stateObject.getStateObject().accept(this);
            }

            // ')'
            if (shouldOutput(expression) || expression.hasRightParenthesis()) {
                writer.append(formatIdentifier(RIGHT_PARENTHESIS));
            }
        }
    }

    protected void toStringChildren(ListHolderStateObject<? extends StateObject> stateObject,
                                    boolean comma) {

        for (ListIterator<? extends StateObject> iter = stateObject.items().iterator(); iter.hasNext(); ) {
            iter.next().accept(this);
            if (iter.hasNext()) {
                writer.append(comma ? COMMA_SPACE : SPACE);
            }
        }
    }

    protected void toStringCompound(CompoundExpressionStateObject stateObject, String identifier) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            CompoundExpression expression = stateObject.getExpression();

            // Left expression
            if (stateObject.hasLeft()) {
                stateObject.getLeft().accept(this);
                writer.append(SPACE);
            }

            // Identifier
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : identifier, identifier);

            if (shouldOutput(expression) || expression.hasSpaceAfterIdentifier()) {
                writer.append(SPACE);
            }

            // Right expression
            if (stateObject.hasRight()) {
                stateObject.getRight().accept(this);
            }
        }
    }

    protected void toStringDoubleEncapsulated(AbstractDoubleEncapsulatedExpressionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            AbstractDoubleEncapsulatedExpression expression = stateObject.getExpression();

            // Identifier
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : stateObject.getIdentifier(), stateObject.getIdentifier());

            // '('
            if (shouldOutput(expression) || expression.hasLeftParenthesis()) {
                writer.append(LEFT_PARENTHESIS);
            }
            else if (expression.hasSpaceAfterIdentifier()) {
                writer.append(COMMA);
            }

            // First expression
            if (stateObject.hasFirst()) {
                stateObject.getFirst().accept(this);
            }

            // ','
            if (shouldOutput(expression) || expression.hasComma()) {
                writer.append(COMMA);
            }

            if (shouldOutput(expression) || expression.hasSpaceAfterComma()) {
                writer.append(SPACE);
            }

            // Second expression
            if (stateObject.hasSecond()) {
                stateObject.getSecond().accept(this);
            }

            // ')'
            if (shouldOutput(expression) || expression.hasRightParenthesis()) {
                writer.append(RIGHT_PARENTHESIS);
            }
        }
    }

    protected void toStringEncapsulatedIdentificationVariable(EncapsulatedIdentificationVariableExpressionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            EncapsulatedIdentificationVariableExpression expression = stateObject.getExpression();

            // Identifier
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : stateObject.getIdentifier(), stateObject.getIdentifier());

            // '('
            if (shouldOutput(expression) || expression.hasLeftParenthesis()) {
                writer.append(LEFT_PARENTHESIS);
            }

            // Identification variable
            if (stateObject.hasIdentificationVariable()) {
                writer.append(stateObject.getIdentificationVariable());
            }

            // ')'
            if (shouldOutput(expression) || expression.hasRightParenthesis()) {
                writer.append(RIGHT_PARENTHESIS);
            }
        }
    }

    protected void toStringFromClause(AbstractFromClauseStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            AbstractFromClause expression = stateObject.getExpression();

            // 'FROM'
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : FROM, FROM);

            if (shouldOutput(expression) || expression.hasSpaceAfterFrom()) {
                writer.append(SPACE);
            }

            // declaration
            if (stateObject.hasItems()) {
                toStringChildren(stateObject, true);
            }
        }
    }

    protected void toStringIdentificationVariableDeclaration(AbstractIdentificationVariableDeclarationStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            IdentificationVariableDeclaration expression = stateObject.getExpression();

            // Range variable declaration
            stateObject.getRangeVariableDeclaration().accept(this);

            // Join | Join Fetch
            if (stateObject.hasItems()) {

                if (shouldOutput(expression) || expression.hasSpace()) {
                    writer.append(SPACE);
                }

                toStringChildren(stateObject, false);
            }
        }
    }

    protected void toStringModifyStatement(AbstractModifyStatementStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            stateObject.getModifyClause().accept(this);

            if (stateObject.hasWhereClause()) {
                // TODO: HANDLE SPACE
                writer.append(SPACE);
                stateObject.getWhereClause().accept(this);
            }
        }
    }

    protected void toStringPathExpression(AbstractPathExpressionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            stateObject.toText(writer);
        }
    }

    protected void toStringRangeVariableDeclaration(AbstractRangeVariableDeclarationStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            RangeVariableDeclaration expression = stateObject.getExpression();

            // "Root" object (abstract schema name or derived declaration)
            stateObject.getRootStateObject().accept(this);

            if (exactMatch && (expression != null) && expression.hasSpaceAfterRootObject()) {
                writer.append(SPACE);
            }

            // 'AS'
            if (stateObject.hasAs()) {

                if (!exactMatch || (expression == null)) {
                    writer.append(SPACE);
                }

                appendIdentifier((expression != null) ? expression.getActualAsIdentifier() : AS, AS);
            }

            if (exactMatch && (expression != null) && expression.hasSpaceAfterAs()) {
                writer.append(SPACE);
            }

            // Identification variable
            if (stateObject.hasIdentificationVariable() &&
               !stateObject.isIdentificationVariableVirtual()) {

                if (!exactMatch || (expression == null)) {
                    writer.append(SPACE);
                }

                writer.append(stateObject.getIdentificationVariable());
            }
        }
    }

    protected boolean toStringSelectStatement(AbstractSelectStatementStateObject stateObject) {

        AbstractSelectStatement expression = stateObject.getExpression();
        boolean spaceAdded = false;

        // SELECT clause
        stateObject.getSelectClause().accept(this);

        // If no select items were parsed but they got added later, make sure a space is added
        if (shouldOutput(expression) ||
            expression.hasSpaceAfterSelect() ||
            // TODO
            (/*!expression.getSelectClause().hasSelectExpression() &&*/
              stateObject.getSelectClause().hasSelectItem())) {

            writer.append(SPACE);
        }

        // FROM clause
        stateObject.getFromClause().accept(this);

        // If no WHERE clause was parsed but was added later, make sure a space is added
        if (exactMatch && (expression != null) && expression.hasSpaceAfterFrom() ||
            stateObject.hasWhereClause()) {

            writer.append(SPACE);
            spaceAdded = true;
        }

        // WHERE clause
        if (stateObject.hasWhereClause()) {
            stateObject.getWhereClause().accept(this);
            spaceAdded = false;
        }

        // If no GROUP BY clause was parsed but was added later, make sure a space is added
        if (exactMatch && (expression != null) && expression.hasSpaceAfterWhere() ||
            stateObject.hasGroupByClause()) {

            if (!spaceAdded) {
                writer.append(SPACE);
                spaceAdded = true;
            }
        }

        // GROUP BY clause
        if (stateObject.hasGroupByClause()) {
            stateObject.getGroupByClause().accept(this);
            spaceAdded = false;
        }

        // If no HAVING clause was parsed but was added later, make sure a space is added
        if (exactMatch && (expression != null) && expression.hasSpaceAfterGroupBy() ||
            stateObject.hasHavingClause()) {

            if (!spaceAdded) {
                writer.append(SPACE);
                spaceAdded = true;
            }
        }

        // HAVING clause
        if (stateObject.hasHavingClause()) {
            stateObject.getHavingClause().accept(this);
            spaceAdded = true;
        }

        return spaceAdded;
    }

    protected void toStringSimpleStateObject(SimpleStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else if (stateObject.hasText()) {
            writer.append(stateObject.getText());
        }
    }

    protected void toStringSingleEncapsulated(AbstractSingleEncapsulatedExpressionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            AbstractSingleEncapsulatedExpression expression = stateObject.getExpression();

            // Identifier
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : stateObject.getIdentifier(), stateObject.getIdentifier());

            // '('
            if (shouldOutput(expression) || expression.hasLeftParenthesis()) {
                writer.append(LEFT_PARENTHESIS);
            }

            if (stateObject.hasStateObject()) {
                stateObject.getStateObject().accept(this);
            }

            // ')'
            if (shouldOutput(expression) || expression.hasRightParenthesis()) {
                writer.append(RIGHT_PARENTHESIS);
            }
        }
    }

    protected void toStringTripleEncapsulated(AbstractTripleEncapsulatedExpressionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            AbstractTripleEncapsulatedExpression expression = stateObject.getExpression();

            // Identifier
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : stateObject.getIdentifier(), stateObject.getIdentifier());

            // '('
            if (shouldOutput(expression) || expression.hasLeftParenthesis()) {
                writer.append(LEFT_PARENTHESIS);
            }

            // First expression
            if (stateObject.hasFirst()) {
                stateObject.getFirst().accept(this);
            }

            if (shouldOutput(expression) || expression.hasFirstComma()) {
                writer.append(COMMA);
            }

            if (shouldOutput(expression) || expression.hasSpaceAfterFirstComma()) {
                writer.append(SPACE);
            }

            // Second expression
            if (stateObject.hasSecond()) {
                stateObject.getSecond().accept(this);
            }

            // Third expression
            if (stateObject.hasThird()) {

                if (shouldOutput(expression) || expression.hasSecondComma()) {
                    writer.append(COMMA);
                }

                if (shouldOutput(expression) || expression.hasSpaceAfterSecondComma()) {
                    writer.append(SPACE);
                }

                stateObject.getThird().accept(this);
            }

            // ')'
            if (shouldOutput(expression) || expression.hasRightParenthesis()) {
                writer.append(RIGHT_PARENTHESIS);
            }
        }
    }

    @Override
    public void visit(AbsExpressionStateObject stateObject) {
        toStringSingleEncapsulated(stateObject);
    }

    @Override
    public void visit(AbstractSchemaNameStateObject stateObject) {
        toStringSimpleStateObject(stateObject);
    }

    @Override
    public void visit(AdditionExpressionStateObject stateObject) {
        toStringCompound(stateObject, PLUS);
    }

    @Override
    public void visit(AllOrAnyExpressionStateObject stateObject) {
        toStringSingleEncapsulated(stateObject);
    }

    @Override
    public void visit(AndExpressionStateObject stateObject) {
        toStringCompound(stateObject, AND);
    }

    @Override
    public void visit(ArithmeticFactorStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            writer.append(stateObject.getArithmeticSign());

            if (stateObject.hasStateObject()) {
                stateObject.getStateObject().accept(this);
            }
        }
    }

    @Override
    public void visit(AvgFunctionStateObject stateObject) {
        toStringAggregateFunction(stateObject);
    }

    @Override
    public void visit(BadExpressionStateObject stateObject) {
        toStringSimpleStateObject(stateObject);
    }

    @Override
    public void visit(BetweenExpressionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            BetweenExpression expression = stateObject.getExpression();

            // Expression
            if (stateObject.hasStateObject()) {
                stateObject.getStateObject().accept(this);
                writer.append(SPACE);
            }

            // 'NOT
            if (stateObject.hasNot()) {
                appendIdentifier((expression != null) ? expression.getActualNotIdentifier() : NOT, NOT);
                writer.append(SPACE);
            }

            // 'BETWEEN'
            appendIdentifier((expression != null) ? expression.getActualBetweenIdentifier() : BETWEEN, BETWEEN);

            if (shouldOutput(expression) || expression.hasSpaceAfterBetween()) {
                writer.append(SPACE);
            }

            // Lower bound expression
            if (stateObject.hasLowerBound()) {
                stateObject.getLowerBound().accept(this);
            }

            if (shouldOutput(expression) || expression.hasSpaceAfterLowerBound()) {
                writer.append(SPACE);
            }

            // 'AND'
            if (shouldOutput(expression) || expression.hasAnd()) {
                appendIdentifier((expression != null) ? expression.getActualAndIdentifier() : AND, AND);
            }

            if (shouldOutput(expression) || expression.hasSpaceAfterAnd()) {
                writer.append(SPACE);
            }

            // Upper bound expression
            if (stateObject.hasUpperBound()) {
                stateObject.getUpperBound().accept(this);
            }
        }
    }

    @Override
    public void visit(CaseExpressionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            CaseExpression expression = stateObject.getExpression();

            // 'CASE'
            appendIdentifier((expression != null) ? expression.getActualCaseIdentifier() : CASE, CASE);

            if (shouldOutput(expression) || expression.hasSpaceAfterCase()) {
                writer.append(SPACE);
            }

            // Case operand
            if (stateObject.hasCaseOperand()) {
                stateObject.getCaseOperand().accept(this);

                if (shouldOutput(expression) || expression.hasSpaceAfterCaseOperand()) {
                    writer.append(SPACE);
                }
            }

            // WHEN clauses
            if (stateObject.hasItems()) {
                toStringChildren(stateObject, false);
            }

            if (shouldOutput(expression) || expression.hasSpaceAfterWhenClauses()) {
                writer.append(SPACE);
            }

            // 'ELSE'
            if (shouldOutput(expression) || expression.hasElse()) {
                appendIdentifier((expression != null) ? expression.getActualElseIdentifier() : ELSE, ELSE);
            }

            if (shouldOutput(expression) || expression.hasSpaceAfterElse()) {
                writer.append(SPACE);
            }

            // Else expression
            if (stateObject.hasElse()) {
                stateObject.getElse().accept(this);
            }

            if (shouldOutput(expression) || expression.hasSpaceAfterElseExpression()) {
                writer.append(SPACE);
            }

            // END
            if (shouldOutput(expression) || expression.hasEnd()) {
                appendIdentifier((expression != null) ? expression.getActualEndIdentifier() : END, END);
            }
        }
    }

    @Override
    public void visit(CoalesceExpressionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            CoalesceExpression expression = stateObject.getExpression();

            // 'COALESCE'
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : COALESCE, COALESCE);

            // '('
            if (shouldOutput(expression) || expression.hasLeftParenthesis()) {
                writer.append(LEFT_PARENTHESIS);
            }
            else if (expression.hasSpaceAfterIdentifier()) {
                writer.append(SPACE);
            }

            toStringChildren(stateObject, true);

            // ')'
            if (shouldOutput(expression) || expression.hasRightParenthesis()) {
                writer.append(RIGHT_PARENTHESIS);
            }
        }
    }

    @Override
    public void visit(CollectionMemberDeclarationStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            CollectionMemberDeclaration expression = stateObject.getExpression();

            // 'IN'
            appendIdentifier((expression != null) ? expression.getActualInIdentifier() : IN, IN);

            // '('
            if (!stateObject.isDerived() && (shouldOutput(expression) || expression.hasLeftParenthesis())) {
                writer.append(LEFT_PARENTHESIS);
            }
            else if (stateObject.isDerived() && (shouldOutput(expression) || expression.hasSpaceAfterIn())) {
                writer.append(SPACE);
            }

            // Collection-valued path expression
            stateObject.getCollectionValuedPath().accept(this);

            // ')'
            if (!stateObject.isDerived() && (shouldOutput(expression) || expression.hasRightParenthesis())) {
                writer.append(RIGHT_PARENTHESIS);

                if (shouldOutput(expression) || expression.hasSpaceAfterRightParenthesis()) {
                    writer.append(SPACE);
                }
            }
            else if (stateObject.isDerived() &&
                     stateObject.hasAs() &&
                     (shouldOutput(expression) || expression.hasSpaceAfterRightParenthesis())) {

                writer.append(SPACE);
            }

            // 'AS'
            if (stateObject.hasAs()) {
                appendIdentifier((expression != null) ? expression.getActualAsIdentifier() : AS, AS);

                if (shouldOutput(expression) || expression.hasSpaceAfterAs()) {
                    writer.append(SPACE);
                }
            }

            // Identification variable
            if (stateObject.hasIdentificationVariable()) {
                stateObject.getIdentificationVariable().accept(this);
            }
        }
    }

    @Override
    public void visit(CollectionMemberExpressionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            CollectionMemberExpression expression = stateObject.getExpression();

            // Entity or value expression
            if (stateObject.hasEntityStateObject()) {
                stateObject.getEntityStateObject().accept(this);
                writer.append(SPACE);
            }

            // 'NOT'
            if (stateObject.hasNot()) {
                appendIdentifier((expression != null) ? expression.getActualNotIdentifier() : NOT, NOT);
                writer.append(SPACE);
            }

            // 'MEMBER'
            appendIdentifier((expression != null) ? expression.getActualMemberIdentifier() : MEMBER, MEMBER);

            if (shouldOutput(expression) || expression.hasSpaceAfterMember()) {
                writer.append(SPACE);
            }

            // 'OF'
            if (stateObject.hasOf()) {
                appendIdentifier((expression != null) ? expression.getActualOfIdentifier() : OF, OF);

                if (shouldOutput(expression) || expression.hasSpaceAfterOf()) {
                    writer.append(SPACE);
                }
            }

            // Collection-valued path expression
            stateObject.getCollectionValuedPath().accept(this);
        }
    }

    @Override
    public void visit(CollectionValuedPathExpressionStateObject stateObject) {
        toStringPathExpression(stateObject);
    }

    @Override
    public void visit(ComparisonExpressionStateObject stateObject) {
        toStringCompound(stateObject, stateObject.getIdentifier());
    }

    @Override
    public void visit(ConcatExpressionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            ConcatExpression expression = stateObject.getExpression();

            // 'CONCAT'
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : CONCAT, CONCAT);

            // '('
            if (shouldOutput(expression) || expression.hasLeftParenthesis()) {
                writer.append(LEFT_PARENTHESIS);
            }

            toStringChildren(stateObject, true);

            // ')'
            if (shouldOutput(expression) || expression.hasRightParenthesis()) {
                writer.append(RIGHT_PARENTHESIS);
            }
        }
    }

    @Override
    public void visit(ConstructorExpressionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            ConstructorExpression expression = stateObject.getExpression();

            // 'NEW'
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : NEW, NEW);

            if (shouldOutput(expression) || expression.hasSpaceAfterNew()) {
                writer.append(SPACE);
            }

            // Class name
            writer.append(stateObject.getClassName());

            // '('
            if (shouldOutput(expression) || expression.hasLeftParenthesis()) {
                writer.append(LEFT_PARENTHESIS);
            }

            toStringChildren(stateObject, true);

            // ')'
            if (shouldOutput(expression) || expression.hasRightParenthesis()) {
                writer.append(RIGHT_PARENTHESIS);
            }
        }
    }

    @Override
    public void visit(CountFunctionStateObject stateObject) {
        toStringAggregateFunction(stateObject);
    }

    @Override
    public void visit(DateTimeStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            DateTime expression = stateObject.getExpression();
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : stateObject.getText(), stateObject.getText());
        }
    }

    @Override
    public void visit(DeleteClauseStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            DeleteClause expression = stateObject.getExpression();

            // 'DELETE'
            appendIdentifier((expression != null) ? expression.getActualDeleteIdentifier() : DELETE, DELETE);

            if (shouldOutput(expression) || expression.hasSpaceAfterDelete()) {
                writer.append(SPACE);
            }

            // 'FROM'
            if (shouldOutput(expression) || expression.hasFrom()) {
                appendIdentifier((expression != null) ? expression.getActualFromIdentifier() : FROM, FROM);
            }

            if (shouldOutput(expression) || expression.hasSpaceAfterFrom()) {
                writer.append(SPACE);
            }

            // Range variable declaration
            stateObject.getRangeVariableDeclaration().accept(this);
        }
    }

    @Override
    public void visit(DeleteStatementStateObject stateObject) {
        toStringModifyStatement(stateObject);
    }

    @Override
    public void visit(DerivedPathIdentificationVariableDeclarationStateObject stateObject) {
        toStringIdentificationVariableDeclaration(stateObject);
    }

    @Override
    public void visit(DerivedPathVariableDeclarationStateObject stateObject) {
        toStringRangeVariableDeclaration(stateObject);
    }

    @Override
    public void visit(DivisionExpressionStateObject stateObject) {
        toStringCompound(stateObject, DIVISION);
    }

    @Override
    public void visit(EmptyCollectionComparisonExpressionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            EmptyCollectionComparisonExpression expression = stateObject.getExpression();

            stateObject.getStateObject().accept(this);
            writer.append(SPACE);

            // 'IS'
            appendIdentifier((expression != null) ? expression.getActualIsIdentifier() : IS, IS);
            writer.append(SPACE);

            // 'NOT'
            if (stateObject.hasNot()) {
                appendIdentifier((expression != null) ? expression.getActualNotIdentifier() : NOT, NOT);
                writer.append(SPACE);
            }

            // 'EMPTY'
            appendIdentifier((expression != null) ? expression.getActualEmptyIdentifier() : EMPTY, EMPTY);
        }
    }

    @Override
    public void visit(EntityTypeLiteralStateObject stateObject) {
        toStringSimpleStateObject(stateObject);
    }

    @Override
    public void visit(EntryExpressionStateObject stateObject) {
        toStringEncapsulatedIdentificationVariable(stateObject);
    }

    @Override
    public void visit(EnumTypeStateObject stateObject) {
        toStringSimpleStateObject(stateObject);
    }

    @Override
    public void visit(ExistsExpressionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            ExistsExpression expression = stateObject.getExpression();

            // 'NOT'
            if (stateObject.hasNot()) {
                appendIdentifier((expression != null) ? expression.getActualNotIdentifier() : NOT, NOT);
                writer.append(SPACE);
            }

            // 'EXISTS'
            String actualIdentifier = (expression != null) ? expression.getActualIdentifier() : null;

            if ((actualIdentifier != null) && actualIdentifier.startsWith(NOT)) {
                actualIdentifier = actualIdentifier.substring(4);
            }

            appendIdentifier(actualIdentifier, EXISTS);

            // '('
            if (shouldOutput(expression) || expression.hasLeftParenthesis()) {
                writer.append(formatIdentifier(LEFT_PARENTHESIS));
            }

            // Subquery
            if (stateObject.hasStateObject()) {
                stateObject.getStateObject().accept(this);
            }

            // ')'
            if (shouldOutput(expression) || expression.hasRightParenthesis()) {
                writer.append(formatIdentifier(RIGHT_PARENTHESIS));
            }
        }
    }

    @Override
    public void visit(FromClauseStateObject stateObject) {
        toStringFromClause(stateObject);
    }

    @Override
    public void visit(FunctionExpressionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            FunctionExpression expression = stateObject.getExpression();

            // FUNC
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : FUNC, FUNC);

            // (
            if (shouldOutput(expression) || expression.hasLeftParenthesis()) {
                writer.append(LEFT_PARENTHESIS);
            }
            else if (exactMatch && expression.hasSpaceAfterIdentifier()) {
                writer.append(SPACE);
            }

            // Function name
            if (stateObject.hasFunctionName()) {

                writer.append(stateObject.getQuotedFunctionName());

                if (shouldOutput(expression) || expression.hasComma()) {
                    writer.append(COMMA);
                }

                if (shouldOutput(expression) || expression.hasSpaceAfterComma()) {
                    writer.append(SPACE);
                }
            }

            // Arguments
            toStringChildren(stateObject, true);

            // )
            if (shouldOutput(expression) || expression.hasRightParenthesis()) {
                writer.append(RIGHT_PARENTHESIS);
            }
        }
    }

    @Override
    public void visit(GroupByClauseStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            GroupByClause expression = stateObject.getExpression();

            // 'GROUP BY'
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : GROUP_BY, GROUP_BY);

            if (shouldOutput(expression) || expression.hasSpaceAfterGroupBy()) {
                writer.append(SPACE);
            }

            // Group by items
            if (stateObject.hasItems()) {
                toStringChildren(stateObject, true);
            }
        }
    }

    @Override
    public void visit(HavingClauseStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            HavingClause expression = stateObject.getExpression();

            // 'HAVING'
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : HAVING, HAVING);

            if (exactMatch && (expression != null) && expression.hasSpaceAfterIdentifier() ||
                stateObject.hasConditional()) {

                writer.append(SPACE);
            }

            // Conditional expression
            if (stateObject.hasConditional()) {
                stateObject.getConditional().accept(this);
            }
        }
    }

    @Override
    public void visit(IdentificationVariableDeclarationStateObject stateObject) {
        toStringIdentificationVariableDeclaration(stateObject);
    }

    @Override
    public void visit(IdentificationVariableStateObject stateObject) {
        toStringSimpleStateObject(stateObject);
    }

    @Override
    public void visit(IndexExpressionStateObject stateObject) {
        toStringEncapsulatedIdentificationVariable(stateObject);
    }

    @Override
    public void visit(InExpressionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            InExpression expression = stateObject.getExpression();

            if (stateObject.hasStateObject()) {
                stateObject.getStateObject().accept(this);
                writer.append(SPACE);
            }

            // 'NOT'
            if (stateObject.hasNot()) {
                appendIdentifier((expression != null) ? expression.getActualNotIdentifier() : NOT, NOT);
                writer.append(SPACE);
            }

            // 'IN'
            appendIdentifier((expression != null) ? expression.getActualInIdentifier() : IN, IN);

            if (!stateObject.isSingleInputParameter()) {
                writer.append(LEFT_PARENTHESIS);
            }
            else if (shouldOutput(expression) || expression.hasSpaceAfterIn()) {
                writer.append(SPACE);
            }

            if (stateObject.hasItems()) {
                toStringChildren(stateObject, true);
            }

            if (!stateObject.isSingleInputParameter()) {
                writer.append(RIGHT_PARENTHESIS);
            }
        }
    }

    @Override
    public void visit(InputParameterStateObject stateObject) {
        toStringSimpleStateObject(stateObject);
    }

    @Override
    public void visit(JoinStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            Join expression = stateObject.getExpression();

            // JOIN
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : stateObject.getJoinType(), stateObject.getJoinType());

            if (shouldOutput(expression) || expression.hasSpaceAfterJoin()) {
                writer.append(SPACE);
            }

            // Join association path
            stateObject.getJoinAssociationPathStateObject().accept(this);

            // Check first if the JOIN FETCH is allowed to have an identification variable
            if (stateObject.hasFetch()) {
                if (expression.hasAs()) {
                    writer.append(SPACE);
                }
            }
            // JOIN always needs a whitespace
            else {
                if (shouldOutput(expression) || expression.hasSpaceAfterJoinAssociation()) {
                    writer.append(SPACE);
                }
            }

            // AS
            if (stateObject.hasAs()) {

                appendIdentifier((expression != null) ? expression.getActualAsIdentifier() : AS, AS);

                if (shouldOutput(expression) || expression.hasSpaceAfterAs()) {
                    writer.append(SPACE);
                }
            }

            // Identification variable
            stateObject.getIdentificationVariableStateObject().accept(this);
        }
    }

    @Override
    public void visit(JPQLQueryStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else if (stateObject.hasQueryStatement()) {
            stateObject.getQueryStatement().accept(this);
        }
    }

    @Override
    public void visit(KeyExpressionStateObject stateObject) {
        toStringEncapsulatedIdentificationVariable(stateObject);
    }

    @Override
    public void visit(KeywordExpressionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            KeywordExpression expression = stateObject.getExpression();
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : stateObject.getText(), stateObject.getText());
        }
    }

    @Override
    public void visit(LengthExpressionStateObject stateObject) {
        toStringSingleEncapsulated(stateObject);
    }

    @Override
    public void visit(LikeExpressionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            LikeExpression expression = stateObject.getExpression();

            // String expression
            if (stateObject.hasStringStateObject()) {
                stateObject.getStringStateObject().accept(this);
            }

            if (shouldOutput(expression) || expression.hasSpaceAfterStringExpression()) {
                writer.append(SPACE);
            }

            // 'NOT'
            if (stateObject.hasNot()) {
                appendIdentifier((expression != null) ? expression.getActualNotIdentifier() : NOT, NOT);
                writer.append(SPACE);
            }

            // 'LIKE'
            appendIdentifier((expression != null) ? expression.getActualLikeIdentifier() : LIKE, LIKE);

            if (shouldOutput(expression) || expression.hasSpaceAfterLike()) {
                writer.append(SPACE);
            }

            // Pattern value
            if (stateObject.hasPatternValue()) {
                stateObject.getPatternValue().accept(this);
            }

            if (exactMatch && (expression != null) && expression.hasSpaceAfterPatternValue()) {
                writer.append(SPACE);
            }

            // Escape character
            if (stateObject.hasEscapeCharacter()) {

                if (!exactMatch) {
                    writer.append(SPACE);
                }

                appendIdentifier((expression != null) ? expression.getActualEscapeIdentifier() : ESCAPE, ESCAPE);

                if (shouldOutput(expression) || expression.hasSpaceAfterEscape()) {
                    writer.append(SPACE);
                }

                writer.append(stateObject.getEscapeCharacter());
            }
        }
    }

    @Override
    public void visit(LocateExpressionStateObject stateObject) {
        toStringTripleEncapsulated(stateObject);
    }

    @Override
    public void visit(LowerExpressionStateObject stateObject) {
        toStringSingleEncapsulated(stateObject);
    }

    @Override
    public void visit(MaxFunctionStateObject stateObject) {
        toStringAggregateFunction(stateObject);
    }

    @Override
    public void visit(MinFunctionStateObject stateObject) {
        toStringAggregateFunction(stateObject);
    }

    @Override
    public void visit(ModExpressionStateObject stateObject) {
        toStringDoubleEncapsulated(stateObject);
    }

    @Override
    public void visit(MultiplicationExpressionStateObject stateObject) {
        toStringCompound(stateObject, MULTIPLICATION);
    }

    @Override
    public void visit(NotExpressionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            NotExpression expression = stateObject.getExpression();

            // 'NOT'
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : NOT, NOT);

            if (shouldOutput(expression) || expression.hasSpaceAfterNot()) {
                writer.append(SPACE);
            }

            // Expression
            if (stateObject.hasStateObject()) {
                stateObject.getStateObject().accept(this);
            }
        }
    }

    @Override
    public void visit(NullComparisonExpressionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            NullComparisonExpression expression = stateObject.getExpression();

            // Expression
            if (stateObject.hasStateObject()) {
                stateObject.getStateObject().accept(this);
                writer.append(SPACE);
            }

            // 'IS'
            appendIdentifier((expression != null) ? expression.getActualIsIdentifier() : IS, IS);
            writer.append(SPACE);

            // 'NOT'
            if (stateObject.hasNot()) {
                appendIdentifier((expression != null) ? expression.getActualNotIdentifier() : NOT, NOT);
                writer.append(SPACE);
            }

            // 'NULL'
            appendIdentifier((expression != null) ? expression.getActualNullIdentifier() : NULL, NULL);
        }
    }

    @Override
    public void visit(NullIfExpressionStateObject stateObject) {
        toStringDoubleEncapsulated(stateObject);
    }

    @Override
    public void visit(NumericLiteralStateObject stateObject) {
        toStringSimpleStateObject(stateObject);
    }

    @Override
    public void visit(ObjectExpressionStateObject stateObject) {
        toStringEncapsulatedIdentificationVariable(stateObject);
    }

    @Override
    public void visit(OrderByClauseStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            OrderByClause expression = stateObject.getExpression();

            // 'ORDER BY'
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : ORDER_BY, ORDER_BY);

            if (shouldOutput(expression) || expression.hasSpaceAfterIdentifier()) {
                writer.append(SPACE);
            }

            // Order by items
            if (stateObject.hasItems()) {
                toStringChildren(stateObject, true);
            }
        }
    }

    @Override
    public void visit(OrderByItemStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            OrderByItem expression = stateObject.getExpression();

            // Order by item
            if (stateObject.hasStateObject()) {
                stateObject.getStateObject().accept(this);
            }

            // ASC/DESC
            if (!stateObject.isDefault()) {

                if (shouldOutput(expression) || expression.hasSpaceAfterExpression()) {
                    writer.append(SPACE);
                }

                String ordering = stateObject.getOrdering().name();
                String actualOrdering = (expression != null) ? expression.getActualOrdering() : null;

                if (!ordering.equalsIgnoreCase(actualOrdering)) {
                    actualOrdering = ordering;
                }

                appendIdentifier(actualOrdering, ordering);
            }
        }
    }

    @Override
    public void visit(OrExpressionStateObject stateObject) {
        toStringCompound(stateObject, OR);
    }

    @Override
    public void visit(RangeVariableDeclarationStateObject stateObject) {
        toStringRangeVariableDeclaration(stateObject);
    }

    @Override
    public void visit(ResultVariableStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            ResultVariable expression = stateObject.getExpression();

            // Select expression
            if (stateObject.hasStateObject()) {
                stateObject.getStateObject().accept(this);
            }

            if (exactMatch && (expression != null) && expression.hasSelectExpression()) {
                writer.append(SPACE);
            }

            // 'AS'
            if (stateObject.hasAs()) {
                if (!exactMatch || (expression == null)) {
                    writer.append(SPACE);
                }
                appendIdentifier((expression != null) ? expression.getActualAsIdentifier() : AS, AS);
            }

            if (exactMatch && (expression != null) && expression.hasSpaceAfterAs()) {
                writer.append(SPACE);
            }

            // Result variable
            if (stateObject.hasResultVariable()) {
                if (!exactMatch || (expression == null)) {
                    writer.append(SPACE);
                }
                writer.append(stateObject.getResultVariable());
            }
        }
    }

    @Override
    public void visit(SelectClauseStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            SelectClause expression = stateObject.getExpression();

            // SELECT
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : SELECT, SELECT);

            if (shouldOutput(expression) || expression.hasSpaceAfterSelect()) {
                writer.append(SPACE);
            }

            // DISTINCT
            if (stateObject.hasDistinct()) {
                appendIdentifier((expression != null) ? expression.getActualDistinctIdentifier() : DISTINCT, DISTINCT);

                if (shouldOutput(expression) || expression.hasSpaceAfterDistinct()) {
                    writer.append(SPACE);
                }
            }

            // Select expressions
            if (stateObject.hasItems()) {
                toStringChildren(stateObject, true);
            }
        }
    }

    @Override
    public void visit(SelectStatementStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            boolean endWithSpace = toStringSelectStatement(stateObject);
            SelectStatement expression = stateObject.getExpression();

            // If no ORDER BY clause was parsed but was added later, make sure a space is added
            if (exactMatch && (expression != null) && expression.hasSpaceBeforeOrderBy() ||
                stateObject.hasOrderByClause()) {

                if (!endWithSpace) {
                    writer.append(SPACE);
                }
            }

            // ORDER BY clause
            if (stateObject.hasOrderByClause()) {
                stateObject.getOrderByClause().accept(this);
            }
        }
    }

    @Override
    public void visit(SimpleFromClauseStateObject stateObject) {
        toStringFromClause(stateObject);
    }

    @Override
    public void visit(SimpleSelectClauseStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            SimpleSelectClause expression = stateObject.getExpression();

            // SELECT
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : SELECT, SELECT);

            if (shouldOutput(expression) || expression.hasSpaceAfterSelect()) {
                writer.append(SPACE);
            }

            // DISTINCT
            if (stateObject.hasDistinct()) {
                appendIdentifier((expression != null) ? expression.getActualDistinctIdentifier() : DISTINCT, DISTINCT);

                if (shouldOutput(expression) || expression.hasSpaceAfterDistinct()) {
                    writer.append(SPACE);
                }
            }

            // Select expression
            if (stateObject.hasSelectItem()) {
                stateObject.getSelectItem().accept(this);
            }
        }
    }

    @Override
    public void visit(SimpleSelectStatementStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            toStringSelectStatement(stateObject);
        }
    }

    @Override
    public void visit(SizeExpressionStateObject stateObject) {
        toStringSingleEncapsulated(stateObject);
    }

    @Override
    public void visit(SqrtExpressionStateObject stateObject) {
        toStringSingleEncapsulated(stateObject);
    }

    @Override
    public void visit(StateFieldPathExpressionStateObject stateObject) {
        toStringPathExpression(stateObject);
    }

    @Override
    public void visit(StringLiteralStateObject stateObject) {
        toStringSimpleStateObject(stateObject);
    }

    @Override
    public void visit(SubExpressionStateObject stateObject) {
        toStringSingleEncapsulated(stateObject);
    }

    @Override
    public void visit(SubstringExpressionStateObject stateObject) {
        toStringTripleEncapsulated(stateObject);
    }

    @Override
    public void visit(SubtractionExpressionStateObject stateObject) {
        toStringCompound(stateObject, MINUS);
    }

    @Override
    public void visit(SumFunctionStateObject stateObject) {
        toStringAggregateFunction(stateObject);
    }

    @Override
    public void visit(TreatExpressionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            TreatExpression expression = stateObject.getExpression();

            // TREAT
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : TREAT, TREAT);

            // (
            if (shouldOutput(expression) || expression.hasLeftParenthesis()) {
                writer.append(LEFT_PARENTHESIS);
            }

            // Join association path expression
            stateObject.getJoinAssociationPathStateObject().accept(this);

            if (shouldOutput(expression) || expression.hasSpaceAfterCollectionValuedPathExpression()) {
                writer.append(SPACE);
            }

            // AS
            if (stateObject.hasAs()) {

                appendIdentifier((expression != null) ? expression.getActualAsIdentifier() : AS, AS);

                if (shouldOutput(expression) || expression.hasSpaceAfterAs()) {
                    writer.append(SPACE);
                }
            }

            // Entity type name
            writer.append(stateObject.getEntityTypeName());

            // )
            if (shouldOutput(expression) || expression.hasRightParenthesis()) {
                writer.append(RIGHT_PARENTHESIS);
            }
        }
    }

    @Override
    public void visit(TrimExpressionStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            TrimExpression expression = stateObject.getExpression();

            // 'TRIM'
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : stateObject.getIdentifier(), stateObject.getIdentifier());

            // '('
            if (shouldOutput(expression) || ( expression != null && expression.hasLeftParenthesis())) {
                writer.append(LEFT_PARENTHESIS);
            }
            else if ((expression != null) && expression.hasSpaceAfterIdentifier()) {
                writer.append(SPACE);
            }

            // Trim specification
            if (stateObject.hasSpecification()) {
                String specification = stateObject.getSpecification().name();
                String actualSpecification = (expression != null) ? expression.getActualSpecificationIdentifier() : null;

                if (!specification.equalsIgnoreCase(actualSpecification)) {
                    actualSpecification = specification;
                }

                appendIdentifier(actualSpecification, specification);
            }

            if (shouldOutput(expression) || expression.hasSpaceAfterSpecification()) {
                writer.append(SPACE);
            }

            // Trim character
            if (stateObject.hasTrimCharacter()) {
                stateObject.getTrimCharacter().accept(this);

                if (shouldOutput(expression) || expression.hasSpaceAfterTrimCharacter()) {
                    writer.append(SPACE);
                }
            }

            // 'FROM'
            if (stateObject.hasSpecification() ||
                stateObject.hasTrimCharacter()) {

                appendIdentifier((expression != null) ? expression.getActualFromIdentifier() : FROM, FROM);

                if (shouldOutput(expression) || expression.hasSpaceAfterFrom()) {
                    writer.append(SPACE);
                }
            }

            // String primary
            if (stateObject.hasStateObject()) {
                stateObject.getStateObject().accept(this);
            }

            // ')'
            if (shouldOutput(expression) || expression.hasRightParenthesis()) {
                writer.append(RIGHT_PARENTHESIS);
            }
        }
    }

    @Override
    public void visit(TypeExpressionStateObject stateObject) {
        toStringSingleEncapsulated(stateObject);
    }

    @Override
    public void visit(UnknownExpressionStateObject stateObject) {
        toStringSimpleStateObject(stateObject);
    }

    @Override
    public void visit(UpdateClauseStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            UpdateClause expression = stateObject.getExpression();

            // 'UPDATE'
            appendIdentifier((expression != null) ? expression.getActualUpdateIdentifier() : UPDATE, UPDATE);

            if (shouldOutput(expression) || expression.hasSpaceAfterUpdate()) {
                writer.append(SPACE);
            }

            // Range variable declaration
            stateObject.getRangeVariableDeclaration().accept(this);

            if (shouldOutput(expression) || expression.hasSpaceAfterRangeVariableDeclaration()) {
                writer.append(SPACE);
            }

            // 'SET'
            if (shouldOutput(expression) || expression.hasSet()) {
                appendIdentifier((expression != null) ? expression.getActualSetIdentifier() : SET, SET);

                if (shouldOutput(expression) || expression.hasSpaceAfterSet()) {
                    writer.append(SPACE);
                }
            }

            // Update items
            if (stateObject.hasItems()) {
                toStringChildren(stateObject, true);
            }
        }
    }

    @Override
    public void visit(UpdateItemStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            UpdateItem expression = stateObject.getExpression();

            // Update item
            stateObject.getStateFieldPath().accept(this);

            if (shouldOutput(expression) || expression.hasSpaceAfterStateFieldPathExpression()) {
                writer.append(SPACE);
            }

            // '='
            if (shouldOutput(expression) || expression.hasEqualSign()) {
                writer.append(EQUAL);
            }

            if (shouldOutput(expression) || expression.hasSpaceAfterEqualSign()) {
                writer.append(SPACE);
            }

            // New value
            if (stateObject.hasNewValue()) {
                stateObject.getNewValue().accept(this);
            }
        }
    }

    @Override
    public void visit(UpdateStatementStateObject stateObject) {
        toStringModifyStatement(stateObject);
    }

    @Override
    public void visit(UpperExpressionStateObject stateObject) {
        toStringSingleEncapsulated(stateObject);
    }

    @Override
    public void visit(ValueExpressionStateObject stateObject) {
        toStringEncapsulatedIdentificationVariable(stateObject);
    }

    @Override
    public void visit(WhenClauseStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            WhenClause expression = stateObject.getExpression();

            // 'WHEN'
            appendIdentifier((expression != null) ? expression.getActualWhenIdentifier() : WHEN, WHEN);

            if (shouldOutput(expression) || expression.hasSpaceAfterWhen()) {
                writer.append(SPACE);
            }

            // WHEN expression
            if (stateObject.hasConditional()) {
                stateObject.getConditional().accept(this);
            }

            if (shouldOutput(expression) || expression.hasSpaceAfterWhenExpression()) {
                writer.append(SPACE);
            }

            // 'THEN'
            if (shouldOutput(expression) || expression.hasThen()) {
                appendIdentifier((expression != null) ? expression.getActualThenIdentifier() : THEN, THEN);
            }

            if (shouldOutput(expression) || expression.hasSpaceAfterThen()) {
                writer.append(SPACE);
            }

            // THEN expression
            if (stateObject.hasThen()) {
                stateObject.getThen().accept(this);
            }
        }
    }

    @Override
    public void visit(WhereClauseStateObject stateObject) {

        if (stateObject.isDecorated()) {
            toText(stateObject);
        }
        else {
            WhereClause expression = stateObject.getExpression();

            // 'WHERE
            appendIdentifier((expression != null) ? expression.getActualIdentifier() : WHERE, WHERE);

            if (exactMatch && (expression != null) && expression.hasSpaceAfterIdentifier() ||
                stateObject.hasConditional()) {

                writer.append(SPACE);
            }

            // Conditional expression
            if (stateObject.hasConditional()) {
                stateObject.getConditional().accept(this);
            }
        }
    }
}
