Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions src/main/java/net/staticstudios/data/Reference.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
import net.staticstudios.data.key.DataKey;
import net.staticstudios.data.util.DataDoesNotExistException;
import net.staticstudios.data.util.DeletionStrategy;
import net.staticstudios.data.util.ValueUpdate;
import net.staticstudios.data.util.ValueUpdateHandler;
import net.staticstudios.utils.ThreadUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

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

/**
* Adds an update handler for the backing id.
* This is useful if logic is needed when the Reference is set or unlinked.
*
* @param updateHandler the update handler
* @return this
*/
public Reference<T> onUpdate(ValueUpdateHandler<UUID> updateHandler) {
getBackingValue().onUpdate(updateHandler);
return this;
}

@Override
public Reference<T> deletionStrategy(DeletionStrategy strategy) {
this.deletionStrategy = strategy;
Expand Down Expand Up @@ -165,6 +180,8 @@ public UniqueData getRootHolder() {
return holder.getRootHolder();
}



/**
* Get the backing {@link PersistentValue} object that stores the foreign id.
* This is for internal use only.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ public void insertInDatabase(Connection connection, UniqueData holder, List<Init
for (String idSchemaTable : initialDataMap.keySet()) {
String idColumn = idSchemaTable.split("\\.", 2)[0];
String schemaTable = idSchemaTable.split("\\.", 2)[1];
Collection<InitialPersistentValue> initialDataValues = initialDataMap.get(idSchemaTable);
List<InitialPersistentValue> initialDataValues = new ArrayList<>(initialDataMap.get(idSchemaTable));
initialDataValues.removeIf(i -> i.getValue().getColumn().equals(idColumn));
List<InitialPersistentValue> overwriteExisting = new ArrayList<>();
for (InitialPersistentValue initial : initialDataValues) {
Expand Down
23 changes: 23 additions & 0 deletions src/test/java/net/staticstudios/data/ReferenceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ public void init() {
id uuid primary key,
favorite_user_id uuid
);
create table if not exists snapchat.user_meta (
id uuid primary key,
update_called integer
);
create table if not exists snapchat.user_settings (
user_id uuid primary key,
enable_friend_requests boolean not null
Expand Down Expand Up @@ -101,4 +105,23 @@ public void testSetReference() {

assertEquals(favoriteUser, user.getFavoriteUser());
}

@RetryingTest(5)
public void testReferenceUpdateHandler() {
MockEnvironment environment = getMockEnvironments().getFirst();
DataManager dataManager = environment.dataManager();

SnapchatUser user = SnapchatUser.createSync(dataManager);
SnapchatUser favoriteUser = SnapchatUser.createSync(dataManager);

assertEquals(0, user.getUpdateCalled());
user.setFavoriteUser(favoriteUser);

waitForDataPropagation();
assertEquals(1, user.getUpdateCalled());

user.setFavoriteUser(null);
waitForDataPropagation();
assertEquals(2, user.getUpdateCalled());
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
package net.staticstudios.data.mock.reference;

import net.staticstudios.data.DataManager;
import net.staticstudios.data.PersistentValue;
import net.staticstudios.data.Reference;
import net.staticstudios.data.UniqueData;
import org.jetbrains.annotations.Nullable;

import java.util.UUID;

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

private SnapchatUser(DataManager dataManager, UUID id) {
super(dataManager, "snapchat", "users", id);
Expand All @@ -34,4 +40,8 @@ public SnapchatUserSettings getSettings() {
public void setFavoriteUser(@Nullable SnapchatUser favoriteUser) {
this.favoriteUser.set(favoriteUser);
}

public Integer getUpdateCalled() {
return updateCalled.get();
}
}