From f2a3a59e6da60288a8473f2c6f858b25c880f8b2 Mon Sep 17 00:00:00 2001 From: Craig Taverner Date: Fri, 10 Mar 2017 14:47:58 +0100 Subject: [PATCH] Support composite uniqueness verification --- .../api/constraints/UniquenessConstraint.java | 15 +++++++++++---- .../neo4j/kernel/api/schema_new/SchemaUtil.java | 7 ++++++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/api/constraints/UniquenessConstraint.java b/community/kernel/src/main/java/org/neo4j/kernel/api/constraints/UniquenessConstraint.java index f84f96efc8a3e..78bbfc8b6419b 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/api/constraints/UniquenessConstraint.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/api/constraints/UniquenessConstraint.java @@ -19,9 +19,12 @@ */ package org.neo4j.kernel.api.constraints; +import java.util.Arrays; + import org.neo4j.kernel.api.TokenNameLookup; import org.neo4j.kernel.api.schema_new.LabelSchemaDescriptor; import org.neo4j.kernel.api.schema_new.constaints.UniquenessConstraintDescriptor; +import org.neo4j.kernel.api.schema_new.SchemaUtil; import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor; import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptorFactory; @@ -60,15 +63,19 @@ public String userDescription( TokenNameLookup tokenNameLookup ) { String labelName = labelName( tokenNameLookup ); String boundIdentifier = labelName.toLowerCase(); - return String - .format( "CONSTRAINT ON ( %s:%s ) ASSERT %s.%s IS UNIQUE", boundIdentifier, labelName, boundIdentifier, - tokenNameLookup.propertyKeyGetName( descriptor.getPropertyId() ) ); + String properties = + SchemaUtil.niceProperties( tokenNameLookup, descriptor.getPropertyIds(), boundIdentifier + "." ); + if ( descriptor.getPropertyIds().length > 1 ) + { + properties = "(" + properties + ")"; + } + return String.format( "CONSTRAINT ON ( %s:%s ) ASSERT %s IS UNIQUE", boundIdentifier, labelName, properties ); } @Override public String toString() { return String.format( "CONSTRAINT ON ( n:label[%d] ) ASSERT n.property[%d] IS UNIQUE", - descriptor.getLabelId(), descriptor.getPropertyId() ); + descriptor.getLabelId(), Arrays.toString( descriptor.getPropertyIds() ) ); } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/SchemaUtil.java b/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/SchemaUtil.java index 05d696b627919..8bff59e1a79d9 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/SchemaUtil.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/SchemaUtil.java @@ -30,11 +30,16 @@ private SchemaUtil() } public static String niceProperties( TokenNameLookup tokenNameLookup, int[] propertyIds ) + { + return niceProperties( tokenNameLookup, propertyIds, "" ); + } + + public static String niceProperties( TokenNameLookup tokenNameLookup, int[] propertyIds, String prefix ) { String[] properties = new String[propertyIds.length]; for ( int i = 0; i < propertyIds.length; i++ ) { - properties[i] = tokenNameLookup.propertyKeyGetName( propertyIds[i] ); + properties[i] = prefix + tokenNameLookup.propertyKeyGetName( propertyIds[i] ); } return String.join( ", ", properties ); }