From 73842158eb2c554e010bb4d7663dda41526329e5 Mon Sep 17 00:00:00 2001 From: fickludd Date: Mon, 6 Feb 2017 13:33:14 +0100 Subject: [PATCH] Removed old IndexDescriptor around TxState --- .../checking/SchemaRecordCheck.java | 2 +- .../consistency/checking/full/IndexCheck.java | 2 +- .../checking/full/MandatoryProperties.java | 4 +- .../full/PropertyAndNodeIndexedCheck.java | 4 +- .../api/schema_new/SchemaDescriptor.java | 4 +- .../SchemaDescriptorPredicates.java | 6 +- .../constaints/ConstraintDescriptor.java | 3 +- .../api/schema_new/index/IndexBoundary.java | 19 +++ .../schema_new/index/NewIndexDescriptor.java | 34 ++++- .../kernel/api/txstate/TransactionState.java | 13 +- .../api/KernelTransactionImplementation.java | 4 +- .../api/StateHandlingStatementOperations.java | 117 +++++++------- .../api/state/ConstraintIndexCreator.java | 18 ++- .../kernel/impl/api/state/LabelState.java | 42 +---- .../neo4j/kernel/impl/api/state/TxState.java | 144 +++++++----------- .../kernel/impl/api/store/SchemaCache.java | 6 +- .../TransactionToRecordStateVisitor.java | 34 ++--- .../impl/store/record/ConstraintRule.java | 2 +- .../kernel/impl/store/record/IndexRule.java | 2 +- .../propertydeduplication/IndexLookup.java | 2 +- .../api/txstate/ReadableTransactionState.java | 20 +-- .../api/txstate/TxStateVisitor.java | 18 +-- .../internal/BatchInserterImpl.java | 4 +- .../ConstraintIndexCreatorTest.java | 17 ++- .../StateHandlingStatementOperationsTest.java | 23 ++- .../kernel/impl/api/state/TxStateTest.java | 39 +++-- .../kernel/impl/store/SchemaStoreTest.java | 6 +- ...ryCountsStoreSnapshotDeserializerTest.java | 2 - .../impl/store/record/ConstraintRuleTest.java | 4 +- .../impl/store/record/IndexRuleTest.java | 4 +- .../record/SchemaRuleSerializationTest.java | 4 +- 31 files changed, 281 insertions(+), 322 deletions(-) diff --git a/community/consistency-check/src/main/java/org/neo4j/consistency/checking/SchemaRecordCheck.java b/community/consistency-check/src/main/java/org/neo4j/consistency/checking/SchemaRecordCheck.java index 1533b04f5466..e97f592ef6b3 100644 --- a/community/consistency-check/src/main/java/org/neo4j/consistency/checking/SchemaRecordCheck.java +++ b/community/consistency-check/src/main/java/org/neo4j/consistency/checking/SchemaRecordCheck.java @@ -222,7 +222,7 @@ public void checkConstraintRule( ConstraintRule rule, DynamicRecord record, private void checkSchema( SchemaRule rule, DynamicRecord record, RecordAccess records, CheckerEngine engine ) { - new CheckSchema( engine, records ).process( rule.getSchemaDescriptor() ); + new CheckSchema( engine, records ).process( rule.schema() ); checkForDuplicates( rule, record, engine ); } diff --git a/community/consistency-check/src/main/java/org/neo4j/consistency/checking/full/IndexCheck.java b/community/consistency-check/src/main/java/org/neo4j/consistency/checking/full/IndexCheck.java index 3688fca404ba..29b3bd5991c7 100644 --- a/community/consistency-check/src/main/java/org/neo4j/consistency/checking/full/IndexCheck.java +++ b/community/consistency-check/src/main/java/org/neo4j/consistency/checking/full/IndexCheck.java @@ -38,7 +38,7 @@ public IndexCheck( IndexRule indexRule ) @Override public void check( IndexEntry record, CheckerEngine engine, RecordAccess records ) { - int labelId = indexRule.getSchemaDescriptor().getLabelId(); + int labelId = indexRule.schema().getLabelId(); engine.comparativeCheck( records.node( record.getId() ), new NodeInUseWithCorrectLabelsCheck<>( new long[]{labelId}, false ) ); } diff --git a/community/consistency-check/src/main/java/org/neo4j/consistency/checking/full/MandatoryProperties.java b/community/consistency-check/src/main/java/org/neo4j/consistency/checking/full/MandatoryProperties.java index 4ed4051cc417..6301180b1876 100644 --- a/community/consistency-check/src/main/java/org/neo4j/consistency/checking/full/MandatoryProperties.java +++ b/community/consistency-check/src/main/java/org/neo4j/consistency/checking/full/MandatoryProperties.java @@ -20,7 +20,6 @@ package org.neo4j.consistency.checking.full; import java.util.Arrays; -import java.util.Iterator; import java.util.function.Function; import org.neo4j.collection.primitive.Primitive; @@ -30,7 +29,6 @@ import org.neo4j.consistency.RecordType; import org.neo4j.consistency.report.ConsistencyReport; import org.neo4j.consistency.report.ConsistencyReporter; -import org.neo4j.kernel.api.exceptions.schema.MalformedSchemaRuleException; import org.neo4j.kernel.api.schema_new.LabelSchemaDescriptor; import org.neo4j.kernel.api.schema_new.RelationTypeSchemaDescriptor; import org.neo4j.kernel.api.schema_new.SchemaProcessor; @@ -58,7 +56,7 @@ public MandatoryProperties( StoreAccess storeAccess ) { if ( rule.getConstraintDescriptor().type() == EXISTS ) { - constraintRecorder.process( rule.getSchemaDescriptor() ); + constraintRecorder.process( rule.schema() ); } } } diff --git a/community/consistency-check/src/main/java/org/neo4j/consistency/checking/full/PropertyAndNodeIndexedCheck.java b/community/consistency-check/src/main/java/org/neo4j/consistency/checking/full/PropertyAndNodeIndexedCheck.java index 2718daa732bf..92c606d87233 100644 --- a/community/consistency-check/src/main/java/org/neo4j/consistency/checking/full/PropertyAndNodeIndexedCheck.java +++ b/community/consistency-check/src/main/java/org/neo4j/consistency/checking/full/PropertyAndNodeIndexedCheck.java @@ -81,7 +81,7 @@ private void checkIndexToLabels( NodeRecord record, List properties = null; for ( IndexRule indexRule : indexes.rules() ) { - long labelId = indexRule.getSchemaDescriptor().getLabelId(); + long labelId = indexRule.schema().getLabelId(); if ( !labels.contains( labelId ) ) { continue; @@ -91,7 +91,7 @@ private void checkIndexToLabels( NodeRecord record, { properties = propertyReader.propertyBlocks( propertyRecs ); } - int propertyId = indexRule.getSchemaDescriptor().getPropertyIds()[0]; // assuming 1 property always + int propertyId = indexRule.schema().getPropertyIds()[0]; // assuming 1 property always PropertyBlock property = propertyWithKey( properties, propertyId ); if ( property == null ) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/SchemaDescriptor.java b/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/SchemaDescriptor.java index 615c59c28968..67b12b7af654 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/SchemaDescriptor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/SchemaDescriptor.java @@ -66,11 +66,11 @@ public interface SchemaDescriptor */ default boolean isSame( SchemaDescriptor.Supplier supplier ) { - return this.equals( supplier.getSchemaDescriptor() ); + return this.equals( supplier.schema() ); } interface Supplier { - SchemaDescriptor getSchemaDescriptor(); + SchemaDescriptor schema(); } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/SchemaDescriptorPredicates.java b/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/SchemaDescriptorPredicates.java index 6a2df19dd0ce..0cac41f707ac 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/SchemaDescriptorPredicates.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/SchemaDescriptorPredicates.java @@ -27,19 +27,19 @@ public class SchemaDescriptorPredicates { public static boolean hasLabel( SchemaDescriptor.Supplier supplier, int labelId ) { - Optional labelOpt = getLabel.compute( supplier.getSchemaDescriptor() ); + Optional labelOpt = getLabel.compute( supplier.schema() ); return labelOpt.isPresent() && labelOpt.get() == labelId; } public static boolean hasRelType( SchemaDescriptor.Supplier supplier, int relTypeId ) { - Optional relTypeOpt = getRelType.compute( supplier.getSchemaDescriptor() ); + Optional relTypeOpt = getRelType.compute( supplier.schema() ); return relTypeOpt.isPresent() && relTypeOpt.get() == relTypeId; } public static boolean hasProperty( SchemaDescriptor.Supplier supplier, int propertyId ) { - List properties = getProperties.compute( supplier.getSchemaDescriptor() ); + List properties = getProperties.compute( supplier.schema() ); return properties.contains( propertyId ); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/constaints/ConstraintDescriptor.java b/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/constaints/ConstraintDescriptor.java index cda2cf4bee66..cc1adfd892c2 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/constaints/ConstraintDescriptor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/constaints/ConstraintDescriptor.java @@ -28,7 +28,7 @@ * Internal representation of a graph constraint, including the schema unit it targets (eg. label-property combination) * and the how that schema unit is constrained (eg. "has to exist", or "must be unique"). */ -public class ConstraintDescriptor +public class ConstraintDescriptor implements SchemaDescriptor.Supplier { public enum Type { UNIQUE, EXISTS } @@ -48,6 +48,7 @@ public interface Supplier // METHODS + @Override public SchemaDescriptor schema() { return schema; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/index/IndexBoundary.java b/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/index/IndexBoundary.java index dab61b2852da..d0b516fbfed3 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/index/IndexBoundary.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/index/IndexBoundary.java @@ -24,6 +24,7 @@ import org.neo4j.helpers.collection.Iterators; import org.neo4j.kernel.api.schema.IndexDescriptor; import org.neo4j.kernel.api.schema.IndexDescriptorFactory; +import org.neo4j.kernel.api.schema.NodePropertyDescriptor; import org.neo4j.kernel.api.schema_new.LabelSchemaDescriptor; /** @@ -59,6 +60,24 @@ public static NewIndexDescriptor map( IndexDescriptor descriptor ) return NewIndexDescriptorFactory.forLabel( descriptor.getLabelId(), descriptor.getPropertyKeyId() ); } + public static NewIndexDescriptor map( NodePropertyDescriptor descriptor ) + { + if ( descriptor == null ) + { + return null; + } + return NewIndexDescriptorFactory.forLabel( descriptor.getLabelId(), descriptor.getPropertyKeyId() ); + } + + public static NewIndexDescriptor mapUnique( IndexDescriptor descriptor ) + { + if ( descriptor == null ) + { + return null; + } + return NewIndexDescriptorFactory.uniqueForLabel( descriptor.getLabelId(), descriptor.getPropertyKeyId() ); + } + public static Iterator map( Iterator iterator ) { return Iterators.map( IndexBoundary::map, iterator ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/index/NewIndexDescriptor.java b/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/index/NewIndexDescriptor.java index f537832cb9fe..6899c8b4469c 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/index/NewIndexDescriptor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/api/schema_new/index/NewIndexDescriptor.java @@ -19,8 +19,11 @@ */ package org.neo4j.kernel.api.schema_new.index; +import java.util.function.Predicate; + import org.neo4j.kernel.api.TokenNameLookup; import org.neo4j.kernel.api.schema_new.LabelSchemaDescriptor; +import org.neo4j.kernel.api.schema_new.SchemaDescriptor; import static java.lang.String.format; @@ -31,10 +34,38 @@ * This will be renamed to IndexDescriptor, once the old org.neo4j.kernel.api.schema.IndexDescriptor is completely * removed. */ -public class NewIndexDescriptor +public class NewIndexDescriptor implements SchemaDescriptor.Supplier { public enum Type { GENERAL, UNIQUE } + public enum Filter implements Predicate + { + GENERAL + { + @Override + public boolean test( NewIndexDescriptor rule ) + { + return rule.type == Type.GENERAL; + } + }, + UNIQUE + { + @Override + public boolean test( NewIndexDescriptor rule ) + { + return rule.type == Type.UNIQUE; + } + }, + ANY + { + @Override + public boolean test( NewIndexDescriptor rule ) + { + return true; + } + } + } + public interface Supplier { NewIndexDescriptor getIndexDescriptor(); @@ -60,6 +91,7 @@ public Type type() * This method currently returns the specific LabelSchemaDescriptor, as we do not support indexes on relations. * When we do, consider down-typing this to a SchemaDescriptor. */ + @Override public LabelSchemaDescriptor schema() { return schema; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/api/txstate/TransactionState.java b/community/kernel/src/main/java/org/neo4j/kernel/api/txstate/TransactionState.java index 32060f195451..3138fbc38c96 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/api/txstate/TransactionState.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/api/txstate/TransactionState.java @@ -24,9 +24,10 @@ import org.neo4j.kernel.api.constraints.RelationshipPropertyConstraint; import org.neo4j.kernel.api.constraints.RelationshipPropertyExistenceConstraint; import org.neo4j.kernel.api.constraints.UniquenessConstraint; -import org.neo4j.kernel.api.schema.IndexDescriptor; import org.neo4j.kernel.api.properties.DefinedProperty; import org.neo4j.kernel.api.properties.Property; +import org.neo4j.kernel.api.schema_new.LabelSchemaDescriptor; +import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor; import org.neo4j.storageengine.api.txstate.ReadableTransactionState; /** @@ -78,13 +79,9 @@ void relationshipDoReplaceProperty( long relationshipId, // SCHEMA RELATED - void indexRuleDoAdd( IndexDescriptor descriptor ); + void indexRuleDoAdd( NewIndexDescriptor descriptor ); - void constraintIndexRuleDoAdd( IndexDescriptor descriptor ); - - void indexDoDrop( IndexDescriptor descriptor ); - - void constraintIndexDoDrop( IndexDescriptor descriptor ); + void indexDoDrop( NewIndexDescriptor descriptor ); void constraintDoAdd( UniquenessConstraint constraint, long indexId ); @@ -100,5 +97,5 @@ void relationshipDoReplaceProperty( long relationshipId, boolean constraintIndexDoUnRemove( UniquenessConstraint constraint ); - void indexDoUpdateProperty( IndexDescriptor descriptor, long nodeId, DefinedProperty before, DefinedProperty after ); + void indexDoUpdateProperty( LabelSchemaDescriptor descriptor, long nodeId, DefinedProperty before, DefinedProperty after ); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementation.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementation.java index 7cd0ee1c6815..69a0197ee01e 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementation.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementation.java @@ -43,7 +43,7 @@ import org.neo4j.kernel.api.exceptions.schema.ConstraintValidationKernelException; import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException; import org.neo4j.kernel.api.exceptions.schema.DropIndexFailureException; -import org.neo4j.kernel.api.schema.IndexDescriptor; +import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor; import org.neo4j.kernel.api.security.SecurityContext; import org.neo4j.kernel.api.txstate.LegacyIndexTransactionState; import org.neo4j.kernel.api.txstate.TransactionState; @@ -349,7 +349,7 @@ private void dropCreatedConstraintIndexes() throws TransactionFailureException { if ( hasTxStateWithChanges() ) { - for ( IndexDescriptor createdConstraintIndex : txState().constraintIndexesCreatedInTx() ) + for ( NewIndexDescriptor createdConstraintIndex : txState().constraintIndexesCreatedInTx() ) { try { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/StateHandlingStatementOperations.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/StateHandlingStatementOperations.java index 3293e4f8be97..010b9171b774 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/StateHandlingStatementOperations.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/StateHandlingStatementOperations.java @@ -67,8 +67,12 @@ import org.neo4j.kernel.api.schema.IndexDescriptorFactory; import org.neo4j.kernel.api.schema.NodePropertyDescriptor; import org.neo4j.kernel.api.schema.RelationshipPropertyDescriptor; +import org.neo4j.kernel.api.schema_new.LabelSchemaDescriptor; import org.neo4j.kernel.api.schema_new.SchemaBoundary; +import org.neo4j.kernel.api.schema_new.SchemaDescriptorFactory; +import org.neo4j.kernel.api.schema_new.SchemaUtil; import org.neo4j.kernel.api.schema_new.index.IndexBoundary; +import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor; import org.neo4j.kernel.api.txstate.TransactionCountingStateVisitor; import org.neo4j.kernel.api.txstate.TransactionState; import org.neo4j.kernel.impl.api.operations.CountsOperations; @@ -98,10 +102,14 @@ import org.neo4j.storageengine.api.schema.PopulationProgress; import org.neo4j.storageengine.api.txstate.ReadableDiffSets; +import static java.lang.String.format; import static org.neo4j.collection.primitive.PrimitiveLongCollections.single; +import static org.neo4j.helpers.collection.Iterators.filter; import static org.neo4j.helpers.collection.Iterators.iterator; import static org.neo4j.helpers.collection.Iterators.singleOrNull; import static org.neo4j.kernel.api.StatementConstants.NO_SUCH_NODE; +import static org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor.Filter.GENERAL; +import static org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor.Filter.UNIQUE; import static org.neo4j.kernel.impl.api.PropertyValueComparison.COMPARE_NUMBERS; import static org.neo4j.register.Registers.newDoubleLongRegister; import static org.neo4j.storageengine.api.txstate.TxStateVisitor.EMPTY; @@ -296,14 +304,15 @@ public boolean nodeAddLabel( KernelStatement state, long nodeId, int labelId ) t while ( properties.next() ) { PropertyItem propertyItem = properties.get(); - IndexDescriptor descriptor = indexGetForLabelAndPropertyKey( state, - new NodePropertyDescriptor( labelId, propertyItem.propertyKeyId() ) ); + NodePropertyDescriptor nodePropDescriptor = + new NodePropertyDescriptor( labelId, propertyItem.propertyKeyId() ); + IndexDescriptor descriptor = indexGetForLabelAndPropertyKey( state, nodePropDescriptor ); if ( descriptor != null ) { DefinedProperty after = Property.property( propertyItem.propertyKeyId(), propertyItem.value() ); - state.txState().indexDoUpdateProperty( descriptor, node.id(), null, after ); + state.txState().indexDoUpdateProperty( SchemaBoundary.map( nodePropDescriptor ), node.id(), null, after ); } } @@ -333,7 +342,7 @@ public boolean nodeRemoveLabel( KernelStatement state, long nodeId, int labelId PropertyItem propItem = properties.get(); DefinedProperty property = Property.property( propItem.propertyKeyId(), propItem.value() ); indexUpdateProperty( state, node.id(), - new NodePropertyDescriptor( labelId, property.propertyKeyId() ), property, null ); + SchemaDescriptorFactory.forLabel( labelId, property.propertyKeyId() ), property, null ); } } @@ -372,21 +381,20 @@ public long relationshipsGetCount( KernelStatement state ) @Override public IndexDescriptor indexCreate( KernelStatement state, NodePropertyDescriptor descriptor ) { - IndexDescriptor indexDescriptor = IndexDescriptorFactory.of(descriptor); - state.txState().indexRuleDoAdd( indexDescriptor ); - return indexDescriptor; + state.txState().indexRuleDoAdd( IndexBoundary.map( descriptor ) ); + return IndexDescriptorFactory.of( descriptor ); } @Override public void indexDrop( KernelStatement state, IndexDescriptor descriptor ) throws DropIndexFailureException { - state.txState().indexDoDrop( descriptor ); + state.txState().indexDoDrop( IndexBoundary.map( descriptor ) ); } @Override public void uniqueIndexDrop( KernelStatement state, IndexDescriptor descriptor ) throws DropIndexFailureException { - state.txState().constraintIndexDoDrop( descriptor ); + state.txState().indexDoDrop( IndexBoundary.mapUnique( descriptor ) ); } @Override @@ -396,7 +404,6 @@ public UniquenessConstraint uniquePropertyConstraintCreate( KernelStatement stat UniquenessConstraint constraint = new UniquenessConstraint( descriptor ); try { - if ( state.hasTxStateWithChanges() && state.txState().constraintIndexDoUnRemove( constraint ) ) // ..., DROP, *CREATE* { // creation is undoing a drop @@ -527,24 +534,20 @@ public void constraintDrop( KernelStatement state, RelationshipPropertyConstrain @Override public IndexDescriptor indexGetForLabelAndPropertyKey( KernelStatement state, NodePropertyDescriptor descriptor ) { - IndexDescriptor indexDescriptor = IndexBoundary.map( - storeLayer.indexGetForLabelAndPropertyKey( SchemaBoundary.map( descriptor ) ) ); + return indexGetForLabelAndPropertyKey( state, SchemaBoundary.map( descriptor ) ); + } - Iterator rules = iterator( indexDescriptor ); + private IndexDescriptor indexGetForLabelAndPropertyKey( KernelStatement state, LabelSchemaDescriptor descriptor ) + { + NewIndexDescriptor indexDescriptor = storeLayer.indexGetForLabelAndPropertyKey( descriptor ); + Iterator rules = iterator( indexDescriptor ); if ( state.hasTxStateWithChanges() ) { - rules = filterByPropertyKeyId( - state.txState().indexDiffSetsByLabel( descriptor.getLabelId() ).apply( rules ), - descriptor ); + rules = filter( + descriptor::isSame, + state.txState().indexDiffSetsByLabel( descriptor.getLabelId(), GENERAL ).apply( rules ) ); } - return singleOrNull( rules ); - } - - private Iterator filterByPropertyKeyId( - Iterator descriptorIterator, - NodePropertyDescriptor descriptor ) - { - return Iterators.filter( item -> descriptor.equals( item ), descriptorIterator ); + return singleOrNull( IndexBoundary.map( rules ) ); } @Override @@ -554,13 +557,8 @@ public InternalIndexState indexGetState( KernelStatement state, IndexDescriptor // If index is in our state, then return populating if ( state.hasTxStateWithChanges() ) { - if ( checkIndexState( descriptor, state.txState().indexDiffSetsByLabel( descriptor.getLabelId() ) ) ) - { - return InternalIndexState.POPULATING; - } - ReadableDiffSets changes = - state.txState().constraintIndexDiffSetsByLabel( descriptor.getLabelId() ); - if ( checkIndexState( descriptor, changes ) ) + if ( checkIndexState( IndexBoundary.map( descriptor ), + state.txState().indexDiffSetsByLabel( descriptor.getLabelId(), NewIndexDescriptor.Filter.ANY ) ) ) { return InternalIndexState.POPULATING; } @@ -576,13 +574,8 @@ public PopulationProgress indexGetPopulationProgress( KernelStatement state, Ind // If index is in our state, then return 0% if ( state.hasTxStateWithChanges() ) { - if ( checkIndexState( descriptor, state.txState().indexDiffSetsByLabel( descriptor.getLabelId() ) ) ) - { - return PopulationProgress.NONE; - } - ReadableDiffSets changes = - state.txState().constraintIndexDiffSetsByLabel( descriptor.getLabelId() ); - if ( checkIndexState( descriptor, changes ) ) + if ( checkIndexState( IndexBoundary.map( descriptor ), + state.txState().indexDiffSetsByLabel( descriptor.getLabelId(), NewIndexDescriptor.Filter.ANY ) ) ) { return PopulationProgress.NONE; } @@ -591,19 +584,17 @@ public PopulationProgress indexGetPopulationProgress( KernelStatement state, Ind return storeLayer.indexGetPopulationProgress( SchemaBoundary.map( descriptor.descriptor() ) ); } - private boolean checkIndexState( IndexDescriptor indexRule, ReadableDiffSets diffSet ) + private boolean checkIndexState( NewIndexDescriptor index, ReadableDiffSets diffSet ) throws IndexNotFoundKernelException { - if ( diffSet.isAdded( indexRule ) ) + if ( diffSet.isAdded( index ) ) { return true; } - if ( diffSet.isRemoved( indexRule ) ) + if ( diffSet.isRemoved( index ) ) { - throw new IndexNotFoundKernelException( String.format( "Index for label id %d on property id %d has been " + - "dropped in this transaction.", - indexRule.getLabelId(), - indexRule.getPropertyKeyIds() ) ); + throw new IndexNotFoundKernelException( format( "Index on %s has been dropped in this transaction.", + index.userDescription( SchemaUtil.noopTokenNameLookup ) ) ); } return false; } @@ -613,10 +604,9 @@ public Iterator indexesGetForLabel( KernelStatement state, int { if ( state.hasTxStateWithChanges() ) { - return state.txState().indexDiffSetsByLabel( labelId ) - .apply( IndexBoundary.map( storeLayer.indexesGetForLabel( labelId ) ) ); + return IndexBoundary.map( state.txState().indexDiffSetsByLabel( labelId, GENERAL ) + .apply( storeLayer.indexesGetForLabel( labelId ) ) ); } - return IndexBoundary.map( storeLayer.indexesGetForLabel( labelId ) ); } @@ -625,7 +615,7 @@ public Iterator indexesGetAll( KernelStatement state ) { if ( state.hasTxStateWithChanges() ) { - return state.txState().indexChanges().apply( IndexBoundary.map( storeLayer.indexesGetAll() ) ); + return IndexBoundary.map( state.txState().indexChanges( GENERAL ).apply( storeLayer.indexesGetAll() ) ); } return IndexBoundary.map( storeLayer.indexesGetAll() ); @@ -636,8 +626,10 @@ public Iterator uniqueIndexesGetForLabel( KernelStatement state { if ( state.hasTxStateWithChanges() ) { - return state.txState().constraintIndexDiffSetsByLabel( labelId ) - .apply( IndexBoundary.map( storeLayer.uniquenessIndexesGetForLabel( labelId ) ) ); + return IndexBoundary.map( + state.txState().indexDiffSetsByLabel( labelId, UNIQUE ) + .apply( storeLayer.uniquenessIndexesGetForLabel( labelId ) ) + ); } return IndexBoundary.map( storeLayer.uniquenessIndexesGetForLabel( labelId ) ); @@ -648,8 +640,9 @@ public Iterator uniqueIndexesGetAll( KernelStatement state ) { if ( state.hasTxStateWithChanges() ) { - return state.txState().constraintIndexChanges() - .apply( IndexBoundary.map( storeLayer.uniquenessIndexesGetAll() ) ); + return IndexBoundary.map( + state.txState().indexChanges( UNIQUE ).apply( storeLayer.uniquenessIndexesGetAll() ) + ); } return IndexBoundary.map( storeLayer.uniquenessIndexesGetAll() ); @@ -796,7 +789,9 @@ private PrimitiveLongIterator filterIndexStateChangesForScanOrSeek( KernelStatem { if ( state.hasTxStateWithChanges() ) { - ReadableDiffSets labelPropertyChanges = state.txState().indexUpdatesForScanOrSeek( index, value ); + ReadableDiffSets labelPropertyChanges = + state.txState().indexUpdatesForScanOrSeek( + IndexBoundary.map( index ), value ); ReadableDiffSets nodes = state.txState().addedAndRemovedNodes(); // Apply to actual index lookup @@ -814,7 +809,8 @@ private PrimitiveLongIterator filterIndexStateChangesForRangeSeekByNumber( Kerne if ( state.hasTxStateWithChanges() ) { ReadableDiffSets labelPropertyChangesForNumber = - state.txState().indexUpdatesForRangeSeekByNumber( index, lower, includeLower, upper, includeUpper ); + state.txState().indexUpdatesForRangeSeekByNumber( + IndexBoundary.map( index ), lower, includeLower, upper, includeUpper ); ReadableDiffSets nodes = state.txState().addedAndRemovedNodes(); // Apply to actual index lookup @@ -833,7 +829,8 @@ private PrimitiveLongIterator filterIndexStateChangesForRangeSeekByString( Kerne if ( state.hasTxStateWithChanges() ) { ReadableDiffSets labelPropertyChangesForString = - state.txState().indexUpdatesForRangeSeekByString( index, lower, includeLower, upper, includeUpper ); + state.txState().indexUpdatesForRangeSeekByString( + IndexBoundary.map( index ), lower, includeLower, upper, includeUpper ); ReadableDiffSets nodes = state.txState().addedAndRemovedNodes(); // Apply to actual index lookup @@ -851,7 +848,7 @@ private PrimitiveLongIterator filterIndexStateChangesForRangeSeekByPrefix( Kerne if ( state.hasTxStateWithChanges() ) { ReadableDiffSets labelPropertyChangesForPrefix = - state.txState().indexUpdatesForRangeSeekByPrefix( index, prefix ); + state.txState().indexUpdatesForRangeSeekByPrefix( IndexBoundary.map( index ), prefix ); ReadableDiffSets nodes = state.txState().addedAndRemovedNodes(); // Apply to actual index lookup @@ -1011,12 +1008,12 @@ private void indexesUpdateProperty( KernelStatement state, NodeItem node, int pr { node.labels().visitKeys( labelId -> { - indexUpdateProperty( state, node.id(), new NodePropertyDescriptor( labelId, propertyKey ), before, after ); + indexUpdateProperty( state, node.id(), SchemaDescriptorFactory.forLabel( labelId, propertyKey ), before, after ); return false; } ); } - private void indexUpdateProperty( KernelStatement state, long nodeId, NodePropertyDescriptor descriptor, + private void indexUpdateProperty( KernelStatement state, long nodeId, LabelSchemaDescriptor descriptor, DefinedProperty before, DefinedProperty after ) { // TODO: Update this to handle composite indexes @@ -1028,7 +1025,7 @@ private void indexUpdateProperty( KernelStatement state, long nodeId, NodeProper Validators.INDEX_VALUE_VALIDATOR.validate( after.value() ); } - state.txState().indexDoUpdateProperty( indexDescriptor, nodeId, before, after ); + state.txState().indexDoUpdateProperty( descriptor, nodeId, before, after ); } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/ConstraintIndexCreator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/ConstraintIndexCreator.java index d7c33a8854f5..d5a2b1c14727 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/ConstraintIndexCreator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/ConstraintIndexCreator.java @@ -35,7 +35,8 @@ import org.neo4j.kernel.api.exceptions.schema.DropIndexFailureException; import org.neo4j.kernel.api.exceptions.schema.SchemaRuleNotFoundException; import org.neo4j.kernel.api.exceptions.schema.UniquenessConstraintVerificationFailedKernelException; -import org.neo4j.kernel.api.schema.IndexDescriptor; +import org.neo4j.kernel.api.schema_new.index.IndexBoundary; +import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor; import org.neo4j.kernel.impl.api.KernelStatement; import org.neo4j.kernel.impl.api.index.IndexingService; import org.neo4j.kernel.impl.api.operations.SchemaReadOperations; @@ -64,11 +65,11 @@ public long createUniquenessConstraintIndex( KernelStatement state, SchemaReadOp CreateConstraintFailureException, DropIndexFailureException { UniquenessConstraint constraint = new UniquenessConstraint( descriptor ); - IndexDescriptor index = createConstraintIndex( constraint ); + NewIndexDescriptor index = createConstraintIndex( constraint ); boolean success = false; try { - long indexId = schema.indexGetCommittedId( state, index, CONSTRAINT ); + long indexId = schema.indexGetCommittedId( state, IndexBoundary.map( index ), CONSTRAINT ); awaitConstrainIndexPopulation( constraint, indexId ); success = true; @@ -95,7 +96,7 @@ public long createUniquenessConstraintIndex( KernelStatement state, SchemaReadOp /** * You MUST hold a schema write lock before you call this method. */ - public void dropUniquenessConstraintIndex( IndexDescriptor descriptor ) + public void dropUniquenessConstraintIndex( NewIndexDescriptor descriptor ) throws TransactionFailureException, DropIndexFailureException { try ( KernelTransaction transaction = @@ -109,7 +110,7 @@ public void dropUniquenessConstraintIndex( IndexDescriptor descriptor ) // TODO (Ben+Jake): The Transactor is really part of the kernel internals, so it needs access to the // internal implementation of Statement. However it is currently used by the external // RemoveOrphanConstraintIndexesOnStartup job. This needs revisiting. - ((KernelStatement) statement).txState().constraintIndexDoDrop( descriptor ); + ((KernelStatement) statement).txState().indexDoDrop( descriptor ); transaction.success(); } } @@ -141,7 +142,7 @@ private void awaitConstrainIndexPopulation( UniquenessConstraint constraint, lon } } - public IndexDescriptor createConstraintIndex( final UniquenessConstraint constraint ) + public NewIndexDescriptor createConstraintIndex( final UniquenessConstraint constraint ) { try ( KernelTransaction transaction = kernelSupplier.get().newTransaction( KernelTransaction.Type.implicit, AUTH_DISABLED ); @@ -154,9 +155,10 @@ public IndexDescriptor createConstraintIndex( final UniquenessConstraint constra // TODO (Ben+Jake): The Transactor is really part of the kernel internals, so it needs access to the // internal implementation of Statement. However it is currently used by the external // RemoveOrphanConstraintIndexesOnStartup job. This needs revisiting. - ((KernelStatement) statement).txState().constraintIndexRuleDoAdd( constraint.indexDescriptor() ); + NewIndexDescriptor index = IndexBoundary.mapUnique( constraint.indexDescriptor() ); + ((KernelStatement) statement).txState().indexRuleDoAdd( index ); transaction.success(); - return constraint.indexDescriptor(); + return index; } catch ( TransactionFailureException e ) { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/LabelState.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/LabelState.java index f8a252990cdf..7643281e5087 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/LabelState.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/LabelState.java @@ -20,7 +20,7 @@ package org.neo4j.kernel.impl.api.state; import org.neo4j.kernel.api.constraints.NodePropertyConstraint; -import org.neo4j.kernel.api.schema.IndexDescriptor; +import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor; import org.neo4j.kernel.impl.util.diffsets.DiffSets; import org.neo4j.storageengine.api.txstate.ReadableDiffSets; @@ -29,9 +29,7 @@ *
    *
  • {@linkplain #nodeDiffSets() Nodes} where the label has been {@linkplain ReadableDiffSets#getAdded() added} * or {@linkplain ReadableDiffSets#getRemoved() removed}.
  • - *
  • {@linkplain #indexChanges() Indexes} for the label that have been - * {@linkplain ReadableDiffSets#getAdded() created} or {@linkplain ReadableDiffSets#getRemoved() dropped}.
  • - *
  • {@linkplain #constraintIndexChanges() Unique indexes} for the label that have been + *
  • {@linkplain #indexChanges(NewIndexDescriptor.Filter) Indexes} for the label that have been * {@linkplain ReadableDiffSets#getAdded() created} or {@linkplain ReadableDiffSets#getRemoved() dropped}.
  • *
  • {@linkplain #nodeConstraintsChanges() Constraints} for the label that have been * {@linkplain ReadableDiffSets#getAdded() created} or {@linkplain ReadableDiffSets#getRemoved() dropped}.
  • @@ -41,17 +39,14 @@ public abstract class LabelState { public abstract ReadableDiffSets nodeDiffSets(); - public abstract ReadableDiffSets indexChanges(); - - public abstract ReadableDiffSets constraintIndexChanges(); + public abstract ReadableDiffSets indexChanges( NewIndexDescriptor.Filter indexType ); public abstract ReadableDiffSets nodeConstraintsChanges(); public static class Mutable extends LabelState { private DiffSets nodeDiffSets; - private DiffSets indexChanges; - private DiffSets constraintIndexChanges; + private DiffSets indexChanges; private DiffSets nodeConstraintsChanges; private final int labelId; @@ -81,12 +76,12 @@ public DiffSets getOrCreateNodeDiffSets() } @Override - public ReadableDiffSets indexChanges() + public ReadableDiffSets indexChanges( NewIndexDescriptor.Filter indexType ) { - return ReadableDiffSets.Empty.ifNull( indexChanges ); + return ReadableDiffSets.Empty.ifNull( indexChanges ).filterAdded( indexType ); } - public DiffSets getOrCreateIndexChanges() + public DiffSets getOrCreateIndexChanges() { if ( indexChanges == null ) { @@ -95,21 +90,6 @@ public DiffSets getOrCreateIndexChanges() return indexChanges; } - @Override - public ReadableDiffSets constraintIndexChanges() - { - return ReadableDiffSets.Empty.ifNull( constraintIndexChanges ); - } - - public DiffSets getOrCreateConstraintIndexChanges() - { - if ( constraintIndexChanges == null ) - { - constraintIndexChanges = new DiffSets<>(); - } - return constraintIndexChanges; - } - @Override public ReadableDiffSets nodeConstraintsChanges() { @@ -150,13 +130,7 @@ public ReadableDiffSets nodeDiffSets() } @Override - public ReadableDiffSets indexChanges() - { - return ReadableDiffSets.Empty.instance(); - } - - @Override - public ReadableDiffSets constraintIndexChanges() + public ReadableDiffSets indexChanges( NewIndexDescriptor.Filter indexType ) { return ReadableDiffSets.Empty.instance(); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/TxState.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/TxState.java index 3c6bc005fd6e..d268b70a3284 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/TxState.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/TxState.java @@ -27,7 +27,6 @@ import java.util.function.Consumer; import org.neo4j.collection.primitive.Primitive; -import org.neo4j.collection.primitive.PrimitiveIntIterator; import org.neo4j.collection.primitive.PrimitiveIntObjectMap; import org.neo4j.collection.primitive.PrimitiveIntSet; import org.neo4j.collection.primitive.PrimitiveLongIterator; @@ -44,9 +43,11 @@ import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException; import org.neo4j.kernel.api.properties.DefinedProperty; import org.neo4j.kernel.api.properties.Property; -import org.neo4j.kernel.api.schema.IndexDescriptor; import org.neo4j.kernel.api.schema.NodePropertyDescriptor; import org.neo4j.kernel.api.schema.RelationshipPropertyDescriptor; +import org.neo4j.kernel.api.schema_new.LabelSchemaDescriptor; +import org.neo4j.kernel.api.schema_new.index.IndexBoundary; +import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor; import org.neo4j.kernel.api.txstate.RelationshipChangeVisitorAdapter; import org.neo4j.kernel.api.txstate.TransactionState; import org.neo4j.kernel.impl.api.RelationshipVisitor; @@ -143,8 +144,7 @@ void setMap( TxState state, Map map ) private Map createdRelationshipTypeTokens; private GraphState graphState; - private DiffSets indexChanges; - private DiffSets constraintIndexChanges; + private DiffSets indexChanges; private DiffSets constraintsChanges; private PropertyChanges propertyChangesForNodes; @@ -263,12 +263,7 @@ public void accept( final TxStateVisitor visitor ) if ( indexChanges != null ) { - indexChanges.accept( indexVisitor( visitor, false ) ); - } - - if ( constraintIndexChanges != null ) - { - constraintIndexChanges.accept( indexVisitor( visitor, true ) ); + indexChanges.accept( indexVisitor( visitor ) ); } if ( constraintsChanges != null ) @@ -417,21 +412,20 @@ public void visitRemovedRelationshipPropertyExistenceConstraint( } } - private static DiffSetsVisitor indexVisitor( final TxStateVisitor visitor, - final boolean forConstraint ) + private static DiffSetsVisitor indexVisitor( final TxStateVisitor visitor ) { - return new DiffSetsVisitor() + return new DiffSetsVisitor() { @Override - public void visitAdded( IndexDescriptor element ) + public void visitAdded( NewIndexDescriptor index ) { - visitor.visitAddedIndex( element, forConstraint ); + visitor.visitAddedIndex( index ); } @Override - public void visitRemoved( IndexDescriptor element ) + public void visitRemoved( NewIndexDescriptor index ) { - visitor.visitRemovedIndex( element, forConstraint ); + visitor.visitRemovedIndex( index ); } }; } @@ -840,64 +834,42 @@ public ReadableDiffSets nodesWithLabelChanged( int labelId ) } @Override - public void indexRuleDoAdd( IndexDescriptor descriptor ) + public void indexRuleDoAdd( NewIndexDescriptor descriptor ) { - DiffSets diff = indexChangesDiffSets(); + DiffSets diff = indexChangesDiffSets(); if ( diff.unRemove( descriptor ) ) { - getOrCreateLabelState( descriptor.getLabelId() ).getOrCreateIndexChanges().unRemove( descriptor ); + getOrCreateLabelState( descriptor.schema().getLabelId() ).getOrCreateIndexChanges().unRemove( descriptor ); } else { diff.add( descriptor ); - getOrCreateLabelState( descriptor.getLabelId() ).getOrCreateIndexChanges().add( descriptor ); + getOrCreateLabelState( descriptor.schema().getLabelId() ).getOrCreateIndexChanges().add( descriptor ); } changed(); } @Override - public void constraintIndexRuleDoAdd( IndexDescriptor descriptor ) - { - constraintIndexChangesDiffSets().add( descriptor ); - getOrCreateLabelState( descriptor.getLabelId() ).getOrCreateConstraintIndexChanges().add( descriptor ); - changed(); - } - - @Override - public void indexDoDrop( IndexDescriptor descriptor ) + public void indexDoDrop( NewIndexDescriptor descriptor ) { indexChangesDiffSets().remove( descriptor ); - getOrCreateLabelState( descriptor.getLabelId() ).getOrCreateIndexChanges().remove( descriptor ); - changed(); - } - - @Override - public void constraintIndexDoDrop( IndexDescriptor descriptor ) - { - constraintIndexChangesDiffSets().remove( descriptor ); - getOrCreateLabelState( descriptor.getLabelId() ).getOrCreateConstraintIndexChanges().remove( descriptor ); + getOrCreateLabelState( descriptor.schema().getLabelId() ).getOrCreateIndexChanges().remove( descriptor ); changed(); } @Override - public ReadableDiffSets indexDiffSetsByLabel( int labelId ) + public ReadableDiffSets indexDiffSetsByLabel( int labelId, NewIndexDescriptor.Filter indexType ) { - return LABEL_STATE.get( this, labelId ).indexChanges(); + return LABEL_STATE.get( this, labelId ).indexChanges( indexType ); } @Override - public ReadableDiffSets constraintIndexDiffSetsByLabel( int labelId ) + public ReadableDiffSets indexChanges( NewIndexDescriptor.Filter indexType ) { - return LABEL_STATE.get( this, labelId ).constraintIndexChanges(); + return ReadableDiffSets.Empty.ifNull( indexChanges ).filterAdded( indexType ); } - @Override - public ReadableDiffSets indexChanges() - { - return ReadableDiffSets.Empty.ifNull( indexChanges ); - } - - private DiffSets indexChangesDiffSets() + private DiffSets indexChangesDiffSets() { if ( indexChanges == null ) { @@ -906,21 +878,6 @@ private DiffSets indexChangesDiffSets() return indexChanges; } - @Override - public ReadableDiffSets constraintIndexChanges() - { - return ReadableDiffSets.Empty.ifNull( constraintIndexChanges ); - } - - private DiffSets constraintIndexChangesDiffSets() - { - if ( constraintIndexChanges == null ) - { - constraintIndexChanges = new DiffSets<>(); - } - return constraintIndexChanges; - } - @Override public ReadableDiffSets addedAndRemovedNodes() { @@ -1078,7 +1035,7 @@ public void constraintDoDrop( NodePropertyConstraint constraint ) if ( constraint instanceof UniquenessConstraint ) { - constraintIndexDoDrop( ((UniquenessConstraint) constraint).indexDescriptor() ); + indexDoDrop( IndexBoundary.mapUnique( ((UniquenessConstraint) constraint).indexDescriptor() ) ); } getOrCreateLabelState( constraint.label() ).getOrCreateConstraintsChanges().remove( constraint ); changed(); @@ -1120,22 +1077,23 @@ public boolean constraintDoUnRemove( NodePropertyConstraint constraint ) @Override public boolean constraintIndexDoUnRemove( UniquenessConstraint constraint ) { - IndexDescriptor descriptor = constraint.indexDescriptor(); - if ( constraintIndexChangesDiffSets().unRemove( descriptor ) ) + NewIndexDescriptor descriptor = IndexBoundary.mapUnique( constraint.indexDescriptor() ); + if ( indexChangesDiffSets().unRemove( descriptor ) ) { - LABEL_STATE.getOrCreate( this, descriptor.getLabelId() ).getOrCreateConstraintIndexChanges() - .unRemove( descriptor ); + LABEL_STATE.getOrCreate( this, descriptor.schema().getLabelId() ) + .getOrCreateIndexChanges().unRemove( descriptor ); return true; } return false; } @Override - public Iterable constraintIndexesCreatedInTx() + public Iterable constraintIndexesCreatedInTx() { if ( createdConstraintIndexesByConstraint != null && !createdConstraintIndexesByConstraint.isEmpty() ) { - return map( constraint -> constraint.indexDescriptor(), createdConstraintIndexesByConstraint.keySet() ); + return map( constraint -> IndexBoundary.mapUnique( constraint.indexDescriptor() ), + createdConstraintIndexesByConstraint.keySet() ); } return Iterables.empty(); } @@ -1148,23 +1106,23 @@ public Long indexCreatedForConstraint( UniquenessConstraint constraint ) } @Override - public ReadableDiffSets indexUpdatesForScanOrSeek( IndexDescriptor descriptor, Object value ) + public ReadableDiffSets indexUpdatesForScanOrSeek( NewIndexDescriptor descriptor, Object value ) { return ReadableDiffSets.Empty.ifNull( (value == null) ? getIndexUpdatesForScanOrSeek( - descriptor.getLabelId(), - descriptor.getPropertyKeyId() + descriptor.schema().getLabelId(), + descriptor.schema().getPropertyIds()[0] ) : getIndexUpdatesForScanOrSeek( - descriptor.getLabelId(), /*create=*/false, - Property.property( descriptor.getPropertyKeyId(), value ) + descriptor.schema().getLabelId(), /*create=*/false, + Property.property( descriptor.schema().getPropertyIds()[0], value ) ) ); } @Override - public ReadableDiffSets indexUpdatesForRangeSeekByNumber( IndexDescriptor descriptor, + public ReadableDiffSets indexUpdatesForRangeSeekByNumber( NewIndexDescriptor descriptor, Number lower, boolean includeLower, Number upper, boolean includeUpper ) { @@ -1173,11 +1131,11 @@ public ReadableDiffSets indexUpdatesForRangeSeekByNumber( IndexDescriptor ); } - private ReadableDiffSets getIndexUpdatesForRangeSeekByNumber( IndexDescriptor descriptor, + private ReadableDiffSets getIndexUpdatesForRangeSeekByNumber( NewIndexDescriptor descriptor, Number lower, boolean includeLower, Number upper, boolean includeUpper ) { - TreeMap> sortedUpdates = getSortedIndexUpdates( descriptor ); + TreeMap> sortedUpdates = getSortedIndexUpdates( descriptor.schema() ); if ( sortedUpdates == null ) { return null; @@ -1190,7 +1148,7 @@ private ReadableDiffSets getIndexUpdatesForRangeSeekByNumber( IndexDescrip boolean selectedIncludeUpper; //TODO: Get working with composite indexes - int propertyKeyId = descriptor.getPropertyKeyId(); + int propertyKeyId = descriptor.schema().getPropertyIds()[0]; if ( lower == null ) { @@ -1225,7 +1183,7 @@ private ReadableDiffSets getIndexUpdatesForRangeSeekByNumber( IndexDescrip } @Override - public ReadableDiffSets indexUpdatesForRangeSeekByString( IndexDescriptor descriptor, + public ReadableDiffSets indexUpdatesForRangeSeekByString( NewIndexDescriptor descriptor, String lower, boolean includeLower, String upper, boolean includeUpper ) { @@ -1234,11 +1192,11 @@ public ReadableDiffSets indexUpdatesForRangeSeekByString( IndexDescriptor ); } - private ReadableDiffSets getIndexUpdatesForRangeSeekByString( IndexDescriptor descriptor, + private ReadableDiffSets getIndexUpdatesForRangeSeekByString( NewIndexDescriptor descriptor, String lower, boolean includeLower, String upper, boolean includeUpper ) { - TreeMap> sortedUpdates = getSortedIndexUpdates( descriptor ); + TreeMap> sortedUpdates = getSortedIndexUpdates( descriptor.schema() ); if ( sortedUpdates == null ) { return null; @@ -1251,7 +1209,7 @@ private ReadableDiffSets getIndexUpdatesForRangeSeekByString( IndexDescrip boolean selectedIncludeUpper; //TODO: Get working with composite indexes - int propertyKeyId = descriptor.getPropertyKeyId(); + int propertyKeyId = descriptor.schema().getPropertyIds()[0]; if ( lower == null ) { @@ -1286,20 +1244,20 @@ private ReadableDiffSets getIndexUpdatesForRangeSeekByString( IndexDescrip } @Override - public ReadableDiffSets indexUpdatesForRangeSeekByPrefix( IndexDescriptor descriptor, String prefix ) + public ReadableDiffSets indexUpdatesForRangeSeekByPrefix( NewIndexDescriptor descriptor, String prefix ) { return ReadableDiffSets.Empty.ifNull( getIndexUpdatesForRangeSeekByPrefix( descriptor, prefix ) ); } - private ReadableDiffSets getIndexUpdatesForRangeSeekByPrefix( IndexDescriptor descriptor, String prefix ) + private ReadableDiffSets getIndexUpdatesForRangeSeekByPrefix( NewIndexDescriptor descriptor, String prefix ) { - TreeMap> sortedUpdates = getSortedIndexUpdates( descriptor ); + TreeMap> sortedUpdates = getSortedIndexUpdates( descriptor.schema() ); if ( sortedUpdates == null ) { return null; } //TODO: get working with composite indexes - int propertyKeyId = descriptor.getPropertyKeyId(); + int propertyKeyId = descriptor.schema().getPropertyIds()[0]; DefinedProperty floor = Property.stringProperty( propertyKeyId, prefix ); DiffSets diffs = new DiffSets<>(); for ( Map.Entry> entry : sortedUpdates.tailMap( floor ).entrySet() ) @@ -1322,7 +1280,7 @@ private ReadableDiffSets getIndexUpdatesForRangeSeekByPrefix( IndexDescrip // Ensure sorted index updates for a given index. This is needed for range query support and // may involve converting the existing hash map first // - private TreeMap> getSortedIndexUpdates( IndexDescriptor descriptor ) + private TreeMap> getSortedIndexUpdates( LabelSchemaDescriptor descriptor ) { if ( indexUpdates == null ) { @@ -1348,7 +1306,7 @@ private TreeMap> getSortedIndexUpdates( IndexDes } @Override - public void indexDoUpdateProperty( IndexDescriptor descriptor, long nodeId, + public void indexDoUpdateProperty( LabelSchemaDescriptor descriptor, long nodeId, DefinedProperty propertyBefore, DefinedProperty propertyAfter ) { DiffSets before = getIndexUpdatesForScanOrSeek( descriptor.getLabelId(), true, propertyBefore ); @@ -1411,7 +1369,7 @@ private DiffSets getIndexUpdatesForScanOrSeek( int label, boolean create, return diffs; } - private DiffSets getIndexUpdatesForScanOrSeek( int label, int propertyKeyIds ) + private DiffSets getIndexUpdatesForScanOrSeek( int label, int propertyId ) { if ( indexUpdates == null ) { @@ -1426,7 +1384,7 @@ private DiffSets getIndexUpdatesForScanOrSeek( int label, int propertyKeyI for ( Map.Entry> entry : updates.entrySet() ) { //TODO: Make this work for composite indexes - if ( entry.getKey().propertyKeyId() == propertyKeyIds ) + if ( entry.getKey().propertyKeyId() == propertyId ) { diffs.addAll( entry.getValue().getAdded().iterator() ); diffs.removeAll( entry.getValue().getRemoved().iterator() ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/store/SchemaCache.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/store/SchemaCache.java index a38a7ecc2434..54ec51ffbf05 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/store/SchemaCache.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/store/SchemaCache.java @@ -101,7 +101,7 @@ public boolean hasIndexRule( SchemaDescriptor descriptor ) { for ( IndexRule rule : indexRuleById.values() ) { - if ( rule.getSchemaDescriptor().equals( descriptor ) ) + if ( rule.schema().equals( descriptor ) ) { return true; } @@ -165,7 +165,7 @@ else if ( rule instanceof IndexRule ) { IndexRule indexRule = (IndexRule) rule; indexRuleById.put( indexRule.getId(), indexRule ); - indexDescriptors.put( indexRule.getSchemaDescriptor(), indexRule.getIndexDescriptor() ); + indexDescriptors.put( indexRule.schema(), indexRule.getIndexDescriptor() ); } } @@ -205,7 +205,7 @@ else if ( constraint instanceof RelationshipPropertyConstraint ) else if ( indexRuleById.containsKey( id ) ) { IndexRule rule = indexRuleById.remove( id ); - indexDescriptors.remove( rule.getSchemaDescriptor() ); + indexDescriptors.remove( rule.schema() ); } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/TransactionToRecordStateVisitor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/TransactionToRecordStateVisitor.java index d0afccdcf9e4..1c9e0f4b1d9b 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/TransactionToRecordStateVisitor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/TransactionToRecordStateVisitor.java @@ -28,12 +28,12 @@ import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException; import org.neo4j.kernel.api.exceptions.schema.DuplicateSchemaRuleException; import org.neo4j.kernel.api.exceptions.schema.SchemaRuleNotFoundException; -import org.neo4j.kernel.api.schema.IndexDescriptor; import org.neo4j.kernel.api.index.SchemaIndexProvider; import org.neo4j.kernel.api.properties.DefinedProperty; import org.neo4j.kernel.api.schema_new.SchemaDescriptorFactory; import org.neo4j.kernel.api.schema_new.constaints.ConstraintDescriptorFactory; -import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptorFactory; +import org.neo4j.kernel.api.schema_new.index.IndexBoundary; +import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor; import org.neo4j.kernel.impl.api.index.SchemaIndexProviderMap; import org.neo4j.kernel.impl.constraints.ConstraintSemantics; import org.neo4j.kernel.impl.store.SchemaStorage; @@ -42,6 +42,8 @@ import org.neo4j.storageengine.api.StorageProperty; import org.neo4j.storageengine.api.txstate.TxStateVisitor; +import static org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor.Type.UNIQUE; + public class TransactionToRecordStateVisitor extends TxStateVisitor.Adapter { private boolean clearSchemaState; @@ -179,37 +181,21 @@ public void visitNodeLabelChanges( long id, final Set added, final Set< } @Override - public void visitAddedIndex( IndexDescriptor element, boolean isConstraintIndex ) + public void visitAddedIndex( NewIndexDescriptor index ) { SchemaIndexProvider.Descriptor providerDescriptor = schemaIndexProviderMap.getDefaultProvider().getProviderDescriptor(); - IndexRule rule; - if ( isConstraintIndex ) - { - // was IndexRule.constraintIndexRule, but calling this with null gives the non-constraint version? - rule = IndexRule.indexRule( - schemaStorage.newRuleId(), - NewIndexDescriptorFactory.uniqueForLabel( element.getLabelId(), element.getPropertyKeyId() ), - providerDescriptor ); - } - else - { - rule = IndexRule.indexRule( - schemaStorage.newRuleId(), - NewIndexDescriptorFactory.forLabel( element.getLabelId(), element.getPropertyKeyId() ), - providerDescriptor ); - } + IndexRule rule = IndexRule.indexRule( schemaStorage.newRuleId(), index, providerDescriptor ); recordState.createSchemaRule( rule ); } @Override - public void visitRemovedIndex( IndexDescriptor desc, boolean isConstraintIndex ) + public void visitRemovedIndex( NewIndexDescriptor index ) { - SchemaStorage.IndexRuleKind kind = isConstraintIndex ? + SchemaStorage.IndexRuleKind kind = index.type() == UNIQUE ? SchemaStorage.IndexRuleKind.CONSTRAINT : SchemaStorage.IndexRuleKind.INDEX; - IndexRule rule = schemaStorage.indexGetForSchema( - SchemaDescriptorFactory.forLabel( desc.getLabelId(), desc.getPropertyKeyId() ), kind ); + IndexRule rule = schemaStorage.indexGetForSchema( index.schema(), kind ); recordState.dropSchemaRule( rule ); } @@ -252,7 +238,7 @@ public void visitRemovedUniquePropertyConstraint( UniquenessConstraint element ) throw new IllegalStateException( "Multiple constraints found for specified label and property." ); } // Remove the index for the constraint as well - visitRemovedIndex( element.indexDescriptor(), true ); + visitRemovedIndex( IndexBoundary.mapUnique( element.indexDescriptor() ) ); } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/record/ConstraintRule.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/record/ConstraintRule.java index 4415cd8a0378..98e5c20dc460 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/record/ConstraintRule.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/record/ConstraintRule.java @@ -66,7 +66,7 @@ public String toString() } @Override - public SchemaDescriptor getSchemaDescriptor() + public SchemaDescriptor schema() { return descriptor.schema(); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/record/IndexRule.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/record/IndexRule.java index 78fc4e05eade..c627c84add8d 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/record/IndexRule.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/record/IndexRule.java @@ -139,7 +139,7 @@ public String toString() } @Override - public LabelSchemaDescriptor getSchemaDescriptor() + public LabelSchemaDescriptor schema() { return descriptor.schema(); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/storemigration/legacystore/v21/propertydeduplication/IndexLookup.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/storemigration/legacystore/v21/propertydeduplication/IndexLookup.java index c85853affb10..274c5f014fb6 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/storemigration/legacystore/v21/propertydeduplication/IndexLookup.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/storemigration/legacystore/v21/propertydeduplication/IndexLookup.java @@ -64,7 +64,7 @@ private PrimitiveIntObjectMap> buildIndexRuleIndex( SchemaStore if ( schemaRule instanceof IndexRule ) { IndexRule rule = (IndexRule) schemaRule; - int propertyId = rule.getSchemaDescriptor().getPropertyIds()[0]; // assuming 1 property always + int propertyId = rule.schema().getPropertyIds()[0]; // assuming 1 property always List ruleList = indexRuleIndex.get( propertyId ); if ( ruleList == null ) { diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableTransactionState.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableTransactionState.java index 0cb780e87d2d..ceec154c5514 100644 --- a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableTransactionState.java +++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableTransactionState.java @@ -31,9 +31,9 @@ import org.neo4j.kernel.api.constraints.UniquenessConstraint; import org.neo4j.kernel.api.exceptions.schema.ConstraintValidationKernelException; import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException; -import org.neo4j.kernel.api.schema.IndexDescriptor; import org.neo4j.kernel.api.schema.NodePropertyDescriptor; import org.neo4j.kernel.api.schema.RelationshipPropertyDescriptor; +import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor; import org.neo4j.kernel.impl.api.RelationshipVisitor; import org.neo4j.kernel.impl.api.store.RelationshipIterator; import org.neo4j.storageengine.api.Direction; @@ -112,15 +112,11 @@ public interface ReadableTransactionState // SCHEMA RELATED - ReadableDiffSets indexDiffSetsByLabel( int labelId ); + ReadableDiffSets indexDiffSetsByLabel( int labelId, NewIndexDescriptor.Filter indexType ); - ReadableDiffSets constraintIndexDiffSetsByLabel( int labelId ); + ReadableDiffSets indexChanges( NewIndexDescriptor.Filter indexType ); - ReadableDiffSets indexChanges(); - - ReadableDiffSets constraintIndexChanges(); - - Iterable constraintIndexesCreatedInTx(); + Iterable constraintIndexesCreatedInTx(); ReadableDiffSets constraintsChanges(); @@ -135,17 +131,17 @@ ReadableDiffSets constraintsChangesForRelationsh Long indexCreatedForConstraint( UniquenessConstraint constraint ); - ReadableDiffSets indexUpdatesForScanOrSeek( IndexDescriptor index, Object value ); + ReadableDiffSets indexUpdatesForScanOrSeek( NewIndexDescriptor index, Object value ); - ReadableDiffSets indexUpdatesForRangeSeekByNumber( IndexDescriptor index, + ReadableDiffSets indexUpdatesForRangeSeekByNumber( NewIndexDescriptor index, Number lower, boolean includeLower, Number upper, boolean includeUpper ); - ReadableDiffSets indexUpdatesForRangeSeekByString( IndexDescriptor index, + ReadableDiffSets indexUpdatesForRangeSeekByString( NewIndexDescriptor index, String lower, boolean includeLower, String upper, boolean includeUpper ); - ReadableDiffSets indexUpdatesForRangeSeekByPrefix( IndexDescriptor index, String prefix ); + ReadableDiffSets indexUpdatesForRangeSeekByPrefix( NewIndexDescriptor index, String prefix ); NodeState getNodeState( long id ); diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/TxStateVisitor.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/TxStateVisitor.java index e9e683e1491d..847f824ee35e 100644 --- a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/TxStateVisitor.java +++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/TxStateVisitor.java @@ -27,7 +27,7 @@ import org.neo4j.kernel.api.constraints.UniquenessConstraint; import org.neo4j.kernel.api.exceptions.schema.ConstraintValidationKernelException; import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException; -import org.neo4j.kernel.api.schema.IndexDescriptor; +import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor; import org.neo4j.storageengine.api.StorageProperty; /** @@ -56,9 +56,9 @@ void visitGraphPropertyChanges( Iterator added, Iterator added, Set removed ) throws ConstraintValidationKernelException; - void visitAddedIndex( IndexDescriptor element, boolean isConstraintIndex ); + void visitAddedIndex( NewIndexDescriptor element ); - void visitRemovedIndex( IndexDescriptor element, boolean isConstraintIndex ); + void visitRemovedIndex( NewIndexDescriptor element ); void visitAddedUniquePropertyConstraint( UniquenessConstraint element ); @@ -133,12 +133,12 @@ public void visitNodeLabelChanges( long id, Set added, Set rem } @Override - public void visitAddedIndex( IndexDescriptor element, boolean isConstraintIndex ) + public void visitAddedIndex( NewIndexDescriptor index ) { } @Override - public void visitRemovedIndex( IndexDescriptor element, boolean isConstraintIndex ) + public void visitRemovedIndex( NewIndexDescriptor index ) { } @@ -264,15 +264,15 @@ public void visitNodeLabelChanges( long id, Set added, Set rem } @Override - public void visitAddedIndex( IndexDescriptor element, boolean isConstraintIndex ) + public void visitAddedIndex( NewIndexDescriptor index ) { - actual.visitAddedIndex( element, isConstraintIndex ); + actual.visitAddedIndex( index ); } @Override - public void visitRemovedIndex( IndexDescriptor element, boolean isConstraintIndex ) + public void visitRemovedIndex( NewIndexDescriptor index ) { - actual.visitRemovedIndex( element, isConstraintIndex ); + actual.visitRemovedIndex( index ); } @Override diff --git a/community/kernel/src/main/java/org/neo4j/unsafe/batchinsert/internal/BatchInserterImpl.java b/community/kernel/src/main/java/org/neo4j/unsafe/batchinsert/internal/BatchInserterImpl.java index f8618a50bfd4..59a2bdd87eaf 100644 --- a/community/kernel/src/main/java/org/neo4j/unsafe/batchinsert/internal/BatchInserterImpl.java +++ b/community/kernel/src/main/java/org/neo4j/unsafe/batchinsert/internal/BatchInserterImpl.java @@ -451,8 +451,8 @@ private void repopulateAllIndexes() throws IOException, IndexEntryConflictExcept for ( int i = 0; i < labelIds.length; i++ ) { IndexRule rule = rules[i]; - int labelId = rule.getSchemaDescriptor().getLabelId(); - int propertyKeyId = rule.getSchemaDescriptor().getPropertyIds()[0]; + int labelId = rule.schema().getLabelId(); + int propertyKeyId = rule.schema().getPropertyIds()[0]; labelIds[i] = labelId; // TODO: Support composite indexes diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/constraints/ConstraintIndexCreatorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/constraints/ConstraintIndexCreatorTest.java index fa76eac90103..afe35cdccdd0 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/constraints/ConstraintIndexCreatorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/constraints/ConstraintIndexCreatorTest.java @@ -41,6 +41,9 @@ import org.neo4j.kernel.api.proc.CallableProcedure; import org.neo4j.kernel.api.proc.CallableUserAggregationFunction; import org.neo4j.kernel.api.proc.CallableUserFunction; +import org.neo4j.kernel.api.schema_new.index.IndexBoundary; +import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor; +import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptorFactory; import org.neo4j.kernel.api.security.SecurityContext; import org.neo4j.kernel.api.txstate.TransactionState; import org.neo4j.kernel.impl.api.KernelStatement; @@ -51,6 +54,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; +import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -91,7 +95,7 @@ public void shouldCreateIndexInAnotherTransaction() throws Exception // then assertEquals( 2468L, indexId ); assertEquals( 1, kernel.statements.size() ); - verify( kernel.statements.get( 0 ).txState() ).constraintIndexRuleDoAdd( index ); + verify( kernel.statements.get( 0 ).txState() ).indexRuleDoAdd( eq( IndexBoundary.mapUnique( index ) ) ); verifyNoMoreInteractions( indexCreationContext.schemaWriteOperations() ); verify( constraintCreationContext.schemaReadOperations() ).indexGetCommittedId( state, index, CONSTRAINT ); verifyNoMoreInteractions( constraintCreationContext.schemaReadOperations() ); @@ -135,12 +139,13 @@ public void shouldDropIndexIfPopulationFails() throws Exception } assertEquals( 2, kernel.statements.size() ); TransactionState tx1 = kernel.statements.get( 0 ).txState(); - verify( tx1 ).constraintIndexRuleDoAdd( IndexDescriptorFactory.of( 123, 456 ) ); + NewIndexDescriptor newIndex = NewIndexDescriptorFactory.uniqueForLabel( 123, 456 ); + verify( tx1 ).indexRuleDoAdd( newIndex ); verifyNoMoreInteractions( tx1 ); verify( constraintCreationContext.schemaReadOperations() ).indexGetCommittedId( state, index, CONSTRAINT ); verifyNoMoreInteractions( constraintCreationContext.schemaReadOperations() ); TransactionState tx2 = kernel.statements.get( 1 ).txState(); - verify( tx2 ).constraintIndexDoDrop( IndexDescriptorFactory.of( 123, 456 ) ); + verify( tx2 ).indexDoDrop( newIndex ); verifyNoMoreInteractions( tx2 ); } @@ -151,16 +156,16 @@ public void shouldDropIndexInAnotherTransaction() throws Exception StubKernel kernel = new StubKernel(); IndexingService indexingService = mock( IndexingService.class ); - IndexDescriptor descriptor = IndexDescriptorFactory.of( 123, 456 ); + NewIndexDescriptor index = NewIndexDescriptorFactory.uniqueForLabel( 123, 456 ); ConstraintIndexCreator creator = new ConstraintIndexCreator( () -> kernel, indexingService ); // when - creator.dropUniquenessConstraintIndex( descriptor ); + creator.dropUniquenessConstraintIndex( index ); // then assertEquals( 1, kernel.statements.size() ); - verify( kernel.statements.get( 0 ).txState() ).constraintIndexDoDrop( descriptor ); + verify( kernel.statements.get( 0 ).txState() ).indexDoDrop( index ); verifyZeroInteractions( indexingService ); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/StateHandlingStatementOperationsTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/StateHandlingStatementOperationsTest.java index 200d4b6b6b20..d435ce051bf9 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/StateHandlingStatementOperationsTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/StateHandlingStatementOperationsTest.java @@ -37,6 +37,8 @@ import org.neo4j.kernel.api.schema.IndexDescriptorFactory; import org.neo4j.kernel.api.schema.NodePropertyDescriptor; import org.neo4j.kernel.api.schema_new.SchemaBoundary; +import org.neo4j.kernel.api.schema_new.index.IndexBoundary; +import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor; import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptorFactory; import org.neo4j.kernel.api.txstate.TransactionState; import org.neo4j.kernel.impl.api.KernelStatement; @@ -75,10 +77,9 @@ public class StateHandlingStatementOperationsTest StoreReadLayer inner = mock( StoreReadLayer.class ); - private int[] properties={66}; - private int[] properties2={99}; private NodePropertyDescriptor descriptor1 = new NodePropertyDescriptor( 10, 66 ); private NodePropertyDescriptor descriptor2 = new NodePropertyDescriptor( 11, 99 ); + private NewIndexDescriptor index = NewIndexDescriptorFactory.forLabel( 1, 2 ); @Test public void shouldNeverDelegateWrites() throws Exception @@ -207,7 +208,6 @@ public void shouldConsiderTransactionStateDuringIndexScan() throws Exception KernelStatement statement = mock( KernelStatement.class ); when( statement.hasTxStateWithChanges() ).thenReturn( true ); when( statement.txState() ).thenReturn( txState ); - IndexDescriptor index = IndexDescriptorFactory.of( 1, 2 ); when( txState.indexUpdatesForScanOrSeek( index, null ) ).thenReturn( new DiffSets<>( Collections.singleton( 42L ), Collections.singleton( 44L ) ) ); @@ -224,7 +224,7 @@ public void shouldConsiderTransactionStateDuringIndexScan() throws Exception StateHandlingStatementOperations context = newTxStateOps( storeReadLayer ); // When - PrimitiveLongIterator results = context.nodesGetFromIndexScan( statement, index ); + PrimitiveLongIterator results = context.nodesGetFromIndexScan( statement, IndexBoundary.map( index ) ); // Then assertEquals( asSet( 42L, 43L ), PrimitiveLongCollections.toSet( results ) ); @@ -238,7 +238,6 @@ public void shouldConsiderTransactionStateDuringIndexSeek() throws Exception KernelStatement statement = mock( KernelStatement.class ); when( statement.hasTxStateWithChanges() ).thenReturn( true ); when( statement.txState() ).thenReturn( txState ); - IndexDescriptor index = IndexDescriptorFactory.of( 1, 2 ); when( txState.indexUpdatesForScanOrSeek( index, "value" ) ).thenReturn( new DiffSets<>( Collections.singleton( 42L ), Collections.singleton( 44L ) ) ); @@ -254,7 +253,7 @@ public void shouldConsiderTransactionStateDuringIndexSeek() throws Exception StateHandlingStatementOperations context = newTxStateOps( storeReadLayer ); // When - PrimitiveLongIterator results = context.nodesGetFromIndexSeek( statement, index, "value" ); + PrimitiveLongIterator results = context.nodesGetFromIndexSeek( statement, IndexBoundary.map( index ), "value" ); // Then assertEquals( asSet( 42L, 43L ), PrimitiveLongCollections.toSet( results ) ); @@ -268,7 +267,6 @@ public void shouldConsiderTransactionStateDuringIndexRangeSeekByPrefix() throws KernelStatement statement = mock( KernelStatement.class ); when( statement.hasTxStateWithChanges() ).thenReturn( true ); when( statement.txState() ).thenReturn( txState ); - IndexDescriptor index = IndexDescriptorFactory.of( 1, 2 ); when( txState.indexUpdatesForRangeSeekByPrefix( index, "prefix" ) ).thenReturn( new DiffSets<>( Collections.singleton( 42L ), Collections.singleton( 44L ) ) ); @@ -284,7 +282,7 @@ public void shouldConsiderTransactionStateDuringIndexRangeSeekByPrefix() throws StateHandlingStatementOperations context = newTxStateOps( storeReadLayer ); // When - PrimitiveLongIterator results = context.nodesGetFromIndexRangeSeekByPrefix( statement, index, "prefix" ); + PrimitiveLongIterator results = context.nodesGetFromIndexRangeSeekByPrefix( statement, IndexBoundary.map( index ), "prefix" ); // Then assertEquals( asSet( 42L, 43L ), PrimitiveLongCollections.toSet( results ) ); @@ -306,7 +304,6 @@ public void shouldConsiderTransactionStateDuringIndexBetweenRangeSeekByNumber() when( statement.txState() ).thenReturn( txState ); StorageStatement storageStatement = mock( StorageStatement.class ); when( statement.getStoreStatement() ).thenReturn( storageStatement ); - IndexDescriptor index = IndexDescriptorFactory.of( 1, propertyKey ); when( txState.indexUpdatesForRangeSeekByNumber( index, lower, true, upper, false ) ).thenReturn( new DiffSets<>( Collections.singleton( 42L ), Collections.singleton( 44L ) ) ); @@ -333,8 +330,8 @@ public void shouldConsiderTransactionStateDuringIndexBetweenRangeSeekByNumber() StateHandlingStatementOperations context = newTxStateOps( storeReadLayer ); // When - PrimitiveLongIterator results = context.nodesGetFromIndexRangeSeekByNumber( statement, index, lower, true, - upper, false ); + PrimitiveLongIterator results = context.nodesGetFromIndexRangeSeekByNumber( + statement, IndexBoundary.map( index ), lower, true, upper, false ); // Then assertEquals( asSet( 42L, 43L ), PrimitiveLongCollections.toSet( results ) ); @@ -348,7 +345,6 @@ public void shouldConsiderTransactionStateDuringIndexBetweenRangeSeekByString() KernelStatement statement = mock( KernelStatement.class ); when( statement.hasTxStateWithChanges() ).thenReturn( true ); when( statement.txState() ).thenReturn( txState ); - IndexDescriptor index = IndexDescriptorFactory.of( 1, 2 ); when( txState.indexUpdatesForRangeSeekByString( index, "Anne", true, "Bill", false ) ).thenReturn( new DiffSets<>( Collections.singleton( 42L ), Collections.singleton( 44L ) ) ); @@ -365,7 +361,8 @@ public void shouldConsiderTransactionStateDuringIndexBetweenRangeSeekByString() StateHandlingStatementOperations context = newTxStateOps( storeReadLayer ); // When - PrimitiveLongIterator results = context.nodesGetFromIndexRangeSeekByString( statement, index, "Anne", true, "Bill", false ); + PrimitiveLongIterator results = context.nodesGetFromIndexRangeSeekByString( + statement, IndexBoundary.map( index ), "Anne", true, "Bill", false ); // Then assertEquals( asSet( 42L, 43L ), PrimitiveLongCollections.toSet( results ) ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/TxStateTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/TxStateTest.java index 991d61d30611..8ded485a1bf4 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/TxStateTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/TxStateTest.java @@ -46,10 +46,10 @@ import org.neo4j.kernel.api.constraints.RelationshipPropertyExistenceConstraint; import org.neo4j.kernel.api.constraints.UniquenessConstraint; import org.neo4j.kernel.api.cursor.RelationshipItemHelper; -import org.neo4j.kernel.api.schema.IndexDescriptor; -import org.neo4j.kernel.api.schema.IndexDescriptorFactory; import org.neo4j.kernel.api.properties.DefinedProperty; import org.neo4j.kernel.api.properties.Property; +import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor; +import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptorFactory; import org.neo4j.kernel.api.txstate.TransactionState; import org.neo4j.kernel.impl.api.RelationshipVisitor; import org.neo4j.kernel.impl.api.store.RelationshipIterator; @@ -81,6 +81,7 @@ import static org.neo4j.kernel.api.properties.Property.numberProperty; import static org.neo4j.kernel.api.properties.Property.stringProperty; import static org.neo4j.kernel.impl.api.state.StubCursors.cursor; +import static org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor.Filter.GENERAL; public class TxStateTest { @@ -183,7 +184,8 @@ public void shouldAddAndGetByLabel() throws Exception state.indexRuleDoAdd( indexOn_2_1 ); // THEN - assertEquals( asSet( indexOn_1_1 ), state.indexDiffSetsByLabel( descriptorOn_1_1.getLabelId() ).getAdded() ); + assertEquals( asSet( indexOn_1_1 ), + state.indexDiffSetsByLabel( indexOn_1_1.schema().getLabelId(), GENERAL ).getAdded() ); } @Test @@ -193,7 +195,7 @@ public void shouldAddAndGetByRuleId() throws Exception state.indexRuleDoAdd( indexOn_1_1 ); // THEN - assertEquals( asSet( indexOn_1_1 ), state.indexChanges().getAdded() ); + assertEquals( asSet( indexOn_1_1 ), state.indexChanges( GENERAL ).getAdded() ); } // endregion @@ -1706,12 +1708,9 @@ protected boolean fetchNext() private final NodePropertyDescriptor descriptor1 = new NodePropertyDescriptor( 1, 17 ); private final NodePropertyDescriptor descriptor2 = new NodePropertyDescriptor( 2, 17 ); private final RelationshipPropertyDescriptor relDescriptor1 = new RelationshipPropertyDescriptor( 1, 42 ); - private final NodePropertyDescriptor descriptorOn_1_1 = new NodePropertyDescriptor( 2, 3 ); - private final NodePropertyDescriptor descriptorOn_1_2 = new NodePropertyDescriptor( 2, 4 ); - private final NodePropertyDescriptor descriptorOn_2_1 = new NodePropertyDescriptor( 3, 3 ); - private final IndexDescriptor indexOn_1_1 = IndexDescriptorFactory.of( descriptorOn_1_1 ); - private final IndexDescriptor indexOn_1_2 = IndexDescriptorFactory.of( descriptorOn_1_2 ); - private final IndexDescriptor indexOn_2_1 = IndexDescriptorFactory.of( descriptorOn_2_1 ); + private final NewIndexDescriptor indexOn_1_1 = NewIndexDescriptorFactory.forLabel( 2, 3 ); + private final NewIndexDescriptor indexOn_1_2 = NewIndexDescriptorFactory.forLabel( 2, 4 ); + private final NewIndexDescriptor indexOn_2_1 = NewIndexDescriptorFactory.forLabel( 3, 3 ); private TransactionState state; @@ -1732,7 +1731,7 @@ private interface IndexUpdater void withBooleanProperties( Collection> nodesWithValues ); } - private IndexUpdater addNodesToIndex( final IndexDescriptor descriptor ) + private IndexUpdater addNodesToIndex( final NewIndexDescriptor descriptor ) { return new IndexUpdater() { @@ -1750,8 +1749,8 @@ public void withDefaultStringProperties( long... nodeIds ) @Override public void withStringProperties( Collection> nodesWithValues ) { - final int labelId = descriptor.getLabelId(); - final int propertyKeyId = descriptor.getPropertyKeyId(); + final int labelId = descriptor.schema().getLabelId(); + final int propertyKeyId = descriptor.schema().getPropertyIds()[0]; for ( Pair entry : nodesWithValues ) { long nodeId = entry.first(); @@ -1760,15 +1759,15 @@ public void withStringProperties( Collection> nodesWithValues Property propertyBefore = noNodeProperty( nodeId, propertyKeyId ); DefinedProperty propertyAfter = stringProperty( propertyKeyId, entry.other() ); state.nodeDoReplaceProperty( nodeId, propertyBefore, propertyAfter ); - state.indexDoUpdateProperty( descriptor, nodeId, null, propertyAfter ); + state.indexDoUpdateProperty( descriptor.schema(), nodeId, null, propertyAfter ); } } @Override public void withNumberProperties( Collection> nodesWithValues ) { - final int labelId = descriptor.getLabelId(); - final int propertyKeyId = descriptor.getPropertyKeyId(); + final int labelId = descriptor.schema().getLabelId(); + final int propertyKeyId = descriptor.schema().getPropertyIds()[0]; for ( Pair entry : nodesWithValues ) { long nodeId = entry.first(); @@ -1777,15 +1776,15 @@ public void withNumberProperties( Collection> no Property propertyBefore = noNodeProperty( nodeId, propertyKeyId ); DefinedProperty propertyAfter = numberProperty( propertyKeyId, entry.other() ); state.nodeDoReplaceProperty( nodeId, propertyBefore, propertyAfter ); - state.indexDoUpdateProperty( descriptor, nodeId, null, propertyAfter ); + state.indexDoUpdateProperty( descriptor.schema(), nodeId, null, propertyAfter ); } } @Override public void withBooleanProperties( Collection> nodesWithValues ) { - final int labelId = descriptor.getLabelId(); - final int propertyKeyId = descriptor.getPropertyKeyId(); + final int labelId = descriptor.schema().getLabelId(); + final int propertyKeyId = descriptor.schema().getPropertyIds()[0]; for ( Pair entry : nodesWithValues ) { long nodeId = entry.first(); @@ -1794,7 +1793,7 @@ public void withBooleanProperties( Collection> nodesWithValue Property propertyBefore = noNodeProperty( nodeId, propertyKeyId ); DefinedProperty propertyAfter = booleanProperty( propertyKeyId, entry.other() ); state.nodeDoReplaceProperty( nodeId, propertyBefore, propertyAfter ); - state.indexDoUpdateProperty( descriptor, nodeId, null, propertyAfter ); + state.indexDoUpdateProperty( descriptor.schema(), nodeId, null, propertyAfter ); } } }; diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/SchemaStoreTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/SchemaStoreTest.java index 0726fa3f9993..20f798affa2e 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/SchemaStoreTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/SchemaStoreTest.java @@ -95,7 +95,7 @@ public void storeAndLoadSchemaRule() throws Exception // THEN assertEquals( indexRule.getId(), readIndexRule.getId() ); - assertEquals( indexRule.getSchemaDescriptor(), readIndexRule.getSchemaDescriptor() ); + assertEquals( indexRule.schema(), readIndexRule.schema() ); assertEquals( indexRule.getIndexDescriptor(), readIndexRule.getIndexDescriptor() ); assertEquals( indexRule.getProviderDescriptor(), readIndexRule.getProviderDescriptor() ); } @@ -114,7 +114,7 @@ public void storeAndLoadCompositeSchemaRule() throws Exception // THEN assertEquals( indexRule.getId(), readIndexRule.getId() ); - assertEquals( indexRule.getSchemaDescriptor(), readIndexRule.getSchemaDescriptor() ); + assertEquals( indexRule.schema(), readIndexRule.schema() ); assertEquals( indexRule.getIndexDescriptor(), readIndexRule.getIndexDescriptor() ); assertEquals( indexRule.getProviderDescriptor(), readIndexRule.getProviderDescriptor() ); } @@ -132,7 +132,7 @@ public void storeAndLoad_Big_CompositeSchemaRule() throws Exception // THEN assertEquals( indexRule.getId(), readIndexRule.getId() ); - assertEquals( indexRule.getSchemaDescriptor(), readIndexRule.getSchemaDescriptor() ); + assertEquals( indexRule.schema(), readIndexRule.schema() ); assertEquals( indexRule.getIndexDescriptor(), readIndexRule.getIndexDescriptor() ); assertEquals( indexRule.getProviderDescriptor(), readIndexRule.getProviderDescriptor() ); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/countStore/InMemoryCountsStoreSnapshotDeserializerTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/countStore/InMemoryCountsStoreSnapshotDeserializerTest.java index 4c47c84826ee..a4a411a1d9b2 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/countStore/InMemoryCountsStoreSnapshotDeserializerTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/countStore/InMemoryCountsStoreSnapshotDeserializerTest.java @@ -29,8 +29,6 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import org.neo4j.kernel.api.schema.IndexDescriptor; -import org.neo4j.kernel.api.schema.IndexDescriptorFactory; import org.neo4j.kernel.impl.store.counts.keys.CountsKey; import org.neo4j.kernel.impl.store.counts.keys.CountsKeyFactory; import org.neo4j.kernel.impl.store.counts.keys.IndexSampleKey; diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/record/ConstraintRuleTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/record/ConstraintRuleTest.java index f8f6a28c1ae9..b84634f73427 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/record/ConstraintRuleTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/record/ConstraintRuleTest.java @@ -42,7 +42,7 @@ public void shouldCreateUniquenessConstraint() throws Exception // THEN assertThat( constraintRule.getId(), equalTo( RULE_ID ) ); - assertThat( constraintRule.getSchemaDescriptor(), equalTo( descriptor.schema() ) ); + assertThat( constraintRule.schema(), equalTo( descriptor.schema() ) ); assertThat( constraintRule.getConstraintDescriptor(), equalTo( descriptor ) ); assertException( constraintRule::getOwnedIndex, IllegalStateException.class, "" ); } @@ -68,7 +68,7 @@ public void shouldCreateExistenceConstraint() throws Exception // THEN assertThat( constraintRule.getId(), equalTo( RULE_ID ) ); - assertThat( constraintRule.getSchemaDescriptor(), equalTo( descriptor.schema() ) ); + assertThat( constraintRule.schema(), equalTo( descriptor.schema() ) ); assertThat( constraintRule.getConstraintDescriptor(), equalTo( descriptor ) ); assertException( constraintRule::getOwnedIndex, IllegalStateException.class, "" ); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/record/IndexRuleTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/record/IndexRuleTest.java index 5dd85b7049aa..2be5aa325954 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/record/IndexRuleTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/record/IndexRuleTest.java @@ -43,7 +43,7 @@ public void shouldCreateGeneralIndex() throws Exception // THEN assertThat( indexRule.getId(), equalTo( RULE_ID ) ); assertFalse( indexRule.canSupportUniqueConstraint() ); - assertThat( indexRule.getSchemaDescriptor(), equalTo( descriptor.schema() ) ); + assertThat( indexRule.schema(), equalTo( descriptor.schema() ) ); assertThat( indexRule.getIndexDescriptor(), equalTo( descriptor ) ); assertThat( indexRule.getProviderDescriptor(), equalTo( PROVIDER_DESCRIPTOR ) ); assertException( indexRule::getOwningConstraint, IllegalStateException.class, "" ); @@ -60,7 +60,7 @@ public void shouldCreateUniqueIndex() throws Exception // THEN assertThat( indexRule.getId(), equalTo( RULE_ID ) ); assertTrue( indexRule.canSupportUniqueConstraint() ); - assertThat( indexRule.getSchemaDescriptor(), equalTo( descriptor.schema() ) ); + assertThat( indexRule.schema(), equalTo( descriptor.schema() ) ); assertThat( indexRule.getIndexDescriptor(), equalTo( descriptor ) ); assertThat( indexRule.getProviderDescriptor(), equalTo( PROVIDER_DESCRIPTOR ) ); assertThat( indexRule.getOwningConstraint(), equalTo( null ) ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/record/SchemaRuleSerializationTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/record/SchemaRuleSerializationTest.java index 5cd168c220ed..ff1532bae018 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/record/SchemaRuleSerializationTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/record/SchemaRuleSerializationTest.java @@ -282,7 +282,7 @@ private void assertSerializeAndDeserializeIndexRule( IndexRule indexRule ) // THEN assertThat( deserialized.getId(), equalTo( indexRule.getId() ) ); assertThat( deserialized.getIndexDescriptor(), equalTo( indexRule.getIndexDescriptor() ) ); - assertThat( deserialized.getSchemaDescriptor(), equalTo( indexRule.getSchemaDescriptor() ) ); + assertThat( deserialized.schema(), equalTo( indexRule.schema() ) ); assertThat( deserialized.getProviderDescriptor(), equalTo( indexRule.getProviderDescriptor() ) ); } @@ -310,7 +310,7 @@ private void assertSerializeAndDeserializeConstraintRule( ConstraintRule constra // THEN assertThat( deserialized.getId(), equalTo( constraintRule.getId() ) ); assertThat( deserialized.getConstraintDescriptor(), equalTo( constraintRule.getConstraintDescriptor() ) ); - assertThat( deserialized.getSchemaDescriptor(), equalTo( constraintRule.getSchemaDescriptor() ) ); + assertThat( deserialized.schema(), equalTo( constraintRule.schema() ) ); } private ConstraintRule assertConstraintRule( SchemaRule schemaRule )