blob: 972180ca8fd06590061c28846785fb79a2ee45cf [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.feature;
import java.io.*;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.testing.models.employee.domain.*;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.sequencing.*;
import org.eclipse.persistence.tools.schemaframework.*;
import org.eclipse.persistence.sessions.*;
/**
* Test custom sequence-table access
*/
public class CustomSequenceTest extends AutoVerifyTestCase {
/** the original setting */
private Sequence originalSequence;
/** the new sequence table name */
private String newSeqTableName;
/** the initial value of the counter for EMP_SEQ in the new table */
private int initialSeqCount;
/** the Employee being inserted using the new Seq Table */
private Employee newEmployee;
public CustomSequenceTest() {
setDescription("This test verifies that sequencing can be customized using setUpdateSequenceQuery(DataModifyQuery) and setSelectSequenceNumberQuery(ValueReadQuery).");
}
protected void buildNEW_SEQUENCETable() {
TableDefinition tabledefinition = new TableDefinition();
// SECTION: TABLE
tabledefinition.setName(this.newSeqTableName);
// SECTION: FIELD
org.eclipse.persistence.tools.schemaframework.FieldDefinition field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
field.setName("SEQ_NAME");
field.setType(String.class);
field.setSize(50);
field.setShouldAllowNull(true);
field.setIsPrimaryKey(false);
field.setUnique(false);
field.setIsIdentity(false);
tabledefinition.addField(field);
// SECTION: FIELD
org.eclipse.persistence.tools.schemaframework.FieldDefinition field1 = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
field1.setName("SEQ_COUNT");
field1.setType(Long.class);
field1.setSize(15);
field1.setShouldAllowNull(true);
field1.setIsPrimaryKey(false);
field1.setUnique(false);
field1.setIsIdentity(false);
tabledefinition.addField(field1);
new SchemaManager((DatabaseSession)getSession()).replaceObject(tabledefinition);
}
@Override
public void reset() {
rollbackTransaction();
getSession().getIdentityMapAccessor().initializeIdentityMaps();
// Change Sequence Query stuff back to normal
getSession().getProject().getLogin().setDefaultSequence(this.originalSequence);
// Don't want the sequence numbers obtained from another sequence table to be used with the regular one.
// Note that before rollbackTransaction used to wipe out all sequencing numbers, but now
// sequencing numbers remain no matter how transaction ends (unless there is no separate sequencing
// connection used)
((DatabaseSession)getSession()).getSequencingControl().initializePreallocated();
}
@Override
public void setup() {
org.eclipse.persistence.internal.databaseaccess.DatabasePlatform p = getSession().getProject().getLogin().getPlatform();
/**
* Build another sequence table for our custom sequencing.
*/
this.newSeqTableName = new String("NEW_SEQUENCE");
this.initialSeqCount = 1233;
buildNEW_SEQUENCETable();
getSession().executeNonSelectingCall(new org.eclipse.persistence.queries.SQLCall("INSERT INTO " + this.newSeqTableName + "(" + p.getSequenceNameFieldName() + ", " + p.getSequenceCounterFieldName() + ") values ('EMP_SEQ', " + this.initialSeqCount + ")"));
/**
* Set the Sequence Query Stuff to use our new sequence table.
*/
// Save the old settings
this.originalSequence = getSession().getLogin().getDefaultSequence();
// Build the new custom queries
DataModifyQuery newUpdateSeqQuery = new DataModifyQuery();
newUpdateSeqQuery.addArgument("seqName");
StringWriter writer1 = new StringWriter();
writer1.write("UPDATE " + this.newSeqTableName);
writer1.write(" SET " + p.getSequenceCounterFieldName());
writer1.write(" = " + p.getSequenceCounterFieldName());
writer1.write(" + " + p.getSequencePreallocationSize());
writer1.write(" WHERE " + p.getSequenceNameFieldName());
writer1.write(" = #seqName");
newUpdateSeqQuery.setSQLString(writer1.toString());
ValueReadQuery newSelectSeqNumQuery = new ValueReadQuery();
newSelectSeqNumQuery.addArgument("seqName");
StringWriter writer2 = new StringWriter();
writer2.write("SELECT " + p.getSequenceCounterFieldName());
writer2.write(" FROM " + this.newSeqTableName);
writer2.write(" WHERE " + p.getSequenceNameFieldName());
writer2.write(" = #seqName");
newSelectSeqNumQuery.setSQLString(writer2.toString());
// Set the new queries
QuerySequence newSequence = new QuerySequence();
newSequence.setUpdateQuery(newUpdateSeqQuery);
newSequence.setSelectQuery(newSelectSeqNumQuery);
getSession().getLogin().setDefaultSequence(newSequence);
((DatabaseSession)getSession()).getSequencingControl().resetSequencing();
((DatabaseSession)getSession()).getSequencingControl().initializePreallocated();
}
@Override
public void test() {
beginTransaction();
// write a new Employee to the DB
this.newEmployee = new org.eclipse.persistence.testing.models.employee.domain.Employee();
this.newEmployee.setFirstName("Brendan");
this.newEmployee.setLastName("Rickey");
UnitOfWork uow1 = getSession().acquireUnitOfWork();
uow1.registerObject(this.newEmployee);
uow1.commit();
// update the Employee
UnitOfWork uow2 = getSession().acquireUnitOfWork();
Employee empRead = (Employee)uow2.readObject(this.newEmployee);
empRead.setFirstName("Object");
empRead.setLastName("People");
uow2.commit();
}
@Override
public void verify() {
//make sure the Employee was inserted and updated, and that the new Seq table was used.
Employee verifyEmp = (Employee)getSession().readObject(this.newEmployee);
if (verifyEmp.getId().intValue() != (this.initialSeqCount + 1)) {
throw new TestErrorException("The new Sequence Table was not used! " + verifyEmp.getId());
}
}
}