/*
* 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.basic;
import static org.junit.Assert.assertEquals;
import javax.persistence.EntityManager;
import com.blazebit.persistence.testsuite.tx.TxVoidWork;
import com.blazebit.persistence.view.testsuite.basic.model.CustomRootPersonView;
import org.junit.Assert;
import org.junit.Test;
import com.blazebit.persistence.CriteriaBuilder;
import com.blazebit.persistence.PagedList;
import com.blazebit.persistence.PaginatedCriteriaBuilder;
import com.blazebit.persistence.view.EntityViewManager;
import com.blazebit.persistence.view.EntityViewSetting;
import com.blazebit.persistence.view.EntityViews;
import com.blazebit.persistence.view.Sorters;
import com.blazebit.persistence.view.spi.EntityViewConfiguration;
import com.blazebit.persistence.view.testsuite.AbstractEntityViewTest;
import com.blazebit.persistence.view.testsuite.basic.model.DocumentWithEntityView;
import com.blazebit.persistence.view.testsuite.basic.model.FilteredDocument;
import com.blazebit.persistence.view.testsuite.entity.Document;
import com.blazebit.persistence.view.testsuite.entity.Person;
import java.util.List;
/**
*
* @author Christian Beikov
* @since 1.0
*/
public class EntityViewSettingTest extends AbstractEntityViewTest {
@Override
public void setUpOnce() {
cleanDatabase();
transactional(new TxVoidWork() {
@Override
public void work(EntityManager em) {
Document doc1 = new Document("MyTest");
Document doc2 = new Document("YourTest");
Document doc3 = new Document("NoContacts");
Person o1 = new Person("pers1");
Person o2 = new Person("pers2");
Person o3 = new Person("pers3");
o1.getLocalized().put(1, "localized1");
o2.getLocalized().put(1, "localized2");
o1.setPartnerDocument(doc1);
o2.setPartnerDocument(doc2);
doc1.setOwner(o1);
doc2.setOwner(o2);
doc3.setOwner(o2);
doc1.getContacts().put(1, o1);
doc2.getContacts().put(1, o2);
doc3.getContacts().put(1, o3);
doc1.getContacts2().put(2, o1);
doc2.getContacts2().put(2, o2);
doc3.getContacts2().put(2, o3);
em.persist(o1);
em.persist(o2);
em.persist(o3);
em.persist(doc1);
em.persist(doc2);
em.persist(doc3);
}
});
}
@Test
public void testEntityViewSetting() {
EntityViewConfiguration cfg = EntityViews.createDefaultConfiguration();
cfg.addEntityView(FilteredDocument.class);
EntityViewManager evm = cfg.createEntityViewManager(cbf);
// Base setting
EntityViewSetting<FilteredDocument, PaginatedCriteriaBuilder<FilteredDocument>> setting = EntityViewSetting.create(
FilteredDocument.class, 0, 1);
// Query
CriteriaBuilder<Document> cb = cbf.create(em, Document.class);
setting.addAttributeFilter("name", "Test");
setting.addAttributeFilter("contactCount", "1");
setting.addAttributeSorter("name", Sorters.descending());
setting.addAttributeSorter("id", Sorters.descending());
setting.addOptionalParameter("index", 1);
PaginatedCriteriaBuilder<FilteredDocument> paginatedCb = evm.applySetting(setting, cb);
PagedList<FilteredDocument> result = paginatedCb.getResultList();
assertEquals(1, result.size());
assertEquals(2, result.getTotalSize());
assertEquals("YourTest", result.get(0).getName());
assertEquals("pers2", result.get(0).getContactName());
}
@Test
public void testEntityViewSettingWithEntityAttribute() {
EntityViewConfiguration cfg = EntityViews.createDefaultConfiguration();
cfg.addEntityView(DocumentWithEntityView.class);
EntityViewManager evm = cfg.createEntityViewManager(cbf);
// Base setting
EntityViewSetting<DocumentWithEntityView, PaginatedCriteriaBuilder<DocumentWithEntityView>> setting = EntityViewSetting
.create(DocumentWithEntityView.class, 0, 1);
// Query
CriteriaBuilder<Document> cb = cbf.create(em, Document.class);
setting.addAttributeFilter("owner.name", "pers2");
// Currently we have no way to express what filter should be used when using entity attributes
try {
evm.applySetting(setting, cb);
Assert.fail("Expected IllegalArgumentException");
} catch (IllegalArgumentException ex) {
// Ok
}
}
@Test
public void testEntityViewSettingNotExistingFilterAttribute() {
EntityViewConfiguration cfg = EntityViews.createDefaultConfiguration();
cfg.addEntityView(DocumentWithEntityView.class);
EntityViewManager evm = cfg.createEntityViewManager(cbf);
// Base setting
EntityViewSetting<DocumentWithEntityView, PaginatedCriteriaBuilder<DocumentWithEntityView>> setting = EntityViewSetting
.create(DocumentWithEntityView.class, 0, 1);
// Query
CriteriaBuilder<Document> cb = cbf.create(em, Document.class);
setting.addAttributeFilter("asd", "test");
// Currently we have no way to express what filter should be used when using entity attributes
try {
evm.applySetting(setting, cb);
Assert.fail("Expected IllegalArgumentException");
} catch (IllegalArgumentException ex) {
// Ok
}
}
@Test
public void testEntityViewSettingCustomRoot() {
EntityViewConfiguration cfg = EntityViews.createDefaultConfiguration();
cfg.addEntityView(CustomRootPersonView.class);
EntityViewManager evm = cfg.createEntityViewManager(cbf);
// Base setting
EntityViewSetting<CustomRootPersonView, CriteriaBuilder<CustomRootPersonView>> setting = EntityViewSetting.create(CustomRootPersonView.class);
// Query
CriteriaBuilder<Document> cb = cbf.create(em, Document.class);
setting.addAttributeFilter("name", "pers1");
CriteriaBuilder<CustomRootPersonView> criteriaBuilder = evm.applySetting(setting, cb, "owner");
assertEquals("SELECT " + singleValuedAssociationIdPath("owner_1.id", "owner_1") + " AS CustomRootPersonView_id, owner_1.name AS CustomRootPersonView_name " +
"FROM Document document JOIN document.owner owner_1 " +
"WHERE owner_1.name <> :param_0", criteriaBuilder.getQueryString());
List<CustomRootPersonView> result = criteriaBuilder.getResultList();
assertEquals(2, result.size());
assertEquals("pers2", result.get(0).getName());
assertEquals("pers2", result.get(1).getName());
}
// TODO: needs more tests
}