Skip to content

Commit

Permalink
Fix issue with error message on composite NODE KEY existence
Browse files Browse the repository at this point in the history
  • Loading branch information
craigtaverner committed Mar 21, 2017
1 parent f150382 commit b2a2cfd
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 5 deletions.
Expand Up @@ -21,6 +21,7 @@


import org.neo4j.kernel.api.TokenNameLookup; import org.neo4j.kernel.api.TokenNameLookup;
import org.neo4j.kernel.api.schema_new.LabelSchemaDescriptor; import org.neo4j.kernel.api.schema_new.LabelSchemaDescriptor;
import org.neo4j.kernel.api.schema_new.SchemaUtil;
import org.neo4j.kernel.api.schema_new.constaints.ConstraintDescriptorFactory; import org.neo4j.kernel.api.schema_new.constaints.ConstraintDescriptorFactory;


import static java.lang.String.format; import static java.lang.String.format;
Expand All @@ -42,9 +43,9 @@ public NodePropertyExistenceException( LabelSchemaDescriptor schema,
@Override @Override
public String getUserMessage( TokenNameLookup tokenNameLookup ) public String getUserMessage( TokenNameLookup tokenNameLookup )
{ {
return format( "Node(%d) with label `%s` must have the property `%s`", return format( "Node(%d) with label `%s` must have the properties `%s`",
nodeId, nodeId,
tokenNameLookup.labelGetName( schema.getLabelId() ), tokenNameLookup.labelGetName( schema.getLabelId() ),
tokenNameLookup.propertyKeyGetName( schema.getPropertyId() ) ); SchemaUtil.niceProperties( tokenNameLookup, schema.getPropertyIds() ) );
} }
} }
Expand Up @@ -21,6 +21,7 @@


import org.neo4j.kernel.api.TokenNameLookup; import org.neo4j.kernel.api.TokenNameLookup;
import org.neo4j.kernel.api.schema_new.LabelSchemaDescriptor; import org.neo4j.kernel.api.schema_new.LabelSchemaDescriptor;
import org.neo4j.kernel.api.schema_new.SchemaUtil;


public class NodeExistenceConstraintDescriptor extends ConstraintDescriptor public class NodeExistenceConstraintDescriptor extends ConstraintDescriptor
{ {
Expand All @@ -43,9 +44,9 @@ public String prettyPrint( TokenNameLookup tokenNameLookup )
{ {
String labelName = escapeLabelOrRelTyp( tokenNameLookup.labelGetName( schema.getLabelId() ) ); String labelName = escapeLabelOrRelTyp( tokenNameLookup.labelGetName( schema.getLabelId() ) );
String nodeName = labelName.toLowerCase(); String nodeName = labelName.toLowerCase();
String propertyName = tokenNameLookup.propertyKeyGetName( schema.getPropertyId() ); String properties =
SchemaUtil.niceProperties( tokenNameLookup, schema.getPropertyIds(), nodeName + ".", false );


return String.format( "CONSTRAINT ON ( %s:%s ) ASSERT exists(%s.%s)", return String.format( "CONSTRAINT ON ( %s:%s ) ASSERT exists(%s)", nodeName, labelName, properties );
nodeName, labelName, nodeName, propertyName );
} }
} }
Expand Up @@ -91,6 +91,30 @@ class CompositeNodeKeyConstraintAcceptanceTest extends ExecutionEngineFunSuite w
} }
} }


test("single property NODE KEY constraint should block adding nodes with missing property") {
// When
exec("CREATE CONSTRAINT ON (n:User) ASSERT (n.email) IS NODE KEY")
createLabeledNode(Map("email" -> "joe@soap.tv"), "User")
createLabeledNode(Map("email" -> "jake@soap.tv"), "User")

// Then
a[ConstraintViolationException] should be thrownBy {
createLabeledNode(Map("firstname" -> "Joe", "lastname" -> "Soap"), "User")
}
}

test("composite NODE KEY constraint should block adding nodes with missing properties") {
// When
exec("CREATE CONSTRAINT ON (n:User) ASSERT (n.firstname,n.lastname) IS NODE KEY")
createLabeledNode(Map("firstname" -> "Joe", "lastname" -> "Soap"), "User")
createLabeledNode(Map("firstname" -> "Joe", "lastname" -> "Smoke"), "User")

// Then
a[ConstraintViolationException] should be thrownBy {
createLabeledNode(Map("firstname" -> "Joe", "lastnamex" -> "Soap"), "User")
}
}

test("composite NODE KEY constraint should not fail when we have nodes with different properties") { test("composite NODE KEY constraint should not fail when we have nodes with different properties") {
// When // When
createLabeledNode(Map("firstname" -> "Joe", "lastname" -> "Soap"), "User") createLabeledNode(Map("firstname" -> "Joe", "lastname" -> "Soap"), "User")
Expand Down Expand Up @@ -172,6 +196,16 @@ class CompositeNodeKeyConstraintAcceptanceTest extends ExecutionEngineFunSuite w
) )
} }


test("trying to add node withoutwhen composite node key constraint exists") {
createLabeledNode(Map("name" -> "A", "surname" -> "B"), "Person")
exec("CREATE CONSTRAINT ON (person:Person) ASSERT (person.name, person.surname) IS NODE KEY")

expectError(
"CREATE (n:Person) SET n.name = 'A', n.surname = 'B'",
String.format("Node(0) already exists with label `Person` and properties `name` = 'A', `surname` = 'B'")
)
}

private def expectError(query: String, expectedError: String) { private def expectError(query: String, expectedError: String) {
val error = intercept[CypherException](exec(query)) val error = intercept[CypherException](exec(query))
assertThat(error.getMessage, containsString(expectedError)) assertThat(error.getMessage, containsString(expectedError))
Expand Down

0 comments on commit b2a2cfd

Please sign in to comment.