Skip to content

Commit 29124a1

Browse files
Leguan16Sammster10
andauthored
Add Reference#onUpdate (#17)
Co-authored-by: Sammy Aknan <sammy.aknan@gmail.com>
1 parent 2a3a8ec commit 29124a1

4 files changed

Lines changed: 52 additions & 2 deletions

File tree

src/main/java/net/staticstudios/data/Reference.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
import net.staticstudios.data.key.DataKey;
88
import net.staticstudios.data.util.DataDoesNotExistException;
99
import net.staticstudios.data.util.DeletionStrategy;
10+
import net.staticstudios.data.util.ValueUpdate;
11+
import net.staticstudios.data.util.ValueUpdateHandler;
12+
import net.staticstudios.utils.ThreadUtils;
1013
import org.jetbrains.annotations.NotNull;
1114
import org.jetbrains.annotations.Nullable;
1215

@@ -57,6 +60,18 @@ public static <T extends UniqueData> Reference<T> foreign(UniqueData holder, Cla
5760
return new Reference<>(holder, clazz, PersistentValue.foreign(holder, UUID.class, schemaTableForeignIdColumn, thisForeignIdColumn));
5861
}
5962

63+
/**
64+
* Adds an update handler for the backing id.
65+
* This is useful if logic is needed when the Reference is set or unlinked.
66+
*
67+
* @param updateHandler the update handler
68+
* @return this
69+
*/
70+
public Reference<T> onUpdate(ValueUpdateHandler<UUID> updateHandler) {
71+
getBackingValue().onUpdate(updateHandler);
72+
return this;
73+
}
74+
6075
@Override
6176
public Reference<T> deletionStrategy(DeletionStrategy strategy) {
6277
this.deletionStrategy = strategy;
@@ -165,6 +180,8 @@ public UniqueData getRootHolder() {
165180
return holder.getRootHolder();
166181
}
167182

183+
184+
168185
/**
169186
* Get the backing {@link PersistentValue} object that stores the foreign id.
170187
* This is for internal use only.

src/main/java/net/staticstudios/data/impl/PersistentValueManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ public void insertInDatabase(Connection connection, UniqueData holder, List<Init
198198
for (String idSchemaTable : initialDataMap.keySet()) {
199199
String idColumn = idSchemaTable.split("\\.", 2)[0];
200200
String schemaTable = idSchemaTable.split("\\.", 2)[1];
201-
Collection<InitialPersistentValue> initialDataValues = initialDataMap.get(idSchemaTable);
201+
List<InitialPersistentValue> initialDataValues = new ArrayList<>(initialDataMap.get(idSchemaTable));
202202
initialDataValues.removeIf(i -> i.getValue().getColumn().equals(idColumn));
203203
List<InitialPersistentValue> overwriteExisting = new ArrayList<>();
204204
for (InitialPersistentValue initial : initialDataValues) {

src/test/java/net/staticstudios/data/ReferenceTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ public void init() {
2424
id uuid primary key,
2525
favorite_user_id uuid
2626
);
27+
create table if not exists snapchat.user_meta (
28+
id uuid primary key,
29+
update_called integer
30+
);
2731
create table if not exists snapchat.user_settings (
2832
user_id uuid primary key,
2933
enable_friend_requests boolean not null
@@ -101,4 +105,23 @@ public void testSetReference() {
101105

102106
assertEquals(favoriteUser, user.getFavoriteUser());
103107
}
108+
109+
@RetryingTest(5)
110+
public void testReferenceUpdateHandler() {
111+
MockEnvironment environment = getMockEnvironments().getFirst();
112+
DataManager dataManager = environment.dataManager();
113+
114+
SnapchatUser user = SnapchatUser.createSync(dataManager);
115+
SnapchatUser favoriteUser = SnapchatUser.createSync(dataManager);
116+
117+
assertEquals(0, user.getUpdateCalled());
118+
user.setFavoriteUser(favoriteUser);
119+
120+
waitForDataPropagation();
121+
assertEquals(1, user.getUpdateCalled());
122+
123+
user.setFavoriteUser(null);
124+
waitForDataPropagation();
125+
assertEquals(2, user.getUpdateCalled());
126+
}
104127
}

src/test/java/net/staticstudios/data/mock/reference/SnapchatUser.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
package net.staticstudios.data.mock.reference;
22

33
import net.staticstudios.data.DataManager;
4+
import net.staticstudios.data.PersistentValue;
45
import net.staticstudios.data.Reference;
56
import net.staticstudios.data.UniqueData;
67
import org.jetbrains.annotations.Nullable;
78

89
import java.util.UUID;
910

1011
public class SnapchatUser extends UniqueData {
12+
private final PersistentValue<Integer> updateCalled = PersistentValue.foreign(this, Integer.class, "snapchat.user_meta.update_called", "id")
13+
.withDefault(0);
1114
private final Reference<SnapchatUserSettings> settings = Reference.of(this, SnapchatUserSettings.class, "id");
12-
private final Reference<SnapchatUser> favoriteUser = Reference.of(this, SnapchatUser.class, "favorite_user_id");
15+
private final Reference<SnapchatUser> favoriteUser = Reference.of(this, SnapchatUser.class, "favorite_user_id")
16+
.onUpdate(update -> {
17+
updateCalled.set(updateCalled.get() + 1);
18+
});
1319

1420
private SnapchatUser(DataManager dataManager, UUID id) {
1521
super(dataManager, "snapchat", "users", id);
@@ -34,4 +40,8 @@ public SnapchatUserSettings getSettings() {
3440
public void setFavoriteUser(@Nullable SnapchatUser favoriteUser) {
3541
this.favoriteUser.set(favoriteUser);
3642
}
43+
44+
public Integer getUpdateCalled() {
45+
return updateCalled.get();
46+
}
3747
}

0 commit comments

Comments
 (0)