Skip to content

Commit c186b4e

Browse files
DarthMaxyuvalr1neo
authored andcommitted
Add validation for ToUndirected config options
1 parent 4a06424 commit c186b4e

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

proc/beta/src/main/java/org/neo4j/gds/beta/undirected/ToUndirectedSpec.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import org.neo4j.gds.MutateComputationResultConsumer;
2323
import org.neo4j.gds.RelationshipType;
24+
import org.neo4j.gds.config.ElementTypeValidator;
2425
import org.neo4j.gds.core.loading.SingleTypeRelationshipImportResult;
2526
import org.neo4j.gds.executor.AlgorithmSpec;
2627
import org.neo4j.gds.executor.ComputationResult;
@@ -29,9 +30,12 @@
2930
import org.neo4j.gds.executor.ExecutionMode;
3031
import org.neo4j.gds.executor.GdsCallable;
3132
import org.neo4j.gds.executor.NewConfigFunction;
33+
import org.neo4j.gds.executor.validation.AfterLoadValidation;
34+
import org.neo4j.gds.executor.validation.ValidationConfiguration;
3235
import org.neo4j.gds.result.AbstractResultBuilder;
3336
import org.neo4j.gds.results.StandardMutateResult;
3437

38+
import java.util.List;
3539
import java.util.Map;
3640
import java.util.stream.Stream;
3741

@@ -80,6 +84,21 @@ protected void updateGraphStore(
8084
};
8185
}
8286

87+
@Override
88+
public ValidationConfiguration<ToUndirectedConfig> validationConfig() {
89+
return new ValidationConfiguration<>() {
90+
@Override
91+
public List<AfterLoadValidation<ToUndirectedConfig>> afterLoadValidations() {
92+
return List.of(
93+
(graphStore, graphProjectConfig, config) -> {
94+
var relationshipType = RelationshipType.of(config.relationshipType());
95+
ElementTypeValidator.validateTypes(graphStore, List.of(relationshipType), "`relationshipType`");
96+
}
97+
);
98+
}
99+
};
100+
}
101+
83102
public static final class MutateResult extends StandardMutateResult {
84103
public final long inputRelationships;
85104
public final long relationshipsWritten;

proc/beta/src/test/java/org/neo4j/gds/beta/undirected/ToUndirectedProcTest.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,18 @@
2828
import org.neo4j.gds.catalog.GraphProjectProc;
2929
import org.neo4j.gds.core.loading.GraphStoreCatalog;
3030
import org.neo4j.gds.extension.Neo4jGraph;
31+
import org.neo4j.graphdb.QueryExecutionException;
3132

3233
import java.util.List;
3334
import java.util.Map;
3435

3536
import static org.hamcrest.Matchers.instanceOf;
37+
import static org.junit.jupiter.api.Assertions.assertEquals;
38+
import static org.junit.jupiter.api.Assertions.assertThrows;
3639
import static org.neo4j.gds.TestSupport.assertGraphEquals;
3740
import static org.neo4j.gds.TestSupport.fromGdl;
41+
import static org.neo4j.gds.utils.ExceptionUtil.rootCause;
42+
import static org.neo4j.gds.utils.StringFormatting.formatWithLocale;
3843

3944
class ToUndirectedProcTest extends BaseProcTest {
4045

@@ -62,7 +67,7 @@ void setup() throws Exception {
6267
}
6368

6469
@Test
65-
void convertToUndirect() {
70+
void convertToUndirected() {
6671
String query = "CALL gds.beta.graph.relationships.toUndirected('graph', {relationshipType: 'REL', mutateRelationshipType: 'REL2'})";
6772

6873
assertCypherResult(query, List.of(Map.of("inputRelationships", 3L,
@@ -78,4 +83,28 @@ void convertToUndirect() {
7883
var graph = gs.graphStore().getGraph(RelationshipType.of("REL2"));
7984
assertGraphEquals(fromGdl(DB.replace("REL", "REL2"), Orientation.UNDIRECTED), graph);
8085
}
86+
87+
@Test
88+
void shouldFailIfMutateRelationshipTypeExists() {
89+
String query = "CALL gds.beta.graph.relationships.toUndirected('graph', {relationshipType: 'REL', mutateRelationshipType: 'REL'})";
90+
91+
Throwable throwable = rootCause(assertThrows(QueryExecutionException.class, () -> runQuery(query)));
92+
assertEquals(IllegalArgumentException.class, throwable.getClass());
93+
String expectedMessage = formatWithLocale(
94+
"Relationship type `REL` already exists in the in-memory graph."
95+
);
96+
assertEquals(expectedMessage, throwable.getMessage());
97+
}
98+
99+
@Test
100+
void shouldFailIfRelationshipTypeDoesNotExists() {
101+
String query = "CALL gds.beta.graph.relationships.toUndirected('graph', {relationshipType: 'REL2', mutateRelationshipType: 'REL2'})";
102+
103+
Throwable throwable = rootCause(assertThrows(QueryExecutionException.class, () -> runQuery(query)));
104+
assertEquals(IllegalArgumentException.class, throwable.getClass());
105+
String expectedMessage = formatWithLocale(
106+
"Could not find the specified `relationshipType` of ['REL2']. Available relationship types are ['REL']."
107+
);
108+
assertEquals(expectedMessage, throwable.getMessage());
109+
}
81110
}

0 commit comments

Comments
 (0)