/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.deltaspike.data.impl.criteria;
import static org.apache.deltaspike.data.test.util.TestDeployments.initDeployment;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.inject.Inject;
import javax.persistence.NonUniqueResultException;
import org.apache.deltaspike.data.test.TransactionalTestCase;
import org.apache.deltaspike.data.test.domain.OneToMany;
import org.apache.deltaspike.data.test.domain.OneToOne;
import org.apache.deltaspike.data.test.domain.Parent;
import org.apache.deltaspike.data.test.domain.Simple;
import org.apache.deltaspike.data.test.service.ParentRepository;
import org.apache.deltaspike.data.test.service.SimpleCriteriaRepository;
import org.apache.deltaspike.data.test.service.Statistics;
import org.apache.deltaspike.test.category.WebProfileCategory;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.shrinkwrap.api.Archive;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@Category(WebProfileCategory.class)
public class CriteriaTest extends TransactionalTestCase
{
@Deployment
public static Archive<?> deployment()
{
return initDeployment()
.addClasses(SimpleCriteriaRepository.class, ParentRepository.class, Statistics.class)
.addPackage(Simple.class.getPackage());
}
@Inject
private SimpleCriteriaRepository repo;
@Inject
private ParentRepository parentRepo;
@Test
public void should_create_criteria_query()
{
// given
final String name = "testCreateCriteriaQuery";
createSimple(name, 55);
// when
List<Simple> result1 = repo.queryByCriteria(name, Boolean.TRUE, 0, 50);
List<Simple> result2 = repo.queryByCriteria(name, Boolean.TRUE, 50, 100);
List<Simple> result3 = repo.queryByCriteria(name, Boolean.FALSE, 50, 100);
// then
assertEquals(0, result1.size());
assertEquals(1, result2.size());
assertEquals(0, result3.size());
}
@Test
public void should_query_with_ignore_case()
{
// given
final String name = "TEST_query_EQ_with_igNOREe_case";
final String nameLike = "TEST_query_LIKE_with_igNOREe_case";
createSimple(name, 155);
createSimple(nameLike, 166);
// when
List<Simple> result1 = repo.queryByIgnoreCase(name.toLowerCase(), "no_match");
List<Simple> result2 = repo.queryByIgnoreCase("no_match", "%" + nameLike.substring(5, 22) + "%");
// then
assertEquals(1, result1.size());
assertEquals(Integer.valueOf(155), result1.get(0).getCounter());
assertEquals(1, result2.size());
assertEquals(Integer.valueOf(166), result2.get(0).getCounter());
}
@Test
public void should_create_join_criteria_query()
{
// given
final String name = "testCreateJoinCriteriaQuery";
final String nameOne = name + "-one";
final String nameMany = name + "-many";
Parent parent = new Parent(name);
parent.setOne(new OneToOne(nameOne));
parent.add(new OneToMany(nameMany));
getEntityManager().persist(parent);
getEntityManager().flush();
// when
List<Parent> result = parentRepo.joinQuery(name, nameOne, nameMany);
// then
assertEquals(1, result.size());
assertNotNull(result.get(0));
Parent queried = result.get(0);
assertEquals(name, queried.getName());
assertNotNull(queried.getOne());
assertEquals(nameOne, queried.getOne().getName());
assertEquals(1, queried.getMany().size());
assertEquals(nameMany, queried.getMany().get(0).getName());
}
@Test
public void should_create_or_query()
{
// given
final String name = "testCreateOrQuery";
Parent parent1 = new Parent(name + "1");
parent1.setValue(25L);
Parent parent2 = new Parent(name + "2");
parent2.setValue(75L);
Parent parent3 = new Parent(name + "3");
parent3.setValue(25L);
Parent parent4 = new Parent(name + "1");
parent4.setValue(75L);
getEntityManager().persist(parent1);
getEntityManager().persist(parent2);
getEntityManager().persist(parent3);
getEntityManager().persist(parent4);
getEntityManager().flush();
// when
List<Parent> result = parentRepo.orQuery(name + "1", name + "2");
// then
assertEquals(2, result.size());
}
@Test
public void should_create_ordered_query()
{
// given
final String name = "testCreateOrderedQuery";
Parent parent1 = new Parent(name + "99");
Parent parent2 = new Parent(name + "12");
Parent parent3 = new Parent(name + "19");
Parent parent4 = new Parent(name + "02");
getEntityManager().persist(parent1);
getEntityManager().persist(parent2);
getEntityManager().persist(parent3);
getEntityManager().persist(parent4);
getEntityManager().flush();
// when
List<Parent> result = parentRepo.orderedQuery();
// then
assertEquals(4, result.size());
assertEquals(name + "02", result.get(0).getName());
assertEquals(name + "12", result.get(1).getName());
assertEquals(name + "19", result.get(2).getName());
assertEquals(name + "99", result.get(3).getName());
}
@Test
public void should_create_query_wihtout_nulls()
{
// given
final String name = "testCreateQueryWihtoutNulls";
Parent parent = new Parent(name);
getEntityManager().persist(parent);
getEntityManager().flush();
// when
List<Parent> result = parentRepo.nullAwareQuery(name, null, null);
// then
assertEquals(1, result.size());
assertEquals(name, result.get(0).getName());
}
@Test
public void should_create_fetch_query()
{
// given
final String name = "testCreateFetchQuery";
Parent parent = new Parent(name);
parent.add(new OneToMany(name + "-1"));
parent.add(new OneToMany(name + "-2"));
getEntityManager().persist(parent);
getEntityManager().flush();
// when
Parent result = parentRepo.fetchQuery(name);
// then
assertNotNull(result);
assertEquals(name, result.getName());
assertNotNull(result.getMany());
assertEquals(2, result.getMany().size());
}
@Test
public void should_create_in_query()
{
// given
final String name = "testCreateInQuery";
Parent parent1 = new Parent(name + "-1");
Parent parent2 = new Parent(name + "-2");
Parent parent3 = new Parent(name + "-3");
getEntityManager().persist(parent1);
getEntityManager().persist(parent2);
getEntityManager().persist(parent3);
getEntityManager().flush();
// when
List<Parent> result = parentRepo.fetchByName(name + "-1", name + "-2", name + "-3");
// then
assertNotNull(result);
assertEquals(3, result.size());
}
@Test
public void should_create_select_criteria_with_result_type()
{
// given
final String name = "testCreateSelectCriteriaWithResultType";
createSimple(name, 1);
createSimple(name, 2);
createSimple(name, 3);
createSimple(name, 4);
createSimple(name, 99);
// when
Statistics result = repo.queryWithSelect(name);
// then
assertNotNull(result.getAverage());
assertEquals(Long.valueOf(5l), result.getCount());
}
@Test
public void should_create_select_criteria_without_result_type()
{
// given
final String name = "testCreateSelectCriteriaWithoutResultType";
createSimple(name, 10);
createSimple(name, 99);
// when
Object[] result = repo.queryWithSelectAggregateReturnArray(name);
// then
assertEquals(Integer.valueOf(10), result[0]);
assertEquals(Integer.valueOf(99), result[1]);
assertTrue(result[2] instanceof java.sql.Date);
assertTrue(result[3] instanceof java.sql.Time);
assertTrue(result[4] instanceof java.sql.Timestamp);
}
@Test
public void should_create_select_criteria_with_attributes()
{
// given
final String name = "testCreateSelectCriteriaWithAttributes";
createSimple(name, 10);
createSimple(name, 99);
// when
List<Object[]> results = repo.queryWithSelectAttributes(name);
// then
for (Object[] result : results)
{
assertEquals(name, result[0]);
assertEquals(name.toUpperCase(), result[1]);
assertEquals(name.toLowerCase(), result[2]);
assertEquals(name.substring(1), result[3]);
assertEquals(name.substring(1, 1 + 2), result[4]);
}
}
@Test
public void should_create_select_criteria_with_optional_result()
{
// given
final String name = "should_create_select_criteria_with_optional_result";
createSimple(name, 10);
// when
Simple result1 = repo.queryOptional(name);
Simple result2 = repo.queryOptional(name + "_doesnt exist");
// then
assertNotNull(result1);
assertEquals(name, result1.getName());
assertNull(result2);
}
@Test(expected = NonUniqueResultException.class)
public void should_fail_with_optional_nonunique_result()
{
// given
final String name = "should_fail_with_optional_nonunique_result";
createSimple(name, 10);
createSimple(name, 10);
// when
repo.queryOptional(name);
}
@Test
public void should_create_select_criteria_with_any_result()
{
// given
final String name = "should_create_select_criteria_with_any_result";
createSimple(name, 10);
createSimple(name, 10);
// when
Simple result1 = repo.queryAny(name);
Simple result2 = repo.queryAny(name + "_doesnt exist");
// then
assertNotNull(result1);
assertEquals(name, result1.getName());
assertNull(result2);
}
@Test // SELECT COUNT(DISTINCT(s.name)) FROM Simple s WHERE s.name = 'should_create_count_criteria'
public void should_create_count_criteria()
{
// given
final String name = "should_create_count_criteria";
createSimple(name, 10);
createSimple(name, 11);
// when
Long result = repo.criteriaCount(name);
// then
assertNotNull(result);
assertEquals(1l, result.longValue());
}
@Test
public void should_create_date_criteria()
{
// given
final String name = "should_create_date_criteria";
final Simple simple = new Simple(name);
simple.setTemporal(new Date());
getEntityManager().persist(simple);
getEntityManager().flush();
Calendar cal = Calendar.getInstance();
cal.setTime(simple.getTemporal());
cal.add(Calendar.MINUTE, -1);
Date from = cal.getTime();
cal.add(Calendar.MINUTE, 2);
Date to = cal.getTime();
// when
final List<Simple> result = repo.findByTimeBetween(from, to);
// then
assertNotNull(result);
assertEquals(1, result.size());
}
@Test
public void should_query_with_att_from_mapped_super()
{
// given
final String name = "should_create_date_criteria";
final String superName = "super_should_create_date_criteria";
final Simple simple = new Simple(name);
simple.setSuperName(superName);
getEntityManager().persist(simple);
getEntityManager().flush();
// when
final Simple result = repo.findBySuperName(superName);
// then
assertEquals(superName, result.getSuperName());
}
@Test
public void should_apply_multiply_orderby()
{
// given
createSimple("a", 1);
createSimple("b", 2);
// when
final List<Simple> orderByNameAndCounter = repo.findOrderByNameAndCounter();
// then
assertEquals(new Integer(2), orderByNameAndCounter.get(0).getCounter());
assertEquals(new Integer(1), orderByNameAndCounter.get(1).getCounter());
}
@Test
public void should_apply_trim()
{
// given
final String name = " should_apply_trim ";
createSimple(name, 10);
// when
Object[] objects = repo.queryWithSelectAttributesAndTrim(name);
assertNotNull(objects);
assertEquals(name, objects[0]);
assertEquals(name.trim(), objects[1]);
assertEquals("should_apply_trim ", objects[2]);
}
private Simple createSimple(String name, Integer counter)
{
Simple result = new Simple(name);
result.setCounter(counter);
getEntityManager().persist(result);
getEntityManager().flush();
return result;
}
}