Skip to content

Commit

Permalink
Implement offheap map for storing properties in tx state
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrei Koval committed Jul 31, 2018
1 parent 8e32ca0 commit 8cfa04b
Show file tree
Hide file tree
Showing 13 changed files with 2,749 additions and 23 deletions.

Large diffs are not rendered by default.

Expand Up @@ -20,11 +20,10 @@
package org.neo4j.kernel.impl.api.state;

import org.eclipse.collections.api.IntIterable;
import org.eclipse.collections.api.map.primitive.IntObjectMap;
import org.eclipse.collections.api.map.primitive.MutableIntObjectMap;
import org.eclipse.collections.api.map.primitive.LongObjectMap;
import org.eclipse.collections.api.map.primitive.MutableLongObjectMap;
import org.eclipse.collections.api.set.primitive.MutableLongSet;
import org.eclipse.collections.impl.factory.primitive.IntSets;
import org.eclipse.collections.impl.map.mutable.primitive.IntObjectHashMap;

import java.util.Iterator;

Expand All @@ -35,16 +34,17 @@
import org.neo4j.storageengine.api.txstate.PropertyContainerState;
import org.neo4j.values.storable.Value;

import static java.lang.Math.toIntExact;
import static java.util.Collections.emptyIterator;
import static java.util.Objects.requireNonNull;

class PropertyContainerStateImpl implements PropertyContainerState
{
final CollectionsFactory collectionsFactory;
private final CollectionsFactory collectionsFactory;
private final long id;

private MutableIntObjectMap<Value> addedProperties;
private MutableIntObjectMap<Value> changedProperties;
private MutableLongObjectMap<Value> addedProperties;
private MutableLongObjectMap<Value> changedProperties;
private MutableLongSet removedProperties;

PropertyContainerStateImpl( long id, CollectionsFactory collectionsFactory )
Expand Down Expand Up @@ -84,7 +84,7 @@ void changeProperty( int propertyKeyId, Value value )

if ( changedProperties == null )
{
changedProperties = new IntObjectHashMap<>();
changedProperties = collectionsFactory.newValuesMap();
}
changedProperties.put( propertyKeyId, value );

Expand All @@ -105,7 +105,7 @@ void addProperty( int propertyKeyId, Value value )
}
if ( addedProperties == null )
{
addedProperties = new IntObjectHashMap<>();
addedProperties = collectionsFactory.newValuesMap();
}
addedProperties.put( propertyKeyId, value );
}
Expand Down Expand Up @@ -172,9 +172,10 @@ public boolean isPropertyChangedOrRemoved( int propertyKey )
|| (changedProperties != null && changedProperties.containsKey( propertyKey ));
}

private Iterator<StorageProperty> toPropertyIterator( IntObjectMap<Value> propertyMap )
private Iterator<StorageProperty> toPropertyIterator( LongObjectMap<Value> propertyMap )
{
return propertyMap == null ? emptyIterator()
: propertyMap.keyValuesView().collect( e -> (StorageProperty) new PropertyKeyValue( e.getOne(), e.getTwo() ) ).iterator();
: propertyMap.keyValuesView().collect(
e -> (StorageProperty) new PropertyKeyValue( toIntExact( e.getOne() ), e.getTwo() ) ).iterator();
}
}
@@ -0,0 +1,64 @@
/*
* Copyright (c) 2002-2018 "Neo4j,"
* Neo4j Sweden AB [http://neo4j.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 <http://www.gnu.org/licenses/>.
*/

package org.neo4j.kernel.impl.api.state;

import javax.annotation.Nonnull;

import org.neo4j.graphdb.Resource;
import org.neo4j.values.storable.Value;

/**
* A collection of values that associates a special {@code long} reference to each added value.
* Instances must be closed with {@link #close()} to release underlying resources.
*/
public interface ValuesContainer extends Resource
{
/**
* @param value value to add
* @return a reference associated with the value, that can be passed to {@link #get(long)} and {@link #remove(long)}
* @throws IllegalStateException if container is closed
*/
long add( @Nonnull Value value );

/**
* @param ref a reference obtained from {@link #add(Value)}
* @return a value associated with the reference
* @throws IllegalStateException if container is closed
* @throws IllegalArgumentException if reference is invalid or associated value was removed
*/
@Nonnull
Value get( long ref );

/**
* @param ref a reference obtained from {@link #add(Value)}
* @return a value associated with the reference
* @throws IllegalStateException if container is closed
* @throws IllegalArgumentException if reference is invalid or associated value was removed
*/
@Nonnull
Value remove( long ref );

/**
* Clears the container and releases all underlying resources.
* @throws IllegalStateException if container is closed
*/
void clear();
}

0 comments on commit 8cfa04b

Please sign in to comment.