Skip to content

Commit

Permalink
Change IndexMap to use LabelSchemaDescriptor
Browse files Browse the repository at this point in the history
  • Loading branch information
ragadeeshu committed Mar 13, 2017
1 parent cc74af9 commit e0871d6
Show file tree
Hide file tree
Showing 57 changed files with 441 additions and 364 deletions.
Expand Up @@ -551,7 +551,7 @@ public void shouldReportNodesWithDuplicatePropertyValueInUniqueIndex() throws Ex
IndexAccessor accessor = fixture.directStoreAccess().indexes() IndexAccessor accessor = fixture.directStoreAccess().indexes()
.getOnlineAccessor( indexRule.getId(), indexRule.getIndexDescriptor(), samplingConfig ); .getOnlineAccessor( indexRule.getId(), indexRule.getIndexDescriptor(), samplingConfig );
IndexUpdater updater = accessor.newUpdater( IndexUpdateMode.ONLINE ); IndexUpdater updater = accessor.newUpdater( IndexUpdateMode.ONLINE );
updater.process( IndexEntryUpdate.add( 42, indexRule.getIndexDescriptor(), "value" ) ); updater.process( IndexEntryUpdate.add( 42, indexRule.getIndexDescriptor().schema(), "value" ) );
updater.close(); updater.close();
accessor.close(); accessor.close();
} }
Expand Down
Expand Up @@ -52,6 +52,7 @@ import org.neo4j.kernel.api.exceptions.schema.{AlreadyConstrainedException, Alre
import org.neo4j.kernel.api.index.InternalIndexState import org.neo4j.kernel.api.index.InternalIndexState
import org.neo4j.kernel.api.proc.CallableUserAggregationFunction.Aggregator import org.neo4j.kernel.api.proc.CallableUserAggregationFunction.Aggregator
import org.neo4j.kernel.api.proc.{QualifiedName => KernelQualifiedName} import org.neo4j.kernel.api.proc.{QualifiedName => KernelQualifiedName}
import org.neo4j.kernel.api.schema.NodePropertyDescriptor
import org.neo4j.kernel.api.schema_new.constaints.ConstraintDescriptorFactory import org.neo4j.kernel.api.schema_new.constaints.ConstraintDescriptorFactory
import org.neo4j.kernel.api.schema_new.{IndexQuery, SchemaDescriptorFactory} import org.neo4j.kernel.api.schema_new.{IndexQuery, SchemaDescriptorFactory}
import org.neo4j.kernel.impl.core.NodeManager import org.neo4j.kernel.impl.core.NodeManager
Expand Down
Expand Up @@ -23,6 +23,7 @@
import org.neo4j.kernel.api.constraints.NodePropertyConstraint; import org.neo4j.kernel.api.constraints.NodePropertyConstraint;
import org.neo4j.kernel.api.constraints.PropertyConstraint; import org.neo4j.kernel.api.constraints.PropertyConstraint;
import org.neo4j.kernel.api.exceptions.Status; import org.neo4j.kernel.api.exceptions.Status;
import org.neo4j.kernel.api.schema.NodePropertyDescriptor;


import static java.lang.String.format; import static java.lang.String.format;


Expand Down Expand Up @@ -57,8 +58,9 @@ private static String constructUserMessage( OperationContext context, TokenNameL
case INDEX_CREATION: case INDEX_CREATION:
// is is safe to cast here because we only support indexes on nodes atm // is is safe to cast here because we only support indexes on nodes atm
NodePropertyConstraint nodePropertyConstraint = (NodePropertyConstraint) constraint; NodePropertyConstraint nodePropertyConstraint = (NodePropertyConstraint) constraint;
NodePropertyDescriptor descriptor = nodePropertyConstraint.descriptor();
return messageWithLabelAndPropertyName( tokenNameLookup, INDEX_CONTEXT_FORMAT, return messageWithLabelAndPropertyName( tokenNameLookup, INDEX_CONTEXT_FORMAT,
nodePropertyConstraint.descriptor() ); descriptor );


case CONSTRAINT_CREATION: case CONSTRAINT_CREATION:
return ALREADY_CONSTRAINED_MESSAGE_PREFIX + constraint.userDescription( tokenNameLookup ); return ALREADY_CONSTRAINED_MESSAGE_PREFIX + constraint.userDescription( tokenNameLookup );
Expand Down
Expand Up @@ -21,8 +21,8 @@


import java.util.Arrays; import java.util.Arrays;


import org.neo4j.kernel.api.schema_new.LabelSchemaDescriptor;
import org.neo4j.kernel.api.schema_new.SchemaUtil; import org.neo4j.kernel.api.schema_new.SchemaUtil;
import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor;
import org.neo4j.kernel.impl.api.index.UpdateMode; import org.neo4j.kernel.impl.api.index.UpdateMode;


import static java.lang.String.format; import static java.lang.String.format;
Expand All @@ -38,17 +38,17 @@ public class IndexEntryUpdate
private final UpdateMode updateMode; private final UpdateMode updateMode;
private final Object[] before; private final Object[] before;
private Object[] values; private Object[] values;
private NewIndexDescriptor descriptor; private LabelSchemaDescriptor descriptor;


private IndexEntryUpdate( long entityId, NewIndexDescriptor descriptor, UpdateMode updateMode, Object... values ) private IndexEntryUpdate( long entityId, LabelSchemaDescriptor descriptor, UpdateMode updateMode, Object... values )
{ {
this.entityId = entityId; this.entityId = entityId;
this.descriptor = descriptor; this.descriptor = descriptor;
this.before = null; this.before = null;
this.values = values; this.values = values;
this.updateMode = updateMode; this.updateMode = updateMode;
} }
private IndexEntryUpdate( long entityId, NewIndexDescriptor descriptor, UpdateMode updateMode, Object[] before, private IndexEntryUpdate( long entityId, LabelSchemaDescriptor descriptor, UpdateMode updateMode, Object[] before,
Object[] values ) Object[] values )
{ {
this.entityId = entityId; this.entityId = entityId;
Expand All @@ -68,7 +68,7 @@ public UpdateMode updateMode()
return updateMode; return updateMode;
} }


public NewIndexDescriptor descriptor() public LabelSchemaDescriptor descriptor()
{ {
return descriptor; return descriptor;
} }
Expand Down Expand Up @@ -129,22 +129,22 @@ public String toString()
.userDescription( SchemaUtil.idTokenNameLookup ), Arrays.toString(values) ); .userDescription( SchemaUtil.idTokenNameLookup ), Arrays.toString(values) );
} }


