Skip to content

Commit a730a38

Browse files
authored
Merge pull request #61 from phocassoftware/hash_links
Hash links
2 parents 81596de + 5212ce5 commit a730a38

File tree

2 files changed

+111
-23
lines changed
  • graphql-database-manager-dynamo/src/main/java/com/phocassoftware/graphql/database/manager/dynamo
  • graphql-database-manager-test/src/test/java/com/phocassoftware/graphql/database/manager/test/hashed

2 files changed

+111
-23
lines changed

graphql-database-manager-dynamo/src/main/java/com/phocassoftware/graphql/database/manager/dynamo/DynamoDb.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -551,10 +551,6 @@ public <T extends Table> CompletableFuture<List<T>> getViaLinks(
551551
Class<T> type,
552552
TableDataLoader<DatabaseKey<Table>> items
553553
) {
554-
if (getExtractor(entry.getClass()).isPresent() || getExtractor(type).isPresent()) {
555-
throw new UnsupportedOperationException("hashed objects can not be linked");
556-
}
557-
558554
String tableTarget = table(type);
559555
var links = getLinks(entry).get(tableTarget);
560556
if (links == null) {
@@ -1289,10 +1285,6 @@ private <T extends Table> CompletableFuture<T> updateEntityLinks(
12891285

12901286
@Override
12911287
public <T extends Table> CompletableFuture<T> link(String organisationId, T entity, Class<? extends Table> class1, List<String> groupIds) {
1292-
if (getExtractor(entity.getClass()).isPresent() || getExtractor(class1).isPresent()) {
1293-
throw new UnsupportedOperationException("hashed objects can not be linked");
1294-
}
1295-
12961288
var source = table(entity.getClass());
12971289

12981290
var target = table(class1);
@@ -1333,10 +1325,6 @@ public <T extends Table> CompletableFuture<T> unlink(
13331325
final Class<? extends Table> clazz,
13341326
final String targetId
13351327
) {
1336-
if (getExtractor(entity.getClass()).isPresent() || getExtractor(clazz).isPresent()) {
1337-
throw new UnsupportedOperationException("hashed objects can not be linked");
1338-
}
1339-
13401328
final var updateEntityLinksRequest = createRemoveLinkRequest(organisationId, entity, clazz, targetId);
13411329

13421330
return client
@@ -1394,9 +1382,6 @@ public <T extends Table> CompletableFuture<T> deleteLinks(String organisationId,
13941382
if (getLinks(entity).isEmpty()) {
13951383
return CompletableFuture.completedFuture(entity);
13961384
}
1397-
if (getExtractor(entity.getClass()).isPresent()) {
1398-
throw new UnsupportedOperationException("hashed objects can not be linked");
1399-
}
14001385

14011386
var organisationIdAttribute = AttributeValue.builder().s(organisationId).build();
14021387
var id = AttributeValue.builder().s(table(entity.getClass()) + ":" + entity.getId()).build();

graphql-database-manager-test/src/test/java/com/phocassoftware/graphql/database/manager/test/hashed/DynamoDbLinkTest.java

Lines changed: 111 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,129 @@
1212

1313
package com.phocassoftware.graphql.database.manager.test.hashed;
1414

15-
import static org.junit.jupiter.api.Assertions.assertEquals;
16-
import static org.junit.jupiter.api.Assertions.assertThrows;
17-
1815
import com.phocassoftware.graphql.database.manager.Database;
1916
import com.phocassoftware.graphql.database.manager.Table;
2017
import com.phocassoftware.graphql.database.manager.annotations.Hash;
18+
import com.phocassoftware.graphql.database.manager.test.TestDatabase;
2119
import com.phocassoftware.graphql.database.manager.test.annotations.DatabaseNames;
22-
import java.util.concurrent.CompletionException;
20+
import com.phocassoftware.graphql.database.manager.test.annotations.DatabaseOrganisation;
21+
import org.junit.jupiter.api.Assertions;
22+
23+
import java.util.Comparator;
2324
import java.util.concurrent.ExecutionException;
2425

2526
final class DynamoDbLinkTest {
2627

2728
@TestDatabase
28-
void testSimpleQuery(@DatabaseNames({ "prod", "stage" }) final Database db, @DatabaseNames("prod") final Database dbProd)
29-
throws InterruptedException, ExecutionException {
29+
void testSimpleQuery(
30+
@DatabaseNames({ "prod", "stage" }) @DatabaseOrganisation("fixed") final Database db,
31+
@DatabaseNames("prod") @DatabaseOrganisation("fixed") final Database dbProd
32+
) throws ExecutionException, InterruptedException {
3033
var garry = db.put(new SimpleTable("garry")).get();
34+
var john = db.put(new AnotherTable("john")).get();
35+
var frank = dbProd.put(new SimpleTable("frank")).get();
3136
var bob = dbProd.put(new AnotherTable("bob")).get();
3237

33-
var t = assertThrows(CompletionException.class, () -> db.link(garry, bob.getClass(), bob.getId()).join());
34-
assertEquals(UnsupportedOperationException.class, t.getCause().getClass());
38+
db.link(garry, bob.getClass(), bob.getId()).get();
39+
dbProd.link(frank, bob.getClass(), bob.getId()).get();
40+
db.link(garry, john.getClass(), john.getId()).get();
41+
42+
john = db.get(AnotherTable.class, john.getId()).get();
43+
bob = db.get(AnotherTable.class, bob.getId()).get();
44+
45+
var johnLink = db.getLink(john, SimpleTable.class).get();
46+
Assertions.assertEquals("garry", johnLink.name);
47+
48+
var bobLinks = db.getLinks(bob, SimpleTable.class).get();
49+
50+
Assertions.assertEquals(1, bobLinks.size());
51+
bobLinks.sort(Comparator.comparing(a -> a.name));
52+
53+
Assertions.assertEquals("frank", bobLinks.get(0).name);
54+
}
55+
56+
@TestDatabase
57+
void testUpdate(final Database db) throws InterruptedException, ExecutionException {
58+
var garry = db.put(new SimpleTable("garry")).get();
59+
var john = db.put(new AnotherTable("john")).get();
60+
var bob = db.put(new AnotherTable("bob")).get();
61+
62+
db.link(garry, john.getClass(), john.getId()).get();
63+
db.link(garry, bob.getClass(), bob.getId()).get();
64+
65+
garry = db.get(SimpleTable.class, garry.getId()).get();
66+
john = db.get(AnotherTable.class, john.getId()).get();
67+
bob = db.get(AnotherTable.class, bob.getId()).get();
68+
69+
var bobLinks = db.getLink(bob, SimpleTable.class).get();
70+
Assertions.assertEquals("garry", bobLinks.name);
71+
72+
var garryLink = db.getLink(garry, AnotherTable.class).get();
73+
Assertions.assertEquals("bob", garryLink.getName());
74+
75+
var johnLink = db.getLinks(john, SimpleTable.class).get();
76+
Assertions.assertEquals(0, johnLink.size());
77+
}
78+
79+
@TestDatabase
80+
void testDelete(final Database db) throws InterruptedException, ExecutionException {
81+
var garry = db.put(new SimpleTable("garry")).get();
82+
var john = db.put(new AnotherTable("john")).get();
83+
84+
db.link(garry, john.getClass(), john.getId()).get();
85+
86+
Assertions
87+
.assertThrows(
88+
RuntimeException.class,
89+
() -> {
90+
db.delete(garry, false).get();
91+
}
92+
);
93+
94+
db.delete(garry, true).get();
95+
96+
var list = db.getLinks(john, SimpleTable.class).get();
97+
Assertions.assertEquals(0, list.size());
98+
}
99+
100+
@TestDatabase
101+
void testDeleteLinks(final Database db) throws InterruptedException, ExecutionException {
102+
var garry = db.put(new SimpleTable("garry")).get();
103+
var john = db.put(new AnotherTable("john")).get();
104+
105+
garry = db.link(garry, john.getClass(), john.getId()).get();
106+
107+
garry = db.deleteLinks(garry).get();
108+
109+
garry = db.get(SimpleTable.class, garry.getId()).get();
110+
111+
var list = db.getLinks(john, SimpleTable.class).get();
112+
Assertions.assertEquals(0, list.size());
113+
114+
var list2 = db.getLinks(garry, AnotherTable.class).get();
115+
Assertions.assertEquals(0, list2.size());
116+
}
117+
118+
@TestDatabase
119+
void unlink(final Database db) throws InterruptedException, ExecutionException {
120+
var garry = db.put(new SimpleTable("garry")).get();
121+
var bob = db.put(new AnotherTable("bob")).get();
122+
123+
db.link(garry, bob.getClass(), bob.getId()).get();
124+
125+
garry = db.get(SimpleTable.class, garry.getId()).get();
126+
bob = db.get(AnotherTable.class, bob.getId()).get();
127+
128+
var bobLinks = db.getLink(bob, SimpleTable.class).get();
129+
Assertions.assertEquals("garry", bobLinks.name);
130+
131+
var garryLink = db.getLink(garry, AnotherTable.class).get();
132+
Assertions.assertEquals("bob", garryLink.getName());
133+
134+
db.unlink(garry, AnotherTable.class, bob.getId()).get();
135+
136+
var unlinked = db.getLink(garry, AnotherTable.class).get();
137+
Assertions.assertNull(unlinked);
35138
}
36139

37140
@Hash(SimplerHasher.class)

0 commit comments

Comments
 (0)