blob: 61ad1a3bd5c869c895bf731e6722bd0d1bf9a8a8 [file] [log] [blame]
/*
* 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.parser;
import org.eclipse.persistence.jpa.jpql.utility.iterable.ListIterable;
/**
* This is the root interface of the parsed tree representation of a JPQL query. The way a JPQL
* query is parsed is based on the {@link JPQLGrammar JPQL grammar} used.
* <p>
* Provisional API: This interface is part of an interim API that is still under development and
* expected to change significantly before reaching stability. It is available at this early stage
* to solicit feedback from pioneering adopters on the understanding that any code that uses this
* API will almost certainly be broken (repeatedly) as the API evolves.
*
* @see JPQLGrammar
*
* @version 2.5
* @since 2.3
* @author Pascal Filion
*/
@SuppressWarnings("nls")
public interface Expression {
/**
* The constant for 'ABS'.
*/
String ABS = "ABS";
/**
* The constant for 'ALL'.
*/
String ALL = "ALL";
/**
* The constant for 'AND'.
*/
String AND = "AND";
/**
* The constant for 'ANY'.
*/
String ANY = "ANY";
/**
* The constant for 'AS'.
*/
String AS = "AS";
/**
* The constant for 'AS OF'.
*
* @since 2.5
*/
String AS_OF = "AS OF";
/**
* The constant for 'ASC'.
*/
String ASC = "ASC";
/**
* The constant for 'AVG'.
*/
String AVG = "AVG";
/**
* The constant for 'BETWEEN'.
*/
String BETWEEN = "BETWEEN";
/**
* The constant for 'BIT_LENGTH', which is an unused keyword.
*/
String BIT_LENGTH = "BIT_LENGTH";
/**
* The constant for 'BOTH'.
*/
String BOTH = "BOTH";
/**
* The constant for the identifier 'CASE'.
*/
String CASE = "CASE";
/**
* The constant for the identifier 'CAST'.
*
* @since 2.4
*/
String CAST = "CAST";
/**
* The constant for 'CHAR_LENGTH', which is an unused keyword.
*/
String CHAR_LENGTH = "CHAR_LENGTH";
/**
* The constant for 'CHARACTER_LENGTH', which is an unused keyword.
*/
String CHARACTER_LENGTH = "CHARACTER_LENGTH";
/**
* The constant for 'CLASS', which is an unused keyword.
*/
String CLASS = "CLASS";
/**
* The constant for 'COALESCE'.
*/
String COALESCE = "COALESCE";
/**
* The constant 'COLUMN', which is an EclipseLink specific identifier that was added in version 2.4.
*
* @since 2.4
*/
String COLUMN = "COLUMN";
/**
* The constant for 'CONCAT'.
*/
String CONCAT = "CONCAT";
/**
* The constant for 'CONNECT BY'.
*
* @since 2.5
*/
String CONNECT_BY = "CONNECT BY";
/**
* The constant for 'COUNT'.
*/
String COUNT = "COUNT";
/**
* The constant for 'CURRENT_DATE'.
*/
String CURRENT_DATE = "CURRENT_DATE";
/**
* The constant for 'CURRENT_DATE'.
*/
String CURRENT_TIME = "CURRENT_TIME";
/**
* The constant for 'CURRENT_TIMESTAMP'.
*/
String CURRENT_TIMESTAMP = "CURRENT_TIMESTAMP";
/**
* The constant for 'DELETE'.
*/
String DELETE = "DELETE";
/**
* The constant for 'DELETE FROM'.
*/
String DELETE_FROM = "DELETE FROM";
/**
* The constant for 'DESC'.
*/
String DESC = "DESC";
/**
* The constant for {@literal '<>'}.
*/
String DIFFERENT = "<>";
/**
* The constant for 'DISTINCT'.
*/
String DISTINCT = "DISTINCT";
/**
* The constant for the division sign '/'.
*/
String DIVISION = "/";
/**
* The constant for the identifier 'ELSE'.
*/
String ELSE = "ELSE";
/**
* The constant for 'EMPTY'.
*/
String EMPTY = "EMPTY";
/**
* The constant for the identifier 'END'.
*/
String END = "END";
/**
* The constant for 'ENTRY'.
*/
String ENTRY = "ENTRY";
/**
* The constant for '='.
*/
String EQUAL = "=";
/**
* The constant for 'ESCAPE'.
*/
String ESCAPE = "ESCAPE";
/**
* The constant for 'EXCEPT'.
*
* @since 2.4
*/
String EXCEPT = "EXCEPT";
/**
* The constant for 'EXISTS'.
*/
String EXISTS = "EXISTS";
/**
* The constant for 'EXTRACT'.
*
* @since 2.4
*/
String EXTRACT = "EXTRACT";
/**
* The constant for 'FALSE'.
*/
String FALSE = "FALSE";
/**
* A constant for 'FETCH'.
*/
String FETCH = "FETCH";
/**
* The constant for 'FIRST'.
*
* @since 2.5
*/
String FIRST = "FIRST";
/**
* The constant for 'FROM'.
*/
String FROM = "FROM";
/**
* The constant 'FUNC', which is an EclipseLink specific identifier that was added in version 2.1.
*/
String FUNC = "FUNC";
/**
* The constant 'FUNCTION', part of JPA 2.1.
*
* @since 2.4
*/
String FUNCTION = "FUNCTION";
/**
* The constant for {@literal '>'}.
*/
String GREATER_THAN = ">";
/**
* The constant for {@literal '>='}.
*/
String GREATER_THAN_OR_EQUAL = ">=";
/**
* The constant for 'GROUP BY'.
*/
String GROUP_BY = "GROUP BY";
/**
* The constant for 'HAVING'.
*/
String HAVING = "HAVING";
/**
* The constant for 'IN'.
*/
String IN = "IN";
/**
* The constant for 'INDEX'.
*/
String INDEX = "INDEX";
/**
* The constant for 'INNER'.
*/
String INNER = "INNER";
/**
* The constant for 'INNER JOIN'.
*/
String INNER_JOIN = "INNER JOIN";
/**
* The constant for 'INNER JOIN FETCH'.
*/
String INNER_JOIN_FETCH = "INNER JOIN FETCH";
/**
* The constant for 'INTERSECT'.
*
* @since 2.4
*/
String INTERSECT = "INTERSECT";
/**
* The constant for 'IS'.
*/
String IS = "IS";
/**
* The constant for 'IS EMPTY'.
*/
String IS_EMPTY = "IS EMPTY";
/**
* The constant for 'IS NOT EMPTY'.
*/
String IS_NOT_EMPTY = "IS NOT EMPTY";
/**
* The constant for 'IS NOT NULL'.
*/
String IS_NOT_NULL = "IS NOT NULL";
/**
* The constant for 'IS NULL'.
*/
String IS_NULL = "IS NULL";
/**
* The constant for 'JOIN'.
*/
String JOIN = "JOIN";
/**
* The constant for 'JOIN FETCH'.
*/
String JOIN_FETCH = "JOIN FETCH";
/**
* The constant for 'KEY'.
*/
String KEY = "KEY";
/**
* The constant for 'LAST'.
*
* @since 2.5
*/
String LAST = "LAST";
/**
* The constant for 'LEADING'.
*/
String LEADING = "LEADING";
/**
* The constant for 'LEFT'.
*/
String LEFT = "LEFT";
/**
* The constant for 'LEFT JOIN'.
*/
String LEFT_JOIN = "LEFT JOIN";
/**
* The constant for 'LEFT JOIN FETCH'.
*/
String LEFT_JOIN_FETCH = "LEFT JOIN FETCH";
/**
* The constant for 'LEFT OUTER JOIN'.
*/
String LEFT_OUTER_JOIN = "LEFT OUTER JOIN";
/**
* The constant for 'LEFT OUTER JOIN FETCH'.
*/
String LEFT_OUTER_JOIN_FETCH = "LEFT OUTER JOIN FETCH";
/**
* The constant for 'LENGTH'.
*/
String LENGTH = "LENGTH";
/**
* The constant for 'LIKE'.
*/
String LIKE = "LIKE";
/**
* The constant for 'LOCATE'.
*/
String LOCATE = "LOCATE";
/**
* The constant for 'LOWER'.
*/
String LOWER = "LOWER";
/**
* The constant for {@literal '<'}.
*/
String LOWER_THAN = "<";
/**
* The constant for {@literal '<='}.
*/
String LOWER_THAN_OR_EQUAL = "<=";
/**
* The constant for 'MAX'.
*/
String MAX = "MAX";
/**
* The constant for 'MEMBER'.
*/
String MEMBER = "MEMBER";
/**
* The constant for 'MEMBER OF'.
*/
String MEMBER_OF = "MEMBER OF";
/**
* The constant for 'MIN'.
*/
String MIN = "MIN";
/**
* The constant for the minus sign '-'.
*/
String MINUS = "-";
/**
* The constant for 'MOD'.
*/
String MOD = "MOD";
/**
* The constant for multiplication sign '*'.
*/
String MULTIPLICATION = "*";
/**
* The constant for ':'.
*/
String NAMED_PARAMETER = ":";
/**
* The constant for 'NEW'.
*/
String NEW = "NEW";
/**
* The constant for 'NOT'.
*/
String NOT = "NOT";
/**
* The constant for 'NOT BETWEEN'.
*/
String NOT_BETWEEN = "NOT BETWEEN";
/**
* The constant for '!='.
*
* @since 2.4
*/
String NOT_EQUAL = "!=";
/**
* The constant for 'NOT EXISTS'.
*/
String NOT_EXISTS = "NOT EXISTS";
/**
* The constant for 'NOT IN'.
*/
String NOT_IN = "NOT IN";
/**
* The constant for 'NOT LIKE'.
*/
String NOT_LIKE = "NOT LIKE";
/**
* The constant for 'NOT MEMBER'.
*/
String NOT_MEMBER = "NOT MEMBER";
/**
* The constant for 'NOT MEMBER OF'.
*/
String NOT_MEMBER_OF = "NOT MEMBER OF";
/**
* The constant for 'NULL'.
*/
String NULL = "NULL";
/**
* The constant for 'NULLIF'.
*/
String NULLIF = "NULLIF";
/**
* The constant for 'NULLS'.
*
* @since 2.5
*/
String NULLS = "NULLS";
/**
* The constant for 'NULLS FIRST'.
*
* @since 2.4
*/
String NULLS_FIRST = "NULLS FIRST";
/**
* The constant for 'NULLS LAST'.
*
* @since 2.4
*/
String NULLS_LAST = "NULLS LAST";
/**
* The constant for 'OBJECT'.
*/
String OBJECT = "OBJECT";
/**
* The constant for 'OF'.
*/
String OF = "OF";
/**
* The constant for 'ON', which is an EclipseLink specific identifier that was added in version 2.4.
*
* @since 2.4
*/
String ON = "ON";
/**
* The constant 'OPERATOR', which is an EclipseLink specific identifier that was added in version 2.4.
*
* @since 2.4
*/
String OPERATOR = "OPERATOR";
/**
* The constant for 'OR'.
*/
String OR = "OR";
/**
* The constant for 'ORDER BY'.
*/
String ORDER_BY = "ORDER BY";
/**
* The constant for 'ORDER SIBLINGS BY'.
*
* @since 2.5
*/
String ORDER_SIBLINGS_BY = "ORDER SIBLINGS BY";
/**
* The constant for 'OUTER'.
*/
String OUTER = "OUTER";
/**
* The constant for for the plus sign '+'.
*/
String PLUS = "+";
/**
* The constant for 'POSITION', which is an unused keyword.
*/
String POSITION = "POSITION";
/**
* The constant for '?'.
*/
String POSITIONAL_PARAMETER = "?";
/**
* The constant for single quote.
*/
String QUOTE = "'";
/**
* The constant for 'REGEXP'.
*
* @since 2.4
*/
String REGEXP = "REGEXP";
/**
* The constant for 'SCN'.
*
* @since 2.5
*/
String SCN = "SCN";
/**
* The constant for 'SELECT'.
*/
String SELECT = "SELECT";
/**
* The constant for 'SET'.
*/
String SET = "SET";
/**
* The constant for 'SIZE'.
*/
String SIZE = "SIZE";
/**
* The constant for 'SOME'.
*/
String SOME = "SOME";
/**
* The constant 'SQL', which is an EclipseLink specific identifier that was added in version 2.4.
*
* @since 2.4
*/
String SQL = "SQL";
/**
* The constant for 'SQRT'.
*/
String SQRT = "SQRT";
/**
* The constant for 'WHERE'.
*
*/
String START_WITH = "START WITH";
/**
* The constant for 'SUBSTRING'.
*/
String SUBSTRING = "SUBSTRING";
/**
* The constant for 'SUM'.
*/
String SUM = "SUM";
/**
* The constant for 'TABLE'.
*
* @since 2.4
*/
String TABLE = "TABLE";
/**
* The constant for 'THEN'.
*/
String THEN = "THEN";
/**
* The constant for 'TIMESTAMP'.
*
* @since 2.5
*/
String TIMESTAMP = "TIMESTAMP";
/**
* The constant for 'TRAILING'.
*/
String TRAILING = "TRAILING";
/**
* The constant for 'TREAT', which is an EclipseLink specific identifier that was added in version 2.1.
*/
String TREAT = "TREAT";
/**
* The constant for 'TRIM'.
*/
String TRIM = "TRIM";
/**
* The constant for 'TRUE'.
*/
String TRUE = "TRUE";
/**
* The constant for 'TYPE'.
*/
String TYPE = "TYPE";
/**
* The constant for 'UNION'.
*
* @since 2.4
*/
String UNION = "UNION";
/**
* The constant for 'UNKNOWN', which is an unused keyword.
*/
String UNKNOWN = "UNKNOWN";
/**
* The constant for 'UPDATE'.
*/
String UPDATE = "UPDATE";
/**
* The constant for 'UPPER'.
*/
String UPPER = "UPPER";
/**
* The constant for 'VALUE'.
*/
String VALUE = "VALUE";
/**
* The constant for the identifier 'WHEN'.
*/
String WHEN = "WHEN";
/**
* The constant for 'WHERE'.
*/
String WHERE = "WHERE";
/**
* Visits this {@link Expression} by the given {@link ExpressionVisitor visitor}.
*
* @param visitor The {@link ExpressionVisitor} to visit this object
*/
void accept(ExpressionVisitor visitor);
/**
* Visits the children of this {@link Expression}. This method can be used to optimize traversing
* the children since a new list is not created every time {@link #children()} is called.
* <p>
* This does not traverse the {@link Expression} sub-hierarchy, use a subclass of
* {@link AbstractTraverseChildrenVisitor} in order to traverse the entire sub-hierarchy.
*
* @param visitor The {@link ExpressionVisitor visitor} to visit the children of this object.
*/
void acceptChildren(ExpressionVisitor visitor);
/**
* Returns the children of this {@link Expression}.
*
* @return The children of this {@link Expression} or an empty {@link ListIterable}
*/
ListIterable<Expression> children();
/**
* Retrieves the {@link JPQLQueryBNF} that represents the fragment of this {@link Expression}
* that was used when parsing the given {@link Expression}.
*
* @param expression The {@link Expression} that is a descendant of this one
* @return The {@link JPQLQueryBNF} that was used to parse the given expression
* @since 2.5
*/
JPQLQueryBNF findQueryBNF(Expression expression);
/**
* Returns the {@link JPQLGrammar} that defines how the JPQL query was parsed.
*
* @return The {@link JPQLGrammar} that was used to parse this {@link Expression}
* @since 2.4
*/
JPQLGrammar getGrammar();
/**
* Returns the length of the string representation of this {@link Expression}, which is the
* length of the text generated by {@link #toActualText()}.
*
* @return The length of the string representation of this {@link Expression}
* @since 2.4
*/
int getLength();
/**
* Returns the position of this {@link Expression} within its parent hierarchy.
*
* @return The length of the string representation of what is coming before this object
* @since 2.4
*/
int getOffset();
/**
* Returns the parent of this {@link Expression}.
*
* @return The parent of this {@link Expression}, which is never <code>null</code> except for the
* root of the tree
*/
Expression getParent();
/**
* Returns the BNF of this {@link Expression}.
*
* @return The {@link JPQLQueryBNF}, which represents the grammar of this {@link Expression}
* @since 2.4
*/
JPQLQueryBNF getQueryBNF();
/**
* Retrieves the root node of the parsed tree hierarchy.
*
* @return The root of the {@link Expression} tree
*/
JPQLExpression getRoot();
/**
* Determines whether this {@link Expression} is a parent of the given {@link Expression}.
*
* @param expression The {@link Expression} to verify its paternity with this {@link Expression}
* @return <code>true</code> if this {@link Expression} is the same as the given {@link Expression}
* or one of its parent; <code>false</code> otherwise
*/
boolean isAncestor(Expression expression);
/**
* Returns the list representing this {@link Expression} and its children.
*
* @return The {@link Expression Expressions} representing this {@link Expression}
*/
ListIterable<Expression> orderedChildren();
/**
* Retrieves the <code>Expression</code> located at the given position using the actual query,
* which may have extra whitespace.
*
* @param position The array has one element and is the position of the {@link Expression} to retrieve
*/
void populatePosition(QueryPosition queryPosition, int position);
/**
* Generates a string representation of this {@link Expression}, which needs to include any
* characters that are considered virtual, i.e. that was parsed when the query is incomplete and
* is needed for functionality like content assist.
*
* @return The string representation of this {@link Expression}
*/
String toActualText();
/**
* Returns a string representation of this {@link Expression} and its children. The expression
* should contain whitespace even if the beautified version would not have any. For instance,
* "SELECT e " should be returned where {@link Expression#toActualText()} would return "SELECT e".
*
* @return The string representation of this {@link Expression}
*/
String toParsedText();
}