blob: 62c65ffce59bbc098b786de816110d2635f1cb8d [file] [log] [blame]
/*
* Copyright (c) 2011, 2021 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.tools.model;
import java.io.IOException;
import org.eclipse.persistence.jpa.jpql.tools.model.AbstractActualJPQLQueryFormatter;
import org.eclipse.persistence.jpa.jpql.tools.model.DefaultActualJPQLQueryFormatter;
import org.eclipse.persistence.jpa.jpql.tools.model.query.AbsExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.AbstractStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.JPQLQueryStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.SelectStatementStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.StateFieldPathExpressionStateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.StateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.StateObjectVisitor;
import org.eclipse.persistence.jpa.tests.jpql.UniqueSignature;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* This unit-tests tests {@link DefaultActualJPQLQueryFormatter}.
*
* @version 2.5
* @since 2.4
* @author Pascal Filion
*/
@UniqueSignature
@SuppressWarnings("nls")
public final class DefaultActualJPQLQueryFormatterTest extends AbstractStateObjectTest {
/**
* Exact match, using info from Expression, which is valid.
*/
@Test
public void testAbsExpression_ExactMatch1() throws Exception {
String jpqlQuery = "SeLeCt AbS(e.age) FrOm Employee e";
StateObject stateObject = buildStateObject(jpqlQuery, true);
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(true);
assertEquals("SeLeCt AbS(e.age) FrOm Employee e", formatter.toString(stateObject));
}
/**
* Exact match, using info from Expression, which is invalid.
*/
@Test
public void testAbsExpression_ExactMatch2() throws Exception {
String jpqlQuery = "SELECT aBs FROM Employee e";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(true);
assertEquals("SELECT aBs FROM Employee e", formatter.toString(stateObject));
}
/**
* Exact match, using info from Expression, which is invalid.
*/
@Test
public void testAbsExpression_ExactMatch3() throws Exception {
String jpqlQuery = "SELECT aBs(e.age FROM Employee e";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(true);
assertEquals("SELECT aBs(e.age FROM Employee e", formatter.toString(stateObject));
}
/**
* Exact match, using info from Expression, which is valid.
*/
@Test
public void testAbsExpression_ExactMatch4() throws Exception {
String jpqlQuery = "SELECT abS(e.age) FROM Employee e";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(true);
assertEquals("SELECT abS(e.age) FROM Employee e", formatter.toString(stateObject));
}
/**
* Exact match, no Expression available.
*/
@Test
public void testAbsExpression_ExactMatch5() throws Exception {
String jpqlQuery = "SELECT FROM Employee e";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
SelectStatementStateObject select = (SelectStatementStateObject) stateObject.getQueryStatement();
select.addSelectItem(new AbsExpressionStateObject(select, new StateFieldPathExpressionStateObject(select, "e.age")));
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(true);
assertEquals("SELECT ABS(e.age) FROM Employee e", formatter.toString(stateObject));
}
/**
* No exact match, should not use info from Expression, which is invalid.
*/
@Test
public void testAbsExpression_NoExactMatch1() throws Exception {
String jpqlQuery = "SeLeCt AbS FrOm Employee e";
StateObject stateObject = buildStateObject(jpqlQuery, true);
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(false);
assertEquals("SELECT ABS() FROM Employee e", formatter.toString(stateObject));
}
/**
* No exact match, should not use info from Expression, which is invalid.
*/
@Test
public void testAbsExpression_NoExactMatch2() throws Exception {
String jpqlQuery = "SeLeCt AbS( FrOm Employee e";
StateObject stateObject = buildStateObject(jpqlQuery, true);
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(false);
assertEquals("SELECT ABS() FROM Employee e", formatter.toString(stateObject));
}
/**
* No exact match, no Expression available.
*/
@Test
public void testAbsExpression_NoExactMatch3() throws Exception {
String jpqlQuery = "SELECT FROM Employee e";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
SelectStatementStateObject select = (SelectStatementStateObject) stateObject.getQueryStatement();
select.addSelectItem(new AbsExpressionStateObject(select, new StateFieldPathExpressionStateObject(select, "e.age")));
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(false);
assertEquals("SELECT ABS(e.age) FROM Employee e", formatter.toString(stateObject));
}
/**
* Test decorated StateObject.
*/
@Test
public void testDecorated() throws Exception {
String jpqlQuery = "Select e From Employee e";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
SelectStatementStateObject select = (SelectStatementStateObject) stateObject.getQueryStatement();
select.decorate(new DecoratedSelectStatementStateObject(select));
DecoratedActualJPQLQueryFormatter formatter = new DecoratedActualJPQLQueryFormatter(false);
assertEquals("Decorated SELECT e FROM Employee e", formatter.toString(stateObject));
}
/**
* Exact match, Expression available, which is invalid.
*/
@Test
public void testHavingClause_ExactMatch1() throws Exception {
String jpqlQuery = "SELECT e fRom Employee e hAvInG";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(true);
assertEquals("SELECT e fRom Employee e hAvInG", formatter.toString(stateObject));
}
/**
* Exact match, Expression available, which is invalid.
*/
@Test
public void testHavingClause_ExactMatch2() throws Exception {
String jpqlQuery = "SELECT e fRom Employee e hAvInG ";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(true);
assertEquals("SELECT e fRom Employee e hAvInG ", formatter.toString(stateObject));
}
/**
* Exact match, Expression available, which invalid.
*/
@Test
public void testHavingClause_ExactMatch3() throws Exception {
String jpqlQuery = "SELECT e fRom Employee e hAvInG e.name = 'JPQL'";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(true);
assertEquals("SELECT e fRom Employee e hAvInG e.name = 'JPQL'", formatter.toString(stateObject));
}
/**
* Exact match, no Expression available.
*/
@Test
public void testHavingClause_ExactMatch4() throws Exception {
String jpqlQuery = "SELECT e fRom Employee e";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
SelectStatementStateObject select = (SelectStatementStateObject) stateObject.getQueryStatement();
select.addHavingClause();
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(true);
assertEquals("SELECT e fRom Employee e HAVING", formatter.toString(stateObject));
}
/**
* Exact match, no Expression available.
*/
@Test
public void testHavingClause_ExactMatch5() throws Exception {
String jpqlQuery = "SELECT e fRom Employee e";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
SelectStatementStateObject select = (SelectStatementStateObject) stateObject.getQueryStatement();
select.addHavingClause("e.name = 'JPQL'");
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(true);
assertEquals("SELECT e fRom Employee e HAVING e.name = 'JPQL'", formatter.toString(stateObject));
}
/**
* No exact match.
*/
@Test
public void testHavingClause_NoExactMatch1() throws Exception {
String jpqlQuery = "sELect e fRom Employee e HavinG e.name = 'JPQL'";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(false);
assertEquals("SELECT e FROM Employee e HAVING e.name = 'JPQL'", formatter.toString(stateObject));
}
/**
* No exact match.
*/
@Test
public void testHavingClause_NoExactMatch2() throws Exception {
String jpqlQuery = "sELect e fRom Employee e HavinG";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(false);
assertEquals("SELECT e FROM Employee e HAVING", formatter.toString(stateObject));
}
/**
* No exact match.
*/
@Test
public void testHavingClause_NoExactMatch3() throws Exception {
String jpqlQuery = "sELect e fRom Employee e HavinG ";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(false);
assertEquals("SELECT e FROM Employee e HAVING", formatter.toString(stateObject));
}
/**
* No exact match.
*/
@Test
public void testHavingClause_NoExactMatch4() throws Exception {
String jpqlQuery = "sELect e fRom Employee e";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
SelectStatementStateObject select = (SelectStatementStateObject) stateObject.getQueryStatement();
select.addHavingClause("e.name = 'JPQL'");
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(false);
assertEquals("SELECT e FROM Employee e HAVING e.name = 'JPQL'", formatter.toString(stateObject));
}
/**
* Exact match, Expression available, which is invalid.
*/
@Test
public void testWhereClause_ExactMatch1() throws Exception {
String jpqlQuery = "SELECT e fRom Employee e wHeRe";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(true);
assertEquals("SELECT e fRom Employee e wHeRe", formatter.toString(stateObject));
}
/**
* Exact match, Expression available, which is invalid.
*/
@Test
public void testWhereClause_ExactMatch2() throws Exception {
String jpqlQuery = "SELECT e fRom Employee e wHeRe ";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(true);
assertEquals("SELECT e fRom Employee e wHeRe ", formatter.toString(stateObject));
}
/**
* Exact match, Expression available, which invalid.
*/
@Test
public void testWhereClause_ExactMatch3() throws Exception {
String jpqlQuery = "SELECT e fRom Employee e wHeRe e.name = 'JPQL'";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(true);
assertEquals("SELECT e fRom Employee e wHeRe e.name = 'JPQL'", formatter.toString(stateObject));
}
/**
* Exact match, no Expression available.
*/
@Test
public void testWhereClause_ExactMatch4() throws Exception {
String jpqlQuery = "SELECT e fRom Employee e";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
SelectStatementStateObject select = (SelectStatementStateObject) stateObject.getQueryStatement();
select.addWhereClause();
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(true);
assertEquals("SELECT e fRom Employee e WHERE", formatter.toString(stateObject));
}
/**
* Exact match, no Expression available.
*/
@Test
public void testWhereClause_ExactMatch5() throws Exception {
String jpqlQuery = "SELECT e fRom Employee e";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
SelectStatementStateObject select = (SelectStatementStateObject) stateObject.getQueryStatement();
select.addWhereClause("e.name = 'JPQL'");
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(true);
assertEquals("SELECT e fRom Employee e WHERE e.name = 'JPQL'", formatter.toString(stateObject));
}
/**
* No exact match.
*/
@Test
public void testWhereClause_NoExactMatch1() throws Exception {
String jpqlQuery = "sELect e fRom Employee e WheRe e.name = 'JPQL'";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(false);
assertEquals("SELECT e FROM Employee e WHERE e.name = 'JPQL'", formatter.toString(stateObject));
}
/**
* No exact match.
*/
@Test
public void testWhereClause_NoExactMatch2() throws Exception {
String jpqlQuery = "sELect e fRom Employee e WheRe";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(false);
assertEquals("SELECT e FROM Employee e WHERE", formatter.toString(stateObject));
}
/**
* No exact match.
*/
@Test
public void testWhereClause_NoExactMatch3() throws Exception {
String jpqlQuery = "sELect e fRom Employee e WheRe ";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(false);
assertEquals("SELECT e FROM Employee e WHERE", formatter.toString(stateObject));
}
/**
* No exact match.
*/
@Test
public void testWhereClause_NoExactMatch4() throws Exception {
String jpqlQuery = "sELect e fRom Employee e";
JPQLQueryStateObject stateObject = buildStateObject(jpqlQuery, true);
SelectStatementStateObject select = (SelectStatementStateObject) stateObject.getQueryStatement();
select.addWhereClause("e.name = 'JPQL'");
DefaultActualJPQLQueryFormatter formatter = new DefaultActualJPQLQueryFormatter(false);
assertEquals("SELECT e FROM Employee e WHERE e.name = 'JPQL'", formatter.toString(stateObject));
}
private static class DecoratedActualJPQLQueryFormatter extends AbstractActualJPQLQueryFormatter {
DecoratedActualJPQLQueryFormatter(boolean exactMatch) {
super(exactMatch);
}
@SuppressWarnings("unused")
public void visit(DecoratedSelectStatementStateObject stateObject) {
writer.append("Decorated ");
stateObject.getParent().accept(this);
}
}
private static class DecoratedSelectStatementStateObject extends AbstractStateObject {
DecoratedSelectStatementStateObject(SelectStatementStateObject parent) {
super(parent);
}
@Override
public void accept(StateObjectVisitor visitor) {
acceptUnknownVisitor(visitor);
}
@Override
public SelectStatementStateObject getParent() {
return (SelectStatementStateObject) super.getParent();
}
@Override
protected void toTextInternal(Appendable writer) throws IOException {
writer.append("Decorated ");
getParent().toText(writer);
}
}
}