/*
* 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.collections.ordered;
import static org.junit.Assert.assertEquals;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import javax.persistence.EntityManager;
import com.blazebit.persistence.testsuite.tx.TxVoidWork;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.blazebit.persistence.CriteriaBuilder;
import com.blazebit.persistence.view.EntityViewManager;
import com.blazebit.persistence.view.EntityViewSetting;
import com.blazebit.persistence.view.EntityViews;
import com.blazebit.persistence.view.spi.EntityViewConfiguration;
import com.blazebit.persistence.view.testsuite.AbstractEntityViewTest;
import com.blazebit.persistence.view.testsuite.collections.entity.simple.DocumentForCollections;
import com.blazebit.persistence.view.testsuite.collections.entity.simple.PersonForCollections;
import com.blazebit.persistence.view.testsuite.collections.ordered.model.BaseDocumentView;
import com.blazebit.persistence.view.testsuite.collections.ordered.model.DocumentWithSetAsListView;
import com.blazebit.persistence.view.testsuite.collections.ordered.model.PersonForCollectionsView;
import com.blazebit.persistence.view.testsuite.collections.ordered.model.PersonWithSetAsListView;
/**
*
* @author Christian Beikov
* @since 1.0
*/
public class ViewSetAsListTest extends AbstractEntityViewTest {
private PersonForCollections pers1;
private PersonForCollections pers2;
private DocumentForCollections d1;
private DocumentForCollections d2;
@Override
protected Class<?>[] getEntityClasses() {
return new Class<?>[]{
DocumentForCollections.class,
PersonForCollections.class
};
}
@Before
public void setUp() {
cleanDatabase();
transactional(new TxVoidWork() {
@Override
public void work(EntityManager em) {
DocumentForCollections doc1 = new DocumentForCollections("doc1");
DocumentForCollections doc2 = new DocumentForCollections("doc2");
DocumentForCollections doc3 = new DocumentForCollections("doc3");
DocumentForCollections doc4 = new DocumentForCollections("doc4");
pers1 = new PersonForCollections("p1");
pers2 = new PersonForCollections("p2");
pers1.setPartnerDocument(doc1);
pers2.setPartnerDocument(doc2);
d1 = new DocumentForCollections("d1");
d2 = new DocumentForCollections("d2");
d1.setOwner(pers1);
d2.setOwner(pers2);
PersonForCollections o1 = new PersonForCollections("pers1");
PersonForCollections o2 = new PersonForCollections("pers2");
PersonForCollections o3 = new PersonForCollections("pers3");
PersonForCollections o4 = new PersonForCollections("pers4");
o1.setPartnerDocument(doc1);
o2.setPartnerDocument(doc2);
o3.setPartnerDocument(doc3);
o4.setPartnerDocument(doc4);
doc1.setOwner(pers1);
doc2.setOwner(pers2);
doc3.setOwner(pers1);
doc4.setOwner(pers2);
em.persist(pers1);
em.persist(pers2);
em.persist(d1);
em.persist(d2);
em.persist(doc1);
em.persist(doc2);
em.persist(doc3);
em.persist(doc4);
em.persist(o1);
em.persist(o2);
em.persist(o3);
em.persist(o4);
doc1.getPartners().add(o1);
doc1.getPartners().add(o3);
doc2.getPartners().add(o2);
doc2.getPartners().add(o4);
doc1.getPersonList().add(o1);
doc1.getPersonList().add(o2);
doc2.getPersonList().add(o3);
doc2.getPersonList().add(o4);
}
});
pers1 = em.find(PersonForCollections.class, pers1.getId());
pers2 = em.find(PersonForCollections.class, pers2.getId());
}
@Test
public void testCollections() {
EntityViewConfiguration cfg = EntityViews.createDefaultConfiguration();
cfg.addEntityView(BaseDocumentView.class);
cfg.addEntityView(PersonWithSetAsListView.class);
cfg.addEntityView(DocumentWithSetAsListView.class);
cfg.addEntityView(PersonForCollectionsView.class);
EntityViewManager evm = cfg.createEntityViewManager(cbf);
CriteriaBuilder<DocumentForCollections> criteria = cbf.create(em, DocumentForCollections.class, "d")
.where("id").in(d1.getId(), d2.getId())
.orderByAsc("d.owner.name")
.orderByDesc("d.owner.ownedDocuments.name")
.orderByDesc("d.owner.ownedDocuments.partners.name");
CriteriaBuilder<BaseDocumentView> cb = evm.applySetting(EntityViewSetting.create(BaseDocumentView.class), criteria);
List<BaseDocumentView> results = cb.getResultList();
assertEquals(2, results.size());
// Pers1
assertEquals(d1.getName(), results.get(0).getName());
assertSubviewCollectionEquals(pers1.getOwnedDocuments(), results.get(0).getOwner().getOwnedDocuments());
// Pers2
assertEquals(d2.getName(), results.get(1).getName());
assertSubviewCollectionEquals(pers2.getOwnedDocuments(), results.get(1).getOwner().getOwnedDocuments());
}
private void assertSubviewCollectionEquals(Set<DocumentForCollections> ownedDocuments, List<? extends DocumentWithSetAsListView> ownedSubviewDocuments) {
assertEquals(ownedDocuments.size(), ownedSubviewDocuments.size());
DocumentForCollections[] sortedDocuments = sortedByDocumentName(ownedDocuments);
for (int i = 0; i < sortedDocuments.length; i++) {
DocumentForCollections doc = sortedDocuments[i];
if (!doc.getName().equals(ownedSubviewDocuments.get(i).getName())) {
Assert.fail("Could not find a DocumentWithSetAsListView with the name: " + doc.getName());
}
assertSubviewPersonCollectionEquals(doc.getPartners(), ownedSubviewDocuments.get(i).getPartners());
}
}
private void assertSubviewPersonCollectionEquals(Set<PersonForCollections> partnerPersons, List<? extends PersonForCollectionsView> persons) {
assertEquals(partnerPersons.size(), persons.size());
PersonForCollections[] sortedPersons = sortedByPersonName(partnerPersons);
for (int i = 0; i < sortedPersons.length; i++) {
PersonForCollections pers = sortedPersons[i];
if (!pers.getName().equals(persons.get(i).getName())) {
Assert.fail("Could not find a PersonForCollectionsView with the name: " + pers.getName());
}
}
}
private DocumentForCollections[] sortedByDocumentName(Set<DocumentForCollections> ownedDocuments) {
Set<DocumentForCollections> set = new TreeSet<DocumentForCollections>(new Comparator<DocumentForCollections>() {
@Override
public int compare(DocumentForCollections o1, DocumentForCollections o2) {
return o2.getName().compareTo(o1.getName());
}
});
set.addAll(ownedDocuments);
return set.toArray(new DocumentForCollections[set.size()]);
}
private PersonForCollections[] sortedByPersonName(Set<PersonForCollections> persons) {
Set<PersonForCollections> set = new TreeSet<PersonForCollections>(new Comparator<PersonForCollections>() {
@Override
public int compare(PersonForCollections o1, PersonForCollections o2) {
return o2.getName().compareTo(o1.getName());
}
});
set.addAll(persons);
return set.toArray(new PersonForCollections[set.size()]);
}
}