Class ExpressionBuilder
- java.lang.Object
-
- org.eclipse.persistence.expressions.Expression
-
- org.eclipse.persistence.internal.expressions.BaseExpression
-
- org.eclipse.persistence.internal.expressions.DataExpression
-
- org.eclipse.persistence.internal.expressions.ObjectExpression
-
- org.eclipse.persistence.expressions.ExpressionBuilder
-
- All Implemented Interfaces:
java.io.Serializable,java.lang.Cloneable
public class ExpressionBuilder extends org.eclipse.persistence.internal.expressions.ObjectExpressionPurpose: Allow for instances of expression to be created. Expressions are Java object-level representations of SQL "where" clauses. The expressions attempt to mirror Java code as closely as possible.
Example:
ExpressionBuilder employee = new ExpressionBuilder(); employee.get("firstName").equal("Bob").and(employee.get("lastName").equal("Smith")) >> equivalent Java code: (employee.getFirstName().equals("Bob")) && (employee.getLastName().equals("Smith")) >> equivalent SQL: (F_NAME = 'Bob') AND (L_NAME = 'Smith')- See Also:
Expression, Serialized Form
-
-
Field Summary
Fields Modifier and Type Field Description protected org.eclipse.persistence.internal.helper.DatabaseTablealiasedViewTableprotected java.lang.ClassqueryClassprotected org.eclipse.persistence.internal.sessions.AbstractSessionsessionprotected org.eclipse.persistence.internal.expressions.SQLSelectStatementstatementprotected org.eclipse.persistence.internal.helper.DatabaseTableviewTableprotected booleanwasAdditionJoinCriteriaUsedprotected booleanwasQueryClassSetInternally-
Fields inherited from class org.eclipse.persistence.internal.expressions.ObjectExpression
castClass, derivedExpressions, descriptor, hasBeenAliased, joinSource, onClause, shouldUseOuterJoin, shouldUseOuterJoinForMultitableInheritance
-
Fields inherited from class org.eclipse.persistence.internal.expressions.DataExpression
asOfClause, derivedFields, derivedTables, hasBeenNormalized, tableAliases
-
Fields inherited from class org.eclipse.persistence.internal.expressions.BaseExpression
baseExpression, builder
-
Fields inherited from class org.eclipse.persistence.expressions.Expression
currentAlias, hashCode, lastTable, selectIfOrderedBy, shouldUseUpperCaseForIgnoreCase
-
-
Constructor Summary
Constructors Constructor Description ExpressionBuilder()PUBLIC: Create a new ExpressionBuilder.ExpressionBuilder(java.lang.Class queryClass)ADVANCED: Create a new ExpressionBuilder representing instances of the argument class.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description org.eclipse.persistence.internal.helper.DatabaseTablealiasForTable(org.eclipse.persistence.internal.helper.DatabaseTable table)INTERNAL: Find the alias for a given table.intassignTableAliasesStartingAt(int initialValue)INTERNAL: Assign aliases to any tables which I own.java.lang.StringdescriptionOfNodeType()INTERNAL: Used for debug printing.booleandoesNotRepresentAnObjectInTheQuery()INTERNAL: There are cases (which we might want to eliminate?)booleanequals(java.lang.Object expression)INTERNAL: Return if the expression is equal to the other.org.eclipse.persistence.internal.helper.DatabaseTablegetAliasedViewTable()INTERNAL:ExpressionBuildergetBuilder()INTERNAL: Return the expression builder which is the ultimate base of this expression, or null if there isn't one (shouldn't happen if we start from a root)ClassDescriptorgetDescriptor()INTERNAL: Only usable after the session and class have been set.ClassDescriptorgetLeafDescriptor(DatabaseQuery query, ClassDescriptor rootDescriptor, org.eclipse.persistence.internal.sessions.AbstractSession session)INTERNAL: Lookup the descriptor for this item by traversing its expression recursively.java.lang.ClassgetQueryClass()INTERNAL:org.eclipse.persistence.internal.sessions.AbstractSessiongetSession()INTERNAL:org.eclipse.persistence.internal.expressions.SQLSelectStatementgetStatement()INTERNAL: Return the statement that expression is for.org.eclipse.persistence.internal.helper.DatabaseTablegetViewTable()INTERNAL:booleanhasViewTable()INTERNAL:booleanisExpressionBuilder()INTERNAL:Expressionnormalize(org.eclipse.persistence.internal.expressions.ExpressionNormalizer normalizer)INTERNAL: Normalize the expression into a printable structure.voidprintJava(org.eclipse.persistence.internal.expressions.ExpressionJavaPrinter printer)INTERNAL: Print javaExpressionrebuildOn(Expression newBase)INTERNAL: This expression is built on a different base than the one we want.protected ExpressionregisterIn(java.util.Map alreadyDone)INTERNAL: Override Expression.registerIn to check if the new base expression has already been provided for the clone.voidresetPlaceHolderBuilder(ExpressionBuilder queryBuilder)INTERNAL: Search the tree for any expressions (like SubSelectExpressions) that have been built using a builder that is not attached to the query.voidsetQueryClass(java.lang.Class queryClass)INTERNAL: Set the class which this node represents.voidsetQueryClassAndDescriptor(java.lang.Class queryClass, ClassDescriptor descriptor)INTERNAL: Set the class and descriptor which this node represents.voidsetSession(org.eclipse.persistence.internal.sessions.AbstractSession session)INTERNAL: Set the session in which we expect this expression to be translated.voidsetStatement(org.eclipse.persistence.internal.expressions.SQLSelectStatement statement)INTERNAL: Set the statement that expression is for.voidsetViewTable(org.eclipse.persistence.internal.helper.DatabaseTable theTable)INTERNAL: This expression represents something read through a view table.voidsetWasAdditionJoinCriteriaUsed(boolean joinCriteriaUsed)INTERNAL: If the additional Join Criteria for the class this builder represents has been added to the statement then mark this as true.ExpressiontwistedForBaseAndContext(Expression newBase, Expression context, Expression oldBase)INTERNAL: Rebuild myself against the base, with the values of parameters supplied by the context expression.java.lang.ObjectvalueFromObject(java.lang.Object object, org.eclipse.persistence.internal.sessions.AbstractSession session, org.eclipse.persistence.internal.sessions.AbstractRecord translationRow, int valueHolderPolicy, boolean isObjectUnregistered)INTERNAL: The expression builder represent the entire object, just return it.booleanwasAdditionJoinCriteriaUsed()INTERNAL: If the additional Join Criteria for the class this builder represents has been added to the statement this method will return true;booleanwasQueryClassSetInternally()INTERNAL: Returns true if TopLink set the query class as opposed to the customer.voidwriteDescriptionOn(java.io.BufferedWriter writer)INTERNAL: For debug printing purposes.-
Methods inherited from class org.eclipse.persistence.internal.expressions.ObjectExpression
addDerivedExpression, additionalExpressionCriteria, additionalExpressionCriteriaMap, anyOf, anyOfAllowingNone, clearAliases, convertToCastDescriptor, copyDerivedExpressions, derivedExpressionNamed, derivedManualExpressionNamed, doNotUseOuterJoin, doUseOuterJoin, existingDerivedExpressionNamed, get, getAdditionalTables, getAllowingNull, getCastClass, getFields, getFirstNonAggregateExpressionAfterExpressionBuilder, getForUpdateOfFields, getJoinSource, getManualQueryKey, getOnClause, getOuterJoinExpIndex, getOwnedTables, getRelationTable, getSelectionFields, hasBeenAliased, hasDerivedExpressions, isDirectCollection, isDowncast, isObjectExpression, isTreatUsed, isUsingOuterJoinForMultitableInheritance, join, leftJoin, newDerivedExpressionNamed, newManualDerivedExpressionNamed, postCopyIn, postCopyIn, setCastClass, setJoinSource, setOnClause, setOuterJoinExpIndex, setShouldUseOuterJoinForMultitableInheritance, shouldUseOuterJoin, shouldUseOuterJoinForMultitableInheritance, treat, type, writeForUpdateOfFields
-
Methods inherited from class org.eclipse.persistence.internal.expressions.DataExpression
addDerivedField, addDerivedTable, asOf, assignAlias, assignAlias, copyCollection, existingDerivedField, existingDerivedTable, getAlias, getAliasedField, getAsOfClause, getContainingDescriptor, getField, getField, getField, getMapping, getQueryKeyOrNull, getTable, getTable, getTableAliases, hasAsOfClause, hasBeenNormalized, hasDerivedFields, hasDerivedTables, isAttribute, isDataExpression, iterateOn, newDerivedField, newDerivedTable, printSQL, setHasBeenNormalized, setTableAliases, tableAliasesDescription, writeSubexpressionsTo
-
Methods inherited from class org.eclipse.persistence.internal.expressions.BaseExpression
getBaseExpression, setBaseExpression, shallowClone
-
Methods inherited from class org.eclipse.persistence.expressions.Expression
addDate, addDate, addMonths, addMonths, alias, all, all, all, all, all, all, all, all, all, all, all, all, all, allOf, and, any, any, any, any, any, any, any, any, any, any, any, any, any, anyOf, anyOfAllowingNone, as, as, ascending, asciiValue, average, between, between, between, between, between, between, between, between, between, caseConditionStatement, caseConditionStatement, caseStatement, caseStatement, cast, clone, cloneUsing, coalesce, coalesce, computeHashCode, concat, containsAllKeyWords, containsAnyKeyWords, containsSubstring, containsSubstring, containsSubstringIgnoringCase, containsSubstringIgnoringCase, convertNodeToUseOuterJoin, convertToUseOuterJoin, copiedVersionFrom, count, create, create, createWithBaseLast, currentDate, currentDateDate, currentTime, currentTimeStamp, dateDifference, dateDifference, dateName, datePart, dateToString, decode, descending, difference, distinct, doesConform, doesConform, equal, equal, equal, equal, equal, equal, equal, equal, equal, equal, equalOuterJoin, equalOuterJoin, equalsIgnoreCase, equalsIgnoreCase, except, except, exceptAll, exceptAll, exists, existsNode, extract, extractFields, extractPrimaryKeyValues, extractValue, extractValues, extractXml, from, fromConstant, fromLiteral, get, getAsOfClauseRecursively, getClonedField, getFieldValue, getFunction, getFunction, getFunction, getFunction, getFunction, getFunctionWithArguments, getFunctionWithArguments, getLeafMapping, getName, getNumberVal, getOperator, getOperator, getParameter, getParameter, getParameter, getProperty, getSelectionFields, getStringVal, greaterThan, greaterThan, greaterThan, greaterThan, greaterThan, greaterThan, greaterThan, greaterThan, greaterThan, greaterThan, greaterThanEqual, greaterThanEqual, greaterThanEqual, greaterThanEqual, greaterThanEqual, greaterThanEqual, greaterThanEqual, greaterThanEqual, greaterThanEqual, greaterThanEqual, hashCode, hexToRaw, ifNull, in, in, in, in, in, in, in, in, in, in, in, in, index, indexOf, intersect, intersect, intersectAll, intersectAll, isClassTypeExpression, isCompoundExpression, isConstantExpression, isEmpty, isFieldExpression, isFragment, isFunctionExpression, isLiteralExpression, isLogicalExpression, isMapEntryExpression, isNull, isParameterExpression, isQueryKeyExpression, isRelationExpression, isSubSelectExpression, isTableExpression, isTreatExpression, isValueExpression, lastDay, leftPad, leftPad, leftTrim, leftTrim, length, lessThan, lessThan, lessThan, lessThan, lessThan, lessThan, lessThan, lessThan, lessThan, lessThan, lessThanEqual, lessThanEqual, lessThanEqual, lessThanEqual, lessThanEqual, lessThanEqual, lessThanEqual, lessThanEqual, lessThanEqual, lessThanEqual, like, like, like, like, likeIgnoreCase, likeIgnoreCase, literal, locate, locate, locate, mapEntry, mapKey, maximum, minimum, monthsBetween, newTime, nextDay, noneOf, not, notBetween, notBetween, notBetween, notBetween, notBetween, notBetween, notBetween, notBetween, notBetween, notEmpty, notEqual, notEqual, notEqual, notEqual, notEqual, notEqual, notEqual, notEqual, notEqual, notEqual, notExists, notIn, notIn, notIn, notIn, notIn, notIn, notIn, notIn, notIn, notIn, notIn, notIn, notLike, notLike, notLike, notLike, notNull, nullIf, nullsFirst, nullsLast, operator, or, performOperator, postfixSQL, prefixSQL, ref, regexp, regexp, replace, replicate, replicate, resetCache, reverse, right, right, rightPad, rightPad, rightTrim, rightTrim, roundDate, selectIfOrderedBy, setLocalBase, setSelectIfOrderedBy, size, size, some, some, some, some, some, some, some, some, some, some, some, some, some, sql, standardDeviation, subQuery, substring, substring, substring, substring, sum, toChar, toChar, toCharacter, toDate, toLowerCase, toNumber, toString, toString, toUpperCase, toUppercaseCasedWords, translate, trim, trim, truncateDate, twist, union, union, unionAll, unionAll, validateNode, value, value, value, value, value, value, value, value, value, value, valueFromObject, variance, writeAlias, writeField, writeFields
-
-
-
-
Field Detail
-
session
protected transient org.eclipse.persistence.internal.sessions.AbstractSession session
-
queryClass
protected java.lang.Class queryClass
-
statement
protected org.eclipse.persistence.internal.expressions.SQLSelectStatement statement
-
viewTable
protected org.eclipse.persistence.internal.helper.DatabaseTable viewTable
-
aliasedViewTable
protected org.eclipse.persistence.internal.helper.DatabaseTable aliasedViewTable
-
wasQueryClassSetInternally
protected boolean wasQueryClassSetInternally
-
wasAdditionJoinCriteriaUsed
protected boolean wasAdditionJoinCriteriaUsed
-
-
Constructor Detail
-
ExpressionBuilder
public ExpressionBuilder()
PUBLIC: Create a new ExpressionBuilder.
-
ExpressionBuilder
public ExpressionBuilder(java.lang.Class queryClass)
ADVANCED: Create a new ExpressionBuilder representing instances of the argument class. This can be used for the purpose of parallel expressions. This is a type of query that searches on the relationship between to un-related objects.
-
-
Method Detail
-
equals
public boolean equals(java.lang.Object expression)
INTERNAL: Return if the expression is equal to the other. This is used to allow dynamic expression's SQL to be cached.- Overrides:
equalsin classorg.eclipse.persistence.internal.expressions.ObjectExpression
-
aliasForTable
public org.eclipse.persistence.internal.helper.DatabaseTable aliasForTable(org.eclipse.persistence.internal.helper.DatabaseTable table)
INTERNAL: Find the alias for a given table. Handle the special case where we are bogus and it should be aliased against our derived tables instead.- Overrides:
aliasForTablein classorg.eclipse.persistence.internal.expressions.DataExpression
-
assignTableAliasesStartingAt
public int assignTableAliasesStartingAt(int initialValue)
INTERNAL: Assign aliases to any tables which I own. Start with t(initialValue), and return the new value of the counter , i.e. if initialValue is one and I have tables ADDRESS and EMPLOYEE I will assign them t1 and t2 respectively, and return 3.- Overrides:
assignTableAliasesStartingAtin classorg.eclipse.persistence.internal.expressions.ObjectExpression
-
descriptionOfNodeType
public java.lang.String descriptionOfNodeType()
INTERNAL: Used for debug printing.- Overrides:
descriptionOfNodeTypein classExpression
-
doesNotRepresentAnObjectInTheQuery
public boolean doesNotRepresentAnObjectInTheQuery()
INTERNAL: There are cases (which we might want to eliminate?) where the expression builder doesn't actually correspond to an object to be read. Mostly this is the case where it's a data query in terms of tables, and the builder is only there to provide a base. It might be better to make tables able to serve as their own base, but it's very nice to have a known unique, shared base. In the meantime, this is a special case to make sure the builder doesn't get tables assigned.
-
getAliasedViewTable
public org.eclipse.persistence.internal.helper.DatabaseTable getAliasedViewTable()
INTERNAL:
-
getBuilder
public ExpressionBuilder getBuilder()
INTERNAL: Return the expression builder which is the ultimate base of this expression, or null if there isn't one (shouldn't happen if we start from a root)- Overrides:
getBuilderin classorg.eclipse.persistence.internal.expressions.BaseExpression
-
getDescriptor
public ClassDescriptor getDescriptor()
INTERNAL: Only usable after the session and class have been set. Return the descriptor for the class this node represents.- Overrides:
getDescriptorin classorg.eclipse.persistence.internal.expressions.ObjectExpression
-
getQueryClass
public java.lang.Class getQueryClass()
INTERNAL:
-
getSession
public org.eclipse.persistence.internal.sessions.AbstractSession getSession()
INTERNAL:- Overrides:
getSessionin classExpression
-
getStatement
public org.eclipse.persistence.internal.expressions.SQLSelectStatement getStatement()
INTERNAL: Return the statement that expression is for. This is used for the context in subselects.
-
getViewTable
public org.eclipse.persistence.internal.helper.DatabaseTable getViewTable()
INTERNAL:
-
hasViewTable
public boolean hasViewTable()
INTERNAL:
-
isExpressionBuilder
public boolean isExpressionBuilder()
INTERNAL:- Overrides:
isExpressionBuilderin classExpression
-
normalize
public Expression normalize(org.eclipse.persistence.internal.expressions.ExpressionNormalizer normalizer)
INTERNAL: Normalize the expression into a printable structure. Any joins must be added to form a new root.- Overrides:
normalizein classorg.eclipse.persistence.internal.expressions.DataExpression
-
printJava
public void printJava(org.eclipse.persistence.internal.expressions.ExpressionJavaPrinter printer)
INTERNAL: Print java- Overrides:
printJavain classExpression
-
rebuildOn
public Expression rebuildOn(Expression newBase)
INTERNAL: This expression is built on a different base than the one we want. Rebuild it and return the root of the new tree This assumes that the original expression has only a single builder.- Specified by:
rebuildOnin classExpression- See Also:
Expression.cloneUsing(Expression newBase)
-
resetPlaceHolderBuilder
public void resetPlaceHolderBuilder(ExpressionBuilder queryBuilder)
INTERNAL: Search the tree for any expressions (like SubSelectExpressions) that have been built using a builder that is not attached to the query. This happens in case of an Exists call using a new ExpressionBuilder(). This builder needs to be replaced with one from the query.- Overrides:
resetPlaceHolderBuilderin classorg.eclipse.persistence.internal.expressions.BaseExpression
-
registerIn
protected Expression registerIn(java.util.Map alreadyDone)
INTERNAL: Override Expression.registerIn to check if the new base expression has already been provided for the clone.- Overrides:
registerInin classExpression- See Also:
Expression.cloneUsing(Expression)- Related Bugs:
- 2637484 INVALID QUERY KEY EXCEPTION THROWN USING BATCH READS AND PARALLEL EXPRESSIONS
-
setQueryClass
public void setQueryClass(java.lang.Class queryClass)
INTERNAL: Set the class which this node represents.
-
setQueryClassAndDescriptor
public void setQueryClassAndDescriptor(java.lang.Class queryClass, ClassDescriptor descriptor)INTERNAL: Set the class and descriptor which this node represents.
-
setSession
public void setSession(org.eclipse.persistence.internal.sessions.AbstractSession session)
INTERNAL: Set the session in which we expect this expression to be translated. Stored session shall always be root session.
-
setStatement
public void setStatement(org.eclipse.persistence.internal.expressions.SQLSelectStatement statement)
INTERNAL: Set the statement that expression is for. This is used for the context in subselects.
-
setViewTable
public void setViewTable(org.eclipse.persistence.internal.helper.DatabaseTable theTable)
INTERNAL: This expression represents something read through a view table.
-
setWasAdditionJoinCriteriaUsed
public void setWasAdditionJoinCriteriaUsed(boolean joinCriteriaUsed)
INTERNAL: If the additional Join Criteria for the class this builder represents has been added to the statement then mark this as true. This will prevent TopLink from adding it again at normalization
-
twistedForBaseAndContext
public Expression twistedForBaseAndContext(Expression newBase, Expression context, Expression oldBase)
INTERNAL: Rebuild myself against the base, with the values of parameters supplied by the context expression. This is used for transforming a standalone expression (e.g. the join criteria of a mapping) into part of some larger expression. You normally would not call this directly, instead calling twist See the comment there for more details.- Overrides:
twistedForBaseAndContextin classExpression
-
valueFromObject
public java.lang.Object valueFromObject(java.lang.Object object, org.eclipse.persistence.internal.sessions.AbstractSession session, org.eclipse.persistence.internal.sessions.AbstractRecord translationRow, int valueHolderPolicy, boolean isObjectUnregistered)INTERNAL: The expression builder represent the entire object, just return it.- Overrides:
valueFromObjectin classExpressionisObjectUnregistered- true if object possibly not a clone, but is being conformed against the unit of work cache.
-
wasAdditionJoinCriteriaUsed
public boolean wasAdditionJoinCriteriaUsed()
INTERNAL: If the additional Join Criteria for the class this builder represents has been added to the statement this method will return true;
-
wasQueryClassSetInternally
public boolean wasQueryClassSetInternally()
INTERNAL: Returns true if TopLink set the query class as opposed to the customer. This is important in determining if this Expression should be treated as a parallel expression during normalization
-
getLeafDescriptor
public ClassDescriptor getLeafDescriptor(DatabaseQuery query, ClassDescriptor rootDescriptor, org.eclipse.persistence.internal.sessions.AbstractSession session)
INTERNAL: Lookup the descriptor for this item by traversing its expression recursively.- Overrides:
getLeafDescriptorin classExpression
-
writeDescriptionOn
public void writeDescriptionOn(java.io.BufferedWriter writer) throws java.io.IOExceptionINTERNAL: For debug printing purposes.- Overrides:
writeDescriptionOnin classExpression- Throws:
java.io.IOException
-
-