Skip to content

Commit

Permalink
Monster commit. Sorry.
Browse files Browse the repository at this point in the history
Ripped out Property classes and replaced with Value equivalents. Not
completely optimized everywhere, but might give decent performance. In
particular haven't worked with cursors, because those will be touched by
separate work.
  • Loading branch information
fickludd committed Jun 15, 2017
1 parent 21f26da commit 55d72a3
Show file tree
Hide file tree
Showing 175 changed files with 1,547 additions and 5,419 deletions.
Expand Up @@ -82,7 +82,7 @@ public static void checkDataBlock( PropertyBlock block,
default: default:
try try
{ {
type.getValue( block, null ); type.getValueNow( block, null );
} }
catch ( Exception e ) catch ( Exception e )
{ {
Expand Down
Expand Up @@ -45,6 +45,7 @@
import org.neo4j.kernel.impl.store.record.PropertyRecord; import org.neo4j.kernel.impl.store.record.PropertyRecord;
import org.neo4j.kernel.impl.store.record.Record; import org.neo4j.kernel.impl.store.record.Record;
import org.neo4j.storageengine.api.schema.IndexReader; import org.neo4j.storageengine.api.schema.IndexReader;
import org.neo4j.values.Value;
import org.neo4j.values.Values; import org.neo4j.values.Values;


import static java.lang.String.format; import static java.lang.String.format;
Expand Down Expand Up @@ -105,7 +106,7 @@ private void matchIndexesToNode(
int[] indexPropertyIds = indexRule.schema().getPropertyIds(); int[] indexPropertyIds = indexRule.schema().getPropertyIds();
if ( nodeHasSchemaProperties( nodePropertyMap, indexPropertyIds ) ) if ( nodeHasSchemaProperties( nodePropertyMap, indexPropertyIds ) )
{ {
Object[] values = getPropertyValues( nodePropertyMap, indexPropertyIds ); Value[] values = getPropertyValues( nodePropertyMap, indexPropertyIds );
try ( IndexReader reader = indexes.accessorFor( indexRule ).newReader() ) try ( IndexReader reader = indexes.accessorFor( indexRule ).newReader() )
{ {
long nodeId = record.getId(); long nodeId = record.getId();
Expand Down Expand Up @@ -197,13 +198,13 @@ private void checkProperty( NodeRecord record,
} }
} }


private Object[] getPropertyValues( PrimitiveIntObjectMap<PropertyBlock> propertyMap, int[] indexPropertyIds ) private Value[] getPropertyValues( PrimitiveIntObjectMap<PropertyBlock> propertyMap, int[] indexPropertyIds )
{ {
Object[] values = new Object[indexPropertyIds.length]; Value[] values = new Value[indexPropertyIds.length];
for ( int i = 0; i < indexPropertyIds.length; i++ ) for ( int i = 0; i < indexPropertyIds.length; i++ )
{ {
PropertyBlock propertyBlock = propertyMap.get( indexPropertyIds[i] ); PropertyBlock propertyBlock = propertyMap.get( indexPropertyIds[i] );
values[i] = propertyReader.propertyValue( propertyBlock ).value(); values[i] = propertyReader.propertyValue( propertyBlock );
} }
return values; return values;
} }
Expand Down
Expand Up @@ -26,15 +26,18 @@


import org.neo4j.function.Suppliers; import org.neo4j.function.Suppliers;
import org.neo4j.kernel.api.index.PropertyAccessor; import org.neo4j.kernel.api.index.PropertyAccessor;
import org.neo4j.kernel.api.properties.DefinedProperty; import org.neo4j.kernel.api.properties.PropertyKeyValue;
import org.neo4j.kernel.api.properties.Property;
import org.neo4j.kernel.impl.store.NodeStore; import org.neo4j.kernel.impl.store.NodeStore;
import org.neo4j.kernel.impl.store.PropertyStore; import org.neo4j.kernel.impl.store.PropertyStore;
import org.neo4j.kernel.impl.store.StoreAccess; import org.neo4j.kernel.impl.store.StoreAccess;
import org.neo4j.kernel.impl.store.record.NodeRecord; import org.neo4j.kernel.impl.store.record.NodeRecord;
import org.neo4j.kernel.impl.store.record.PropertyBlock; import org.neo4j.kernel.impl.store.record.PropertyBlock;
import org.neo4j.kernel.impl.store.record.PropertyRecord; import org.neo4j.kernel.impl.store.record.PropertyRecord;
import org.neo4j.kernel.impl.store.record.Record; import org.neo4j.kernel.impl.store.record.Record;
import org.neo4j.storageengine.api.StorageProperty;
import org.neo4j.values.Value;
import org.neo4j.values.Values;

import static org.neo4j.kernel.impl.store.record.RecordLoad.FORCE; import static org.neo4j.kernel.impl.store.record.RecordLoad.FORCE;


public class PropertyReader implements PropertyAccessor public class PropertyReader implements PropertyAccessor
Expand Down Expand Up @@ -93,13 +96,13 @@ public List<PropertyBlock> propertyBlocks( NodeRecord nodeRecord )
return propertyBlocks; return propertyBlocks;
} }


public DefinedProperty propertyValue( PropertyBlock block ) public Value propertyValue( PropertyBlock block )
{ {
return block.getType().readProperty( block.getKeyIndexId(), block, Suppliers.singleton( propertyStore ) ); return block.getType().getValue( block, propertyStore );
} }


@Override @Override
public Property getProperty( long nodeId, int propertyKeyId ) public Value getPropertyValue( long nodeId, int propertyKeyId )
{ {
NodeRecord nodeRecord = nodeStore.newRecord(); NodeRecord nodeRecord = nodeStore.newRecord();
if ( nodeStore.getRecord( nodeId, nodeRecord, FORCE ).inUse() ) if ( nodeStore.getRecord( nodeId, nodeRecord, FORCE ).inUse() )
Expand All @@ -112,6 +115,6 @@ public Property getProperty( long nodeId, int propertyKeyId )
} }
} }
} }
return Property.noNodeProperty( nodeId, propertyKeyId ); return Values.NO_VALUE;
} }
} }
Expand Up @@ -107,6 +107,8 @@
import org.neo4j.storageengine.api.schema.SchemaRule; import org.neo4j.storageengine.api.schema.SchemaRule;
import org.neo4j.string.UTF8; import org.neo4j.string.UTF8;
import org.neo4j.test.rule.SuppressOutput; import org.neo4j.test.rule.SuppressOutput;
import org.neo4j.values.Value;
import org.neo4j.values.Values;


