blob: ca7400c8955d139a9e1d19d69ff0306d8a8ec10a [file] [log] [blame]
/*
* Copyright (c) 1998, 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 from Oracle TopLink
package org.eclipse.persistence.testing.tests.queries;
import java.util.*;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.expressions.*;
import org.eclipse.persistence.internal.sessions.AbstractSession;
/**
* Test the cursored stream feature by performing a cursor read on the database
* and comparing the contents to a normal query read.
*/
public class
CursoredStreamTest extends AutoVerifyTestCase {
protected int size;
protected Vector normalQueryObjects;
protected Vector cursoredQueryObjects;
protected Class<?> referenceClass;
protected Expression joinExpression;
public CursoredStreamTest(Class<?> referenceClass, Expression expression) {
setReferenceClass(referenceClass);
setName(getName() + "(" + referenceClass + ")");
setDescription("This test verifies that the number of objects read in using a cursored stream" +
" matches the number of object read in using a normal query");
joinExpression = expression;
}
public Vector getCursoredQueryObjects() {
return cursoredQueryObjects;
}
public Vector getNormalQueryObjects() {
return normalQueryObjects;
}
public Class<?> getReferenceClass() {
return referenceClass;
}
public int getSize() {
return size;
}
public void setCursoredQueryObjects(Vector objects) {
cursoredQueryObjects = objects;
}
public void setNormalQueryObjects(Vector objects) {
normalQueryObjects = objects;
}
public void setReferenceClass(Class<?> aClass) {
referenceClass = aClass;
}
public void setSize(int aSize) {
size = aSize;
}
@Override
protected void setup() {
setNormalQueryObjects(getSession().readAllObjects(getReferenceClass(), joinExpression));
getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
}
@Override
public void test() {
ReadAllQuery query = new ReadAllQuery();
CursoredStream stream = null;
try {
Object databaseObject;
cursoredQueryObjects = new Vector();
query.setReferenceClass(getReferenceClass());
query.setSelectionCriteria(joinExpression);
query.useCursoredStream();
stream = (CursoredStream)getSession().executeQuery(query);
// Test dual cursors and read(int)
CursoredStream stream2 = (CursoredStream)getSession().executeQuery(query);
try {
stream2.read(5);
} catch (org.eclipse.persistence.exceptions.QueryException ex) {
} // ignore at end
setSize(stream2.size());
stream2.close();
while (!stream.atEnd()) {
databaseObject = stream.read();
getCursoredQueryObjects().addElement(databaseObject);
stream.releasePrevious();
}
} finally {
if (stream != null) {
stream.close();
}
}
}
/**
* Verify if number of query objects matches number of cursor objects
*/
@Override
protected void verify() {
if (getNormalQueryObjects().size() != getCursoredQueryObjects().size()) {
throw new TestErrorException("The number of streamed objects does not match the number of objects stored on the database. Expected: " +
getNormalQueryObjects().size() + ". Got: " +
getCursoredQueryObjects().size());
}
if (getNormalQueryObjects().size() == 0) {
throw new TestWarningException("no object with the specified selection criteria was found ");
}
if (getSize() != getNormalQueryObjects().size()) {
throw new TestErrorException("The cursored stream size function is not working properly");
}
int first = 0;
int last = getNormalQueryObjects().size() - 1;
if (!((AbstractSession)getSession()).compareObjects(getCursoredQueryObjects().elementAt(first),
getNormalQueryObjects().elementAt(first))) {
throw new TestErrorException("The First Objects do not match");
}
if (!((AbstractSession)getSession()).compareObjects(getCursoredQueryObjects().elementAt(last),
getNormalQueryObjects().elementAt(last))) {
throw new TestErrorException("The Last Objects do not match");
}
}
}