public static IndexEntryUpdate add( long nodeId, NewIndexDescriptor descriptor, Object... values ) public static IndexEntryUpdate add( long nodeId, LabelSchemaDescriptor descriptor, Object... values )
{ {
return new IndexEntryUpdate( nodeId, descriptor, UpdateMode.ADDED, values ); return new IndexEntryUpdate( nodeId, descriptor, UpdateMode.ADDED, values );
} }


public static IndexEntryUpdate remove( long nodeId, NewIndexDescriptor descriptor, Object... values ) public static IndexEntryUpdate remove( long nodeId, LabelSchemaDescriptor descriptor, Object... values )
{ {
return new IndexEntryUpdate( nodeId, descriptor, UpdateMode.REMOVED, values ); return new IndexEntryUpdate( nodeId, descriptor, UpdateMode.REMOVED, values );
} }


public static IndexEntryUpdate change( long nodeId, NewIndexDescriptor descriptor, Object before, Object after ) public static IndexEntryUpdate change( long nodeId, LabelSchemaDescriptor descriptor, Object before, Object after )
{ {
return new IndexEntryUpdate( nodeId, descriptor, UpdateMode.CHANGED, new Object[]{before}, new Object[]{after} ); return new IndexEntryUpdate( nodeId, descriptor, UpdateMode.CHANGED, new Object[]{before}, new Object[]{after} );
} }


