/* * Copyright 2014 - 2017 Blazebit. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.blazebit.persistence.view.testsuite.correlation; import com.blazebit.persistence.CriteriaBuilder; import com.blazebit.persistence.testsuite.base.category.NoDatanucleus; import com.blazebit.persistence.testsuite.base.category.NoDatanucleus4; import com.blazebit.persistence.testsuite.base.category.NoEclipselink; import com.blazebit.persistence.testsuite.base.category.NoHibernate42; import com.blazebit.persistence.testsuite.base.category.NoHibernate43; import com.blazebit.persistence.testsuite.base.category.NoHibernate50; import com.blazebit.persistence.testsuite.base.category.NoOpenJPA; import com.blazebit.persistence.testsuite.tx.TxVoidWork; import com.blazebit.persistence.view.EntityViewManager; import com.blazebit.persistence.view.EntityViewSetting; import com.blazebit.persistence.view.EntityViews; import com.blazebit.persistence.view.impl.ConfigurationProperties; import com.blazebit.persistence.view.spi.EntityViewConfiguration; import com.blazebit.persistence.view.testsuite.AbstractEntityViewTest; import com.blazebit.persistence.view.testsuite.correlation.general.model.DocumentCorrelationViewJoinId; import com.blazebit.persistence.view.testsuite.correlation.general.model.DocumentCorrelationViewJoinNormal; import com.blazebit.persistence.view.testsuite.correlation.general.model.DocumentCorrelationViewSubqueryId; import com.blazebit.persistence.view.testsuite.correlation.general.model.DocumentCorrelationViewSubqueryNormal; import com.blazebit.persistence.view.testsuite.correlation.general.model.DocumentCorrelationViewSubselectId; import com.blazebit.persistence.view.testsuite.correlation.general.model.DocumentCorrelationViewSubselectNormal; import com.blazebit.persistence.view.testsuite.correlation.model.DocumentCorrelationView; import com.blazebit.persistence.view.testsuite.correlation.model.SimpleDocumentCorrelatedView; import com.blazebit.persistence.view.testsuite.correlation.model.SimplePersonCorrelatedSubView; import com.blazebit.persistence.view.testsuite.entity.Document; import com.blazebit.persistence.view.testsuite.entity.Person; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.experimental.categories.Category; import javax.persistence.EntityManager; import java.util.Collection; import java.util.Iterator; import java.util.List; import static org.junit.Assert.assertEquals; /** * * @author Christian Beikov * @since 1.2.0 */ public abstract class AbstractCorrelationTest extends AbstractEntityViewTest { protected Document doc1; protected Document doc2; protected Document doc3; protected Document doc4; @Override public void setUpOnce() { cleanDatabase(); transactional(new TxVoidWork() { @Override public void work(EntityManager em) { doc1 = new Document("doc1"); doc2 = new Document("doc2"); doc3 = new Document("doc3"); doc4 = new Document("doc4"); Person o1 = new Person("pers1"); Person o2 = new Person("pers2"); Person o3 = new Person("pers3"); doc1.setOwner(o1); doc2.setOwner(o2); doc3.setOwner(o2); doc4.setOwner(o2); em.persist(o1); em.persist(o2); em.persist(o3); em.persist(doc1); em.persist(doc2); em.persist(doc3); em.persist(doc4); } }); } @Before public void setUp() { doc1 = cbf.create(em, Document.class).where("name").eq("doc1").getSingleResult(); doc2 = cbf.create(em, Document.class).where("name").eq("doc2").getSingleResult(); doc3 = cbf.create(em, Document.class).where("name").eq("doc3").getSingleResult(); doc4 = cbf.create(em, Document.class).where("name").eq("doc4").getSingleResult(); } protected <T extends DocumentCorrelationView> void testCorrelation(Class<T> entityView, Integer batchSize) { EntityViewConfiguration cfg = EntityViews.createDefaultConfiguration(); cfg.addEntityView(entityView); cfg.addEntityView(SimpleDocumentCorrelatedView.class); cfg.addEntityView(SimplePersonCorrelatedSubView.class); EntityViewManager evm = cfg.createEntityViewManager(cbf); CriteriaBuilder<Document> criteria = cbf.create(em, Document.class, "d").orderByAsc("id"); EntityViewSetting<T, CriteriaBuilder<T>> setting = EntityViewSetting.create(entityView); if (batchSize != null) { setting.setProperty(ConfigurationProperties.DEFAULT_BATCH_SIZE + ".ownerRelatedDocumentIds", batchSize); } CriteriaBuilder<T> cb = evm.applySetting(setting, criteria); List<T> results = cb.getResultList(); assertEquals(4, results.size()); // Doc1 assertEquals(doc1.getName(), results.get(0).getName()); assertThisAndOwnerMappings(doc1, results.get(0)); assertEquals(0, results.get(0).getOwnerRelatedDocumentViews().size()); assertEquals(0, results.get(0).getOwnerRelatedDocumentIds().size()); assertEquals(1, results.get(0).getOwnerOnlyRelatedDocumentViews().size()); assertRemovedByName(doc1.getName(), results.get(0).getOwnerOnlyRelatedDocumentViews()); assertEquals(1, results.get(0).getOwnerOnlyRelatedDocumentIds().size()); assertRemoved(doc1.getId(), results.get(0).getOwnerOnlyRelatedDocumentIds()); // Doc2 assertEquals(doc2.getName(), results.get(1).getName()); assertThisAndOwnerMappings(doc2, results.get(1)); assertEquals(2, results.get(1).getOwnerRelatedDocumentViews().size()); assertRemovedByName(doc3.getName(), results.get(1).getOwnerRelatedDocumentViews()); assertRemovedByName(doc4.getName(), results.get(1).getOwnerRelatedDocumentViews()); assertEquals(2, results.get(1).getOwnerRelatedDocumentIds().size()); assertRemoved(doc3.getId(), results.get(1).getOwnerRelatedDocumentIds()); assertRemoved(doc4.getId(), results.get(1).getOwnerRelatedDocumentIds()); assertEquals(3, results.get(1).getOwnerOnlyRelatedDocumentViews().size()); assertRemovedByName(doc2.getName(), results.get(1).getOwnerOnlyRelatedDocumentViews()); assertRemovedByName(doc3.getName(), results.get(1).getOwnerOnlyRelatedDocumentViews()); assertRemovedByName(doc4.getName(), results.get(1).getOwnerOnlyRelatedDocumentViews()); assertEquals(3, results.get(1).getOwnerOnlyRelatedDocumentIds().size()); assertRemoved(doc2.getId(), results.get(1).getOwnerOnlyRelatedDocumentIds()); assertRemoved(doc3.getId(), results.get(1).getOwnerOnlyRelatedDocumentIds()); assertRemoved(doc4.getId(), results.get(1).getOwnerOnlyRelatedDocumentIds()); // Doc3 assertEquals(doc3.getName(), results.get(2).getName()); assertThisAndOwnerMappings(doc3, results.get(2)); assertEquals(2, results.get(2).getOwnerRelatedDocumentViews().size()); assertRemovedByName(doc2.getName(), results.get(2).getOwnerRelatedDocumentViews()); assertRemovedByName(doc4.getName(), results.get(2).getOwnerRelatedDocumentViews()); assertEquals(2, results.get(2).getOwnerRelatedDocumentIds().size()); assertRemoved(doc2.getId(), results.get(2).getOwnerRelatedDocumentIds()); assertRemoved(doc4.getId(), results.get(2).getOwnerRelatedDocumentIds()); assertEquals(3, results.get(2).getOwnerOnlyRelatedDocumentViews().size()); assertRemovedByName(doc2.getName(), results.get(2).getOwnerOnlyRelatedDocumentViews()); assertRemovedByName(doc3.getName(), results.get(2).getOwnerOnlyRelatedDocumentViews()); assertRemovedByName(doc4.getName(), results.get(2).getOwnerOnlyRelatedDocumentViews()); assertEquals(3, results.get(2).getOwnerOnlyRelatedDocumentIds().size()); assertRemoved(doc2.getId(), results.get(2).getOwnerOnlyRelatedDocumentIds()); assertRemoved(doc3.getId(), results.get(2).getOwnerOnlyRelatedDocumentIds()); assertRemoved(doc4.getId(), results.get(2).getOwnerOnlyRelatedDocumentIds()); // Doc4 assertEquals(doc4.getName(), results.get(3).getName()); assertThisAndOwnerMappings(doc4, results.get(3)); assertEquals(2, results.get(3).getOwnerRelatedDocumentViews().size()); assertRemovedByName(doc2.getName(), results.get(3).getOwnerRelatedDocumentViews()); assertRemovedByName(doc3.getName(), results.get(3).getOwnerRelatedDocumentViews()); assertEquals(2, results.get(3).getOwnerRelatedDocumentIds().size()); assertRemoved(doc2.getId(), results.get(3).getOwnerRelatedDocumentIds()); assertRemoved(doc3.getId(), results.get(3).getOwnerRelatedDocumentIds()); assertEquals(3, results.get(3).getOwnerOnlyRelatedDocumentViews().size()); assertRemovedByName(doc2.getName(), results.get(3).getOwnerOnlyRelatedDocumentViews()); assertRemovedByName(doc3.getName(), results.get(3).getOwnerOnlyRelatedDocumentViews()); assertRemovedByName(doc4.getName(), results.get(3).getOwnerOnlyRelatedDocumentViews()); assertEquals(3, results.get(3).getOwnerOnlyRelatedDocumentIds().size()); assertRemoved(doc2.getId(), results.get(3).getOwnerOnlyRelatedDocumentIds()); assertRemoved(doc3.getId(), results.get(3).getOwnerOnlyRelatedDocumentIds()); assertRemoved(doc4.getId(), results.get(3).getOwnerOnlyRelatedDocumentIds()); } private void assertRemovedByName(String expectedName, Collection<SimpleDocumentCorrelatedView> views) { Iterator<SimpleDocumentCorrelatedView> iter = views.iterator(); while (iter.hasNext()) { SimpleDocumentCorrelatedView v = iter.next(); if (expectedName.equals(v.getName())) { iter.remove(); return; } } Assert.fail("Could not find '" + expectedName + "' in: " + views); } private <T> void assertRemoved(T expectedValue, Collection<T> collection) { if (!collection.remove(expectedValue)) { Assert.fail("Could not find '" + expectedValue + "' in: " + collection); } } private void assertThisAndOwnerMappings(Document doc, DocumentCorrelationView view) { // ThisCorrelated variants assertEquals(doc, view.getThisCorrelatedEntity()); assertEquals(doc.getId(), view.getThisCorrelatedId()); assertDocumentEqualsView(doc, view.getThisCorrelatedView()); assertEquals(1, view.getThisCorrelatedEntityList().size()); assertEquals(doc, view.getThisCorrelatedEntityList().iterator().next()); assertEquals(1, view.getThisCorrelatedIdList().size()); assertEquals(doc.getId(), view.getThisCorrelatedIdList().iterator().next()); assertEquals(1, view.getThisCorrelatedViewList().size()); assertDocumentEqualsView(doc, view.getThisCorrelatedViewList().iterator().next()); // CorrelatedOwner variants assertEquals(doc.getOwner(), view.getCorrelatedOwner()); assertEquals(doc.getOwner().getId(), view.getCorrelatedOwnerId()); assertDocumentEqualsView(doc.getOwner(), view.getCorrelatedOwnerView()); assertEquals(1, view.getCorrelatedOwnerList().size()); assertEquals(doc.getOwner(), view.getCorrelatedOwnerList().iterator().next()); assertEquals(1, view.getCorrelatedOwnerIdList().size()); assertEquals(doc.getOwner().getId(), view.getCorrelatedOwnerIdList().iterator().next()); assertEquals(1, view.getCorrelatedOwnerViewList().size()); assertDocumentEqualsView(doc.getOwner(), view.getCorrelatedOwnerViewList().iterator().next()); } private void assertDocumentEqualsView(Document doc, SimpleDocumentCorrelatedView view) { assertEquals(doc.getId(), view.getId()); assertEquals(doc.getName(), view.getName()); assertDocumentEqualsView(doc.getOwner(), view.getOwner()); } private void assertDocumentEqualsView(Person pers, SimplePersonCorrelatedSubView view) { assertEquals(pers.getId(), view.getId()); assertEquals(pers.getName().toUpperCase(), view.getName()); } }