blob: 5fb99c28130c14cfd3d5a9ab774f659f0be27f43 [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:
// dminsky - initial API and implementation
package org.eclipse.persistence.testing.tests.queries;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.testing.models.insurance.*;
import org.eclipse.persistence.descriptors.invalidation.*;
import org.eclipse.persistence.internal.helper.*;
import org.eclipse.persistence.descriptors.*;
import org.eclipse.persistence.expressions.*;
import org.eclipse.persistence.mappings.*;
import org.eclipse.persistence.sessions.*;
/**
* EL Bug 245448 - Add regression tests for querying across relationships using
* nested joining and DailyCacheInvalidationPolicy
* - testing nested joining
* - no indirection throughout
* - daily expiration policy for cache invalidation
* - foreign reference relationship on 1:M with batching + private owned
* - 1:1 back-pointer for above not private owned, no batching, no joining
*/
public class QueryExecutionTimeSetOnBuildObjectTest extends TransactionalTestCase {
protected QuerySQLTracker sqlTracker;
private CacheInvalidationPolicy oldHolderCacheInvalidationPolicy;
private boolean oldPoliciesShouldBatchRead;
private boolean oldPoliciesShouldBePrivateOwned;
private boolean oldPolicyHolderShouldBeBatchRead;
private boolean oldPolicyHolderShouldBePrivateOwned;
private int oldPolicyHolderJoining;
private boolean oldAddressShouldBeBatchRead;
private boolean oldAddressShouldBePrivateOwned;
private int oldAddressJoining;
public QueryExecutionTimeSetOnBuildObjectTest() {
super();
setDescription("Test that no duplicate sql is generated for nested join queries without indirection");
}
@Override
public void setup() {
super.setup();
getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
ClassDescriptor holderDescriptor = getSession().getDescriptor(PolicyHolder.class);
ClassDescriptor policyDescriptor = getSession().getDescriptor(Policy.class);
ClassDescriptor addressDescriptor = getSession().getDescriptor(Address.class);
// cache invalidation
oldHolderCacheInvalidationPolicy = holderDescriptor.getCacheInvalidationPolicy();
holderDescriptor.setCacheInvalidationPolicy(new DailyCacheInvalidationPolicy(0, 0, 0, 0));
// PolicyHolder -> Policies batch reading
OneToManyMapping policyHolderToPoliciesMapping = (OneToManyMapping) holderDescriptor.getMappingForAttributeName("policies");
oldPoliciesShouldBatchRead = policyHolderToPoliciesMapping.shouldUseBatchReading();
policyHolderToPoliciesMapping.setUsesBatchReading(true);
// PolicyHolder -> Policies private owned
oldPoliciesShouldBePrivateOwned = policyHolderToPoliciesMapping.isPrivateOwned();
policyHolderToPoliciesMapping.setIsPrivateOwned(true);
// Policy -> PolicyHolder batch reading
OneToOneMapping policyToPolicyHolderMapping = (OneToOneMapping) policyDescriptor.getMappingForAttributeName("policyHolder");
oldPolicyHolderShouldBeBatchRead = policyToPolicyHolderMapping.shouldUseBatchReading();
policyToPolicyHolderMapping.setUsesBatchReading(false);
// Policy -> PolicyHolder private owned
oldPolicyHolderShouldBePrivateOwned = policyToPolicyHolderMapping.isPrivateOwned();
policyToPolicyHolderMapping.setIsPrivateOwned(false);
// Policy -> PolicyHolder joining
oldPolicyHolderJoining = policyToPolicyHolderMapping.getJoinFetch();
policyToPolicyHolderMapping.setJoinFetch(ForeignReferenceMapping.NONE);
policyToPolicyHolderMapping.getDescriptor().reInitializeJoinedAttributes();
// Address -> PolicyHolder batch reading
OneToOneMapping addressToPolicyHolderMapping = (OneToOneMapping)addressDescriptor.getMappingForAttributeName("policyHolder");
oldAddressShouldBeBatchRead = addressToPolicyHolderMapping.shouldUseBatchReading();
addressToPolicyHolderMapping.setUsesBatchReading(false);
// Address -> PolicyHolder joining
oldAddressJoining = addressToPolicyHolderMapping.getJoinFetch();
addressToPolicyHolderMapping.setJoinFetch(ForeignReferenceMapping.INNER_JOIN); // joining must be enabled on Address -> PolicyHolder
addressToPolicyHolderMapping.getDescriptor().reInitializeJoinedAttributes();
// Address -> PolicyHolder private owned
oldAddressShouldBePrivateOwned = addressToPolicyHolderMapping.isPrivateOwned();
addressToPolicyHolderMapping.setIsPrivateOwned(false);
PolicyHolder holder = new PolicyHolder();
holder.setFirstName("David");
holder.setLastName("Minkoff");
holder.setMale();
holder.setSsn(515376);
holder.setBirthDate(Helper.dateFromString("1979/03/25"));
holder.setOccupation("Electrician");
Address address = new Address();
address.setCity("Calgary");
address.setCountry("Canada");
address.setState("AB");
address.setStreet("Suite 840, 401 - 9th Avenue SW");
address.setZipCode("T2P3C5");
HealthPolicy healthPolicy1 = new HealthPolicy();
healthPolicy1.setPolicyNumber(515377);
healthPolicy1.setDescription("policy 1");
healthPolicy1.setCoverageRate((float)1.5);
healthPolicy1.setMaxCoverage(50000);
HealthPolicy healthPolicy2 = new HealthPolicy();
healthPolicy2.setPolicyNumber(515378);
healthPolicy2.setDescription("policy 2");
healthPolicy2.setCoverageRate((float)1.5);
healthPolicy2.setMaxCoverage(50000);
HealthPolicy healthPolicy3 = new HealthPolicy();
healthPolicy3.setPolicyNumber(515379);
healthPolicy3.setDescription("policy 3");
healthPolicy3.setCoverageRate((float)1.5);
healthPolicy3.setMaxCoverage(50000);
holder.setAddress(address);
holder.addPolicy(healthPolicy1);
holder.addPolicy(healthPolicy2);
holder.addPolicy(healthPolicy3);
UnitOfWork uow = getSession().acquireUnitOfWork();
uow.registerObject(holder);
uow.commit();
// create tracker object for query sql
sqlTracker = new QuerySQLTracker(getSession());
getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
}
@Override
public void test() {
// query from address -> policyHolder -> Policy to trigger nested joins (no indirection)
UnitOfWork uow = getSession().acquireUnitOfWork();
Expression expression = new ExpressionBuilder().get("zipCode").equal("T2P3C5");
uow.readObject(Address.class, expression);
uow.release();
}
@Override
public void verify() {
// Insurance model expected SQL with configured adjustments in setup()
// 1 x main select with joining from address -> policyholder
// SELECT t1.CITY, t1.ZIPCODE, t1.STATE, t1.COUNTRY, t1.STREET, t1.SSN, t0.SSN, t0.L_NAME, t0.OCC, t0.BDATE, t0.F_NAME, t0.SEX FROM HOLDER t0, INS_ADDR t1 WHERE ((t1.ZIPCODE = T2P3C5) AND (t0.SSN = t1.SSN))
// 1x policy type inheritance query
// SELECT DISTINCT POL_TYPE FROM POLICY WHERE (SSN = 515376)
// 1 x policy select based on type from policy inheritance query and policyholder pk
// SELECT POL_ID, POL_TYPE, MAX_COV, DESCRIPT, SSN, COV_RATE FROM POLICY WHERE ((SSN = 515376) AND (POL_TYPE = 2))
// 3 x claim selects from 3 policies read previously (no joining or batch reading configured)
// SELECT DISTINCT CLM_TYPE FROM CLAIM WHERE (POL_ID = 515378)
// SELECT DISTINCT CLM_TYPE FROM CLAIM WHERE (POL_ID = 515379)
// SELECT DISTINCT CLM_TYPE FROM CLAIM WHERE (POL_ID = 515377)
// 1 x PolicyHolder -> Child select (as mapped)
// SELECT t0.CHILD_NAME FROM CHILDNAM t0 WHERE (t0.HOLDER_ID = 515376)
// 1 x PolicyHolder -> Phone select (as mapped)
// SELECT TYPE, PHONE_NUMBER, AREACODE FROM INS_PHONE WHERE (HOLDER_SSN = 515376)
// = 8 statements expected
int expectedNumberOfStatements = 8;
int actualNumberOfSQLStatements = sqlTracker.getSqlStatements().size();
if (expectedNumberOfStatements != actualNumberOfSQLStatements) {
throw new TestErrorException("Expected " + expectedNumberOfStatements + " SQL statements - got " + actualNumberOfSQLStatements);
}
}
@Override
public void reset() {
super.reset();
ClassDescriptor holderDescriptor = getSession().getDescriptor(PolicyHolder.class);
ClassDescriptor policyDescriptor = getSession().getDescriptor(Policy.class);
ClassDescriptor addressDescriptor = getSession().getDescriptor(Address.class);
// cache invalidation
oldHolderCacheInvalidationPolicy = holderDescriptor.getCacheInvalidationPolicy();
holderDescriptor.setCacheInvalidationPolicy(oldHolderCacheInvalidationPolicy);
// PolicyHolder -> Policies batch reading
OneToManyMapping policiesMapping = (OneToManyMapping) holderDescriptor.getMappingForAttributeName("policies");
policiesMapping.setUsesBatchReading(oldPoliciesShouldBatchRead);
// PolicyHolder -> Policies private owned
policiesMapping.setIsPrivateOwned(oldPoliciesShouldBePrivateOwned);
// Policy -> PolicyHolder batch reading
OneToOneMapping policyHolderMapping = (OneToOneMapping) policyDescriptor.getMappingForAttributeName("policyHolder");
policyHolderMapping.setUsesBatchReading(oldPolicyHolderShouldBeBatchRead);
// Policy -> PolicyHolder private owned
policyHolderMapping.setIsPrivateOwned(oldPolicyHolderShouldBePrivateOwned);
// Policy -> PolicyHolder joining
policyHolderMapping.setJoinFetch(oldPolicyHolderJoining);
policyHolderMapping.getDescriptor().reInitializeJoinedAttributes();
// Address -> PolicyHolder batch reading
OneToOneMapping addressToPolicyHolderMapping = (OneToOneMapping)addressDescriptor.getMappingForAttributeName("policyHolder");
addressToPolicyHolderMapping.setUsesBatchReading(oldAddressShouldBeBatchRead);
// Address -> PolicyHolder joining
addressToPolicyHolderMapping.setJoinFetch(oldAddressJoining);
addressToPolicyHolderMapping.getDescriptor().reInitializeJoinedAttributes();
// Address -> PolicyHolder private owned
addressToPolicyHolderMapping.setIsPrivateOwned(oldAddressShouldBePrivateOwned);
sqlTracker.remove();
}
}