/*
* 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.jpa;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import com.querydsl.core.support.Context;
import com.querydsl.core.types.ConstantImpl;
import com.querydsl.core.types.Expression;
import com.querydsl.core.types.ExpressionUtils;
import com.querydsl.core.types.Predicate;
import com.querydsl.jpa.domain.QCat;
import com.querydsl.jpa.domain.QCompany;
import com.querydsl.jpa.domain.QDomesticCat;
import com.querydsl.jpa.domain.QEmployee;
public class JPACollectionAnyVisitorTest {
private QCat cat = QCat.cat;
@Test
public void path() {
assertEquals("cat_kittens_0", serialize(cat.kittens.any()));
}
@Test
public void longer_path() {
assertEquals("cat_kittens_0.name", serialize(cat.kittens.any().name));
}
@Test
public void nested_any_booleanOperation() {
QCompany company = QCompany.company;
Predicate predicate = company.departments.any().employees.any().firstName.eq("Bob");
assertEquals("exists (select 1\n" +
"from company.departments as company_departments_0\n" +
" inner join company_departments_0.employees as company_departments_0_employees_1\n" +
"where company_departments_0_employees_1.firstName = ?1)", serialize(predicate));
}
@Test
public void simple_booleanOperation() {
Predicate predicate = cat.kittens.any().name.eq("Ruth123");
assertEquals("exists (select 1\n" +
"from cat.kittens as cat_kittens_0\n" +
"where cat_kittens_0.name = ?1)", serialize(predicate));
}
@Test
public void simple_booleanOperation_longPath() {
Predicate predicate = cat.kittens.any().kittens.any().name.eq("Ruth123");
assertEquals("exists (select 1\n" +
"from cat.kittens as cat_kittens_0\n" +
" inner join cat_kittens_0.kittens as cat_kittens_0_kittens_1\n" +
"where cat_kittens_0_kittens_1.name = ?1)", serialize(predicate));
}
@Test
public void simple_booleanOperation_elementCollection() {
QEmployee employee = QEmployee.employee;
Predicate predicate = employee.jobFunctions.any().stringValue().eq("CODER");
assertEquals("exists (select 1\n" +
"from Employee employee_1463394548\n" +
" inner join employee_1463394548.jobFunctions as employee_jobFunctions_0\n" +
"where employee_1463394548 = employee and str(employee_jobFunctions_0) = ?1)", serialize(predicate));
}
@Test
public void simple_stringOperation() {
Predicate predicate = cat.kittens.any().name.substring(1).eq("uth123");
assertEquals("exists (select 1\n" +
"from cat.kittens as cat_kittens_0\n" +
"where substring(cat_kittens_0.name,2) = ?1)", serialize(predicate));
}
@Test
public void and_operation() {
Predicate predicate = cat.kittens.any().name.eq("Ruth123").and(cat.kittens.any().bodyWeight.gt(10.0));
assertEquals("exists (select 1\n" +
"from cat.kittens as cat_kittens_0\n" +
"where cat_kittens_0.name = ?1) and exists (select 1\n" +
"from cat.kittens as cat_kittens_1\n" +
"where cat_kittens_1.bodyWeight > ?2)", serialize(predicate));
}
@Test
public void template() {
Expression<Boolean> templateExpr = ExpressionUtils.template(Boolean.class, "{0} = {1}",
cat.kittens.any().name, ConstantImpl.create("Ruth123"));
assertEquals("exists (select 1\n" +
"from cat.kittens as cat_kittens_0\n" +
"where cat_kittens_0.name = ?1)", serialize(templateExpr));
}
@Test
public void cast() {
// JPAQuery query = new JPAQuery(em).from(QPerson.person);
// QDog anyDog = QPerson.person.animals.any().as(QDog.class);
// query.where(anyDog.gender.eq("M"));
// List<Person> foundOwners = query.fetch(QPerson.person);
QDomesticCat anyCat = QCat.cat.kittens.any().as(QDomesticCat.class);
Predicate predicate = anyCat.name.eq("X");
assertEquals("exists (select 1\n" +
"from cat.kittens as cat_kittens_0\n" +
"where cat_kittens_0.name = ?1)", serialize(predicate));
}
private String serialize(Expression<?> expression) {
Expression<?> transformed = expression.accept(new JPACollectionAnyVisitor(), new Context());
JPQLSerializer serializer = new JPQLSerializer(HQLTemplates.DEFAULT, null);
serializer.handle(transformed);
return serializer.toString();
}
}