public static IndexEntryUpdate change( long nodeId, NewIndexDescriptor descriptor, Object[] before, Object[] after ) public static IndexEntryUpdate change( long nodeId, LabelSchemaDescriptor descriptor, Object[] before, Object[] after )
{ {
return new IndexEntryUpdate( nodeId, descriptor, UpdateMode.CHANGED, before, after ); return new IndexEntryUpdate( nodeId, descriptor, UpdateMode.CHANGED, before, after );
} }
Expand Down
Expand Up @@ -27,7 +27,7 @@
import java.util.Set; import java.util.Set;


import org.neo4j.kernel.api.properties.DefinedProperty; import org.neo4j.kernel.api.properties.DefinedProperty;
import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor; import org.neo4j.kernel.api.schema_new.LabelSchemaDescriptor;
import org.neo4j.kernel.impl.api.index.UpdateMode; import org.neo4j.kernel.impl.api.index.UpdateMode;
import org.neo4j.kernel.impl.transaction.state.LabelChangeSummary; import org.neo4j.kernel.impl.transaction.state.LabelChangeSummary;


Expand Down Expand Up @@ -133,23 +133,23 @@ public final long getNodeId()
return nodeId; return nodeId;
} }


public Optional<IndexEntryUpdate> forIndex( NewIndexDescriptor index ) public Optional<IndexEntryUpdate> forIndex( LabelSchemaDescriptor descriptor )
{ {
if ( index.schema().getPropertyIds().length > 1 ) if ( descriptor.getPropertyIds().length > 1 )
{ {
return getMultiPropertyIndexUpdate( index ); return getMultiPropertyIndexUpdate( descriptor );
} }
else else
{ {
return getSingePropertyIndexUpdate( index ); return getSingePropertyIndexUpdate( descriptor );
} }
} }


private Optional<IndexEntryUpdate> getMultiPropertyIndexUpdate( NewIndexDescriptor index ) private Optional<IndexEntryUpdate> getMultiPropertyIndexUpdate( LabelSchemaDescriptor descriptor )
{ {
int[] propertyKeyIds = index.schema().getPropertyIds(); int[] propertyKeyIds = descriptor.getPropertyIds();
boolean labelExistsBefore = binarySearch( labelsBefore, index.schema().getLabelId() ) >= 0; boolean labelExistsBefore = binarySearch( labelsBefore, descriptor.getLabelId() ) >= 0;
boolean labelExistsAfter = binarySearch( labelsAfter, index.schema().getLabelId() ) >= 0; boolean labelExistsAfter = binarySearch( labelsAfter, descriptor.getLabelId() ) >= 0;
Set<Integer> added = new HashSet<>(); // index specific properties added to this node Set<Integer> added = new HashSet<>(); // index specific properties added to this node
Set<Integer> removed = new HashSet<>(); // index specific properties removed from this node Set<Integer> removed = new HashSet<>(); // index specific properties removed from this node
Set<Integer> changed = new HashSet<>(); // index specific properties changed on this node Set<Integer> changed = new HashSet<>(); // index specific properties changed on this node
Expand Down Expand Up @@ -197,86 +197,86 @@ else if ( unchangedValue != null )
if ( labelExistsAfter ) if ( labelExistsAfter )
{ {
// Added one or more properties and the label exists // Added one or more properties and the label exists
return Optional.of( IndexEntryUpdate.add( nodeId, index, after ) ); return Optional.of( IndexEntryUpdate.add( nodeId, descriptor, after ) );
} }
} }
else if ( removed.size() > 0 ) else if ( removed.size() > 0 )
{ {
if ( labelExistsBefore ) if ( labelExistsBefore )
{ {
// Removed one or more properties and the label existed // Removed one or more properties and the label existed
return Optional.of( IndexEntryUpdate.remove( nodeId, index, before ) ); return Optional.of( IndexEntryUpdate.remove( nodeId, descriptor, before ) );
} }
} }
else if ( changed.size() > 0 ) else if ( changed.size() > 0 )
{ {
if ( labelExistsBefore && labelExistsAfter ) if ( labelExistsBefore && labelExistsAfter )
{ {
// Changed one or more properties and the label still exists // Changed one or more properties and the label still exists
return Optional.of( IndexEntryUpdate.change( nodeId, index, before, after ) ); return Optional.of( IndexEntryUpdate.change( nodeId, descriptor, before, after ) );
} }
else if ( labelExistsAfter ) else if ( labelExistsAfter )
{ {
// Changed one or more properties and added the label // Changed one or more properties and added the label
return Optional.of( IndexEntryUpdate.add( nodeId, index, after ) ); return Optional.of( IndexEntryUpdate.add( nodeId, descriptor, after ) );
} }
else if ( labelExistsBefore ) else if ( labelExistsBefore )
{ {
// Changed one or more properties and removed the label // Changed one or more properties and removed the label
return Optional.of( IndexEntryUpdate.remove( nodeId, index, before ) ); return Optional.of( IndexEntryUpdate.remove( nodeId, descriptor, before ) );
} }
} }
else if ( unchanged.size() >= 0 ) else if ( unchanged.size() >= 0 )
{ {
if ( !labelExistsBefore && labelExistsAfter ) if ( !labelExistsBefore && labelExistsAfter )
{ {
// Node has the right properties and the label was added // Node has the right properties and the label was added
return Optional.of( IndexEntryUpdate.add( nodeId, index, after ) ); return Optional.of( IndexEntryUpdate.add( nodeId, descriptor, after ) );
} }
else if ( labelExistsBefore && !labelExistsAfter ) else if ( labelExistsBefore && !labelExistsAfter )
{ {
// Node has the right property and the label was removed // Node has the right property and the label was removed
return Optional.of( IndexEntryUpdate.remove( nodeId, index, before ) ); return Optional.of( IndexEntryUpdate.remove( nodeId, descriptor, before ) );
} }
} }
} }
return Optional.empty(); return Optional.empty();
} }


