/*
* 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.testsuite;
import static org.junit.Assert.assertEquals;
import java.util.Locale;
import javax.persistence.Tuple;
import org.junit.Test;
import com.blazebit.persistence.CriteriaBuilder;
import com.blazebit.persistence.testsuite.entity.Document;
import com.blazebit.persistence.testsuite.entity.Workflow;
/**
*
* @author Christian Beikov
* @since 1.0
*/
public class MultipleJoinTest extends AbstractCoreTest {
@Test
public void testExcplicitMultipleJoins() {
CriteriaBuilder<Tuple> cb = cbf.create(em, Tuple.class).from(Workflow.class)
.leftJoin("localized", "l1")
.leftJoin("localized", "l2")
.select("id");
String expectedQuery = "SELECT workflow.id FROM Workflow workflow"
+ " LEFT JOIN workflow.localized l1"
+ " LEFT JOIN workflow.localized l2";
assertEquals(expectedQuery, cb.getQueryString());
cb.getResultList();
}
@Test
public void testOneExplicitJoinAndOneExplicitDefaultJoin() {
CriteriaBuilder<Tuple> cb = cbf.create(em, Tuple.class).from(Workflow.class)
.leftJoinOn("localized", "l1").on("KEY(l1)").eqExpression(":locale").end()
.leftJoinDefault("localized", "l2")
.select("localized[:locale].name")
.select("localized.name");
String expectedQuery = "SELECT " + joinAliasValue("l1", "name") + ", " + joinAliasValue("l2", "name") + " FROM Workflow workflow"
+ " LEFT JOIN workflow.localized l1"
+ onClause("KEY(l1) = :locale")
+ " LEFT JOIN workflow.localized l2";
assertEquals(expectedQuery, cb.getQueryString());
cb.setParameter("locale", Locale.GERMAN)
.getResultList();
}
@Test
public void testOneImplicitJoinAndOneImplicitDefaultJoin() {
CriteriaBuilder<Tuple> cb = cbf.create(em, Tuple.class).from(Workflow.class)
.select("localized[:locale].name")
.select("localized.name");
String expectedQuery = "SELECT " + joinAliasValue("localized_locale_1", "name") + ", " + joinAliasValue("localized_1", "name") + " FROM Workflow workflow"
+ " LEFT JOIN workflow.localized localized_1"
+ " LEFT JOIN workflow.localized localized_locale_1"
+ onClause("KEY(localized_locale_1) = :locale");
assertEquals(expectedQuery, cb.getQueryString());
cb.setParameter("locale", Locale.GERMAN)
.getResultList();
}
@Test
public void testFirstOneImplicitJoinAndOneImplicitDefaultJoinThenExplicit() {
CriteriaBuilder<Tuple> cb = cbf.create(em, Tuple.class).from(Workflow.class)
.select("localized[:locale].name")
.select("localized.name")
.leftJoinOn("localized", "l1").on("KEY(l1)").eqExpression(":locale").end()
.leftJoinDefault("localized", "l2");
String expectedQuery = "SELECT " + joinAliasValue("l1", "name") + ", " + joinAliasValue("l2", "name") + " FROM Workflow workflow"
+ " LEFT JOIN workflow.localized l1"
+ onClause("KEY(l1) = :locale")
+ " LEFT JOIN workflow.localized l2";
assertEquals(expectedQuery, cb.getQueryString());
cb.setParameter("locale", Locale.GERMAN)
.getResultList();
}
@Test
public void testExcplicitMultipleJoinsWithParameterMatch() {
CriteriaBuilder<Tuple> cb = cbf.create(em, Tuple.class).from(Workflow.class)
.leftJoinOn("localized", "l1").on("KEY(l1)").eqExpression(":locale").end()
.leftJoinOn("localized", "l2").on("KEY(l2)").eqExpression("workflow.defaultLanguage").end()
.select("localized[:locale].name")
.select("localized[defaultLanguage].name");
String expectedQuery = "SELECT " + joinAliasValue("l1", "name") + ", " + joinAliasValue("l2", "name") + " FROM Workflow workflow"
+ " LEFT JOIN workflow.localized l1"
+ onClause("KEY(l1) = :locale")
+ " LEFT JOIN workflow.localized l2"
+ onClause("KEY(l2) = workflow.defaultLanguage");
assertEquals(expectedQuery, cb.getQueryString());
cb.setParameter("locale", Locale.GERMAN)
.getResultList();
}
@Test
public void testMultipleNestedJoins() {
CriteriaBuilder<Tuple> cb = cbf.create(em, Tuple.class).from(Document.class)
.leftJoin("partners", "p1")
.leftJoin("partners", "p2")
.leftJoin("p1.localized", "l11")
.leftJoin("p1.localized", "l12")
.leftJoin("p2.localized", "l21")
.leftJoin("p2.localized", "l22")
.select("l11").select("l12")
.select("l21").select("l22");
String expectedQuery = "SELECT "
+ joinAliasValue("l11") + ", "
+ joinAliasValue("l12") + ", "
+ joinAliasValue("l21") + ", "
+ joinAliasValue("l22") + " "
+ "FROM Document document"
+ " LEFT JOIN document.partners p1"
+ " LEFT JOIN p1.localized l11"
+ " LEFT JOIN p1.localized l12"
+ " LEFT JOIN document.partners p2"
+ " LEFT JOIN p2.localized l21"
+ " LEFT JOIN p2.localized l22";
assertEquals(expectedQuery, cb.getQueryString());
cb.getResultList();
}
@Test
public void testMultipleNestedJoinsWithDefault() {
CriteriaBuilder<Tuple> cb = cbf.create(em, Tuple.class).from(Document.class)
.leftJoin("partners", "p1")
.leftJoin("partners.localized", "l")
.where("p1.partnerDocument.name").eq("doc")
.select("l");
String expectedQuery = "SELECT " + joinAliasValue("l") + " FROM Document document"
+ " LEFT JOIN document.partners p1"
+ " LEFT JOIN p1.partnerDocument partnerDocument_1"
+ " LEFT JOIN document.partners partners_1"
+ " LEFT JOIN partners_1.localized l"
+ " WHERE partnerDocument_1.name = :param_0";
assertEquals(expectedQuery, cb.getQueryString());
cb.getResultList();
}
}