content: /*****************************************************************
   *   Licensed to the Apache Software Foundation (ASF) under one
   *  or more contributor license agreements.  See the NOTICE file
   *  distributed with this work for additional information
   *  regarding copyright ownership.  The ASF licenses this file
   *  to you under the Apache License, Version 2.0 (the
   *  "License"); you may not use this file except in compliance
   *  with the License.  You may obtain a copy of the License at
   *
   *    https://www.apache.org/licenses/LICENSE-2.0
   *
   *  Unless required by applicable law or agreed to in writing,
   *  software distributed under the License is distributed on an
   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   *  KIND, either express or implied.  See the License for the
   *  specific language governing permissions and limitations
   *  under the License.
   ****************************************************************/
  package org.apache.cayenne.ejbql;
  
  import org.apache.cayenne.ejbql.parser.EJBQLAggregateColumn;
  import org.apache.cayenne.ejbql.parser.EJBQLDecimalLiteral;
  import org.apache.cayenne.ejbql.parser.EJBQLFromItem;
  import org.apache.cayenne.ejbql.parser.EJBQLIntegerLiteral;
  import org.apache.cayenne.ejbql.parser.EJBQLJoin;
  import org.apache.cayenne.ejbql.parser.EJBQLPositionalInputParameter;
  
  /**
   * A visitor interface to inspect the EJBQL expression tree. Visit methods return
   * booleans, indicating whether the children of a given node should be visited.
   * 
   * @since 3.0
   */
  public interface EJBQLExpressionVisitor {
  
      boolean visitAbs(EJBQLExpression expression, int finishedChildIndex);
  
      boolean visitAbstractSchemaName(EJBQLExpression expression);
  
      /**
       * Called on visiting "add" expression and also after visiting every expression child.
       * 
       * @param expression an "add" node being visited.
       * @param finishedChildIndex "-1" when the expression node is visited for the first
       *            time, before its children; otherwise this is an index of a child just
       *            visited.
       */
      boolean visitAdd(EJBQLExpression expression, int finishedChildIndex);
  
      boolean visitAggregate(EJBQLExpression expression);
  
      boolean visitAll(EJBQLExpression expression);
  
      /**
       * Called on visiting "and" expression and also after visiting every expression child.
       * 
       * @param expression an "and" node being visited.
       * @param finishedChildIndex "-1" when the expression node is visited for the first
       *            time, before its children; otherwise this is an index of a child just
       *            visited.
       */
      boolean visitAnd(EJBQLExpression expression, int finishedChildIndex);
  
      boolean visitAny(EJBQLExpression expression);
  
      boolean visitAscending(EJBQLExpression expression);
  
      boolean visitAverage(EJBQLAggregateColumn expression);
  
      /**
       * Called on visiting "between" expression and also after visiting every expression
       * child.
       * 
       * @param expression an "between" node being visited.
       * @param finishedChildIndex "-1" when the expression node is visited for the first
       *            time, before its children; otherwise this is an index of a child just
       *            visited.
       */
      boolean visitBetween(EJBQLExpression expression, int finishedChildIndex);
  
      boolean visitBooleanLiteral(EJBQLExpression expression);
  
      boolean visitClassName(EJBQLExpression expression);
  
      boolean visitConcat(EJBQLExpression expression, int finishedChildIndex);
  
      boolean visitConstructor(EJBQLExpression expression);
  
      boolean visitConstructorParameter(EJBQLExpression expression);
  
      boolean visitConstructorParameters(EJBQLExpression expression);
  
      boolean visitCount(EJBQLAggregateColumn expression);
  
      boolean visitCurrentDate(EJBQLExpression expression);
  
      boolean visitCurrentTime(EJBQLExpression expression);
  
      boolean visitCurrentTimestamp(EJBQLExpression expression);
  
      boolean visitDecimalLiteral(EJBQLDecimalLiteral expression);
  
      boolean visitDelete(EJBQLExpression expression);
  
      boolean visitDescending(EJBQLExpression expression);
  
      boolean visitDistinct(EJBQLExpression expression);
  
      /**
       * Called on visiting "divide" expression and also after visiting every expression
       * child.
       * 
       * @param expression an "divide" node being visited.
       * @param finishedChildIndex "-1" when the expression node is visited for the first
       *            time, before its children; otherwise this is an index of a child just
       *            visited.
       */
      boolean visitDivide(EJBQLExpression expression, int finishedChildIndex);
  
      /**
       * Called on visiting "equals" expression and also after visiting every expression
       * child.
       * 
       * @param expression an "equals" node being visited.
       * @param finishedChildIndex "-1" when the expression node is visited for the first
       *            time, before its children; otherwise this is an index of a child just
       *            visited.
       */
      boolean visitEquals(EJBQLExpression expression, int finishedChildIndex);
  
      boolean visitEscapeCharacter(EJBQLExpression expression);
  
      boolean visitExists(EJBQLExpression expression);
  
      boolean visitFrom(EJBQLExpression expression, int finishedChildIndex);
  
      boolean visitFromItem(EJBQLFromItem expression, int finishedChildIndex);
  
      /**
       * Called on visiting "&gt;=" expression and also after visiting every expression child.
       * 
       * @param expression an "&gt;=" node being visited.
       * @param finishedChildIndex "-1" when the expression node is visited for the first
       *            time, before its children; otherwise this is an index of a child just
       *            visited.
       */
      boolean visitGreaterOrEqual(EJBQLExpression expression, int finishedChildIndex);
  
      /**
       * Called on visiting "&gt;=" expression and also after visiting every expression child.
       * 
       * @param expression an "&gt;=" node being visited.
       * @param finishedChildIndex "-1" when the expression node is visited for the first
       *            time, before its children; otherwise this is an index of a child just
       *            visited.
       */
      boolean visitGreaterThan(EJBQLExpression expression, int finishedChildIndex);
  
      boolean visitGroupBy(EJBQLExpression expression);
  
      boolean visitHaving(EJBQLExpression expression);
  
      boolean visitIdentificationVariable(EJBQLExpression expression);
  
      boolean visitIdentifier(EJBQLExpression expression);
  
      boolean visitIn(EJBQLExpression expression, int finishedChildIndex);
  
      boolean visitInnerFetchJoin(EJBQLJoin join);
  
      boolean visitInnerJoin(EJBQLJoin join);
  
      boolean visitIntegerLiteral(EJBQLIntegerLiteral expression);
  
      boolean visitIsEmpty(EJBQLExpression expression);
  
      boolean visitIsNull(EJBQLExpression expression, int finishedChildIndex);
  
      boolean visitLength(EJBQLExpression expression, int finishedChildIndex);
  
      /**
       * Called on visiting "&lt;=" expression and also after visiting every expression child.
       * 
       * @param expression an "&lt;=" node being visited.
       * @param finishedChildIndex "-1" when the expression node is visited for the first
       *            time, before its children; otherwise this is an index of a child just
       *            visited.
       */
      boolean visitLessOrEqual(EJBQLExpression expression, int finishedChildIndex);
  
      /**
       * Called on visiting "&lt;" expression and also after visiting every expression child.
       * 
       * @param expression an "&lt;" node being visited.
       * @param finishedChildIndex "-1" when the expression node is visited for the first
       *            time, before its children; otherwise this is an index of a child just
       *            visited.
       */
      boolean visitLessThan(EJBQLExpression expression, int finishedChildIndex);
  
      /**
       * Called on visiting "LIKE" expression and also after visiting every expression
       * child.
       * 
       * @param expression an "LIKE" node being visited.
       * @param finishedChildIndex "-1" when the expression node is visited for the first
       *            time, before its children; otherwise this is an index of a child just
       *            visited.
       */
      boolean visitLike(EJBQLExpression expression, int finishedChildIndex);
  
      boolean visitLocate(EJBQLExpression expression, int finishedChildIndex);
  
      boolean visitLower(EJBQLExpression expression, int finishedChildIndex);
  
      boolean visitMax(EJBQLAggregateColumn expression);
  
      boolean visitMemberOf(EJBQLExpression expression);
  
      boolean visitMin(EJBQLAggregateColumn expression);
  
      boolean visitMod(EJBQLExpression expression, int finishedChildIndex);
  
      /**
       * Called on visiting "*" expression and also after visiting every expression child.
       * 
       * @param expression an "*" node being visited.
       * @param finishedChildIndex "-1" when the expression node is visited for the first
       *            time, before its children; otherwise this is an index of a child just
       *            visited.
       */
      boolean visitMultiply(EJBQLExpression expression, int finishedChildIndex);
  
      /**
       * <p>This method is invoked from the processing of the
       * {@link org.apache.cayenne.ejbql.parser.EJBQLIn} in order to handle a query such
       * as;</p>
       *
       * <div><code>p.toArtist IN (:artists)</code></div>
       */
  
      boolean visitNamedInputParameterForIn(EJBQLExpression expression);
  
      boolean visitNamedInputParameter(EJBQLExpression expression);
  
      boolean visitNegative(EJBQLExpression expression);
  
      boolean visitNot(EJBQLExpression expression);
  
      /**
       * Called on visiting "!=" expression and also after visiting every expression child.
       * 
       * @param expression an "!=" node being visited.
       * @param finishedChildIndex "-1" when the expression node is visited for the first
       *            time, before its children; otherwise this is an index of a child just
       *            visited.
       */
      boolean visitNotEquals(EJBQLExpression expression, int finishedChildIndex);
  
      /**
       * Called on visiting "or" expression and also after visiting every expression child.
       * 
       * @param expression an "or" node being visited.
       * @param finishedChildIndex "-1" when the expression node is visited for the first
       *            time, before its children; otherwise this is an index of a child just
       *            visited.
       */
      boolean visitOr(EJBQLExpression expression, int finishedChildIndex);
  
      boolean visitOrderBy(EJBQLExpression expression);
  
      boolean visitOrderByItem(EJBQLExpression expression);
  
      boolean visitOuterFetchJoin(EJBQLJoin join);
  
      boolean visitOuterJoin(EJBQLJoin join);
  
      /**
       * Called on visiting "path" expression and also after visiting every expression
       * child.
       * 
       * @param expression a "path" node being visited.
       * @param finishedChildIndex "-1" when the expression node is visited for the first
       *            time, before its children; otherwise this is an index of a child just
       *            visited.
       */
      boolean visitPath(EJBQLExpression expression, int finishedChildIndex);
      
      boolean visitDbPath(EJBQLExpression expression, int finishedChildIndex);
  
      boolean visitPatternValue(EJBQLExpression expression);
  
      /**
       * <p>This method is invoked from the processing of the
       * {@link org.apache.cayenne.ejbql.parser.EJBQLIn} in order to handle a query such
       * as;</p>
       *
       * <div><code>p.toArtist IN (?1)</code></div>
       */
  
      boolean visitPositionalInputParameterForIn(EJBQLPositionalInputParameter expression);
  
      boolean visitPositionalInputParameter(EJBQLPositionalInputParameter expression);
  
      boolean visitSelect(EJBQLExpression expression);
      
      boolean visitSelectClause(EJBQLExpression expression);
  
      boolean visitSelectExpression(EJBQLExpression expression);
  
      boolean visitSelectExpressions(EJBQLExpression expression);
  
      boolean visitSize(EJBQLExpression expression);
  
      boolean visitSqrt(EJBQLExpression expression, int finishedChildIndex);
  
      boolean visitStringLiteral(EJBQLExpression expression);
  
      boolean visitSubselect(EJBQLExpression expression);
  
      boolean visitSubstring(EJBQLExpression expression, int finishedChildIndex);
  
      /**
       * Called on visiting "subtract" expression and also after visiting every expression
       * child.
       * 
       * @param expression an "subtract" node being visited.
       * @param finishedChildIndex "-1" when the expression node is visited for the first
       *            time, before its children; otherwise this is an index of a child just
       *            visited.
       */
      boolean visitSubtract(EJBQLExpression expression, int finishedChildIndex);
  
      boolean visitSum(EJBQLAggregateColumn expression);
  
      boolean visitTok(EJBQLExpression expression);
  
      boolean visitTrim(EJBQLExpression expression, int finishedChildIndex);
  
      boolean visitTrimBoth(EJBQLExpression expression);
  
      boolean visitTrimCharacter(EJBQLExpression expression);
  
      boolean visitTrimLeading(EJBQLExpression expression);
  
      boolean visitTrimTrailing(EJBQLExpression expression);
  
      boolean visitUpdate(EJBQLExpression expression);
  
      boolean visitUpdateField(EJBQLExpression expression, int finishedChildIndex);
  
      boolean visitUpdateItem(EJBQLExpression expression, int finishedChildIndex);
  
      boolean visitUpdateValue(EJBQLExpression expression);
  
      boolean visitUpper(EJBQLExpression expression, int finishedChildIndex);
  
      boolean visitWhere(EJBQLExpression expression);
  }
  