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()
.getOnlineAccessor( indexRule.getId(), indexRule.getIndexDescriptor(), samplingConfig );
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();
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.proc.CallableUserAggregationFunction.Aggregator
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.{IndexQuery, SchemaDescriptorFactory}
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.PropertyConstraint;
import org.neo4j.kernel.api.exceptions.Status;
import org.neo4j.kernel.api.schema.NodePropertyDescriptor;

import static java.lang.String.format;

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

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

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.index.NewIndexDescriptor;
import org.neo4j.kernel.impl.api.index.UpdateMode;

import static java.lang.String.format;
Expand All @@ -38,17 +38,17 @@ public class IndexEntryUpdate
private final UpdateMode updateMode;
private final Object[] before;
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.descriptor = descriptor;
this.before = null;
this.values = values;
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 )
{
this.entityId = entityId;
Expand All @@ -68,7 +68,7 @@ public UpdateMode updateMode()
return updateMode;
}

public NewIndexDescriptor descriptor()
public LabelSchemaDescriptor descriptor()
{
return descriptor;
}
Expand Down Expand Up @@ -129,22 +129,22 @@ public String toString()
.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 );
}

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 );
}

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} );
}

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 );
}
Expand Down
Expand Up @@ -27,7 +27,7 @@
import java.util.Set;

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.transaction.state.LabelChangeSummary;

Expand Down Expand Up @@ -133,23 +133,23 @@ public final long getNodeId()
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
{
return getSingePropertyIndexUpdate( index );
return getSingePropertyIndexUpdate( descriptor );
}
}

private Optional<IndexEntryUpdate> getMultiPropertyIndexUpdate( NewIndexDescriptor index )
private Optional<IndexEntryUpdate> getMultiPropertyIndexUpdate( LabelSchemaDescriptor descriptor )
{
int[] propertyKeyIds = index.schema().getPropertyIds();
boolean labelExistsBefore = binarySearch( labelsBefore, index.schema().getLabelId() ) >= 0;
boolean labelExistsAfter = binarySearch( labelsAfter, index.schema().getLabelId() ) >= 0;
int[] propertyKeyIds = descriptor.getPropertyIds();
boolean labelExistsBefore = binarySearch( labelsBefore, descriptor.getLabelId() ) >= 0;
boolean labelExistsAfter = binarySearch( labelsAfter, descriptor.getLabelId() ) >= 0;
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> changed = new HashSet<>(); // index specific properties changed on this node
Expand Down Expand Up @@ -197,86 +197,86 @@ else if ( unchangedValue != null )
if ( labelExistsAfter )
{
// 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 )
{
if ( labelExistsBefore )
{
// 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 )
{
if ( labelExistsBefore && labelExistsAfter )
{
// 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 )
{
// 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 )
{
// 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 )
{
if ( !labelExistsBefore && labelExistsAfter )
{
// 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 )
{
// 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();
}

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 after = propertiesAfter.get( propertyKeyId );
Object unchanged = propertiesUnchanged.get( propertyKeyId );
boolean labelExistsBefore = binarySearch( labelsBefore, index.schema().getLabelId() ) >= 0;
boolean labelExistsAfter = binarySearch( labelsAfter, index.schema().getLabelId() ) >= 0;
boolean labelExistsBefore = binarySearch( labelsBefore, descriptor.getLabelId() ) >= 0;
boolean labelExistsAfter = binarySearch( labelsAfter, descriptor.getLabelId() ) >= 0;
if ( before != null )
{
if ( after != null )
{
if ( labelExistsBefore && labelExistsAfter )
{
// 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 )
{
// 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 )
{
// Changed a property and removed the label
return Optional.of( IndexEntryUpdate.remove( nodeId, index, before ) );
return Optional.of( IndexEntryUpdate.remove( nodeId, descriptor, before ) );
}
}
else
{
if ( labelExistsBefore )
{
// 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 )
{
// 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 )
{
if ( !labelExistsBefore && labelExistsAfter )
{
// 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 )
{
// 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();
Expand Down
Expand Up @@ -125,16 +125,16 @@ public boolean equals( Object o )
{
if ( o != null && o instanceof NewIndexDescriptor )
{
NewIndexDescriptor that = (NewIndexDescriptor) o;
return this.schema().equals( that.schema() );
NewIndexDescriptor that = (NewIndexDescriptor)o;
return this.type() == that.type() && this.schema().equals( that.schema() );
}
return false;
}

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

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

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

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

Expand Down
Expand Up @@ -24,7 +24,7 @@
import java.util.Map;
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.
Expand All @@ -35,15 +35,15 @@
public final class IndexMap implements Cloneable
{
private final Map<Long, IndexProxy> indexesById;
private final Map<NewIndexDescriptor, IndexProxy> indexesByDescriptor;
private final Map<NewIndexDescriptor, Long> indexIdsByDescriptor;
private final Map<LabelSchemaDescriptor,IndexProxy> indexesByDescriptor;
private final Map<LabelSchemaDescriptor,Long> indexIdsByDescriptor;

public IndexMap()
{
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.indexesByDescriptor = indexesByDescriptor;
Expand All @@ -55,29 +55,29 @@ public IndexProxy getIndexProxy( long indexId )
return indexesById.get( indexId );
}

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

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

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

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

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

0 comments on commit e0871d6

Please sign in to comment.