/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: Apache License, Version 2.0
* See the LICENSE file in the root directory or visit http://www.apache.org/licenses/LICENSE-2.0
*/
package org.hibernate.sqm.test.hql;
import org.hibernate.query.sqm.SemanticException;
import org.hibernate.query.sqm.tree.SqmSelectStatement;
import org.hibernate.query.sqm.tree.expression.domain.SqmEntityReference;
import org.hibernate.query.sqm.tree.expression.domain.SqmSingularAttributeReference;
import org.hibernate.query.sqm.tree.from.SqmFromElementSpace;
import org.hibernate.query.sqm.tree.from.SqmRoot;
import org.hibernate.query.sqm.tree.select.SqmSelection;
import org.hibernate.sqm.test.domain.StandardModelTest;
import org.hibernate.test.sqm.domain.FromElementHelper;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.endsWith;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.startsWith;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
/**
* @author Steve Ebersole
*/
public class FromElementContainmentTests extends StandardModelTest {
@Test
public void testPathExpression() {
final String query = "select p.mate from Person p";
SqmSelectStatement statement = interpretSelect( query );
assertEquals( 1, statement.getQuerySpec().getFromClause().getFromElementSpaces().size() );
final SqmFromElementSpace fromElementSpace = statement.getQuerySpec().getFromClause().getFromElementSpaces().get( 0 );
assertThat( fromElementSpace.getJoins().size(), is(1) );
assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() );
SqmSelection selection = statement.getQuerySpec().getSelectClause().getSelections().get( 0 );
assertThat( selection.getExpression(), instanceOf( SqmSingularAttributeReference.class ) );
assertSame( fromElementSpace.getJoins().get( 0 ), FromElementHelper.extractExpressionFromElement( selection.getExpression() ) );
}
@Test
public void testFromElementReferenceInSelect() {
final String query = "select p from Person p";
SqmSelectStatement statement = interpretSelect( query );
assertEquals( 1, statement.getQuerySpec().getFromClause().getFromElementSpaces().size() );
final SqmFromElementSpace fromElementSpace = statement.getQuerySpec().getFromClause().getFromElementSpaces().get( 0 );
final SqmRoot fromElement = fromElementSpace.getRoot();
assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() );
SqmSelection selection = statement.getQuerySpec().getSelectClause().getSelections().get( 0 );
assertThat( selection.getExpression(), instanceOf( SqmEntityReference.class ) );
assertSame( fromElement, FromElementHelper.extractExpressionFromElement( selection.getExpression() ) );
}
@Test
public void testFromElementReferenceInOrderBy() {
final String query = "select p from Person p order by p";
SqmSelectStatement statement = interpretSelect( query );
assertEquals( 1, statement.getQuerySpec().getFromClause().getFromElementSpaces().size() );
SqmRoot fromElement = statement.getQuerySpec().getFromClause().getFromElementSpaces().get( 0 ).getRoot();
assertEquals( 1, statement.getQuerySpec().getOrderByClause().getSortSpecifications().size() );
assertThat(
statement.getQuerySpec().getOrderByClause().getSortSpecifications().get( 0 ).getSortExpression(),
instanceOf( SqmEntityReference.class )
);
assertSame(
fromElement,
FromElementHelper.extractExpressionFromElement( statement.getQuerySpec().getOrderByClause().getSortSpecifications().get( 0 ).getSortExpression() )
);
}
@Test
public void testCrossSpaceReferencesFail() {
final String query = "select p from Person p, Person p2 join Person p3 on p3.id = p.id ";
try {
interpret( query );
fail( "Expecting failure" );
}
catch (SemanticException e) {
assertThat( e.getMessage(), startsWith( "Qualified join predicate referred to FromElement [" ) );
assertThat( e.getMessage(), endsWith( "] outside the FromElementSpace containing the join" ) );
}
}
}