From eeb58d8fed0eb7aceb038d0033227420d9c0d7a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Finn=C3=A9?= Date: Mon, 23 Apr 2018 13:37:49 +0200 Subject: [PATCH] Kernel API has ability to specify provider at index creation --- .../full/FullCheckIntegrationTest.java | 4 +- .../v2_3/TransactionBoundQueryContext.scala | 2 +- .../v3_1/TransactionBoundQueryContext.scala | 4 +- .../TransactionBoundQueryContext.scala | 2 +- .../internal/kernel/api/SchemaWrite.java | 5 +- .../kernel/api/SchemaReadWriteTestBase.java | 36 ++++----- .../factory/GraphDatabaseSettings.java | 1 + .../org/neo4j/kernel/NeoStoreDataSource.java | 2 +- .../neo4j/kernel/api/index/IndexProvider.java | 8 ++ .../api/KernelTransactionImplementation.java | 9 ++- .../kernel/impl/api/KernelTransactions.java | 9 ++- .../index/IndexProviderDescriptorByName.java | 72 ++++++++++++++++++ .../impl/coreapi/schema/SchemaImpl.java | 2 +- .../neo4j/kernel/impl/newapi/Operations.java | 22 +++++- .../neo4j/kernel/api/CompositeIndexingIT.java | 2 +- .../kernel/api/KernelTransactionFactory.java | 3 +- .../builtinprocs/SchemaProcedureIT.java | 2 +- .../api/KernelSchemaStateFlushingTest.java | 2 +- .../api/KernelTransactionTerminationTest.java | 5 +- .../impl/api/KernelTransactionTestBase.java | 3 +- .../impl/api/KernelTransactionsTest.java | 5 +- .../neo4j/kernel/impl/api/index/IndexIT.java | 18 ++--- .../impl/api/index/IndexStatisticsTest.java | 2 +- .../integrationtest/BuiltInProceduresIT.java | 13 ++-- .../impl/api/integrationtest/KernelIT.java | 2 +- .../AbstractNodeValueIndexCursorTest.java | 2 +- .../impl/newapi/OperationsLockTest.java | 3 +- .../GraphDbStructureGuideTest.java | 2 +- .../impl/index/schema/IndexCreateIT.java | 73 +++++++++++++++++++ .../java/org/neo4j/kernel/ha/HaCountsIT.java | 2 +- .../TransactionStatusResultTest.java | 3 +- 31 files changed, 252 insertions(+), 68 deletions(-) create mode 100644 community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexProviderDescriptorByName.java create mode 100644 community/neo4j/src/test/java/org/neo4j/kernel/impl/index/schema/IndexCreateIT.java diff --git a/community/consistency-check/src/test/java/org/neo4j/consistency/checking/full/FullCheckIntegrationTest.java b/community/consistency-check/src/test/java/org/neo4j/consistency/checking/full/FullCheckIntegrationTest.java index bfa10a916283..43f98da62da9 100644 --- a/community/consistency-check/src/test/java/org/neo4j/consistency/checking/full/FullCheckIntegrationTest.java +++ b/community/consistency-check/src/test/java/org/neo4j/consistency/checking/full/FullCheckIntegrationTest.java @@ -62,11 +62,11 @@ import org.neo4j.internal.kernel.api.TokenRead; import org.neo4j.internal.kernel.api.TokenWrite; import org.neo4j.internal.kernel.api.exceptions.KernelException; +import org.neo4j.internal.kernel.api.exceptions.TransactionFailureException; import org.neo4j.io.pagecache.IOLimiter; import org.neo4j.kernel.api.KernelTransaction; import org.neo4j.kernel.api.Statement; import org.neo4j.kernel.api.direct.DirectStoreAccess; -import org.neo4j.internal.kernel.api.exceptions.TransactionFailureException; import org.neo4j.kernel.api.index.IndexAccessor; import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.index.IndexPopulator; @@ -229,7 +229,7 @@ protected void generateInitialData( GraphDatabaseService db ) key1 = tokenWrite.propertyKeyGetOrCreateForName( PROP1 ); key2 = tokenWrite.propertyKeyGetOrCreateForName( PROP2 ); label3 = ktx.tokenRead().nodeLabel( "label3" ); - ktx.schemaWrite().indexCreate( SchemaDescriptorFactory.forLabel( label3, key1, key2 ) ); + ktx.schemaWrite().indexCreate( SchemaDescriptorFactory.forLabel( label3, key1, key2 ), null ); } db.schema().constraintFor( label( "label4" ) ).assertPropertyIsUnique( PROP1 ).create(); diff --git a/community/cypher/cypher/src/main/scala/org/neo4j/cypher/internal/spi/v2_3/TransactionBoundQueryContext.scala b/community/cypher/cypher/src/main/scala/org/neo4j/cypher/internal/spi/v2_3/TransactionBoundQueryContext.scala index 8ce55efd5314..d19b04a68035 100644 --- a/community/cypher/cypher/src/main/scala/org/neo4j/cypher/internal/spi/v2_3/TransactionBoundQueryContext.scala +++ b/community/cypher/cypher/src/main/scala/org/neo4j/cypher/internal/spi/v2_3/TransactionBoundQueryContext.scala @@ -716,7 +716,7 @@ final class TransactionBoundQueryContext(tc: TransactionalContextWrapper, val re def addIndexRule(labelId: Int, propertyKeyId: Int): IdempotentResult[SchemaTypes.IndexDescriptor] = try { IdempotentResult( DefaultIndexReference.toDescriptor( - tc.kernelTransaction.schemaWrite().indexCreate(SchemaDescriptorFactory.forLabel(labelId, propertyKeyId))) + tc.kernelTransaction.schemaWrite().indexCreate(SchemaDescriptorFactory.forLabel(labelId, propertyKeyId), null)) ) } catch { case _: AlreadyIndexedException => diff --git a/community/cypher/cypher/src/main/scala/org/neo4j/cypher/internal/spi/v3_1/TransactionBoundQueryContext.scala b/community/cypher/cypher/src/main/scala/org/neo4j/cypher/internal/spi/v3_1/TransactionBoundQueryContext.scala index bf79e6c19cbc..e83cd35f5f32 100644 --- a/community/cypher/cypher/src/main/scala/org/neo4j/cypher/internal/spi/v3_1/TransactionBoundQueryContext.scala +++ b/community/cypher/cypher/src/main/scala/org/neo4j/cypher/internal/spi/v3_1/TransactionBoundQueryContext.scala @@ -36,7 +36,7 @@ import org.neo4j.cypher.internal.compiler.v3_1.spi._ import org.neo4j.cypher.internal.frontend.v3_1.SemanticDirection.{BOTH, INCOMING, OUTGOING} import org.neo4j.cypher.internal.frontend.v3_1.{Bound, EntityNotFoundException, FailedIndexException, SemanticDirection} import org.neo4j.cypher.internal.javacompat.GraphDatabaseCypherService -import org.neo4j.cypher.internal.runtime.interpreted.{JavaConversionSupport, ResourceManager} +import org.neo4j.cypher.internal.runtime.interpreted.ResourceManager import org.neo4j.cypher.internal.spi.v3_1.TransactionBoundQueryContext.IndexSearchMonitor import org.neo4j.cypher.internal.spi.{CursorIterator, PrimitiveCursorIterator} import org.neo4j.graphalgo.impl.path.ShortestPath @@ -731,7 +731,7 @@ final class TransactionBoundQueryContext(txContext: TransactionalContextWrapper, override def addIndexRule(labelId: Int, propertyKeyId: Int): IdempotentResult[IndexDescriptor] = try { IdempotentResult( DefaultIndexReference.toDescriptor( - txContext.kernelTransaction.schemaWrite().indexCreate(SchemaDescriptorFactory.forLabel(labelId, propertyKeyId))) + txContext.kernelTransaction.schemaWrite().indexCreate(SchemaDescriptorFactory.forLabel(labelId, propertyKeyId), null)) ) } catch { case _: AlreadyIndexedException => diff --git a/community/cypher/interpreted-runtime/src/main/scala/org/neo4j/cypher/internal/runtime/interpreted/TransactionBoundQueryContext.scala b/community/cypher/interpreted-runtime/src/main/scala/org/neo4j/cypher/internal/runtime/interpreted/TransactionBoundQueryContext.scala index 77e899cdf656..75c479655892 100644 --- a/community/cypher/interpreted-runtime/src/main/scala/org/neo4j/cypher/internal/runtime/interpreted/TransactionBoundQueryContext.scala +++ b/community/cypher/interpreted-runtime/src/main/scala/org/neo4j/cypher/internal/runtime/interpreted/TransactionBoundQueryContext.scala @@ -640,7 +640,7 @@ sealed class TransactionBoundQueryContext(val transactionalContext: Transactiona override def addIndexRule(descriptor: IndexDescriptor): IdempotentResult[IndexReference] = { val kernelDescriptor = cypherToKernelSchema(descriptor) try { - IdempotentResult(transactionalContext.kernelTransaction.schemaWrite().indexCreate(kernelDescriptor)) + IdempotentResult(transactionalContext.kernelTransaction.schemaWrite().indexCreate(kernelDescriptor, null)) } catch { case _: AlreadyIndexedException => val indexReference = transactionalContext.kernelTransaction.schemaRead().index(kernelDescriptor.getLabelId, kernelDescriptor.getPropertyIds: _*) diff --git a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/SchemaWrite.java b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/SchemaWrite.java index c435f9d833c3..0593a8ca9670 100644 --- a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/SchemaWrite.java +++ b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/SchemaWrite.java @@ -31,12 +31,13 @@ public interface SchemaWrite { /** - * Create index from schema descriptor + * Create index from schema descriptor. Optionally a specific provider name can be specified. * * @param descriptor description of the index + * @param providerName specific index provider this index will be created for. If {@code null} then the default configured will be used. * @return the newly created index */ - IndexReference indexCreate( SchemaDescriptor descriptor ) throws SchemaKernelException; + IndexReference indexCreate( SchemaDescriptor descriptor, String providerName ) throws SchemaKernelException; /** * Drop the given index diff --git a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/SchemaReadWriteTestBase.java b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/SchemaReadWriteTestBase.java index 45ee4ae664f8..e10624e939fa 100644 --- a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/SchemaReadWriteTestBase.java +++ b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/SchemaReadWriteTestBase.java @@ -96,7 +96,7 @@ public void shouldCreateIndex() throws Exception IndexReference index; try ( Transaction transaction = session.beginTransaction() ) { - index = transaction.schemaWrite().indexCreate( labelDescriptor( label, prop1 ) ); + index = transaction.schemaWrite().indexCreate( labelDescriptor( label, prop1 ), null ); transaction.success(); } @@ -112,7 +112,7 @@ public void shouldGetUndecidedVersionAndKeyFromIndexReference() throws Exception { try ( Transaction transaction = session.beginTransaction() ) { - transaction.schemaWrite().indexCreate( labelDescriptor( label, prop1 ) ); + transaction.schemaWrite().indexCreate( labelDescriptor( label, prop1 ), null ); CapableIndexReference index = transaction.schemaRead().index( label, prop1 ); assertThat( index.providerKey(), equalTo( "Undecided" )); @@ -126,7 +126,7 @@ public void createdIndexShouldPopulateInTx() throws Exception IndexReference index; try ( Transaction tx = session.beginTransaction() ) { - index = tx.schemaWrite().indexCreate( labelDescriptor( label, prop1 ) ); + index = tx.schemaWrite().indexCreate( labelDescriptor( label, prop1 ), null ); assertThat( tx.schemaRead().indexGetState( index ), equalTo( InternalIndexState.POPULATING ) ); tx.success(); } @@ -138,7 +138,7 @@ public void shouldDropIndex() throws Exception IndexReference index; try ( Transaction transaction = session.beginTransaction() ) { - index = transaction.schemaWrite().indexCreate( labelDescriptor( label, prop1 ) ); + index = transaction.schemaWrite().indexCreate( labelDescriptor( label, prop1 ), null ); transaction.success(); } @@ -161,7 +161,7 @@ public void shouldFailIfExistingIndex() throws Exception //Given try ( Transaction transaction = session.beginTransaction() ) { - transaction.schemaWrite().indexCreate( labelDescriptor( label, prop1 ) ); + transaction.schemaWrite().indexCreate( labelDescriptor( label, prop1 ), null ); transaction.success(); } @@ -171,7 +171,7 @@ public void shouldFailIfExistingIndex() throws Exception //When try ( Transaction transaction = session.beginTransaction() ) { - transaction.schemaWrite().indexCreate( labelDescriptor( label, prop1 ) ); + transaction.schemaWrite().indexCreate( labelDescriptor( label, prop1 ), null ); transaction.success(); } } @@ -181,13 +181,13 @@ public void shouldSeeIndexFromTransaction() throws Exception { try ( Transaction transaction = session.beginTransaction() ) { - transaction.schemaWrite().indexCreate( labelDescriptor( label, prop1 ) ); + transaction.schemaWrite().indexCreate( labelDescriptor( label, prop1 ), null ); transaction.success(); } try ( Transaction transaction = session.beginTransaction() ) { - transaction.schemaWrite().indexCreate( labelDescriptor( label, prop2 ) ); + transaction.schemaWrite().indexCreate( labelDescriptor( label, prop2 ), null ); SchemaRead schemaRead = transaction.schemaRead(); CapableIndexReference index = schemaRead.index( label, prop2 ); assertThat( index.properties(), equalTo( new int[]{prop2} ) ); @@ -201,7 +201,7 @@ public void shouldNotSeeDroppedIndexFromTransaction() throws Exception IndexReference index; try ( Transaction transaction = session.beginTransaction() ) { - index = transaction.schemaWrite().indexCreate( labelDescriptor( label, prop1 ) ); + index = transaction.schemaWrite().indexCreate( labelDescriptor( label, prop1 ), null ); transaction.success(); } @@ -223,15 +223,15 @@ public void shouldListAllIndexes() throws Exception try ( Transaction tx = session.beginTransaction() ) { - toRetain = tx.schemaWrite().indexCreate( labelDescriptor( label, prop1 ) ); - toRetain2 = tx.schemaWrite().indexCreate( labelDescriptor( label2, prop1 ) ); - toDrop = tx.schemaWrite().indexCreate( labelDescriptor( label, prop2 ) ); + toRetain = tx.schemaWrite().indexCreate( labelDescriptor( label, prop1 ), null ); + toRetain2 = tx.schemaWrite().indexCreate( labelDescriptor( label2, prop1 ), null ); + toDrop = tx.schemaWrite().indexCreate( labelDescriptor( label, prop2 ), null ); tx.success(); } try ( Transaction tx = session.beginTransaction() ) { - created = tx.schemaWrite().indexCreate( labelDescriptor( label2, prop2 ) ); + created = tx.schemaWrite().indexCreate( labelDescriptor( label2, prop2 ), null ); tx.schemaWrite().indexDrop( toDrop ); Iterable allIndexes = () -> tx.schemaRead().indexesGetAll(); @@ -255,16 +255,16 @@ public void shouldListIndexesByLabel() throws Exception wrongLabel = tx.tokenWrite().labelGetOrCreateForName( "wrongLabel" ); tx.schemaWrite().uniquePropertyConstraintCreate( labelDescriptor( wrongLabel, prop1 ) ); - inStore = tx.schemaWrite().indexCreate( labelDescriptor( label, prop1 ) ); - droppedInTx = tx.schemaWrite().indexCreate( labelDescriptor( label, prop2 ) ); + inStore = tx.schemaWrite().indexCreate( labelDescriptor( label, prop1 ), null ); + droppedInTx = tx.schemaWrite().indexCreate( labelDescriptor( label, prop2 ), null ); tx.success(); } try ( Transaction tx = session.beginTransaction() ) { - createdInTx = tx.schemaWrite().indexCreate( labelDescriptor( label, prop3 ) ); - tx.schemaWrite().indexCreate( labelDescriptor( wrongLabel, prop2 ) ); + createdInTx = tx.schemaWrite().indexCreate( labelDescriptor( label, prop3 ), null ); + tx.schemaWrite().indexCreate( labelDescriptor( wrongLabel, prop2 ), null ); tx.schemaWrite().indexDrop( droppedInTx ); Iterable indexes = () -> tx.schemaRead().indexesGetForLabel( label ); @@ -323,7 +323,7 @@ public void shouldFailToCreateUniqueConstraintIfExistingIndex() throws Exception //Given try ( Transaction transaction = session.beginTransaction() ) { - transaction.schemaWrite().indexCreate( labelDescriptor( label, prop1 ) ); + transaction.schemaWrite().indexCreate( labelDescriptor( label, prop1 ), null ); transaction.success(); } diff --git a/community/kernel/src/main/java/org/neo4j/graphdb/factory/GraphDatabaseSettings.java b/community/kernel/src/main/java/org/neo4j/graphdb/factory/GraphDatabaseSettings.java index 58007efe684a..c4fc0aafc720 100644 --- a/community/kernel/src/main/java/org/neo4j/graphdb/factory/GraphDatabaseSettings.java +++ b/community/kernel/src/main/java/org/neo4j/graphdb/factory/GraphDatabaseSettings.java @@ -538,6 +538,7 @@ public class GraphDatabaseSettings implements LoadableConfig public enum SchemaIndex { + // These strings are supposed to match provider names, i.e. key-version, see IndexProvider.Descriptor#name() NATIVE20( "lucene+native-2.0" ), NATIVE10( "lucene+native-1.0" ), LUCENE10( "lucene-1.0" ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java b/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java index 9f798aadc831..a55545719428 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java @@ -687,7 +687,7 @@ private NeoStoreKernelModule buildKernel( LogFiles logFiles, TransactionAppender availabilityGuard, tracers, storageEngine, procedures, transactionIdStore, clock, cpuClockRef, heapAllocationRef, accessCapability, DefaultCursors::new, autoIndexing, explicitIndexStore, versionContextSupplier, collectionsFactorySupplier, constraintSemantics, - databaseSchemaState, indexingService ) ); + databaseSchemaState, indexingService, indexProviderMap ) ); buildTransactionMonitor( kernelTransactions, clock, config ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/api/index/IndexProvider.java b/community/kernel/src/main/java/org/neo4j/kernel/api/index/IndexProvider.java index c32b0b15426a..61415f288655 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/api/index/IndexProvider.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/api/index/IndexProvider.java @@ -309,6 +309,14 @@ public String getVersion() return version; } + /** + * @return a combination of {@link #getKey()} and {@link #getVersion()} with a '-' in between. + */ + public String name() + { + return key + "-" + version; + } + @Override public int hashCode() { 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 73831de9e029..82fb32e982c0 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 @@ -52,6 +52,7 @@ import org.neo4j.internal.kernel.api.TokenWrite; import org.neo4j.internal.kernel.api.Write; import org.neo4j.internal.kernel.api.exceptions.InvalidTransactionTypeKernelException; +import org.neo4j.internal.kernel.api.exceptions.TransactionFailureException; import org.neo4j.internal.kernel.api.exceptions.schema.ConstraintValidationException; import org.neo4j.internal.kernel.api.security.AccessMode; import org.neo4j.internal.kernel.api.security.AuthSubject; @@ -63,13 +64,13 @@ import org.neo4j.kernel.api.SilentTokenNameLookup; import org.neo4j.kernel.api.exceptions.ConstraintViolationTransactionFailureException; import org.neo4j.kernel.api.exceptions.Status; -import org.neo4j.internal.kernel.api.exceptions.TransactionFailureException; import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException; import org.neo4j.kernel.api.explicitindex.AutoIndexing; import org.neo4j.kernel.api.schema.index.SchemaIndexDescriptor; import org.neo4j.kernel.api.txstate.ExplicitIndexTransactionState; import org.neo4j.kernel.api.txstate.TransactionState; import org.neo4j.kernel.api.txstate.TxStateHolder; +import org.neo4j.kernel.impl.api.index.IndexProviderMap; import org.neo4j.kernel.impl.api.index.IndexingService; import org.neo4j.kernel.impl.api.state.ConstraintIndexCreator; import org.neo4j.kernel.impl.api.state.TxState; @@ -195,7 +196,8 @@ public KernelTransactionImplementation( StatementOperationParts statementOperati StorageEngine storageEngine, AccessCapability accessCapability, DefaultCursors cursors, AutoIndexing autoIndexing, ExplicitIndexStore explicitIndexStore, VersionContextSupplier versionContextSupplier, CollectionsFactorySupplier collectionsFactorySupplier, ConstraintSemantics constraintSemantics, - SchemaState schemaState, IndexingService indexingService ) + SchemaState schemaState, IndexingService indexingService, + IndexProviderMap indexProviderMap ) { this.schemaWriteGuard = schemaWriteGuard; this.hooks = hooks; @@ -227,7 +229,8 @@ public KernelTransactionImplementation( StatementOperationParts statementOperati new IndexTxStateUpdater( storageEngine.storeReadLayer(), allStoreHolder, indexingService ), storageStatement, this, new KernelToken( storeLayer, this ), cursors, autoIndexing, constraintIndexCreator, - constraintSemantics ); + constraintSemantics, + indexProviderMap ); this.collectionsFactory = collectionsFactorySupplier.create(); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactions.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactions.java index 9653e5bfdc21..4a75c419d308 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactions.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactions.java @@ -40,6 +40,7 @@ import org.neo4j.kernel.api.exceptions.Status; import org.neo4j.kernel.api.explicitindex.AutoIndexing; import org.neo4j.kernel.api.txstate.ExplicitIndexTransactionState; +import org.neo4j.kernel.impl.api.index.IndexProviderMap; import org.neo4j.kernel.impl.api.index.IndexingService; import org.neo4j.kernel.impl.api.state.ConstraintIndexCreator; import org.neo4j.kernel.impl.api.state.ExplicitIndexTransactionStateImpl; @@ -102,6 +103,7 @@ public class KernelTransactions extends LifecycleAdapter implements Supplier new CachingExplicitIndexTransactionState( new ExplicitIndexTransactionStateImpl( indexConfigStore, explicitIndexProviderLookup ) ); @@ -374,7 +378,8 @@ public KernelTransactionImplementation newInstance() tracers.pageCursorTracerSupplier, storageEngine, accessCapability, cursorsSupplier.get(), autoIndexing, explicitIndexStore, versionContextSupplier, collectionsFactorySupplier, constraintSemantics, - schemaState, indexingService ); + schemaState, indexingService, + indexProviderMap ); this.transactions.add( tx ); return tx; } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexProviderDescriptorByName.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexProviderDescriptorByName.java new file mode 100644 index 000000000000..0c13f6fdabc9 --- /dev/null +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexProviderDescriptorByName.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2002-2018 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.neo4j.kernel.impl.api.index; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import java.util.function.Consumer; + +import org.neo4j.kernel.api.index.IndexProvider; + +/** + * Can visit an {@link IndexProviderMap} and extract {@link IndexProvider.Descriptor} matching a given name. + */ +public class IndexProviderDescriptorByName implements Consumer, Iterable +{ + private final Set hits = new HashSet<>(); + private final String name; + + public IndexProviderDescriptorByName( String name ) + { + this.name = name; + } + + @Override + public void accept( IndexProvider indexProvider ) + { + IndexProvider.Descriptor providerDescriptor = indexProvider.getProviderDescriptor(); + if ( providerDescriptor.name().equals( name ) ) + { + hits.add( providerDescriptor ); + } + } + + @Override + public Iterator iterator() + { + return hits.iterator(); + } + + public IndexProvider.Descriptor single() + { + Iterator iterator = hits.iterator(); + if ( !iterator.hasNext() ) + { + throw new IllegalArgumentException( "No index provider matching name '" + name + "'" ); + } + IndexProvider.Descriptor single = iterator.next(); + if ( iterator.hasNext() ) + { + throw new IllegalArgumentException( "Multiple index providers matching name '" + name + "'" ); + } + return single; + } +} diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/coreapi/schema/SchemaImpl.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/coreapi/schema/SchemaImpl.java index 5bb12629c076..0d878259f843 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/coreapi/schema/SchemaImpl.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/coreapi/schema/SchemaImpl.java @@ -461,7 +461,7 @@ public IndexDefinition createIndexDefinition( Label label, String... propertyKey int labelId = tokenWrite.labelGetOrCreateForName( indexDefinition.getLabel().name() ); int[] propertyKeyIds = getOrCreatePropertyKeyIds( tokenWrite, indexDefinition ); LabelSchemaDescriptor descriptor = forLabel( labelId, propertyKeyIds ); - transaction.schemaWrite().indexCreate( descriptor ); + transaction.schemaWrite().indexCreate( descriptor, null ); return indexDefinition; } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Operations.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Operations.java index 361240dc0049..c113f471849a 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Operations.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Operations.java @@ -71,6 +71,7 @@ import org.neo4j.kernel.api.exceptions.schema.UnableToValidateConstraintException; import org.neo4j.kernel.api.exceptions.schema.UniquePropertyValueValidationException; import org.neo4j.kernel.api.explicitindex.AutoIndexing; +import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.api.schema.SchemaDescriptorFactory; import org.neo4j.kernel.api.schema.constaints.ConstraintDescriptorFactory; import org.neo4j.kernel.api.schema.constaints.IndexBackedConstraintDescriptor; @@ -81,6 +82,8 @@ import org.neo4j.kernel.api.txstate.ExplicitIndexTransactionState; import org.neo4j.kernel.api.txstate.TransactionState; import org.neo4j.kernel.impl.api.KernelTransactionImplementation; +import org.neo4j.kernel.impl.api.index.IndexProviderDescriptorByName; +import org.neo4j.kernel.impl.api.index.IndexProviderMap; import org.neo4j.kernel.impl.api.state.ConstraintIndexCreator; import org.neo4j.kernel.impl.api.store.DefaultIndexReference; import org.neo4j.kernel.impl.constraints.ConstraintSemantics; @@ -127,6 +130,7 @@ public class Operations implements Write, ExplicitIndexWrite, SchemaWrite private final DefaultCursors cursors; private final ConstraintIndexCreator constraintIndexCreator; private final ConstraintSemantics constraintSemantics; + private final IndexProviderMap indexProviderMap; public Operations( AllStoreHolder allStoreHolder, @@ -137,7 +141,8 @@ public Operations( DefaultCursors cursors, AutoIndexing autoIndexing, ConstraintIndexCreator constraintIndexCreator, - ConstraintSemantics constraintSemantics ) + ConstraintSemantics constraintSemantics, + IndexProviderMap indexProviderMap ) { this.token = token; this.autoIndexing = autoIndexing; @@ -148,6 +153,7 @@ public Operations( this.cursors = cursors; this.constraintIndexCreator = constraintIndexCreator; this.constraintSemantics = constraintSemantics; + this.indexProviderMap = indexProviderMap; } public void initialize() @@ -873,7 +879,7 @@ public DefaultPropertyCursor propertyCursor() } @Override - public IndexReference indexCreate( SchemaDescriptor descriptor ) throws SchemaKernelException + public IndexReference indexCreate( SchemaDescriptor descriptor, String providerName ) throws SchemaKernelException { acquireExclusiveLabelLock( descriptor.keyId() ); ktx.assertOpen(); @@ -881,7 +887,17 @@ public IndexReference indexCreate( SchemaDescriptor descriptor ) throws SchemaKe assertIndexDoesNotExist( SchemaKernelException.OperationContext.INDEX_CREATION, descriptor ); SchemaIndexDescriptor indexDescriptor = SchemaIndexDescriptorFactory.forSchema( descriptor ); - ktx.txState().indexRuleDoAdd( indexDescriptor, null ); + IndexProvider.Descriptor providerDescriptor = null; + if ( providerName != null ) + { + IndexProviderDescriptorByName candidates = new IndexProviderDescriptorByName( providerName ); + indexProviderMap.accept( candidates ); + + // We have to have a one-to-one mapping to the specified provider name, otherwise we can't be sure which. + // Having this method fail if that's not the case is OK since that's a user error and way before commit. + providerDescriptor = candidates.single(); + } + ktx.txState().indexRuleDoAdd( indexDescriptor, providerDescriptor ); return DefaultIndexReference.fromDescriptor( indexDescriptor ); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/api/CompositeIndexingIT.java b/community/kernel/src/test/java/org/neo4j/kernel/api/CompositeIndexingIT.java index 58739cc3491b..2342d2250843 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/api/CompositeIndexingIT.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/api/CompositeIndexingIT.java @@ -89,7 +89,7 @@ public void setup() throws Exception } else { - ktx.schemaWrite().indexCreate( index.schema() ); + ktx.schemaWrite().indexCreate( index.schema(), null ); } tx.success(); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/api/KernelTransactionFactory.java b/community/kernel/src/test/java/org/neo4j/kernel/api/KernelTransactionFactory.java index 7bb4a8ff66d7..0c9cd4c63fa1 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/api/KernelTransactionFactory.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/api/KernelTransactionFactory.java @@ -34,6 +34,7 @@ import org.neo4j.kernel.impl.api.TransactionHeaderInformation; import org.neo4j.kernel.impl.api.TransactionHooks; import org.neo4j.kernel.impl.api.TransactionRepresentationCommitProcess; +import org.neo4j.kernel.impl.api.index.IndexProviderMap; import org.neo4j.kernel.impl.api.index.IndexingService; import org.neo4j.kernel.impl.api.state.ConstraintIndexCreator; import org.neo4j.kernel.impl.constraints.StandardConstraintSemantics; @@ -107,7 +108,7 @@ static Instances kernelTransactionWithInternals( LoginContext loginContext ) PageCursorTracerSupplier.NULL, storageEngine, new CanWrite(), new DefaultCursors(), AutoIndexing.UNSUPPORTED, mock( ExplicitIndexStore.class ), EmptyVersionContextSupplier.EMPTY, ON_HEAP, new StandardConstraintSemantics(), - mock( SchemaState.class), mock( IndexingService.class ) ); + mock( SchemaState.class), mock( IndexingService.class ), mock( IndexProviderMap.class ) ); StatementLocks statementLocks = new SimpleStatementLocks( new NoOpClient() ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/builtinprocs/SchemaProcedureIT.java b/community/kernel/src/test/java/org/neo4j/kernel/builtinprocs/SchemaProcedureIT.java index 5ca79f2fce4a..edf8cee59978 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/builtinprocs/SchemaProcedureIT.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/builtinprocs/SchemaProcedureIT.java @@ -84,7 +84,7 @@ public void testLabelIndex() throws Throwable commit(); SchemaWrite schemaOps = schemaWriteInNewTransaction(); - schemaOps.indexCreate( SchemaDescriptorFactory.forLabel( labelId, propertyIdName ) ); + schemaOps.indexCreate( SchemaDescriptorFactory.forLabel( labelId, propertyIdName ), null ); schemaOps.uniquePropertyConstraintCreate( SchemaDescriptorFactory.forLabel( labelId, propertyIdAge ) ); commit(); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelSchemaStateFlushingTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelSchemaStateFlushingTest.java index 5e6c8da03502..069fc73b0848 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelSchemaStateFlushingTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelSchemaStateFlushingTest.java @@ -160,7 +160,7 @@ private IndexReference createIndex() throws KernelException try ( Transaction transaction = session.beginTransaction( KernelTransaction.Type.implicit ) ) { IndexReference reference = transaction.schemaWrite().indexCreate( - SchemaDescriptorFactory.forLabel( 1, 1 ) ); + SchemaDescriptorFactory.forLabel( 1, 1 ), null ); transaction.success(); return reference; } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelTransactionTerminationTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelTransactionTerminationTest.java index f04380e2c083..80258f072e03 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelTransactionTerminationTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelTransactionTerminationTest.java @@ -31,13 +31,14 @@ import org.neo4j.collection.pool.Pool; import org.neo4j.graphdb.TransactionTerminatedException; +import org.neo4j.internal.kernel.api.exceptions.TransactionFailureException; import org.neo4j.io.pagecache.tracing.cursor.PageCursorTracerSupplier; import org.neo4j.io.pagecache.tracing.cursor.context.EmptyVersionContextSupplier; import org.neo4j.kernel.api.KernelTransaction; import org.neo4j.kernel.api.exceptions.Status; -import org.neo4j.internal.kernel.api.exceptions.TransactionFailureException; import org.neo4j.kernel.api.explicitindex.AutoIndexing; import org.neo4j.kernel.api.txstate.ExplicitIndexTransactionState; +import org.neo4j.kernel.impl.api.index.IndexProviderMap; import org.neo4j.kernel.impl.api.index.IndexingService; import org.neo4j.kernel.impl.api.state.ConstraintIndexCreator; import org.neo4j.kernel.impl.constraints.StandardConstraintSemantics; @@ -351,7 +352,7 @@ private static class TestKernelTransaction extends KernelTransactionImplementat mock( StorageEngine.class, RETURNS_MOCKS ), new CanWrite(), mock( DefaultCursors.class ), AutoIndexing.UNSUPPORTED, mock( ExplicitIndexStore.class ), EmptyVersionContextSupplier.EMPTY, ON_HEAP, new StandardConstraintSemantics(), mock( SchemaState.class), - mock( IndexingService.class ) ); + mock( IndexingService.class ), mock( IndexProviderMap.class ) ); this.monitor = monitor; } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelTransactionTestBase.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelTransactionTestBase.java index 87b6a8c97883..ef277a0cc051 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelTransactionTestBase.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelTransactionTestBase.java @@ -39,6 +39,7 @@ import org.neo4j.kernel.api.explicitindex.AutoIndexing; import org.neo4j.kernel.api.txstate.ExplicitIndexTransactionState; import org.neo4j.kernel.configuration.Config; +import org.neo4j.kernel.impl.api.index.IndexProviderMap; import org.neo4j.kernel.impl.api.index.IndexingService; import org.neo4j.kernel.impl.constraints.StandardConstraintSemantics; import org.neo4j.kernel.impl.factory.CanWrite; @@ -169,7 +170,7 @@ public KernelTransactionImplementation newNotInitializedTransaction() new CanWrite(), new DefaultCursors(), AutoIndexing.UNSUPPORTED, mock( ExplicitIndexStore.class ), EmptyVersionContextSupplier.EMPTY, () -> collectionsFactory, new StandardConstraintSemantics(), mock( SchemaState.class), - mock( IndexingService.class) ); + mock( IndexingService.class ), mock( IndexProviderMap.class ) ); } public class CapturingCommitProcess implements TransactionCommitProcess diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelTransactionsTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelTransactionsTest.java index 3f6cf7aa36a4..dcf5c7f5f120 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelTransactionsTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelTransactionsTest.java @@ -46,6 +46,7 @@ import org.neo4j.kernel.api.exceptions.Status; import org.neo4j.kernel.api.explicitindex.AutoIndexing; import org.neo4j.kernel.api.security.AnonymousContext; +import org.neo4j.kernel.impl.api.index.IndexProviderMap; import org.neo4j.kernel.impl.api.index.IndexingService; import org.neo4j.kernel.impl.api.state.ConstraintIndexCreator; import org.neo4j.kernel.impl.constraints.ConstraintSemantics; @@ -615,7 +616,7 @@ null, DEFAULT, commitProcess, null, null, new TransactionHooks(), DefaultCursors::new, AutoIndexing.UNSUPPORTED, mock( ExplicitIndexStore.class ), EmptyVersionContextSupplier.EMPTY, ON_HEAP, mock( ConstraintSemantics.class ), mock( SchemaState.class ), - mock( IndexingService.class) ); + mock( IndexingService.class ), mock( IndexProviderMap.class ) ); } private static TestKernelTransactions createTestTransactions( StorageEngine storageEngine, @@ -685,7 +686,7 @@ private static class TestKernelTransactions extends KernelTransactions transactionIdStore, clock, new AtomicReference<>( CpuClock.NOT_AVAILABLE ), new AtomicReference<>( HeapAllocation.NOT_AVAILABLE ), accessCapability, cursors, autoIndexing, mock( ExplicitIndexStore.class ), versionContextSupplier, ON_HEAP, new StandardConstraintSemantics(), mock( SchemaState.class ), - mock( IndexingService.class ) ); + mock( IndexingService.class ), mock( IndexProviderMap.class ) ); } @Override diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexIT.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexIT.java index c74641f3031b..6a5a07eaa858 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexIT.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexIT.java @@ -103,7 +103,7 @@ public void createIndexForAnotherLabelWhileHoldingSharedLockOnOtherLabel() throw long nodeId = write.nodeCreate(); write.nodeAddLabel( nodeId, label2 ); - schemaWriteInNewTransaction().indexCreate( descriptor ); + schemaWriteInNewTransaction().indexCreate( descriptor, null ); commit(); } @@ -114,7 +114,7 @@ public void createIndexesForDifferentLabelsConcurrently() throws Throwable int label2 = tokenWrite.labelGetOrCreateForName( "Label2" ); LabelSchemaDescriptor anotherLabelDescriptor = SchemaDescriptorFactory.forLabel( label2, propertyKeyId ); - schemaWriteInNewTransaction().indexCreate( anotherLabelDescriptor ); + schemaWriteInNewTransaction().indexCreate( anotherLabelDescriptor, null ); Future indexFuture = executorService.submit( createIndex( db, Label.label( LABEL ), PROPERTY_KEY ) ); indexFuture.get(); @@ -128,7 +128,7 @@ public void addIndexRuleInATransaction() throws Exception SchemaWrite schemaWriteOperations = schemaWriteInNewTransaction(); // WHEN - IndexReference expectedRule = schemaWriteOperations.indexCreate( descriptor ); + IndexReference expectedRule = schemaWriteOperations.indexCreate( descriptor, null ); commit(); // THEN @@ -143,13 +143,13 @@ public void committedAndTransactionalIndexRulesShouldBeMerged() throws Exception { // GIVEN SchemaWrite schemaWriteOperations = schemaWriteInNewTransaction(); - IndexReference existingRule = schemaWriteOperations.indexCreate( descriptor ); + IndexReference existingRule = schemaWriteOperations.indexCreate( descriptor, null ); commit(); // WHEN Transaction transaction = newTransaction( AUTH_DISABLED ); IndexReference addedRule = transaction.schemaWrite() - .indexCreate( SchemaDescriptorFactory.forLabel( labelId, 10 ) ); + .indexCreate( SchemaDescriptorFactory.forLabel( labelId, 10 ), null ); Set indexRulesInTx = asSet( transaction.schemaRead().indexesGetForLabel( labelId ) ); commit(); @@ -164,7 +164,7 @@ public void rollBackIndexRuleShouldNotBeCommitted() throws Exception SchemaWrite schemaWrite = schemaWriteInNewTransaction(); // WHEN - schemaWrite.indexCreate( descriptor ); + schemaWrite.indexCreate( descriptor, null ); // don't mark as success rollback(); @@ -205,7 +205,7 @@ public void shouldDisallowDroppingIndexThatDoesNotExist() throws Exception IndexReference index; { SchemaWrite statement = schemaWriteInNewTransaction(); - index = statement.indexCreate( descriptor ); + index = statement.indexCreate( descriptor, null ); commit(); } { @@ -244,7 +244,7 @@ public void shouldFailToCreateIndexWhereAConstraintAlreadyExists() throws Except try { SchemaWrite statement = schemaWriteInNewTransaction(); - statement.indexCreate( descriptor ); + statement.indexCreate( descriptor, null ); commit(); fail( "expected exception" ); @@ -305,7 +305,7 @@ public void shouldListAll() throws Exception { // given SchemaWrite schemaWrite = schemaWriteInNewTransaction(); - IndexReference index1 = schemaWrite.indexCreate( descriptor ); + IndexReference index1 = schemaWrite.indexCreate( descriptor, null ); IndexReference index2 = fromDescriptor( ((IndexBackedConstraintDescriptor) schemaWrite.uniquePropertyConstraintCreate( descriptor2 )).ownedIndexDescriptor()) ; commit(); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexStatisticsTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexStatisticsTest.java index 6be22dfa84ec..484578a257e8 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexStatisticsTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexStatisticsTest.java @@ -549,7 +549,7 @@ private IndexReference createIndex( String labelName, String propertyKeyName ) t int labelId = ktx.tokenWrite().labelGetOrCreateForName( labelName ); int propertyKeyId = ktx.tokenWrite().propertyKeyGetOrCreateForName( propertyKeyName ); LabelSchemaDescriptor descriptor = forLabel( labelId, propertyKeyId ); - index = ktx.schemaWrite().indexCreate( descriptor ); + index = ktx.schemaWrite().indexCreate( descriptor, null ); } tx.success(); return index; diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/BuiltInProceduresIT.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/BuiltInProceduresIT.java index 6be8a4403346..0307dfec16ac 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/BuiltInProceduresIT.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/BuiltInProceduresIT.java @@ -19,21 +19,20 @@ */ package org.neo4j.kernel.impl.api.integrationtest; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + import java.util.Arrays; import java.util.HashSet; import java.util.Map; import java.util.Set; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; - import org.neo4j.collection.RawIterator; import org.neo4j.helpers.collection.MapUtil; import org.neo4j.internal.kernel.api.TokenWrite; import org.neo4j.internal.kernel.api.Transaction; import org.neo4j.internal.kernel.api.exceptions.ProcedureException; -import org.neo4j.kernel.api.KernelTransaction; import org.neo4j.kernel.api.ResourceTracker; import org.neo4j.kernel.api.StubResourceManager; import org.neo4j.kernel.api.security.AnonymousContext; @@ -310,9 +309,9 @@ public void listAllIndexes() throws Throwable int propertyKeyId1 = transaction.tokenWrite().propertyKeyGetOrCreateForName( "foo" ); int propertyKeyId2 = transaction.tokenWrite().propertyKeyGetOrCreateForName( "bar" ); //TODO: Add test support for composite indexes - transaction.schemaWrite().indexCreate( forLabel( labelId1, propertyKeyId1 ) ); + transaction.schemaWrite().indexCreate( forLabel( labelId1, propertyKeyId1 ), null ); transaction.schemaWrite().uniquePropertyConstraintCreate( forLabel( labelId2, propertyKeyId1 ) ); - transaction.schemaWrite().indexCreate( forLabel( labelId1, propertyKeyId1, propertyKeyId2 ) ); + transaction.schemaWrite().indexCreate( forLabel( labelId1, propertyKeyId1, propertyKeyId2 ), null ); commit(); //let indexes come online diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/KernelIT.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/KernelIT.java index d82d374f1455..872db1733eb4 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/KernelIT.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/KernelIT.java @@ -213,7 +213,7 @@ private IndexReference createIndex( org.neo4j.internal.kernel.api.Transaction tr SchemaWrite schemaWrite = transaction.schemaWrite(); LabelSchemaDescriptor schemaDescriptor = forLabel( tokenWrite.labelGetOrCreateForName( "hello" ), tokenWrite.propertyKeyGetOrCreateForName( "hepp" ) ); - return schemaWrite.indexCreate( schemaDescriptor ); + return schemaWrite.indexCreate( schemaDescriptor, null ); } private String getOrCreateSchemaState( String key, final String maybeSetThisState ) diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/AbstractNodeValueIndexCursorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/AbstractNodeValueIndexCursorTest.java index 0785c556a6a2..d236f8875ef1 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/AbstractNodeValueIndexCursorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/AbstractNodeValueIndexCursorTest.java @@ -43,6 +43,6 @@ protected void createCompositeIndex( GraphDatabaseService graphDb, String label, schemaWrite.indexCreate( SchemaDescriptorFactory.forLabel( token.labelGetOrCreateForName( "Person" ), token.propertyKeyGetOrCreateForName( "firstname" ), - token.propertyKeyGetOrCreateForName( "surname" ) ) ); + token.propertyKeyGetOrCreateForName( "surname" ) ), null ); } } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/OperationsLockTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/OperationsLockTest.java index b55e512a549a..9924b6735f2e 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/OperationsLockTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/OperationsLockTest.java @@ -52,6 +52,7 @@ import org.neo4j.kernel.api.txstate.TransactionState; import org.neo4j.kernel.impl.api.KernelTransactionImplementation; import org.neo4j.kernel.impl.api.SchemaState; +import org.neo4j.kernel.impl.api.index.IndexProviderMap; import org.neo4j.kernel.impl.api.state.ConstraintIndexCreator; import org.neo4j.kernel.impl.api.state.TxState; import org.neo4j.kernel.impl.api.store.DefaultIndexReference; @@ -138,7 +139,7 @@ public void setUp() throws InvalidTransactionTypeKernelException constraintIndexCreator = mock( ConstraintIndexCreator.class ); operations = new Operations( allStoreHolder, mock( IndexTxStateUpdater.class ), storageStatement, transaction, new KernelToken( storeReadLayer, transaction ), cursors, autoindexing, - constraintIndexCreator, mock( ConstraintSemantics.class ) ); + constraintIndexCreator, mock( ConstraintSemantics.class ), mock( IndexProviderMap.class ) ); operations.initialize(); this.order = inOrder( locks, txState, storeReadLayer ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/util/dbstructure/GraphDbStructureGuideTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/util/dbstructure/GraphDbStructureGuideTest.java index 4d93a89907fb..cc36eb9f815d 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/util/dbstructure/GraphDbStructureGuideTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/util/dbstructure/GraphDbStructureGuideTest.java @@ -240,7 +240,7 @@ private IndexReference createSchemaIndex( int labelId, int pkId ) throws Excepti { KernelTransaction ktx = ktx(); - return ktx.schemaWrite().indexCreate( SchemaDescriptorFactory.forLabel( labelId, pkId ) ); + return ktx.schemaWrite().indexCreate( SchemaDescriptorFactory.forLabel( labelId, pkId ), null ); } diff --git a/community/neo4j/src/test/java/org/neo4j/kernel/impl/index/schema/IndexCreateIT.java b/community/neo4j/src/test/java/org/neo4j/kernel/impl/index/schema/IndexCreateIT.java new file mode 100644 index 000000000000..ba763d7e11c7 --- /dev/null +++ b/community/neo4j/src/test/java/org/neo4j/kernel/impl/index/schema/IndexCreateIT.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2002-2018 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.neo4j.kernel.impl.index.schema; + +import org.junit.Test; + +import org.neo4j.graphdb.factory.GraphDatabaseSettings; +import org.neo4j.internal.kernel.api.SchemaWrite; +import org.neo4j.internal.kernel.api.exceptions.KernelException; +import org.neo4j.internal.kernel.api.schema.LabelSchemaDescriptor; +import org.neo4j.kernel.impl.api.integrationtest.KernelIntegrationTest; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; +import static org.neo4j.kernel.api.schema.SchemaDescriptorFactory.forLabel; + +public class IndexCreateIT extends KernelIntegrationTest +{ + @Test + public void shouldCreateIndexWithSpecificExistingProviderName() throws KernelException + { + int labelId = 0; + for ( GraphDatabaseSettings.SchemaIndex indexSetting : GraphDatabaseSettings.SchemaIndex.values() ) + { + // given + SchemaWrite schemaWrite = schemaWriteInNewTransaction(); + String provider = indexSetting.providerName(); + LabelSchemaDescriptor descriptor = forLabel( labelId++, 0 ); + schemaWrite.indexCreate( descriptor, provider ); + + // when + commit(); + + // then + assertEquals( provider, indexingService.getIndexProxy( descriptor ).getProviderDescriptor().name() ); + } + } + + @Test + public void shouldFailOnCreateIndexWithNonExistentProviderName() throws KernelException + { + // given + SchemaWrite schemaWrite = schemaWriteInNewTransaction(); + + // when + try + { + schemaWrite.indexCreate( forLabel( 0, 0 ), "something-completely-different" ); + fail( "Should have failed" ); + } + catch ( IllegalArgumentException e ) + { + // then good + } + } +} diff --git a/enterprise/ha/src/test/java/org/neo4j/kernel/ha/HaCountsIT.java b/enterprise/ha/src/test/java/org/neo4j/kernel/ha/HaCountsIT.java index 7645f8f63018..90b5b93506c7 100644 --- a/enterprise/ha/src/test/java/org/neo4j/kernel/ha/HaCountsIT.java +++ b/enterprise/ha/src/test/java/org/neo4j/kernel/ha/HaCountsIT.java @@ -189,7 +189,7 @@ private SchemaIndexDescriptor createAnIndex( HighlyAvailableGraphDatabase db, La int labelId = ktx.tokenWrite().labelGetOrCreateForName( label.name() ); int propertyKeyId = ktx.tokenWrite().propertyKeyGetOrCreateForName( propertyName ); IndexReference index = ktx.schemaWrite() - .indexCreate( SchemaDescriptorFactory.forLabel( labelId, propertyKeyId ) ); + .indexCreate( SchemaDescriptorFactory.forLabel( labelId, propertyKeyId ), null ); tx.success(); return DefaultIndexReference.toDescriptor( index ); } diff --git a/enterprise/kernel/src/test/java/org/neo4j/kernel/enterprise/builtinprocs/TransactionStatusResultTest.java b/enterprise/kernel/src/test/java/org/neo4j/kernel/enterprise/builtinprocs/TransactionStatusResultTest.java index 5d94d3b421cd..bf326a20ce3a 100644 --- a/enterprise/kernel/src/test/java/org/neo4j/kernel/enterprise/builtinprocs/TransactionStatusResultTest.java +++ b/enterprise/kernel/src/test/java/org/neo4j/kernel/enterprise/builtinprocs/TransactionStatusResultTest.java @@ -51,6 +51,7 @@ import org.neo4j.kernel.impl.api.TransactionCommitProcess; import org.neo4j.kernel.impl.api.TransactionExecutionStatistic; import org.neo4j.kernel.impl.api.TransactionHooks; +import org.neo4j.kernel.impl.api.index.IndexProviderMap; import org.neo4j.kernel.impl.api.index.IndexingService; import org.neo4j.kernel.impl.api.state.ConstraintIndexCreator; import org.neo4j.kernel.impl.constraints.StandardConstraintSemantics; @@ -227,7 +228,7 @@ public TransactionExecutionStatistic transactionStatistic() mock( StorageEngine.class, RETURNS_MOCKS ), new CanWrite(), mock( DefaultCursors.class ), AutoIndexing.UNSUPPORTED, mock( ExplicitIndexStore.class ), EmptyVersionContextSupplier.EMPTY, ON_HEAP, new StandardConstraintSemantics(), mock( SchemaState.class), - mock( IndexingService.class ) ) + mock( IndexingService.class ), mock( IndexProviderMap.class ) ) { @Override public Statistics getStatistics()