Skip to content

Commit caa0989

Browse files
Allow Table and Column name expressions to return SqlIdentifier
Signed-off-by: Sergey Korotaev <[email protected]>
1 parent d8e4768 commit caa0989

File tree

2 files changed

+35
-46
lines changed

2 files changed

+35
-46
lines changed

spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentEntity.java

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,17 @@
3737
* @author Bastian Wilhelm
3838
* @author Mikhail Polivakha
3939
* @author Kurt Niemi
40+
* @author Sergey Korotaev
4041
*/
4142
class BasicRelationalPersistentEntity<T> extends BasicPersistentEntity<T, RelationalPersistentProperty>
4243
implements RelationalPersistentEntity<T> {
4344

4445
private static final SpelExpressionParser PARSER = new SpelExpressionParser();
4546

4647
private final Lazy<SqlIdentifier> tableName;
47-
private final @Nullable Expression tableNameExpression;
48+
private final Lazy<SqlIdentifier> tableNameExpression;
4849
private final Lazy<Optional<SqlIdentifier>> schemaName;
49-
private final @Nullable Expression schemaNameExpression;
50+
private final Lazy<SqlIdentifier> schemaNameExpression;
5051
private final ExpressionEvaluator expressionEvaluator;
5152
private boolean forceQuote = true;
5253

@@ -72,19 +73,19 @@ class BasicRelationalPersistentEntity<T> extends BasicPersistentEntity<T, Relati
7273

7374
this.tableName = Lazy.of(() -> StringUtils.hasText(table.value()) ? createSqlIdentifier(table.value())
7475
: createDerivedSqlIdentifier(namingStrategy.getTableName(getType())));
75-
this.tableNameExpression = detectExpression(table.value());
76+
this.tableNameExpression = Lazy.of(() -> detectExpression(table.value()));
7677

7778
this.schemaName = StringUtils.hasText(table.schema())
7879
? Lazy.of(() -> Optional.of(createSqlIdentifier(table.schema())))
7980
: defaultSchema;
80-
this.schemaNameExpression = detectExpression(table.schema());
81+
this.schemaNameExpression = Lazy.of(() -> detectExpression(table.schema()));
8182

8283
} else {
8384

8485
this.tableName = Lazy.of(() -> createDerivedSqlIdentifier(namingStrategy.getTableName(getType())));
85-
this.tableNameExpression = null;
86+
this.tableNameExpression = Lazy.empty();
8687
this.schemaName = defaultSchema;
87-
this.schemaNameExpression = null;
88+
this.schemaNameExpression = Lazy.empty();
8889
}
8990
}
9091

