blob: 5ada5607b73c9acd247de996d4a657949ffa9578 [file] [log] [blame]
/*
* Copyright (c) 1998, 2020 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 from Oracle TopLink
// IBM - Bug 537795: CASE THEN and ELSE scalar expression Constants should not be casted to CASE operand type
package org.eclipse.persistence.internal.expressions;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Vector;
import org.eclipse.persistence.expressions.Expression;
import org.eclipse.persistence.internal.sessions.AbstractRecord;
import org.eclipse.persistence.internal.sessions.AbstractSession;
/**
* Used for wrapping collection of values or expressions.
*/
public class CollectionExpression extends ConstantExpression {
public CollectionExpression() {
}
public CollectionExpression(Object newValue, Expression baseExpression) {
super(newValue, baseExpression);
}
@Override
public void printSQL(ExpressionSQLPrinter printer) {
Object value = this.value;
if(this.localBase != null) {
value = this.localBase.getFieldValue(value, getSession());
}
printer.printList((Collection)value);
}
/**
* INTERNAL:
* Return the value for in memory comparison.
* This is only valid for valueable expressions.
*/
@Override
public Object valueFromObject(Object object, AbstractSession session, AbstractRecord translationRow, int valueHolderPolicy, boolean isObjectUnregistered) {
if (this.value instanceof Collection) {
Collection values = (Collection)this.value;
Vector fieldValues = new Vector(values.size());
for (Iterator iterator = values.iterator(); iterator.hasNext();) {
Object value = iterator.next();
if (value instanceof Expression){
value = ((Expression)value).valueFromObject(object, session, translationRow, valueHolderPolicy, isObjectUnregistered);
} else if(this.localBase != null) {
value = this.localBase.getFieldValue(value, session);
}
fieldValues.add(value);
}
return fieldValues;
}
if(this.localBase != null) {
return this.localBase.getFieldValue(this.value, session);
}
return this.value;
}
@Override
public void setLocalBase(Expression e) {
super.setLocalBase(e);
if (this.value instanceof Collection) {
Collection values = (Collection)this.value;
for (Iterator iterator = values.iterator(); iterator.hasNext();) {
Object val = iterator.next();
if (val instanceof Expression){
((Expression)val).setLocalBase(e);
}
}
}
}
/**
* INTERNAL:
* Used for cloning.
*/
@Override
protected void postCopyIn(Map alreadyDone) {
super.postCopyIn(alreadyDone);
if (this.value instanceof Collection) {
Collection values = (Collection)this.value;
Vector newValues = org.eclipse.persistence.internal.helper.NonSynchronizedVector.newInstance(values.size());
for (Iterator iterator = values.iterator(); iterator.hasNext();) {
Object val = iterator.next();
if (val instanceof Expression){
newValues.add(((Expression)val).copiedVersionFrom(alreadyDone));
} else {
newValues.add(val);
}
}
setValue(newValues);
}
}
}