Use fully qualified names in ORDER BY clause.

Closes #968
Original pull request: #1080.
This commit is contained in:
Jens Schauder
2021-11-04 10:30:20 +01:00
committed by Mark Paluch
parent bc164cd4fb
commit 7d1ed85cbe
7 changed files with 69 additions and 26 deletions

View File

@@ -218,7 +218,7 @@ public class SqlGeneratorUnitTests {
"FROM dummy_entity ", //
"LEFT OUTER JOIN referenced_entity ref ON ref.dummy_entity = dummy_entity.id1", //
"LEFT OUTER JOIN second_level_referenced_entity ref_further ON ref_further.referenced_entity = ref.x_l1id", //
"ORDER BY x_name ASC");
"ORDER BY dummy_entity.x_name ASC");
}
@Test // DATAJDBC-101
@@ -238,7 +238,7 @@ public class SqlGeneratorUnitTests {
"FROM dummy_entity ", //
"LEFT OUTER JOIN referenced_entity ref ON ref.dummy_entity = dummy_entity.id1", //
"LEFT OUTER JOIN second_level_referenced_entity ref_further ON ref_further.referenced_entity = ref.x_l1id", //
"ORDER BY x_name DESC", //
"ORDER BY dummy_entity.x_name DESC", //
"x_other ASC");
}
@@ -286,7 +286,7 @@ public class SqlGeneratorUnitTests {
"FROM dummy_entity ", //
"LEFT OUTER JOIN referenced_entity ref ON ref.dummy_entity = dummy_entity.id1", //
"LEFT OUTER JOIN second_level_referenced_entity ref_further ON ref_further.referenced_entity = ref.x_l1id", //
"ORDER BY x_name ASC", //
"ORDER BY dummy_entity.x_name ASC", //
"OFFSET 30", //
"LIMIT 10");
}
@@ -371,7 +371,8 @@ public class SqlGeneratorUnitTests {
+ "FROM dummy_entity " //
+ "LEFT OUTER JOIN referenced_entity ref ON ref.dummy_entity = dummy_entity.id1 " //
+ "LEFT OUTER JOIN second_level_referenced_entity ref_further ON ref_further.referenced_entity = ref.x_l1id " //
+ "WHERE dummy_entity.backref = :backref " + "ORDER BY key-column");
+ "WHERE dummy_entity.backref = :backref " //
+ "ORDER BY dummy_entity.key-column");
}
@Test // DATAJDBC-219
@@ -493,7 +494,7 @@ public class SqlGeneratorUnitTests {
+ "entity_with_read_only_property.key-column AS key-column " //
+ "FROM entity_with_read_only_property " //
+ "WHERE entity_with_read_only_property.backref = :backref " //
+ "ORDER BY key-column" //
+ "ORDER BY entity_with_read_only_property.key-column" //
);
}

View File

@@ -445,7 +445,7 @@ public class PartTreeJdbcQueryUnitTests {
ParametrizedQuery query = jdbcQuery.createQuery(accessor, returnedType);
assertThat(query.getQuery())
.isEqualTo(BASE_SELECT + " WHERE " + TABLE + ".\"AGE\" = :age ORDER BY \"LAST_NAME\" DESC");
.isEqualTo(BASE_SELECT + " WHERE " + TABLE + ".\"AGE\" = :age ORDER BY \"users\".\"LAST_NAME\" DESC");
}
@Test // DATAJDBC-318
@@ -456,7 +456,7 @@ public class PartTreeJdbcQueryUnitTests {
ParametrizedQuery query = jdbcQuery.createQuery(accessor, returnedType);
assertThat(query.getQuery())
.isEqualTo(BASE_SELECT + " WHERE " + TABLE + ".\"AGE\" = :age ORDER BY \"LAST_NAME\" ASC");
.isEqualTo(BASE_SELECT + " WHERE " + TABLE + ".\"AGE\" = :age ORDER BY \"users\".\"LAST_NAME\" ASC");
}
@Test // DATAJDBC-318

View File

@@ -77,7 +77,7 @@ class OrderByClauseVisitor extends TypedSubtreeVisitor<OrderByField> implements
Delegation leaveNested(Visitable segment) {
if (segment instanceof Column) {
builder.append(NameRenderer.reference(context, (Column) segment));
builder.append(NameRenderer.fullyQualifiedReference(context, (Column) segment));
}
return super.leaveNested(segment);

View File

@@ -112,7 +112,7 @@ public class SqlServerDialectRenderingUnitTests {
String sql = SqlRenderer.create(factory.createRenderContext()).render(select);
assertThat(sql).isEqualTo("SELECT foo.* FROM foo ORDER BY column_1 OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY");
assertThat(sql).isEqualTo("SELECT foo.* FROM foo ORDER BY foo.column_1 OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY");
}
@Test // DATAJDBC-498
@@ -177,7 +177,7 @@ public class SqlServerDialectRenderingUnitTests {
String sql = SqlRenderer.create(factory.createRenderContext()).render(select);
assertThat(sql).isEqualTo("SELECT foo.* FROM foo WITH (UPDLOCK, ROWLOCK) ORDER BY column_1 OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY");
assertThat(sql).isEqualTo("SELECT foo.* FROM foo WITH (UPDLOCK, ROWLOCK) ORDER BY foo.column_1 OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY");
}
@Test // DATAJDBC-498
@@ -190,6 +190,6 @@ public class SqlServerDialectRenderingUnitTests {
String sql = SqlRenderer.create(factory.createRenderContext()).render(select);
assertThat(sql).isEqualTo("SELECT foo.* FROM foo WITH (HOLDLOCK, ROWLOCK) ORDER BY column_1 OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY");
assertThat(sql).isEqualTo("SELECT foo.* FROM foo WITH (HOLDLOCK, ROWLOCK) ORDER BY foo.column_1 OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY");
}
}