import static java.lang.String.format; import static java.lang.String.format;
import static java.util.Arrays.asList; import static java.util.Arrays.asList;
Expand Down Expand Up @@ -598,12 +600,12 @@ public void shouldReportNodesWithDuplicatePropertyValueInUniqueIndex() throws Ex
.andThatsAllFolks(); .andThatsAllFolks();
} }


private Object[] values( IndexRule indexRule ) private Value[] values( IndexRule indexRule )
{ {
switch ( indexRule.schema().getPropertyIds().length ) switch ( indexRule.schema().getPropertyIds().length )
{ {
case 1: return Iterators.array( VALUE1 ); case 1: return Iterators.array( Values.of( VALUE1 ) );
case 2: return Iterators.array( VALUE1, VALUE2 ); case 2: return Iterators.array( Values.of( VALUE1 ), Values.of( VALUE2 ) );
default: throw new UnsupportedOperationException(); default: throw new UnsupportedOperationException();
} }
} }
Expand Down
Expand Up @@ -158,7 +158,7 @@ RelationshipIterator nodeGetRelationships( long nodeId, Direction direction, int
long nodeGetFromUniqueIndexSeek( IndexDescriptor index, IndexQuery.ExactPredicate... predicates ) throws IndexNotFoundKernelException, long nodeGetFromUniqueIndexSeek( IndexDescriptor index, IndexQuery.ExactPredicate... predicates ) throws IndexNotFoundKernelException,
IndexBrokenKernelException, IndexNotApplicableKernelException; IndexBrokenKernelException, IndexNotApplicableKernelException;


long nodesCountIndexed( IndexDescriptor index, long nodeId, Object value ) long nodesCountIndexed( IndexDescriptor index, long nodeId, Value value )
throws IndexNotFoundKernelException, IndexBrokenKernelException; throws IndexNotFoundKernelException, IndexBrokenKernelException;


boolean nodeExists( long nodeId ); boolean nodeExists( long nodeId );
Expand Down
Expand Up @@ -19,31 +19,35 @@
*/ */
package org.neo4j.kernel.api.exceptions.index; package org.neo4j.kernel.api.exceptions.index;


import java.util.Arrays;

import org.neo4j.kernel.api.TokenNameLookup; import org.neo4j.kernel.api.TokenNameLookup;
import org.neo4j.kernel.api.exceptions.KernelException; import org.neo4j.kernel.api.exceptions.KernelException;
import org.neo4j.kernel.api.schema.LabelSchemaDescriptor; import org.neo4j.kernel.api.schema.LabelSchemaDescriptor;
import org.neo4j.kernel.api.schema.OrderedPropertyValues;
import org.neo4j.kernel.api.schema.SchemaUtil; import org.neo4j.kernel.api.schema.SchemaUtil;
import org.neo4j.kernel.api.schema.index.IndexDescriptor; import org.neo4j.kernel.api.schema.index.IndexDescriptor;
import org.neo4j.values.Value;
import org.neo4j.values.ValueTuple;


import static java.lang.String.format; import static java.lang.String.format;
import static java.lang.String.valueOf;
import static org.neo4j.kernel.api.StatementConstants.NO_SUCH_NODE; import static org.neo4j.kernel.api.StatementConstants.NO_SUCH_NODE;


/** /**
* TODO why isn't this a {@link KernelException}? * TODO why isn't this a {@link KernelException}?
*/ */
public class IndexEntryConflictException extends Exception public class IndexEntryConflictException extends Exception
{ {
private final OrderedPropertyValues propertyValues; private final ValueTuple propertyValues;
private final long addedNodeId; private final long addedNodeId;
private final long existingNodeId; private final long existingNodeId;


public IndexEntryConflictException( long existingNodeId, long addedNodeId, Object propertyValue ) public IndexEntryConflictException( long existingNodeId, long addedNodeId, Value propertyValue )
{ {
this( existingNodeId, addedNodeId, OrderedPropertyValues.ofUndefined( propertyValue ) ); this( existingNodeId, addedNodeId, ValueTuple.of( propertyValue ) );
} }


public IndexEntryConflictException( long existingNodeId, long addedNodeId, OrderedPropertyValues propertyValues ) public IndexEntryConflictException( long existingNodeId, long addedNodeId, ValueTuple propertyValues )
{ {
super( format( "Both node %d and node %d share the property value %s", super( format( "Both node %d and node %d share the property value %s",
existingNodeId, addedNodeId, propertyValues ) ); existingNodeId, addedNodeId, propertyValues ) );
Expand Down Expand Up @@ -81,14 +85,14 @@ public String evidenceMessage( TokenNameLookup tokenNameLookup, LabelSchemaDescr
} }
} }


public OrderedPropertyValues getPropertyValues() public ValueTuple getPropertyValues()
{ {
return propertyValues; return propertyValues;
} }


public Object getSinglePropertyValue() public Value getSinglePropertyValue()
{ {
return propertyValues.getSinglePropertyValue(); return propertyValues.getOnlyValue();
} }


public long getAddedNodeId() public long getAddedNodeId()
Expand Down Expand Up @@ -150,8 +154,55 @@ private String propertyString( TokenNameLookup tokenNameLookup, int[] propertyId
sb.append( '`' ); sb.append( '`' );
sb.append( tokenNameLookup.propertyKeyGetName( propertyIds[i] ) ); sb.append( tokenNameLookup.propertyKeyGetName( propertyIds[i] ) );
sb.append( "` = " ); sb.append( "` = " );
sb.append( OrderedPropertyValues.quote( propertyValues.valueAt( i ) ) ); sb.append( quote( propertyValues.valueAt( i ).asPublic() ) );
} }
return sb.toString(); return sb.toString();
} }

