Skip to content

Commit 211a798

Browse files
Enhance DefaultDynamoDbTableNameResolver with caching and improved table name resolution (#1464)
Enhance `DefaultDynamoDbTableNameResolver` with caching and improved table name resolution. Fixes: #1463
1 parent 313d106 commit 211a798

File tree

2 files changed

+38
-22
lines changed

2 files changed

+38
-22
lines changed

spring-cloud-aws-dynamodb/src/main/java/io/awspring/cloud/dynamodb/DefaultDynamoDbTableNameResolver.java

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@
1616
package io.awspring.cloud.dynamodb;
1717

1818
import java.util.Locale;
19+
import java.util.Map;
20+
import java.util.concurrent.ConcurrentHashMap;
1921
import org.springframework.lang.Nullable;
20-
import org.springframework.util.Assert;
2122
import org.springframework.util.StringUtils;
2223

2324
/**
@@ -26,17 +27,15 @@
2627
* @author Matej Nedic
2728
* @author Arun Patra
2829
* @author Volodymyr Ivakhnenko
30+
* @author Marcus Voltolim
2931
* @since 3.0
3032
*/
3133
public class DefaultDynamoDbTableNameResolver implements DynamoDbTableNameResolver {
3234

33-
@Nullable
34-
private final String tablePrefix;
35+
private final Map<Class<?>, String> tableNameCache = new ConcurrentHashMap<>();
3536

36-
@Nullable
37+
private final String tablePrefix;
3738
private final String tableSuffix;
38-
39-
@Nullable
4039
private final String tableSeparator;
4140

4241
public DefaultDynamoDbTableNameResolver() {
@@ -53,22 +52,23 @@ public DefaultDynamoDbTableNameResolver(@Nullable String tablePrefix, @Nullable
5352

5453
public DefaultDynamoDbTableNameResolver(@Nullable String tablePrefix, @Nullable String tableSuffix,
5554
@Nullable String tableSeparator) {
56-
this.tablePrefix = tablePrefix;
57-
this.tableSuffix = tableSuffix;
58-
this.tableSeparator = tableSeparator;
55+
this.tablePrefix = StringUtils.hasText(tablePrefix) ? tablePrefix : "";
56+
this.tableSuffix = StringUtils.hasText(tableSuffix) ? tableSuffix : "";
57+
this.tableSeparator = StringUtils.hasText(tableSeparator) ? tableSeparator : "_";
5958
}
6059

6160
@Override
62-
public String resolve(Class clazz) {
63-
Assert.notNull(clazz, "clazz is required");
61+
public <T> String resolve(Class<T> clazz) {
62+
return tableNameCache.computeIfAbsent(clazz, this::resolveInternal);
63+
}
6464

65-
String prefix = StringUtils.hasText(tablePrefix) ? tablePrefix : "";
66-
String suffix = StringUtils.hasText(tableSuffix) ? tableSuffix : "";
67-
String separator = StringUtils.hasText(tableSeparator) ? tableSeparator : "_";
65+
private <T> String resolveInternal(Class<T> clazz) {
66+
final String className = clazz.getSimpleName().replaceAll("(.)(\\p{Lu})", "$1" + tableSeparator + "$2");
67+
return tablePrefix + className.toLowerCase(Locale.ROOT) + tableSuffix;
68+
}
6869

69-
return prefix.concat(
70-
clazz.getSimpleName().replaceAll("(.)(\\p{Lu})", "$1" + separator + "$2").toLowerCase(Locale.ROOT))
71-
.concat(suffix);
70+
Map<Class<?>, String> getTableNameCache() {
71+
return tableNameCache;
7272
}
7373

7474
}

spring-cloud-aws-dynamodb/src/test/java/io/awspring/cloud/dynamodb/DynamoDbTableNameResolverTest.java

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,36 +28,38 @@
2828
*/
2929
class DynamoDbTableNameResolverTest {
3030

31-
private static final DefaultDynamoDbTableNameResolver tableNameResolver = new DefaultDynamoDbTableNameResolver(
32-
null);
31+
private final DefaultDynamoDbTableNameResolver tableNameResolver = new DefaultDynamoDbTableNameResolver();
3332

34-
private static final DefaultDynamoDbTableNameResolver prefixedTableNameResolver = new DefaultDynamoDbTableNameResolver(
33+
private final DefaultDynamoDbTableNameResolver prefixedTableNameResolver = new DefaultDynamoDbTableNameResolver(
3534
"my_prefix_");
3635

37-
private static final DefaultDynamoDbTableNameResolver prefixedAndSuffixedTableNameResolver = new DefaultDynamoDbTableNameResolver(
36+
private final DefaultDynamoDbTableNameResolver prefixedAndSuffixedTableNameResolver = new DefaultDynamoDbTableNameResolver(
3837
"my_prefix_", "_my_suffix");
3938

40-
private static final DefaultDynamoDbTableNameResolver prefixedAndSuffixedTableAndSeparatorTableNameResolver = new DefaultDynamoDbTableNameResolver(
39+
private final DefaultDynamoDbTableNameResolver prefixedAndSuffixedTableAndSeparatorTableNameResolver = new DefaultDynamoDbTableNameResolver(
4140
"prefix-", "-suffix", "-");
4241

4342
@Test
4443
void resolveTableNameSuccessfully() {
4544
assertThat(tableNameResolver.resolve(MoreComplexPerson.class)).isEqualTo("more_complex_person");
4645
assertThat(tableNameResolver.resolve(Person.class)).isEqualTo("person");
46+
assertThat(tableNameResolver.getTableNameCache()).hasSize(2);
4747
}
4848

4949
@Test
5050
void resolvePrefixedTableNameSuccessfully() {
5151
assertThat(prefixedTableNameResolver.resolve(MoreComplexPerson.class))
5252
.isEqualTo("my_prefix_more_complex_person");
5353
assertThat(prefixedTableNameResolver.resolve(Person.class)).isEqualTo("my_prefix_person");
54+
assertThat(prefixedTableNameResolver.getTableNameCache()).hasSize(2);
5455
}
5556

5657
@Test
5758
void resolvePrefixedAndSuffixedTableNameSuccessfully() {
5859
assertThat(prefixedAndSuffixedTableNameResolver.resolve(MoreComplexPerson.class))
5960
.isEqualTo("my_prefix_more_complex_person_my_suffix");
6061
assertThat(prefixedAndSuffixedTableNameResolver.resolve(Person.class)).isEqualTo("my_prefix_person_my_suffix");
62+
assertThat(prefixedAndSuffixedTableNameResolver.getTableNameCache()).hasSize(2);
6163
}
6264

6365
@Test
@@ -66,22 +68,35 @@ void resolvePrefixedAndSuffixedAndSeparatorTableNameSuccessfully() {
6668
.isEqualTo("prefix-more-complex-person-suffix");
6769
assertThat(prefixedAndSuffixedTableAndSeparatorTableNameResolver.resolve(Person.class))
6870
.isEqualTo("prefix-person-suffix");
71+
assertThat(prefixedAndSuffixedTableAndSeparatorTableNameResolver.getTableNameCache()).hasSize(2);
6972
}
7073

7174
@Test
7275
void resolvesTableNameFromRecord() {
7376
assertThat(tableNameResolver.resolve(PersonRecord.class)).isEqualTo("person_record");
77+
assertThat(tableNameResolver.getTableNameCache()).hasSize(1);
7478
}
7579

7680
@Test
7781
void resolvesPrefixedTableNameFromRecord() {
7882
assertThat(prefixedTableNameResolver.resolve(PersonRecord.class)).isEqualTo("my_prefix_person_record");
83+
assertThat(prefixedTableNameResolver.getTableNameCache()).hasSize(1);
7984
}
8085

8186
@Test
8287
void resolvePrefixedAndSuffixedAndSeparatorTableNameFromRecord() {
8388
assertThat(prefixedAndSuffixedTableAndSeparatorTableNameResolver.resolve(PersonRecord.class))
8489
.isEqualTo("prefix-person-record-suffix");
90+
assertThat(prefixedAndSuffixedTableAndSeparatorTableNameResolver.getTableNameCache()).hasSize(1);
91+
}
92+
93+
@Test
94+
void resolveSameTableNameSuccessfully() {
95+
assertThat(tableNameResolver.getTableNameCache()).isEmpty();
96+
assertThat(tableNameResolver.resolve(MoreComplexPerson.class)).isEqualTo("more_complex_person");
97+
assertThat(tableNameResolver.resolve(MoreComplexPerson.class)).isEqualTo("more_complex_person");
98+
assertThat(tableNameResolver.resolve(MoreComplexPerson.class)).isEqualTo("more_complex_person");
99+
assertThat(tableNameResolver.getTableNameCache()).hasSize(1);
85100
}
86101

87102
record PersonRecord(String name) {
@@ -92,4 +107,5 @@ private static class Person {
92107

93108
private static class MoreComplexPerson {
94109
}
110+
95111
}

0 commit comments

Comments
 (0)