private Optional<IndexEntryUpdate> getSingePropertyIndexUpdate( NewIndexDescriptor index ) private Optional<IndexEntryUpdate> getSingePropertyIndexUpdate( LabelSchemaDescriptor descriptor )
{ {
int propertyKeyId = index.schema().getPropertyId(); int propertyKeyId = descriptor.getPropertyId();
Object before = propertiesBefore.get( propertyKeyId ); Object before = propertiesBefore.get( propertyKeyId );
Object after = propertiesAfter.get( propertyKeyId ); Object after = propertiesAfter.get( propertyKeyId );
Object unchanged = propertiesUnchanged.get( propertyKeyId ); Object unchanged = propertiesUnchanged.get( propertyKeyId );
boolean labelExistsBefore = binarySearch( labelsBefore, index.schema().getLabelId() ) >= 0; boolean labelExistsBefore = binarySearch( labelsBefore, descriptor.getLabelId() ) >= 0;
boolean labelExistsAfter = binarySearch( labelsAfter, index.schema().getLabelId() ) >= 0; boolean labelExistsAfter = binarySearch( labelsAfter, descriptor.getLabelId() ) >= 0;
if ( before != null ) if ( before != null )
{ {
if ( after != null ) if ( after != null )
{ {
if ( labelExistsBefore && labelExistsAfter ) if ( labelExistsBefore && labelExistsAfter )
{ {
// Changed a property and have the label // Changed a property and have the label
return Optional.of( IndexEntryUpdate.change( nodeId, index, before, after ) ); return Optional.of( IndexEntryUpdate.change( nodeId, descriptor, before, after ) );
} }
else if ( labelExistsAfter ) else if ( labelExistsAfter )
{ {
// Changed a property and added the label // Changed a property and added the label
return Optional.of( IndexEntryUpdate.add( nodeId, index, after ) ); return Optional.of( IndexEntryUpdate.add( nodeId, descriptor, after ) );
} }
else if ( labelExistsBefore ) else if ( labelExistsBefore )
{ {
// Changed a property and removed the label // Changed a property and removed the label
return Optional.of( IndexEntryUpdate.remove( nodeId, index, before ) ); return Optional.of( IndexEntryUpdate.remove( nodeId, descriptor, before ) );
} }
} }
else else
{ {
if ( labelExistsBefore ) if ( labelExistsBefore )
{ {
// Removed a property and node had the label // Removed a property and node had the label
return Optional.of( IndexEntryUpdate.remove( nodeId, index, before ) ); return Optional.of( IndexEntryUpdate.remove( nodeId, descriptor, before ) );
} }
} }
} }
Expand All @@ -285,20 +285,20 @@ else if ( after != null )
if ( labelExistsAfter ) if ( labelExistsAfter )
{ {
// Added a property and node has the label // Added a property and node has the label
return Optional.of( IndexEntryUpdate.add( nodeId, index, after ) ); return Optional.of( IndexEntryUpdate.add( nodeId, descriptor, after ) );
} }
} }
else if ( unchanged != null ) else if ( unchanged != null )
{ {
if ( !labelExistsBefore && labelExistsAfter ) if ( !labelExistsBefore && labelExistsAfter )
{ {
// Node has the right property and the label was added // Node has the right property and the label was added
return Optional.of( IndexEntryUpdate.add( nodeId, index, unchanged ) ); return Optional.of( IndexEntryUpdate.add( nodeId, descriptor, unchanged ) );
} }
else if ( labelExistsBefore && !labelExistsAfter ) else if ( labelExistsBefore && !labelExistsAfter )
{ {
// Node has the right property and the label was removed // Node has the right property and the label was removed
return Optional.of( IndexEntryUpdate.remove( nodeId, index, unchanged ) ); return Optional.of( IndexEntryUpdate.remove( nodeId, descriptor, unchanged ) );
} }
} }
return Optional.empty(); return Optional.empty();
Expand Down
Expand Up @@ -125,16 +125,16 @@ public boolean equals( Object o )
{ {
if ( o != null && o instanceof NewIndexDescriptor ) if ( o != null && o instanceof NewIndexDescriptor )
{ {
NewIndexDescriptor that = (NewIndexDescriptor) o; NewIndexDescriptor that = (NewIndexDescriptor)o;
return this.schema().equals( that.schema() ); return this.type() == that.type() && this.schema().equals( that.schema() );
} }
return false; return false;
} }


