diff --git a/dbschema/migrations/00008.edgeql b/dbschema/migrations/00008.edgeql new file mode 100644 index 00000000..d412ea4a --- /dev/null +++ b/dbschema/migrations/00008.edgeql @@ -0,0 +1,9 @@ +CREATE MIGRATION m1xt33ahn2zm5wiwbdubmpttdcg5ywahjme2dnpj3jx3hfhkzcc3sq + ONTO m1tig3qk3mnrb2xpszwyodgurkdeyza6yt67zo7kfljc2icy3e7yma +{ + CREATE TYPE tests::Links { + CREATE LINK b: tests::Links; + CREATE MULTI LINK c: tests::Links; + CREATE PROPERTY a: std::str; + }; +}; diff --git a/dbschema/migrations/00009.edgeql b/dbschema/migrations/00009.edgeql new file mode 100644 index 00000000..b06c760f --- /dev/null +++ b/dbschema/migrations/00009.edgeql @@ -0,0 +1,9 @@ +CREATE MIGRATION m1hds33s7w5uj53nhqljjf7cqpzzv64csyo7r4di4cf5f22q5ydywa + ONTO m1xt33ahn2zm5wiwbdubmpttdcg5ywahjme2dnpj3jx3hfhkzcc3sq +{ + ALTER TYPE tests::Links { + ALTER PROPERTY a { + CREATE CONSTRAINT std::exclusive; + }; + }; +}; diff --git a/dbschema/tests.esdl b/dbschema/tests.esdl index 0f8533df..60e5fd4c 100644 --- a/dbschema/tests.esdl +++ b/dbschema/tests.esdl @@ -4,4 +4,12 @@ module tests { required property b -> str; required property c -> str; } + + type Links { + a: str { + constraint exclusive; + }; + b: Links; + multi c: Links; + } } \ No newline at end of file diff --git a/examples/java-examples/src/main/java/com/edgedb/examples/LinkProperties.java b/examples/java-examples/src/main/java/com/edgedb/examples/LinkProperties.java index 09f6f68c..9a3d84d9 100644 --- a/examples/java-examples/src/main/java/com/edgedb/examples/LinkProperties.java +++ b/examples/java-examples/src/main/java/com/edgedb/examples/LinkProperties.java @@ -1,6 +1,7 @@ package com.edgedb.examples; import com.edgedb.driver.EdgeDBClient; +import com.edgedb.driver.annotations.EdgeDBLinkType; import com.edgedb.driver.annotations.EdgeDBType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -16,6 +17,7 @@ public static final class Person { public String name; public Long age; public Person bestFriend; + @EdgeDBLinkType(Person.class) public Collection friends; } diff --git a/src/driver/src/main/java/com/edgedb/driver/binary/codecs/visitors/TypeVisitor.java b/src/driver/src/main/java/com/edgedb/driver/binary/codecs/visitors/TypeVisitor.java index ef20bc1c..aaf3956d 100644 --- a/src/driver/src/main/java/com/edgedb/driver/binary/codecs/visitors/TypeVisitor.java +++ b/src/driver/src/main/java/com/edgedb/driver/binary/codecs/visitors/TypeVisitor.java @@ -131,6 +131,10 @@ public static Codec visitCompilableCodec(@NotNull TypeVisitor visitor, @NotNu // context type control: // inner codec: try(var ignored = visitor.enterNewContext(v -> { + if(v.isRealType) { + return; + } + var innerType = TypeUtils.tryPullWrappingType(visitor.getContext().type); if(innerType == null) { diff --git a/src/driver/src/test/java/QueryTests.java b/src/driver/src/test/java/QueryTests.java index b74451f7..2dfb14ac 100644 --- a/src/driver/src/test/java/QueryTests.java +++ b/src/driver/src/test/java/QueryTests.java @@ -1,15 +1,50 @@ import com.edgedb.driver.EdgeDBClient; +import com.edgedb.driver.annotations.EdgeDBLinkType; import com.edgedb.driver.annotations.EdgeDBType; import com.edgedb.driver.datatypes.MultiRange; import com.edgedb.driver.datatypes.Range; import org.junit.jupiter.api.Test; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import static org.assertj.core.api.Assertions.assertThat; public class QueryTests { + @EdgeDBType + public static final class Links { + public String a; + public Links b; + @EdgeDBLinkType(Links.class) + public Collection c; + } + + @Test + public void testLinkProperties() throws Exception { + try(var client = new EdgeDBClient().withModule("tests")) { + var result = client + .execute( + "with a := (insert Links { a := 'A' } unless conflict on .a)," + + "b := (insert Links { a := 'B'} unless conflict on .a)," + + "c := (insert Links { a := 'C', c := b } unless conflict on .a)" + + "insert Links { a := 'D', c := { a, b, c }, b := c } unless conflict on .a") + .thenCompose(v -> + client.queryRequiredSingle( + Links.class, + "select Links { a, c: { a, b, c }, b: { a, b, c } } filter .a = 'D'" + ) + ) + .toCompletableFuture().get(); + + assertThat(result.a).isEqualTo("D"); + + for (var linkClass : result.c) { + assertThat(linkClass.getClass()).isEqualTo(Links.class); // verify its deserialized an actual object + } + } + } + @Test public void testMultiRanges() { try(var client = new EdgeDBClient()) {