| /* |
| * 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(); |
| } |