/*
* Copyright 2015, The Querydsl Team (http://www.querydsl.com/team)
*
* 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.querydsl.hibernate.search;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.hibernate.Session;
import org.junit.Ignore;
import org.junit.Test;
import com.querydsl.core.NonUniqueResultException;
import com.querydsl.core.QueryResults;
import com.querydsl.core.types.OrderSpecifier;
import com.querydsl.core.types.dsl.BooleanExpression;
public class SearchQueryTest extends AbstractQueryTest {
private final QUser user = new QUser("user");
@Override
public void setUp() {
super.setUp();
createUser("Bob", "Stewart", "Smith", "bob@example.com");
createUser("Barbara", "X", "Lock", "barbara@a.com");
createUser("Anton", "X", "Bruckner", "anton@b.com");
createUser("Robert", "X", "Downing", "bob@c.com");
createUser("John", "X", "Stewart", "john@d.com");
Session session = getSession();
session.flush();
session.getTransaction().commit();
session.beginTransaction();
}
@Test
public void exists() {
assertTrue(query().where(user.emailAddress.eq("bob@example.com")).fetchCount() > 0);
assertFalse(query().where(user.emailAddress.eq("bobby@example.com")).fetchCount() > 0);
}
@Test
public void notExists() {
assertFalse(query().where(user.emailAddress.eq("bob@example.com")).fetchCount() == 0);
assertTrue(query().where(user.emailAddress.eq("bobby@example.com")).fetchCount() == 0);
}
@Test
public void count() {
BooleanExpression filter = user.emailAddress.eq("bob@example.com");
assertEquals(1, query().where(filter).fetchCount());
}
@Test
public void uniqueResult() {
BooleanExpression filter = user.emailAddress.eq("bob@example.com");
User u = query().where(filter).fetchOne();
assertNotNull(u);
assertEquals("bob@example.com", u.getEmailAddress());
}
@Test
public void list() {
BooleanExpression filter = user.emailAddress.eq("bob@example.com");
List<User> list = query().where(filter).fetch();
assertEquals(1, list.size());
User u = query().where(filter).fetchOne();
assertEquals(u, list.get(0));
}
@Test(expected = NonUniqueResultException.class)
public void unique_result_throws_exception_on_multiple_results() {
query().where(user.middleName.eq("X")).fetchOne();
}
@Test
public void singleResult() {
assertNotNull(query().where(user.middleName.eq("X")).fetchFirst());
}
@Test
public void ordering() {
BooleanExpression filter = user.middleName.eq("X");
// asc
List<String> asc = getFirstNames(query().where(filter).orderBy(
user.firstName.asc()).fetch());
assertEquals(Arrays.asList("Anton", "Barbara", "John", "Robert"), asc);
// desc
List<String> desc = getFirstNames(query().where(filter).orderBy(
user.firstName.desc()).fetch());
assertEquals(Arrays.asList("Robert", "John", "Barbara", "Anton"), desc);
}
@Test
public void paging() {
BooleanExpression filter = user.middleName.eq("X");
OrderSpecifier<?> order = user.firstName.asc();
// limit
List<String> limit = getFirstNames(query().where(filter).orderBy(order)
.limit(2).fetch());
assertEquals(Arrays.asList("Anton", "Barbara"), limit);
// offset
List<String> offset = getFirstNames(query().where(filter)
.orderBy(order).offset(1).fetch());
assertEquals(Arrays.asList("Barbara", "John", "Robert"), offset);
// limit + offset
List<String> limitAndOffset = getFirstNames(query().where(filter)
.orderBy(order).limit(2).offset(1).fetch());
assertEquals(Arrays.asList("Barbara", "John"), limitAndOffset);
}
@Test
public void listResults() {
BooleanExpression filter = user.middleName.eq("X");
QueryResults<User> users = query().where(filter).orderBy(
user.firstName.asc()).limit(2).fetchResults();
List<String> asc = getFirstNames(users.getResults());
assertEquals(Arrays.asList("Anton", "Barbara"), asc);
assertEquals(4, users.getTotal());
}
@Test
public void no_where() {
assertEquals(5, query().fetch().size());
}
@Test @Ignore // OufOfMemoryError
public void limit_max_value() {
assertEquals(5, query().limit(Long.MAX_VALUE).fetch().size());
}
private List<String> getFirstNames(List<User> users) {
List<String> rv = new ArrayList<String>(users.size());
for (User user : users) {
rv.add(user.getFirstName());
}
return rv;
}
private User createUser(String firstName, String middleName,
String lastName, String email) {
User user = new User();
user.setFirstName(firstName);
user.setMiddleName(middleName);
user.setLastName(lastName);
user.setEmailAddress(email);
getSession().save(user);
return user;
}
private SearchQuery<User> query() {
return new SearchQuery<User>(getSession(), user);
}
}