private static String quote( Object propertyValue )
{
if ( propertyValue instanceof String )
{
return format( "'%s'", propertyValue );
}
else if ( propertyValue.getClass().isArray() )
{
Class<?> type = propertyValue.getClass().getComponentType();
if ( type == Boolean.TYPE )
{
return Arrays.toString( (boolean[]) propertyValue );
}
else if ( type == Byte.TYPE )
{
return Arrays.toString( (byte[]) propertyValue );
}
else if ( type == Short.TYPE )
{
return Arrays.toString( (short[]) propertyValue );
}
else if ( type == Character.TYPE )
{
return Arrays.toString( (char[]) propertyValue );
}
else if ( type == Integer.TYPE )
{
return Arrays.toString( (int[]) propertyValue );
}
else if ( type == Long.TYPE )
{
return Arrays.toString( (long[]) propertyValue );
}
else if ( type == Float.TYPE )
{
return Arrays.toString( (float[]) propertyValue );
}
else if ( type == Double.TYPE )
{
return Arrays.toString( (double[]) propertyValue );
}
return Arrays.toString( (Object[]) propertyValue );
}
return valueOf( propertyValue );
}

} }
Expand Up @@ -24,6 +24,7 @@
import org.neo4j.kernel.api.schema.IndexQuery; import org.neo4j.kernel.api.schema.IndexQuery;
import org.neo4j.storageengine.api.schema.IndexReader; import org.neo4j.storageengine.api.schema.IndexReader;
import org.neo4j.storageengine.api.schema.IndexSampler; import org.neo4j.storageengine.api.schema.IndexSampler;
import org.neo4j.values.Value;