@Override @Override
public int hashCode() public int hashCode()
{ {
return schema.hashCode(); return type.hashCode() & schema.hashCode();
} }


@Override @Override
Expand Down
Expand Up @@ -166,7 +166,7 @@ private InternalIndexState getState( IndexSpecifier indexDescription, NewIndexDe


private void triggerSampling( NewIndexDescriptor index ) throws IndexNotFoundKernelException private void triggerSampling( NewIndexDescriptor index ) throws IndexNotFoundKernelException
{ {
indexingService.triggerIndexSampling( index, IndexSamplingMode.TRIGGER_REBUILD_ALL ); indexingService.triggerIndexSampling( index.schema(), IndexSamplingMode.TRIGGER_REBUILD_ALL );
} }


@Override @Override
Expand Down
Expand Up @@ -66,7 +66,7 @@ public IndexReader newReader( NewIndexDescriptor descriptor ) throws IndexNotFou
@Override @Override
public IndexReader newUnCachedReader( NewIndexDescriptor descriptor ) throws IndexNotFoundKernelException public IndexReader newUnCachedReader( NewIndexDescriptor descriptor ) throws IndexNotFoundKernelException
{ {
IndexProxy index = indexingService.getIndexProxy( descriptor ); IndexProxy index = indexingService.getIndexProxy( descriptor.schema() );
return index.newReader(); return index.newReader();
} }


Expand Down
Expand Up @@ -24,7 +24,7 @@
import java.util.Map; import java.util.Map;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;


import org.neo4j.kernel.api.schema_new.index.NewIndexDescriptor; import org.neo4j.kernel.api.schema_new.LabelSchemaDescriptor;


/** /**
* Bundles various mappings to IndexProxy. Used by IndexingService via IndexMapReference. * Bundles various mappings to IndexProxy. Used by IndexingService via IndexMapReference.
Expand All @@ -35,15 +35,15 @@
public final class IndexMap implements Cloneable public final class IndexMap implements Cloneable
{ {
private final Map<Long, IndexProxy> indexesById; private final Map<Long, IndexProxy> indexesById;
private final Map<NewIndexDescriptor, IndexProxy> indexesByDescriptor; private final Map<LabelSchemaDescriptor,IndexProxy> indexesByDescriptor;
private final Map<NewIndexDescriptor, Long> indexIdsByDescriptor; private final Map<LabelSchemaDescriptor,Long> indexIdsByDescriptor;


public IndexMap() public IndexMap()
{ {
this( new HashMap<>(), new HashMap<>(), new HashMap<>() ); this( new HashMap<>(), new HashMap<>(), new HashMap<>() );
} }


private IndexMap( Map<Long, IndexProxy> indexesById, Map<NewIndexDescriptor, IndexProxy> indexesByDescriptor, Map<NewIndexDescriptor, Long> indexIdsByDescriptor ) private IndexMap( Map<Long, IndexProxy> indexesById, Map<LabelSchemaDescriptor,IndexProxy> indexesByDescriptor, Map<LabelSchemaDescriptor,Long> indexIdsByDescriptor )
{ {
this.indexesById = indexesById; this.indexesById = indexesById;
this.indexesByDescriptor = indexesByDescriptor; this.indexesByDescriptor = indexesByDescriptor;
Expand All @@ -55,29 +55,29 @@ public IndexProxy getIndexProxy( long indexId )
return indexesById.get( indexId ); return indexesById.get( indexId );
} }


public IndexProxy getIndexProxy( NewIndexDescriptor descriptor ) public IndexProxy getIndexProxy( LabelSchemaDescriptor descriptor )
{ {
return indexesByDescriptor.get( descriptor ); return indexesByDescriptor.get( descriptor );
} }


public long getIndexId( NewIndexDescriptor descriptor ) public long getIndexId( LabelSchemaDescriptor descriptor )
{ {
return indexIdsByDescriptor.get( descriptor ); return indexIdsByDescriptor.get( descriptor );
} }


public void putIndexProxy( long indexId, IndexProxy indexProxy ) public void putIndexProxy( long indexId, IndexProxy indexProxy )
{ {
indexesById.put( indexId, indexProxy ); indexesById.put( indexId, indexProxy );
indexesByDescriptor.put( indexProxy.getDescriptor(), indexProxy ); indexesByDescriptor.put( indexProxy.getDescriptor().schema(), indexProxy );
indexIdsByDescriptor.put( indexProxy.getDescriptor(), indexId ); indexIdsByDescriptor.put( indexProxy.getDescriptor().schema(), indexId );
} }


public IndexProxy removeIndexProxy( long indexId ) public IndexProxy removeIndexProxy( long indexId )
{ {
IndexProxy removedProxy = indexesById.remove( indexId ); IndexProxy removedProxy = indexesById.remove( indexId );
if ( null != removedProxy ) if ( null != removedProxy )
{ {
indexesByDescriptor.remove( removedProxy.getDescriptor() ); indexesByDescriptor.remove( removedProxy.getDescriptor().schema() );
} }
return removedProxy; return removedProxy;
} }
Expand Down Expand Up @@ -109,7 +109,7 @@ private <K, V> Map<K, V> cloneMap( Map<K, V> map )
return shallowCopy; return shallowCopy;
} }


public Iterator<NewIndexDescriptor> descriptors() public Iterator<LabelSchemaDescriptor> descriptors()
{ {
return indexesByDescriptor.keySet().iterator(); return indexesByDescriptor.keySet().iterator();
} }
Expand Down

0 comments on commit e0871d6

Please sign in to comment.