@@ -93,17 +94,20 @@ class BasicRelationalPersistentEntity<T> extends BasicPersistentEntity<T, Relati
9394
* {@link LiteralExpression} (indicating that no subsequent evaluation is necessary).
9495
*
9596
* @param potentialExpression can be {@literal null}
96-
* @return can be {@literal null}.
9797
*/
98-
@Nullable
99-
private static Expression detectExpression(@Nullable String potentialExpression) {
98+
private SqlIdentifier detectExpression(@Nullable String potentialExpression) {
99+
100100

101101
if (!StringUtils.hasText(potentialExpression)) {
102102
return null;
103103
}
104104

105105
Expression expression = PARSER.parseExpression(potentialExpression, ParserContext.TEMPLATE_EXPRESSION);
106-
return expression instanceof LiteralExpression ? null : expression;
106+
if (expression instanceof LiteralExpression) {
107+
return null;
108+
}
109+
110+
return createSqlIdentifier(expressionEvaluator.evaluate(expression));
107111
}
108112

109113
private SqlIdentifier createSqlIdentifier(String name) {
@@ -124,32 +128,21 @@ public void setForceQuote(boolean forceQuote) {
124128

125129
@Override
126130
public SqlIdentifier getTableName() {
127-
128-
if (tableNameExpression == null) {
129-
return tableName.get();
130-
}
131-
132-
return createSqlIdentifier(expressionEvaluator.evaluate(tableNameExpression));
131+
return tableNameExpression.getOptional()
132+
.orElse(tableName.get());
133133
}
134134

135135
@Override
136136
public SqlIdentifier getQualifiedTableName() {
137137

138138
SqlIdentifier schema;
139-
if (schemaNameExpression != null) {
140-
schema = createSqlIdentifier(expressionEvaluator.evaluate(schemaNameExpression));
141-
} else {
142-
schema = schemaName.get().orElse(null);
143-
}
139+
schema = schemaNameExpression.getOptional()
140+
.orElse(schemaName.get().orElse(null));
144141

145142
if (schema == null) {
146143
return getTableName();
147144
}
148145

149-
if (schemaNameExpression != null) {
150-
schema = createSqlIdentifier(expressionEvaluator.evaluate(schemaNameExpression));
151-
}
152-
153146
return SqlIdentifier.from(schema, getTableName());
154147
}
155148

spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentProperty.java

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
* @author Florian Lüdiger
4444
* @author Bastian Wilhelm
4545
* @author Kurt Niemi
46+
* @author Sergey Korotaev
4647
*/
4748
public class BasicRelationalPersistentProperty extends AnnotationBasedPersistentProperty<RelationalPersistentProperty>
4849
implements RelationalPersistentProperty {
@@ -51,11 +52,11 @@ public class BasicRelationalPersistentProperty extends AnnotationBasedPersistent
5152

5253
private final Lazy<SqlIdentifier> columnName;
5354
private final boolean hasExplicitColumnName;
54-
private final @Nullable Expression columnNameExpression;
55+
private final Lazy<SqlIdentifier> columnNameExpression;
5556
private final SqlIdentifier sequence;
5657
private final Lazy<Optional<SqlIdentifier>> collectionIdColumnName;
5758
private final Lazy<SqlIdentifier> collectionKeyColumnName;
58-
private final @Nullable Expression collectionKeyColumnNameExpression;
59+
private final Lazy<SqlIdentifier> collectionKeyColumnNameExpression;
5960
private final boolean isEmbedded;
6061
private final String embeddedPrefix;
6162

@@ -101,10 +102,10 @@ public BasicRelationalPersistentProperty(Property property, PersistentEntity<?,
101102
() -> StringUtils.hasText(mappedCollection.keyColumn()) ? createSqlIdentifier(mappedCollection.keyColumn())
102103
: createDerivedSqlIdentifier(namingStrategy.getKeyColumn(this)));
103104

104-
this.collectionKeyColumnNameExpression = detectExpression(mappedCollection.keyColumn());
105+
this.collectionKeyColumnNameExpression = Lazy.of(() -> detectExpression(mappedCollection.keyColumn()));
105106
} else {
106107

107-
this.collectionKeyColumnNameExpression = null;
108+
this.collectionKeyColumnNameExpression = Lazy.empty();
108109
}
109110

110111
if (isAnnotationPresent(Column.class)) {
@@ -114,7 +115,7 @@ public BasicRelationalPersistentProperty(Property property, PersistentEntity<?,
114115

115116
this.columnName = Lazy.of(() -> StringUtils.hasText(column.value()) ? createSqlIdentifier(column.value())
116117
: createDerivedSqlIdentifier(namingStrategy.getColumnName(this)));
117-
this.columnNameExpression = detectExpression(column.value());
118+
this.columnNameExpression = Lazy.of(() -> detectExpression(column.value()));
118119

119120
if (collectionIdColumnName == null && StringUtils.hasText(column.value())) {
120121
collectionIdColumnName = Lazy.of(() -> Optional.of(createSqlIdentifier(column.value())));
@@ -123,7 +124,7 @@ public BasicRelationalPersistentProperty(Property property, PersistentEntity<?,
123124
} else {
124125
this.hasExplicitColumnName = false;
125126
this.columnName = Lazy.of(() -> createDerivedSqlIdentifier(namingStrategy.getColumnName(this)));
126-
this.columnNameExpression = null;
127+
this.columnNameExpression = Lazy.empty();
127128
}
128129

129130
this.sequence = determineSequenceName();
@@ -145,17 +146,19 @@ void setExpressionEvaluator(ExpressionEvaluator expressionEvaluator) {
145146
* {@link LiteralExpression} (indicating that no subsequent evaluation is necessary).
146147
*
147148
* @param potentialExpression can be {@literal null}
148-
* @return can be {@literal null}.
149149
*/
150-
@Nullable
151-
private static Expression detectExpression(@Nullable String potentialExpression) {
150+
private SqlIdentifier detectExpression(@Nullable String potentialExpression) {
152151

153152
if (!StringUtils.hasText(potentialExpression)) {
154153
return null;
155154
}
156155

157156
Expression expression = PARSER.parseExpression(potentialExpression, ParserContext.TEMPLATE_EXPRESSION);
158-
return expression instanceof LiteralExpression ? null : expression;
157+
if (expression instanceof LiteralExpression) {
158+
return null;
159+
}
160+
161+
return createSqlIdentifier(expressionEvaluator.evaluate(expression));
159162
}
160163

161164
private SqlIdentifier createSqlIdentifier(String name) {
@@ -186,12 +189,8 @@ public boolean isEntity() {
186189

187190
@Override
188191
public SqlIdentifier getColumnName() {
189-
190-
if (columnNameExpression == null) {
191-
return columnName.get();
192-
}
193-
194-
return createSqlIdentifier(expressionEvaluator.evaluate(columnNameExpression));
192+
return columnNameExpression.getOptional()
193+
.orElse(columnName.get());
195194
}
196195

197196
@Override
@@ -218,11 +217,8 @@ public SqlIdentifier getKeyColumn() {
218217
return null;
219218
}
220219

221-
if (collectionKeyColumnNameExpression == null) {
222-
return collectionKeyColumnName.get();
223-
}
224-
225-
return createSqlIdentifier(expressionEvaluator.evaluate(collectionKeyColumnNameExpression));
220+
return collectionKeyColumnNameExpression.getOptional()
221+
.orElse(collectionKeyColumnName.get());
226222
}
227223

228224
@Override

0 commit comments

Comments
 (0)