public void setSelectionCriteria(Expression expression) { super.setSelectionCriteria(expression); if ((expression != null) && (defaultBuilder != null)) { // For flashback: Must make sure expression and defaultBuilder always in sync. ExpressionBuilder newBuilder = expression.getBuilder(); if ( (newBuilder != defaultBuilder) && (newBuilder.getQueryClass() == null || newBuilder.getQueryClass().equals(defaultBuilder.getQueryClass()) )){ defaultBuilder = newBuilder; } } }
/** * INTERNAL: * For debug printing purposes. */ public void writeDescriptionOn(BufferedWriter writer) throws IOException { String className; if (getQueryClass() == null) { className = "QUERY OBJECT"; } else { className = getQueryClass().getName(); } writer.write(className + tableAliasesDescription()); } }
/** * INTERNAL: * Only usable after the session and class have been set. Return the * descriptor for the class this node represents. */ public ClassDescriptor getDescriptor() { if (descriptor == null) { if (getQueryClass() == null) { return null; } else { if (getSession() == null) { throw QueryException.noExpressionBuilderFound(this); } descriptor = getSession().getDescriptor(getQueryClass()); } } return descriptor; }
/** * ADVANCED: * Set all of the objects from the given Expression to be invalid in the TopLink Identity Maps */ public void invalidateObjects(Expression selectionCriteria) { invalidateObjects(getAllFromIdentityMap(selectionCriteria, selectionCriteria.getBuilder().getQueryClass(), new DatabaseRecord(1))); }
/** * INTERNAL: * Used for joining in conjunction with pessimistic locking * Iterate through a list of joined expressions and ensure expression is set on the locking * clause for each expression that represents a pessimisically locked descriptor. */ private void setupLockingClauseForJoinedExpressions(List joinedExpressions, AbstractSession session) { // Must iterate over all of the joined attributes, just check // if any of them have pessimistic locking defined on the descriptor. for (Iterator e = joinedExpressions.iterator(); e.hasNext();) { Expression expression = (Expression)e.next(); // Expression has not yet been validated. if (expression.isObjectExpression()) { ObjectExpression joinedAttribute = (ObjectExpression)expression; // Expression may not have been initialized. joinedAttribute.getBuilder().setSession(session.getRootSession(null)); if (joinedAttribute.getBuilder().getQueryClass() == null){ joinedAttribute.getBuilder().setQueryClass(descriptor.getJavaClass()); } ClassDescriptor nestedDescriptor = null;// joinedAttribute.getDescriptor(); // expression may not be valid, no descriptor, validation occurs later. if (nestedDescriptor == null) { return; } } } return; }
/** * PUBLIC: * Return an expression that is the boolean logical combination of both expressions. * This is equivalent to the SQL "OR" operator and the Java "||" operator. * <p>Example: * <pre><blockquote> * TopLink: employee.get("firstName").equal("Bob").OR(employee.get("lastName").equal("Smith")) * Java: (employee.getFirstName().equals("Bob")) || (employee.getLastName().equals("Smith")) * SQL: F_NAME = 'Bob' OR L_NAME = 'Smith' * </blockquote></pre> */ public Expression or(Expression theExpression) { // Allow ands with null. if (theExpression == null) { return this; } ExpressionBuilder base = getBuilder(); Expression expressionToUse = theExpression; // Ensure the same builder, unless a parralel query is used. if ((theExpression.getBuilder() != base) && (theExpression.getBuilder().getQueryClass() == null)) { expressionToUse = theExpression.rebuildOn(base); } if (base == this) {// Allow and to be sent to the builder. return expressionToUse; } ExpressionOperator anOperator = getOperator(ExpressionOperator.Or); return anOperator.expressionFor(this, expressionToUse); }
/** * PUBLIC: * Return an expression that is the boolean logical combination of both expressions. * This is equivalent to the SQL "AND" operator and the Java "&&" operator. * <p>Example: * <pre><blockquote> * TopLink: employee.get("firstName").equal("Bob").and(employee.get("lastName").equal("Smith")) * Java: (employee.getFirstName().equals("Bob")) && (employee.getLastName().equals("Smith")) * SQL: F_NAME = 'Bob' AND L_NAME = 'Smith' * </blockquote></pre> */ public Expression and(Expression theExpression) { // Allow ands with null. if (theExpression == null) { return this; } ExpressionBuilder base = getBuilder(); Expression expressionToUse = theExpression; // Ensure the same builder, unless a parralel query is used. // For flashback added an extra condition: if left side is a 'NullExpression' // then rebuild on it regardless. if ((theExpression.getBuilder() != base) && ((base == this) || (theExpression.getBuilder().getQueryClass() == null))) { expressionToUse = theExpression.rebuildOn(base); } if (base == this) {// Allow and to be sent to the builder. return expressionToUse; } ExpressionOperator anOperator = getOperator(ExpressionOperator.And); return anOperator.expressionFor(this, expressionToUse); }
if (objectExpression.getBuilder().getQueryClass() == null){ objectExpression.getBuilder().setQueryClass(descriptor.getJavaClass());
Class queryClass = builder.getQueryClass();
/** * Validate and prepare the join expression. */ protected void prepareJoinExpression(Expression expression, AbstractSession session) { // Must be query key expression. if (!expression.isQueryKeyExpression()) { throw QueryException.mappingForExpressionDoesNotSupportJoining(expression); } QueryKeyExpression objectExpression = (QueryKeyExpression)expression; // Expression may not have been initialized. objectExpression.getBuilder().setSession(session.getRootSession(null)); if (objectExpression.getBuilder().getQueryClass() == null){ objectExpression.getBuilder().setQueryClass(descriptor.getJavaClass()); } // Can only join relationships. if ((objectExpression.getMapping() == null) || (!objectExpression.getMapping().isJoiningSupported())) { throw QueryException.mappingForExpressionDoesNotSupportJoining(objectExpression); } // Search if any of the expression traverse a 1-m. ObjectExpression baseExpression = objectExpression; while (!baseExpression.isExpressionBuilder()) { if (((QueryKeyExpression)baseExpression).shouldQueryToManyRelationship()) { setIsToManyJoinQuery(true); } if (((QueryKeyExpression)baseExpression).shouldUseOuterJoin()) { setIsOuterJoinedAttributeQuery(true); } baseExpression = (ObjectExpression)((QueryKeyExpression)baseExpression).getBaseExpression(); } }
Class queryClass = ((ExpressionBuilder)expression).getQueryClass(); if ((queryClass != null) && (queryClass != getReferenceClass())) { return getSession().getDescriptor(queryClass);
newDescriptor = getSession().getDescriptor(((ExpressionBuilder)baseExp).getQueryClass());
if (query.isObjectLevelReadQuery()){ ExpressionBuilder builder = ((ObjectLevelReadQuery)query).getExpressionBuilder(); if ((additionalJoin.getBuilder() != builder) && (additionalJoin.getBuilder().getQueryClass() == null)) { if ((!isSubSelect) && (builder != null)) { builder = (ExpressionBuilder)builder.copiedVersionFrom(clonedExpressions);
if (getAttributeExpression() != null){ if (getAttributeExpression().isExpressionBuilder()) { Class resultClass = ((ExpressionBuilder)getAttributeExpression()).getQueryClass(); if (resultClass == null){ resultClass = query.getReferenceClass();