View File

@@ -49,14 +49,4 @@ class NameRendererUnitTests {
assertThat(rendered).isEqualTo("tab_alias.col_alias");
}
@Test // GH-1003
void fullyQualifiedUnaliasedReference() {
Column column = Column.aliased("col", Table.aliased("table", "tab_alias"), "col_alias");
CharSequence rendered = NameRenderer.fullyQualifiedUnaliasedReference(context, column);
assertThat(rendered).isEqualTo("tab_alias.col");
}
}

View File

@@ -32,7 +32,7 @@ import org.springframework.data.relational.core.sql.Table;
public class OrderByClauseVisitorUnitTests {
@Test // DATAJDBC-309
public void shouldRenderOrderByName() {
public void shouldRenderOrderByAlias() {
Table employee = SQL.table("employee").as("emp");
Column column = employee.column("name").as("emp_name");
@@ -42,9 +42,8 @@ public class OrderByClauseVisitorUnitTests {
OrderByClauseVisitor visitor = new OrderByClauseVisitor(new SimpleRenderContext(NamingStrategies.asIs()));
select.visit(visitor);
assertThat(visitor.getRenderedPart().toString()).isEqualTo("emp_name ASC");
assertThat(visitor.getRenderedPart().toString()).isEqualTo("emp.emp_name ASC");
}
@Test // DATAJDBC-309
public void shouldApplyNamingStrategy() {
@@ -56,6 +55,37 @@ public class OrderByClauseVisitorUnitTests {
OrderByClauseVisitor visitor = new OrderByClauseVisitor(new SimpleRenderContext(NamingStrategies.toUpper()));
select.visit(visitor);
assertThat(visitor.getRenderedPart().toString()).isEqualTo("EMP_NAME ASC");
assertThat(visitor.getRenderedPart().toString()).isEqualTo("EMP.EMP_NAME ASC");
}
@Test // GH-968
public void shouldRenderOrderByFullyQualifiedName() {
Table employee = SQL.table("employee");
Column column = employee.column("name");
Select select = Select.builder().select(column).from(employee).orderBy(OrderByField.from(column).asc()).build();
OrderByClauseVisitor visitor = new OrderByClauseVisitor(new SimpleRenderContext(NamingStrategies.asIs()));
select.visit(visitor);
assertThat(visitor.getRenderedPart().toString()).isEqualTo("employee.name ASC");
}
@Test // GH-968
public void shouldRenderOrderByFullyQualifiedNameWithTableAlias() {
Table employee = SQL.table("employee").as("emp");
Column column = employee.column("name");
Select select = Select.builder().select(column).from(employee).orderBy(OrderByField.from(column).asc()).build();
OrderByClauseVisitor visitor = new OrderByClauseVisitor(new SimpleRenderContext(NamingStrategies.asIs()));
select.visit(visitor);
assertThat(visitor.getRenderedPart().toString()).isEqualTo("emp.name ASC");
}
}

View File

@@ -266,7 +266,7 @@ class SelectRendererUnitTests {
Select select = Select.builder().select(column).from(employee).orderBy(OrderByField.from(column).asc()).build();
assertThat(SqlRenderer.toString(select))
.isEqualTo("SELECT emp.name AS emp_name FROM employee emp ORDER BY emp_name ASC");
.isEqualTo("SELECT emp.name AS emp_name FROM employee emp ORDER BY emp.emp_name ASC");
}
@Test // DATAJDBC-309
@@ -467,4 +467,26 @@ class SelectRendererUnitTests {
final String rendered = SqlRenderer.toString(select);
assertThat(rendered).isEqualTo("SELECT CAST(User.name AS VARCHAR2) FROM User");
}
@Test // GH-968
void rendersFullyQualifiedNamesInOrderBy() {
Table tableA = SQL.table("tableA");
Column tableAName = tableA.column("name");
Column tableAId = tableA.column("id");
Table tableB = SQL.table("tableB");
Column tableBId = tableB.column("id");
Column tableBName = tableB.column("name");
Select select = StatementBuilder.select(Expressions.asterisk()) //
.from(tableA) //
.join(tableB).on(tableAId.isEqualTo(tableBId)) //
.orderBy(tableAName, tableBName) //
.build();
final String rendered = SqlRenderer.toString(select);
assertThat(rendered)
.isEqualTo("SELECT * FROM tableA JOIN tableB ON tableA.id = tableB.id ORDER BY tableA.name, tableB.name");
}
}