blob: fa04a28795b58c838cb56cc11f8cf3d3f52d5a42 [file] [log] [blame]
/*
* Copyright (c) 2006, 2020 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation
//
package org.eclipse.persistence.jpa.tests.jpql.parser;
import org.junit.Test;
import static org.eclipse.persistence.jpa.jpql.parser.Expression.*;
import static org.eclipse.persistence.jpa.tests.jpql.parser.JPQLParserTester.*;
@SuppressWarnings("nls")
public final class JoinTest extends JPQLParserTest {
private void test_Join(String identifier, JoinTester join) {
String jpqlQuery = "SELECT e FROM Employee e " + identifier;
SelectStatementTester selectStatement = selectStatement(
select(variable("e")),
from("Employee", "e", join)
);
join.hasSpaceAfterJoin = false;
testInvalidQuery(jpqlQuery, selectStatement);
}
@Test
public void test_Join_01() {
String jpqlQuery = "SELECT pub FROM Publisher pub JOIN pub.magazines mag WHERE pub.revenue > 1000000";
SelectStatementTester selectStatement = selectStatement(
select(variable("pub")),
from("Publisher", "pub", join("pub.magazines", "mag")),
where(path("pub.revenue").greaterThan(numeric(1000000)))
);
testQuery(jpqlQuery, selectStatement);
}
@Test
public void test_Join_02() {
String jpqlQuery = "SELECT pub FROM Publisher pub JOIN pub.magazines AS mag WHERE pub.revenue > 1000000";
SelectStatementTester selectStatement = selectStatement(
select(variable("pub")),
from("Publisher", "pub", joinAs("pub.magazines", "mag")),
where(path("pub.revenue").greaterThan(numeric(1000000)))
);
testQuery(jpqlQuery, selectStatement);
}
@Test
public void test_Join_03() {
String jpqlQuery = "SELECT pub FROM Publisher pub JOIN pub.magazines WHERE pub.revenue > 1000000";
SelectStatementTester selectStatement = selectStatement(
select(variable("pub")),
from("Publisher", "pub", join(collectionPath("pub.magazines"), nullExpression())),
where(path("pub.revenue").greaterThan(numeric(1000000)))
);
testInvalidQuery(jpqlQuery, selectStatement);
}
@Test
public void test_Join_04() {
String jpqlQuery = "SELECT pub FROM Publisher pub JOIN WHERE pub.revenue > 1000000";
SelectStatementTester selectStatement = selectStatement(
select(variable("pub")),
from("Publisher", "pub", join(nullExpression(), nullExpression())),
where(path("pub.revenue").greaterThan(numeric(1000000)))
);
selectStatement.hasSpaceAfterFrom = false;
testInvalidQuery(jpqlQuery, selectStatement);
}
@Test
public void test_Join_05() {
String jpqlQuery = "SELECT pub FROM Publisher pub JOIN AS HAVING pub.revenue > 1000000";
SelectStatementTester selectStatement = selectStatement(
select(variable("pub")),
from("Publisher", "pub", joinAs(nullExpression(), nullExpression())),
having(path("pub.revenue").greaterThan(numeric(1000000)))
);
selectStatement.hasSpaceAfterFrom = false;
testInvalidQuery(jpqlQuery, selectStatement);
}
@Test
public void test_Join_06() {
String jpqlQuery = "SELECT pub FROM Publisher pub JOIN AS mag WHERE pub.revenue > 1000000";
SelectStatementTester selectStatement = selectStatement(
select(variable("pub")),
from("Publisher", "pub", joinAs(nullExpression(), variable("mag"))),
where(path("pub.revenue").greaterThan(numeric(1000000)))
);
testInvalidQuery(jpqlQuery, selectStatement);
}
@Test
public void test_Join_07() {
String jpqlQuery = "SELECT pub " +
"FROM Publisher pub " +
" LEFT JOIN pub.magazines mag " +
"WHERE pub.revenue > 1000000";
SelectStatementTester selectStatement = selectStatement(
select(variable("pub")),
from("Publisher", "pub", leftJoin(collectionPath("pub.magazines"), variable("mag"))),
where(path("pub.revenue").greaterThan(numeric(1000000)))
);
testQuery(jpqlQuery, selectStatement);
}
@Test
public void test_Join_08() {
String jpqlQuery = "SELECT pub " +
"FROM Publisher pub " +
" INNER JOIN pub.magazines mag " +
"WHERE pub.revenue > 1000000";
SelectStatementTester selectStatement = selectStatement(
select(variable("pub")),
from("Publisher", "pub", innerJoin(collectionPath("pub.magazines"), variable("mag"))),
where(path("pub.revenue").greaterThan(numeric(1000000)))
);
testQuery(jpqlQuery, selectStatement);
}
@Test
public void test_Join_09() {
String jpqlQuery = "SELECT pub " +
"FROM Publisher pub " +
" LEFT OUTER JOIN pub.magazines mag " +
"WHERE pub.revenue > 1000000";
SelectStatementTester selectStatement = selectStatement(
select(variable("pub")),
from("Publisher", "pub", leftOuterJoin(collectionPath("pub.magazines"), variable("mag"))),
where(path("pub.revenue").greaterThan(numeric(1000000)))
);
testQuery(jpqlQuery, selectStatement);
}
@Test
public void test_Join_10() {
String jpqlQuery = "Delete from Employee e join e.address a where e.id < 0";
DeleteStatementTester deleteStatement = deleteStatement(
delete(
spacedCollection(
rangeVariableDeclaration("Employee", "e"),
bad(join("e.address", "a"))
)
),
where(path("e.id").lowerThan(numeric(0)))
);
testInvalidQuery(jpqlQuery, deleteStatement);
}
@Test
public void test_Join_11() {
JoinTester join = join(nullExpression(), nullExpression());
test_Join(JOIN, join);
}
@Test
public void test_Join_12() {
JoinTester join = leftJoin(nullExpression(), nullExpression());
test_Join(LEFT_JOIN, join);
}
@Test
public void test_Join_13() {
JoinTester join = leftOuterJoin(nullExpression(), nullExpression());
test_Join(LEFT_OUTER_JOIN, join);
}
@Test
public void test_Join_14() {
JoinTester join = innerJoin(nullExpression(), nullExpression());
test_Join(INNER_JOIN, join);
}
@Test
public void test_Join_15() {
JoinTester join = join("OUTER JOIN", nullExpression(), nullExpression());
test_Join("OUTER JOIN", join);
}
@Test
public void test_Join_16() {
JoinTester join = joinFetch(nullExpression(), nullExpression());
test_Join(JOIN_FETCH, join);
}
@Test
public void test_Join_17() {
JoinTester join = leftJoinFetch(nullExpression(), nullExpression());
test_Join(LEFT_JOIN_FETCH, join);
}
@Test
public void test_Join_18() {
JoinTester join = leftOuterJoinFetch(nullExpression(), nullExpression());
test_Join(LEFT_OUTER_JOIN_FETCH, join);
}
@Test
public void test_Join_19() {
JoinTester join = innerJoinFetch(nullExpression(), nullExpression());
test_Join(INNER_JOIN_FETCH, join);
}
@Test
public void test_Join_20() {
JoinTester join = join("OUTER JOIN FETCH", nullExpression(), nullExpression());
test_Join("OUTER JOIN FETCH", join);
}
@Test
public void test_Join_21() {
JoinTester join = join("LEFT INNER JOIN", nullExpression(), nullExpression());
test_Join("LEFT INNER JOIN", join);
}
@Test
public void test_Join_22() {
JoinTester join = join("LEFT INNER JOIN FETCH", nullExpression(), nullExpression());
test_Join("LEFT INNER JOIN FETCH", join);
}
@Test
public void test_JoinFetch_01() {
String jpqlQuery = "SELECT pub FROM Publisher pub JOIN FETCH pub.magazines mag WHERE pub.revenue > 1000000";
SelectStatementTester selectStatement = selectStatement(
select(variable("pub")),
from("Publisher", "pub", joinFetch("pub.magazines", "mag")),
where(path("pub.revenue").greaterThan(numeric(1000000)))
);
testQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JoinFetch_02() {
String jpqlQuery = "SELECT pub FROM Publisher pub JOIN FETCH pub.magazines AS mag WHERE pub.revenue > 1000000";
SelectStatementTester selectStatement = selectStatement(
select(variable("pub")),
from("Publisher", "pub", joinFetchAs("pub.magazines", "mag")),
where(path("pub.revenue").greaterThan(numeric(1000000)))
);
testQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JoinFetch_03() {
String jpqlQuery = "SELECT pub FROM Publisher pub JOIN FETCH pub.magazines WHERE pub.revenue > 1000000";
SelectStatementTester selectStatement = selectStatement(
select(variable("pub")),
from("Publisher", "pub", joinFetch(collectionPath("pub.magazines"))),
where(path("pub.revenue").greaterThan(numeric(1000000)))
);
testInvalidQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JoinFetch_04() {
String jpqlQuery = "SELECT pub FROM Publisher pub JOIN FETCH WHERE pub.revenue > 1000000";
SelectStatementTester selectStatement = selectStatement(
select(variable("pub")),
from("Publisher", "pub", joinFetch(nullExpression())),
where(path("pub.revenue").greaterThan(numeric(1000000)))
);
selectStatement.hasSpaceAfterFrom = false;
testInvalidQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JoinFetch_05() {
String jpqlQuery = "SELECT pub FROM Publisher pub JOIN FETCH AS HAVING pub.revenue > 1000000";
SelectStatementTester selectStatement = selectStatement(
select(variable("pub")),
from("Publisher", "pub", joinFetchAs(nullExpression(), nullExpression())),
having(path("pub.revenue").greaterThan(numeric(1000000)))
);
selectStatement.hasSpaceAfterFrom = false;
testInvalidQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JoinFetch_06() {
String jpqlQuery = "SELECT pub FROM Publisher pub JOIN FETCH AS mag WHERE pub.revenue > 1000000";
SelectStatementTester selectStatement = selectStatement(
select(variable("pub")),
from("Publisher", "pub", joinFetchAs(nullExpression(), variable("mag"))),
where(path("pub.revenue").greaterThan(numeric(1000000)))
);
testInvalidQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JoinFetch_07() {
String jpqlQuery = "SELECT pub " +
"FROM Publisher pub " +
" LEFT JOIN FETCH pub.magazines mag " +
"WHERE pub.revenue > 1000000";
SelectStatementTester selectStatement = selectStatement(
select(variable("pub")),
from("Publisher", "pub", leftJoinFetch(collectionPath("pub.magazines"), variable("mag"))),
where(path("pub.revenue").greaterThan(numeric(1000000)))
);
testQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JoinFetch_08() {
String jpqlQuery = "SELECT pub " +
"FROM Publisher pub " +
" INNER JOIN FETCH pub.magazines mag " +
"WHERE pub.revenue > 1000000";
SelectStatementTester selectStatement = selectStatement(
select(variable("pub")),
from("Publisher", "pub", innerJoinFetch(collectionPath("pub.magazines"), variable("mag"))),
where(path("pub.revenue").greaterThan(numeric(1000000)))
);
testQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JoinFetch_09() {
String jpqlQuery = "SELECT pub " +
"FROM Publisher pub " +
" LEFT OUTER JOIN FETCH pub.magazines mag " +
"WHERE pub.revenue > 1000000";
SelectStatementTester selectStatement = selectStatement(
select(variable("pub")),
from("Publisher", "pub", leftOuterJoinFetch(collectionPath("pub.magazines"), variable("mag"))),
where(path("pub.revenue").greaterThan(numeric(1000000)))
);
testQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JoinFetch_10() {
String jpqlQuery = "SELECT pub " +
"FROM Publisher pub " +
" LEFT OUTER JOIN FETCH pub.magazines " +
"WHERE pub.revenue > 1000000";
SelectStatementTester selectStatement = selectStatement(
select(variable("pub")),
from("Publisher", "pub", leftOuterJoinFetch(collectionPath("pub.magazines"))),
where(path("pub.revenue").greaterThan(numeric(1000000)))
);
testQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JoinFetch_11() {
String jpqlQuery = "SELECT pub " +
"FROM Publisher pub " +
" LEFT JOIN FETCH pub.magazines " +
"WHERE pub.revenue > 1000000";
SelectStatementTester selectStatement = selectStatement(
select(variable("pub")),
from("Publisher", "pub", leftJoinFetch(collectionPath("pub.magazines"))),
where(path("pub.revenue").greaterThan(numeric(1000000)))
);
testQuery(jpqlQuery, selectStatement);
}
@Test
public void test_JoinFetch_12() {
String jpqlQuery = "SELECT pub " +
"FROM Publisher pub " +
" JOIN FETCH pub.magazines " +
"WHERE pub.revenue > 1000000";
SelectStatementTester selectStatement = selectStatement(
select(variable("pub")),
from("Publisher", "pub", joinFetch(collectionPath("pub.magazines"))),
where(path("pub.revenue").greaterThan(numeric(1000000)))
);
testQuery(jpqlQuery, selectStatement);
}
}