public class DelegatingIndexReader implements IndexReader public class DelegatingIndexReader implements IndexReader
{ {
Expand All @@ -35,7 +36,7 @@ public DelegatingIndexReader( IndexReader delegate )
} }


@Override @Override
public long countIndexedNodes( long nodeId, Object... propertyValues ) public long countIndexedNodes( long nodeId, Value... propertyValues )
{ {
return delegate.countIndexedNodes( nodeId, propertyValues ); return delegate.countIndexedNodes( nodeId, propertyValues );
} }
Expand Down
Expand Up @@ -24,6 +24,7 @@
import org.neo4j.kernel.api.schema.LabelSchemaSupplier; import org.neo4j.kernel.api.schema.LabelSchemaSupplier;
import org.neo4j.kernel.api.schema.SchemaUtil; import org.neo4j.kernel.api.schema.SchemaUtil;
import org.neo4j.kernel.impl.api.index.UpdateMode; import org.neo4j.kernel.impl.api.index.UpdateMode;
import org.neo4j.values.Value;


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


Expand All @@ -36,17 +37,17 @@ public class IndexEntryUpdate<INDEX_KEY extends LabelSchemaSupplier>
{ {
private final long entityId; private final long entityId;
private final UpdateMode updateMode; private final UpdateMode updateMode;
private final Object[] before; private final Value[] before;
private final Object[] values; private final Value[] values;
private final INDEX_KEY indexKey; private final INDEX_KEY indexKey;


private IndexEntryUpdate( long entityId, INDEX_KEY indexKey, UpdateMode updateMode, Object... values ) private IndexEntryUpdate( long entityId, INDEX_KEY indexKey, UpdateMode updateMode, Value... values )
{ {
this( entityId, indexKey, updateMode, null, values ); this( entityId, indexKey, updateMode, null, values );
} }


private IndexEntryUpdate( long entityId, INDEX_KEY indexKey, UpdateMode updateMode, Object[] before, private IndexEntryUpdate( long entityId, INDEX_KEY indexKey, UpdateMode updateMode, Value[] before,
Object[] values ) Value[] values )
{ {
// we do not support partial index entries // we do not support partial index entries
assert indexKey.schema().getPropertyIds().length == values.length : assert indexKey.schema().getPropertyIds().length == values.length :
Expand Down Expand Up @@ -76,7 +77,7 @@ public INDEX_KEY indexKey()
return indexKey; return indexKey;
} }


public Object[] values() public Value[] values()
{ {
return values; return values;
} }
Expand All @@ -103,11 +104,11 @@ public boolean equals( Object o )
{ {
return false; return false;
} }
if ( !Arrays.deepEquals( before, that.before ) ) if ( !Arrays.equals( before, that.before ) )
{ {
return false; return false;
} }
if ( !Arrays.deepEquals( values, that.values ) ) if ( !Arrays.equals( values, that.values ) )
{ {
return false; return false;
} }
Expand All @@ -119,8 +120,8 @@ public int hashCode()
{ {
int result = (int) (entityId ^ (entityId >>> 32)); int result = (int) (entityId ^ (entityId >>> 32));
result = 31 * result + (updateMode != null ? updateMode.hashCode() : 0); result = 31 * result + (updateMode != null ? updateMode.hashCode() : 0);
result = 31 * result + Arrays.deepHashCode( before ); result = 31 * result + Arrays.hashCode( before );
result = 31 * result + Arrays.deepHashCode( values ); result = 31 * result + Arrays.hashCode( values );
result = 31 * result + (indexKey != null ? indexKey.schema().hashCode() : 0); result = 31 * result + (indexKey != null ? indexKey.schema().hashCode() : 0);
return result; return result;
} }
Expand All @@ -133,31 +134,31 @@ public String toString()
} }


