Class FunctionExpression
- java.lang.Object
-
- org.eclipse.persistence.expressions.Expression
-
- org.eclipse.persistence.internal.expressions.BaseExpression
-
- org.eclipse.persistence.internal.expressions.FunctionExpression
-
- All Implemented Interfaces:
java.io.Serializable,java.lang.Cloneable
- Direct Known Subclasses:
ArgumentListFunctionExpression
public class FunctionExpression extends BaseExpression
Used for expressions that have 0 to n children. These include not, between and all functions.- See Also:
- Serialized Form
-
-
Field Summary
Fields Modifier and Type Field Description protected java.util.Vector<Expression>childrenprotected ExpressionOperatoroperatorprotected ExpressionOperatorplatformOperatorprotected java.lang.ClassresultType-
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 FunctionExpression()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidaddChild(Expression child)DatabaseTablealiasForTable(DatabaseTable table)INTERNAL: Find the alias for a given tableExpressionasOf(AsOfClause clause)Sets all tables represented by this expression to be queried as of a past time.intcomputeHashCode()INTERNAL: Compute a consistent hash-code for the expression.Expressioncreate(Expression base, java.lang.Object singleArgument, ExpressionOperator anOperator)INTERNAL:Expressioncreate(Expression base, java.util.List arguments, ExpressionOperator anOperator)INTERNAL:ExpressioncreateWithBaseLast(Expression base, java.lang.Object singleArgument, ExpressionOperator anOperator)INTERNAL: added for Trim support.java.lang.StringdescriptionOfNodeType()INTERNAL: Used for debug printing.booleandoesConform(java.lang.Object object, AbstractSession session, AbstractRecord translationRow, int valueHolderPolicy, boolean isObjectUnregistered)INTERNAL: Check if the object conforms to the expression in memory.booleanequals(java.lang.Object object)INTERNAL: Return if the expression is equal to the other.java.util.Vector<Expression>getChildren()java.util.VectorgetFields()INTERNAL: Not to be confused with the public getField(String) This returns a collection of all fields associated with this object.DatabaseMappinggetLeafMapping(DatabaseQuery query, ClassDescriptor rootDescriptor, AbstractSession session)INTERNAL: Lookup the mapping for this item by traversing its expression recursively.protected QueryKeygetLeafQueryKeyFor(DatabaseQuery query, Expression expression, ClassDescriptor rootDescriptor, AbstractSession session)INTERNAL: Lookup the query key for this item.protected DatabaseMappinggetMappingOfFirstPrimaryKey(ClassDescriptor descriptor)ExpressionOperatorgetOperator()INTERNAL: Most expression have operators, so this is just a convenience method.ExpressionOperatorgetPlatformOperator(DatabasePlatform platform)java.lang.ClassgetResultType()java.util.List<DatabaseField>getSelectionFields(ReadQuery query)INTERNAL:booleanhasResultType()voidinitializePlatformOperator(DatabasePlatform platform)INTERNAL:booleanisFunctionExpression()INTERNAL:protected booleanisObjectComparison()INTERNAL: Return if the represents an object comparison.voiditerateOn(ExpressionIterator iterator)INTERNAL: For iterating using an inner classExpressionnormalize(ExpressionNormalizer normalizer)INTERNAL: Normalize into a structure that is printable.protected voidpostCopyIn(java.util.Map alreadyDone)INTERNAL: Used for cloning.voidprepareObjectAttributeCount(ExpressionNormalizer normalizer, ReportItem item, ReportQuery query, java.util.Map clonedExpressions)INTERNAL: JPQL allows count([distinct] e), where e can be an object, not just a single field, however the database only allows a single field, so object needs to be translated to a single field.voidprintJava(ExpressionJavaPrinter printer)INTERNAL: Print java for project class generationvoidprintSQL(ExpressionSQLPrinter printer)INTERNAL: Print SQL using the operator.ExpressionrebuildOn(Expression newBase)INTERNAL: This expression is built on a different base than the one we want.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.voidsetLocalBase(Expression exp)INTERNAL: Set the local base expression, ie the one on the other side of the operator Most types will ignore this, since they don't need it.voidsetOperator(ExpressionOperator theOperator)voidsetResultType(java.lang.Class resultType)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, AbstractSession session, AbstractRecord translationRow, int valueHolderPolicy, boolean isObjectUnregistered)INTERNAL: Return the value for in memory comparison.voidwriteDescriptionOn(java.io.BufferedWriter writer)INTERNAL: Used to print a debug form of the expression tree.voidwriteFields(ExpressionSQLPrinter printer, java.util.Vector newFields, SQLSelectStatement statement)INTERNAL: called from SQLSelectStatement.writeFieldsFromExpression(...)voidwriteSubexpressionsTo(java.io.BufferedWriter writer, int indent)INTERNAL: Used in SQL printing.-
Methods inherited from class org.eclipse.persistence.internal.expressions.BaseExpression
getBaseExpression, getBuilder, 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, anyOf, anyOfAllowingNone, anyOfAllowingNone, as, as, ascending, asciiValue, assignAlias, assignTableAliasesStartingAt, average, between, between, between, between, between, between, between, between, between, caseConditionStatement, caseConditionStatement, caseStatement, caseStatement, cast, clone, cloneUsing, coalesce, coalesce, concat, containsAllKeyWords, containsAnyKeyWords, containsSubstring, containsSubstring, containsSubstringIgnoringCase, containsSubstringIgnoringCase, convertNodeToUseOuterJoin, convertToUseOuterJoin, copiedVersionFrom, count, currentDate, currentDateDate, currentTime, currentTimeStamp, dateDifference, dateDifference, dateName, datePart, dateToString, decode, descending, difference, distinct, 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, get, getAlias, getAllowingNull, getAsOfClause, getAsOfClauseRecursively, getClonedField, getField, getField, getFieldValue, getFunction, getFunction, getFunction, getFunction, getFunction, getFunctionWithArguments, getFunctionWithArguments, getLeafDescriptor, getName, getNumberVal, getOperator, getOwnedTables, getParameter, getParameter, getParameter, getProperty, getSelectionFields, getSession, getStringVal, getTable, getTable, getTableAliases, greaterThan, greaterThan, greaterThan, greaterThan, greaterThan, greaterThan, greaterThan, greaterThan, greaterThan, greaterThan, greaterThanEqual, greaterThanEqual, greaterThanEqual, greaterThanEqual, greaterThanEqual, greaterThanEqual, greaterThanEqual, greaterThanEqual, greaterThanEqual, greaterThanEqual, hasAsOfClause, hasBeenAliased, hashCode, hexToRaw, ifNull, in, in, in, in, in, in, in, in, in, in, in, in, index, indexOf, intersect, intersect, intersectAll, intersectAll, isClassTypeExpression, isCompoundExpression, isConstantExpression, isDataExpression, isEmpty, isExpressionBuilder, isFieldExpression, isFragment, isLiteralExpression, isLogicalExpression, isMapEntryExpression, isNull, isObjectExpression, isParameterExpression, isQueryKeyExpression, isRelationExpression, isSubSelectExpression, isTableExpression, isTreatExpression, isValueExpression, join, lastDay, leftJoin, 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, registerIn, replace, replicate, replicate, resetCache, reverse, right, right, rightPad, rightPad, rightTrim, rightTrim, roundDate, selectIfOrderedBy, 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, treat, trim, trim, truncateDate, twist, type, union, union, unionAll, unionAll, validateNode, value, value, value, value, value, value, value, value, value, value, valueFromObject, variance, writeAlias, writeField
-
-
-
-
Field Detail
-
children
protected java.util.Vector<Expression> children
-
operator
protected ExpressionOperator operator
-
platformOperator
protected transient ExpressionOperator platformOperator
-
resultType
protected java.lang.Class resultType
-
-
Method Detail
-
equals
public boolean equals(java.lang.Object object)
INTERNAL: Return if the expression is equal to the other. This is used to allow dynamic expression's SQL to be cached. This must be over written by each subclass.- Overrides:
equalsin classExpression
-
computeHashCode
public int computeHashCode()
INTERNAL: Compute a consistent hash-code for the expression. This is used to allow dynamic expression's SQL to be cached.- Overrides:
computeHashCodein classExpression
-
addChild
public void addChild(Expression child)
-
aliasForTable
public DatabaseTable aliasForTable(DatabaseTable table)
INTERNAL: Find the alias for a given table- Overrides:
aliasForTablein classExpression
-
asOf
public Expression asOf(AsOfClause clause)
Description copied from class:ExpressionSets all tables represented by this expression to be queried as of a past time.Example:
EclipseLink: employee.asOf(new AsOfClause(pastTime)) Java: None SQL (Flashback): SELECT ... FROM EMPLOYEE AS OF TIMESTAMP (pastTime) t0 ... SQL (Generic): .. WHERE (t1.START <= pastTime) AND ((t1.END IS NULL) OR t1.END > pastTime)
Set an as of clause at the expression level to still query for current objects while expressing selection criteria like:
- query objects as of one time that met some condition at another time.
- query objects that changed a certain way over a certain interval (querying for change).
Simultaneously querying on two versions of the same object (one past one present) lets you express these advanced selection criteria.
Example: Querying on past attributes using parallel expressions.
// Finds all employees who lived in Ottawa as of a past time. ExpressionBuilder employee = new ExpressionBuilder(); ExpressionBuilder pastEmployee = new ExpressionBuilder(Employee.class); pastEmployee.asOf(pastTime); Expression pastAddress = pastEmployee.get("address"); // by default address will also be as of past time. Expression selectionCriteria = pastAddress.get("city").equal("Ottawa").and( employee.equal(pastEmployee));The advantage of the parallel expression is that you can still read current objects, the as of clause will affect only the where clause / selection criteria.
You may be tempted to rewrite the above as employee.get("address").asOf(pastTime). That is allowed but see below for the finer points involved in this.
Example: Querying on object changes using parallel expressions.
// Finds all employees who recently received a raise. Note that current // objects are returned, so can be cached normally. ExpressionBuilder employee = new ExpressionBuilder(); Expression pastEmployee = new ExpressionBuilder(Employee.class); pastEmployee.asOf(yesterday); Expression parallelJoin = employee.equal(pastEmployee); Expression selectionCriteria = parallelJoin.and( employee.get("salary").greaterThan(pastEmployee.get("salary")));Example: Querying on object changes using custom query keys
// First define the custom query key and add it to your descriptor. ExpressionBuilder builder = new ExpressionBuilder(Employee.class); Expression joinCriteria = builder.getField("EMPLOYEE.EMP_ID").equal(builder.getParameter("EMPLOYEE.EMP_ID")); OneToOneQueryKey selfReferential = new OneToOneQueryKey(); selfReferential.setName("this"); selfReferential.setJoinCriteria(joinCriteria); selfReferential.setReferenceClass(Employee.class); getSession().getDescriptor(Employee.class).addQueryKey(selfReferential); // Now build query as before. Expression employee = new ExpessionBuilder(); Expression pastEmployee = employee.get("this").asOf(yesterday); Expression selectionCriteria = employee.get("salary").greaterThan(pastEmployee.get("salary"));Note in general that any parallel expression can be rewritten using a custom query key. EclipseLink will even automatically interpret x.get("this") for you so you do not need to define the above query key first.
Full Reference:
If an object is mapped to multiple tables, then each table will be as of the same time. Two objects mapped to the same table can not have different as of times. Conversely only expressions which have associated tables can have an as of clause.
If an as of clause is not explicitly set an expression will use the clause of its base expression, and so on recursively until one is found or an ExpressionBuilder is reached. Some usage scenarios follow:
- employee.asOf(pastTime).anyOf("projects"): projects as of past time.
- expressionBuilder.asOf(pastTime): entire expression as of past time.
- employee.asOf(pastTime).anyOf("projects").asOf(null): projects as of current time.
- employee.anyOf("projects").asOf(pastTime): projects only as of past time.
Watch out for x.asOf(oneTime).get("y").asOf(anotherTime).
- emp.anyOf("phoneNumbers").asOf(yesterday) = emp.asOf(yesterday).anyOf("phoneNumbers") but:
- emp.get("address").asOf(yesterday) != emp.asOf(yesterday).get("address").
- Overrides:
asOfin classExpression- Parameters:
clause- A read only data object used to represent a past time.- Returns:
this- See Also:
AsOfClause,Expression.hasAsOfClause(),Session.acquireHistoricalSession(org.eclipse.persistence.history.AsOfClause),ObjectLevelReadQuery.setAsOfClause(org.eclipse.persistence.history.AsOfClause)
-
create
public Expression create(Expression base, java.lang.Object singleArgument, ExpressionOperator anOperator)
INTERNAL:- Overrides:
createin classExpression
-
createWithBaseLast
public Expression createWithBaseLast(Expression base, java.lang.Object singleArgument, ExpressionOperator anOperator)
INTERNAL: added for Trim support. TRIM([trim_character FROM] string_primary)- Overrides:
createWithBaseLastin classExpression
-
create
public Expression create(Expression base, java.util.List arguments, ExpressionOperator anOperator)
INTERNAL:- Overrides:
createin classExpression
-
descriptionOfNodeType
public java.lang.String descriptionOfNodeType()
INTERNAL: Used for debug printing.- Overrides:
descriptionOfNodeTypein classExpression
-
doesConform
public boolean doesConform(java.lang.Object object, AbstractSession session, AbstractRecord translationRow, int valueHolderPolicy, boolean isObjectUnregistered)INTERNAL: Check if the object conforms to the expression in memory. This is used for in-memory querying. If the expression in not able to determine if the object conform throw a not supported exception.- Overrides:
doesConformin classExpressionisObjectUnregistered- true if object possibly not a clone, but is being conformed against the unit of work cache; if object is not in the UOW cache but some of its attributes are, use the registered versions of object's attributes for the purposes of this method.
-
getChildren
public java.util.Vector<Expression> getChildren()
-
getFields
public java.util.Vector getFields()
INTERNAL: Not to be confused with the public getField(String) This returns a collection of all fields associated with this object. Really only applies to query keys representing an object or to expression builders.- Overrides:
getFieldsin classExpression
-
getSelectionFields
public java.util.List<DatabaseField> getSelectionFields(ReadQuery query)
INTERNAL:- Overrides:
getSelectionFieldsin classExpression
-
getOperator
public ExpressionOperator getOperator()
Description copied from class:ExpressionINTERNAL: Most expression have operators, so this is just a convenience method.- Overrides:
getOperatorin classExpression
-
getPlatformOperator
public ExpressionOperator getPlatformOperator(DatabasePlatform platform)
-
getResultType
public java.lang.Class getResultType()
-
hasResultType
public boolean hasResultType()
-
initializePlatformOperator
public void initializePlatformOperator(DatabasePlatform platform)
INTERNAL:
-
isFunctionExpression
public boolean isFunctionExpression()
Description copied from class:ExpressionINTERNAL:- Overrides:
isFunctionExpressionin classExpression
-
isObjectComparison
protected boolean isObjectComparison()
INTERNAL: Return if the represents an object comparison.
-
iterateOn
public void iterateOn(ExpressionIterator iterator)
INTERNAL: For iterating using an inner class- Overrides:
iterateOnin classExpression
-
normalize
public Expression normalize(ExpressionNormalizer normalizer)
INTERNAL: Normalize into a structure that is printable. Also compute printing information such as outer joins. This checks for object isNull, notNull, in and notIn comparisons.- Overrides:
normalizein classExpression
-
postCopyIn
protected void postCopyIn(java.util.Map alreadyDone)
INTERNAL: Used for cloning.- Overrides:
postCopyInin classBaseExpression
-
printSQL
public void printSQL(ExpressionSQLPrinter printer)
INTERNAL: Print SQL using the operator.- Specified by:
printSQLin classExpression
-
printJava
public void printJava(ExpressionJavaPrinter printer)
INTERNAL: Print java for project class generation- 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- 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 classBaseExpression
-
setLocalBase
public void setLocalBase(Expression exp)
Description copied from class:ExpressionINTERNAL: Set the local base expression, ie the one on the other side of the operator Most types will ignore this, since they don't need it.- Overrides:
setLocalBasein classExpression
-
setOperator
public void setOperator(ExpressionOperator theOperator)
-
setResultType
public void setResultType(java.lang.Class resultType)
-
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, AbstractSession session, AbstractRecord translationRow, int valueHolderPolicy, boolean isObjectUnregistered)INTERNAL: Return the value for in memory comparison. This is only valid for valueable expressions.- Overrides:
valueFromObjectin classExpressionisObjectUnregistered- true if object possibly not a clone, but is being conformed against the unit of work cache.
-
writeDescriptionOn
public void writeDescriptionOn(java.io.BufferedWriter writer) throws java.io.IOExceptionINTERNAL: Used to print a debug form of the expression tree.- Overrides:
writeDescriptionOnin classExpression- Throws:
java.io.IOException
-
writeFields
public void writeFields(ExpressionSQLPrinter printer, java.util.Vector newFields, SQLSelectStatement statement)
INTERNAL: called from SQLSelectStatement.writeFieldsFromExpression(...)- Overrides:
writeFieldsin classExpression
-
writeSubexpressionsTo
public void writeSubexpressionsTo(java.io.BufferedWriter writer, int indent) throws java.io.IOExceptionINTERNAL: Used in SQL printing.- Overrides:
writeSubexpressionsToin classExpression- Throws:
java.io.IOException
-
prepareObjectAttributeCount
public void prepareObjectAttributeCount(ExpressionNormalizer normalizer, ReportItem item, ReportQuery query, java.util.Map clonedExpressions)
INTERNAL: JPQL allows count([distinct] e), where e can be an object, not just a single field, however the database only allows a single field, so object needs to be translated to a single field. If the descriptor has a single pk, it is used, otherwise any pk is used if distinct, otherwise a subselect is used. If the object was obtained through an outer join, then the subselect also will not work, so an error is thrown.
-
getLeafQueryKeyFor
protected QueryKey getLeafQueryKeyFor(DatabaseQuery query, Expression expression, ClassDescriptor rootDescriptor, AbstractSession session) throws QueryException
INTERNAL: Lookup the query key for this item. If an aggregate of foreign mapping is found it is traversed.- Throws:
QueryException
-
getMappingOfFirstPrimaryKey
protected DatabaseMapping getMappingOfFirstPrimaryKey(ClassDescriptor descriptor)
-
getLeafMapping
public DatabaseMapping getLeafMapping(DatabaseQuery query, ClassDescriptor rootDescriptor, AbstractSession session)
INTERNAL: Lookup the mapping for this item by traversing its expression recursively.- Overrides:
getLeafMappingin classExpression
-
-