public static <INDEX_KEY extends LabelSchemaSupplier> IndexEntryUpdate<INDEX_KEY> add( public static <INDEX_KEY extends LabelSchemaSupplier> IndexEntryUpdate<INDEX_KEY> add(
long nodeId, INDEX_KEY indexKey, Object... values ) long nodeId, INDEX_KEY indexKey, Value... values )
{ {
return new IndexEntryUpdate<>( nodeId, indexKey, UpdateMode.ADDED, values ); return new IndexEntryUpdate<>( nodeId, indexKey, UpdateMode.ADDED, values );
} }


public static <INDEX_KEY extends LabelSchemaSupplier> IndexEntryUpdate<INDEX_KEY> remove( public static <INDEX_KEY extends LabelSchemaSupplier> IndexEntryUpdate<INDEX_KEY> remove(
long nodeId, INDEX_KEY indexKey, Object... values ) long nodeId, INDEX_KEY indexKey, Value... values )
{ {
return new IndexEntryUpdate<>( nodeId, indexKey, UpdateMode.REMOVED, values ); return new IndexEntryUpdate<>( nodeId, indexKey, UpdateMode.REMOVED, values );
} }


public static <INDEX_KEY extends LabelSchemaSupplier> IndexEntryUpdate<INDEX_KEY> change( public static <INDEX_KEY extends LabelSchemaSupplier> IndexEntryUpdate<INDEX_KEY> change(
long nodeId, INDEX_KEY indexKey, Object before, Object after ) long nodeId, INDEX_KEY indexKey, Value before, Value after )
{ {
return new IndexEntryUpdate<>( nodeId, indexKey, UpdateMode.CHANGED, return new IndexEntryUpdate<>( nodeId, indexKey, UpdateMode.CHANGED,
new Object[]{before}, new Object[]{after} ); new Value[]{before}, new Value[]{after} );
} }


public static <INDEX_KEY extends LabelSchemaSupplier> IndexEntryUpdate<INDEX_KEY> change( public static <INDEX_KEY extends LabelSchemaSupplier> IndexEntryUpdate<INDEX_KEY> change(
long nodeId, INDEX_KEY indexKey, Object[] before, Object[] after ) long nodeId, INDEX_KEY indexKey, Value[] before, Value[] after )
{ {
return new IndexEntryUpdate<>( nodeId, indexKey, UpdateMode.CHANGED, before, after ); return new IndexEntryUpdate<>( nodeId, indexKey, UpdateMode.CHANGED, before, after );
} }


public Object[] beforeValues() public Value[] beforeValues()
{ {
if ( before == null ) if ( before == null )
{ {
Expand Down
Expand Up @@ -20,12 +20,12 @@
package org.neo4j.kernel.api.index; package org.neo4j.kernel.api.index;


import org.neo4j.kernel.api.exceptions.EntityNotFoundException; import org.neo4j.kernel.api.exceptions.EntityNotFoundException;
import org.neo4j.kernel.api.properties.Property; import org.neo4j.values.Value;


/** /**
* Used by the {@link IndexPopulator} for verifying constraints, if need be. * Used by the {@link IndexPopulator} for verifying constraints, if need be.
*/ */
public interface PropertyAccessor public interface PropertyAccessor
{ {
Property getProperty( long nodeId, int propertyKeyId ) throws EntityNotFoundException; Value getPropertyValue( long nodeId, int propertyKeyId ) throws EntityNotFoundException;
} }

0 comments on commit 55d72a3

Please sign in to comment.