Skip to content

Commit

Permalink
Separate read-only/mutable long diff sets interfaces and implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrei Koval committed May 16, 2018
1 parent 805b0a5 commit 819c686
Show file tree
Hide file tree
Showing 10 changed files with 241 additions and 212 deletions.
Expand Up @@ -336,7 +336,7 @@ void addIndexDiff( MutableLongDiffSets diff )
{ {
if ( indexDiffs == null ) if ( indexDiffs == null )
{ {
indexDiffs = Collections.newSetFromMap( new IdentityHashMap<MutableLongDiffSets, Boolean>() ); indexDiffs = Collections.newSetFromMap( new IdentityHashMap<>() );
} }
indexDiffs.add( diff ); indexDiffs.add( diff );
} }
Expand Down
Expand Up @@ -61,6 +61,7 @@
import org.neo4j.kernel.impl.util.collection.OnHeapCollectionsFactory; import org.neo4j.kernel.impl.util.collection.OnHeapCollectionsFactory;
import org.neo4j.kernel.impl.util.diffsets.DiffSets; import org.neo4j.kernel.impl.util.diffsets.DiffSets;
import org.neo4j.kernel.impl.util.diffsets.MutableLongDiffSets; import org.neo4j.kernel.impl.util.diffsets.MutableLongDiffSets;
import org.neo4j.kernel.impl.util.diffsets.MutableLongDiffSetsImpl;
import org.neo4j.kernel.impl.util.diffsets.RelationshipDiffSets; import org.neo4j.kernel.impl.util.diffsets.RelationshipDiffSets;
import org.neo4j.storageengine.api.Direction; import org.neo4j.storageengine.api.Direction;
import org.neo4j.storageengine.api.NodeItem; import org.neo4j.storageengine.api.NodeItem;
Expand Down Expand Up @@ -1002,7 +1003,7 @@ public LongDiffSets indexUpdatesForScan( SchemaIndexDescriptor descriptor )
{ {
return LongDiffSets.EMPTY; return LongDiffSets.EMPTY;
} }
MutableLongDiffSets diffs = new MutableLongDiffSets(); MutableLongDiffSetsImpl diffs = new MutableLongDiffSetsImpl();
for ( MutableLongDiffSets diffSet : updates.values() ) for ( MutableLongDiffSets diffSet : updates.values() )
{ {
diffs.addAll( diffSet.getAdded().longIterator() ); diffs.addAll( diffSet.getAdded().longIterator() );
Expand All @@ -1026,7 +1027,7 @@ public LongDiffSets indexUpdatesForSuffixOrContains( SchemaIndexDescriptor descr
{ {
return LongDiffSets.EMPTY; return LongDiffSets.EMPTY;
} }
MutableLongDiffSets diffs = new MutableLongDiffSets(); MutableLongDiffSetsImpl diffs = new MutableLongDiffSetsImpl();
for ( Map.Entry<ValueTuple, MutableLongDiffSets> entry : updates.entrySet() ) for ( Map.Entry<ValueTuple, MutableLongDiffSets> entry : updates.entrySet() )
{ {
if ( query.acceptsValue( entry.getKey().getOnlyValue() ) ) if ( query.acceptsValue( entry.getKey().getOnlyValue() ) )
Expand Down Expand Up @@ -1093,7 +1094,7 @@ public LongDiffSets indexUpdatesForRangeSeek( SchemaIndexDescriptor descriptor,
private LongDiffSets indexUpdatesForRangeSeek( TreeMap<ValueTuple, MutableLongDiffSets> sortedUpdates, ValueTuple lower, private LongDiffSets indexUpdatesForRangeSeek( TreeMap<ValueTuple, MutableLongDiffSets> sortedUpdates, ValueTuple lower,
boolean includeLower, ValueTuple upper, boolean includeUpper ) boolean includeLower, ValueTuple upper, boolean includeUpper )
{ {
MutableLongDiffSets diffs = new MutableLongDiffSets(); MutableLongDiffSetsImpl diffs = new MutableLongDiffSetsImpl();


Collection<MutableLongDiffSets> inRange = sortedUpdates.subMap( lower, includeLower, upper, includeUpper ).values(); Collection<MutableLongDiffSets> inRange = sortedUpdates.subMap( lower, includeLower, upper, includeUpper ).values();
for ( MutableLongDiffSets diffForSpecificValue : inRange ) for ( MutableLongDiffSets diffForSpecificValue : inRange )
Expand All @@ -1113,7 +1114,7 @@ public LongDiffSets indexUpdatesForRangeSeekByPrefix( SchemaIndexDescriptor desc
return LongDiffSets.EMPTY; return LongDiffSets.EMPTY;
} }
ValueTuple floor = ValueTuple.of( Values.stringValue( prefix ) ); ValueTuple floor = ValueTuple.of( Values.stringValue( prefix ) );
MutableLongDiffSets diffs = new MutableLongDiffSets(); MutableLongDiffSetsImpl diffs = new MutableLongDiffSetsImpl();
for ( Map.Entry<ValueTuple, MutableLongDiffSets> entry : sortedUpdates.tailMap( floor ).entrySet() ) for ( Map.Entry<ValueTuple, MutableLongDiffSets> entry : sortedUpdates.tailMap( floor ).entrySet() )
{ {
ValueTuple key = entry.getKey(); ValueTuple key = entry.getKey();
Expand Down Expand Up @@ -1209,7 +1210,7 @@ private MutableLongDiffSets getIndexUpdatesForSeek(
private MutableLongDiffSets getIndexUpdatesForSeek( Map<ValueTuple, MutableLongDiffSets> updates, private MutableLongDiffSets getIndexUpdatesForSeek( Map<ValueTuple, MutableLongDiffSets> updates,
ValueTuple values, boolean create ) ValueTuple values, boolean create )
{ {
return create ? updates.computeIfAbsent( values, value -> new MutableLongDiffSets() ) : updates.get( values ); return create ? updates.computeIfAbsent( values, value -> new MutableLongDiffSetsImpl() ) : updates.get( values );
} }


private Map<ValueTuple, MutableLongDiffSets> getIndexUpdatesByDescriptor( SchemaDescriptor schema, private Map<ValueTuple, MutableLongDiffSets> getIndexUpdatesByDescriptor( SchemaDescriptor schema,
Expand Down
Expand Up @@ -25,7 +25,7 @@
import org.eclipse.collections.api.set.primitive.MutableLongSet; import org.eclipse.collections.api.set.primitive.MutableLongSet;


import org.neo4j.kernel.impl.api.state.TxState; import org.neo4j.kernel.impl.api.state.TxState;
import org.neo4j.kernel.impl.util.diffsets.MutableLongDiffSets; import org.neo4j.kernel.impl.util.diffsets.MutableLongDiffSetsImpl;
import org.neo4j.memory.MemoryTracker; import org.neo4j.memory.MemoryTracker;


/** /**
Expand All @@ -42,7 +42,7 @@ public interface CollectionsFactory


<V> MutableIntObjectMap<V> newIntObjectMap(); <V> MutableIntObjectMap<V> newIntObjectMap();


MutableLongDiffSets newLongDiffSets(); MutableLongDiffSetsImpl newLongDiffSets();


MemoryTracker getMemoryTracker(); MemoryTracker getMemoryTracker();


Expand Down
Expand Up @@ -28,7 +28,7 @@
import org.eclipse.collections.impl.set.mutable.primitive.IntHashSet; import org.eclipse.collections.impl.set.mutable.primitive.IntHashSet;
import org.eclipse.collections.impl.set.mutable.primitive.LongHashSet; import org.eclipse.collections.impl.set.mutable.primitive.LongHashSet;


import org.neo4j.kernel.impl.util.diffsets.MutableLongDiffSets; import org.neo4j.kernel.impl.util.diffsets.MutableLongDiffSetsImpl;
import org.neo4j.memory.MemoryAllocationTracker; import org.neo4j.memory.MemoryAllocationTracker;
import org.neo4j.memory.MemoryTracker; import org.neo4j.memory.MemoryTracker;


Expand Down Expand Up @@ -68,9 +68,9 @@ public <V> MutableIntObjectMap<V> newIntObjectMap()
} }


@Override @Override
public MutableLongDiffSets newLongDiffSets() public MutableLongDiffSetsImpl newLongDiffSets()
{ {
return new MutableLongDiffSets( this ); return new MutableLongDiffSetsImpl( this );
} }


@Override @Override
Expand Down
Expand Up @@ -29,7 +29,7 @@
import org.eclipse.collections.impl.set.mutable.primitive.IntHashSet; import org.eclipse.collections.impl.set.mutable.primitive.IntHashSet;
import org.eclipse.collections.impl.set.mutable.primitive.LongHashSet; import org.eclipse.collections.impl.set.mutable.primitive.LongHashSet;


import org.neo4j.kernel.impl.util.diffsets.MutableLongDiffSets; import org.neo4j.kernel.impl.util.diffsets.MutableLongDiffSetsImpl;
import org.neo4j.memory.MemoryTracker; import org.neo4j.memory.MemoryTracker;


public class OnHeapCollectionsFactory implements CollectionsFactory public class OnHeapCollectionsFactory implements CollectionsFactory
Expand Down Expand Up @@ -66,9 +66,9 @@ public <V> MutableIntObjectMap<V> newIntObjectMap()
} }


@Override @Override
public MutableLongDiffSets newLongDiffSets() public MutableLongDiffSetsImpl newLongDiffSets()
{ {
return new MutableLongDiffSets( this ); return new MutableLongDiffSetsImpl( this );
} }


@Override @Override
Expand Down
Expand Up @@ -17,191 +17,25 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */

package org.neo4j.kernel.impl.util.diffsets; package org.neo4j.kernel.impl.util.diffsets;


import org.eclipse.collections.api.iterator.LongIterator; import org.eclipse.collections.api.iterator.LongIterator;
import org.eclipse.collections.api.set.primitive.MutableLongSet;
import org.eclipse.collections.impl.factory.primitive.LongSets;


import java.io.Closeable; import java.io.Closeable;
import java.util.Objects;


import org.neo4j.collection.PrimitiveLongResourceIterator;
import org.neo4j.kernel.impl.util.collection.CollectionsFactory;
import org.neo4j.kernel.impl.util.collection.OnHeapCollectionsFactory;
import org.neo4j.storageengine.api.txstate.LongDiffSets; import org.neo4j.storageengine.api.txstate.LongDiffSets;


/** public interface MutableLongDiffSets extends LongDiffSets, Closeable
* Primitive long version of collection that with given a sequence of add and removal operations, tracks
* which elements need to actually be added and removed at minimum from some
* target collection such that the result is equivalent to just
* executing the sequence of additions and removals in order.
*/
public class MutableLongDiffSets implements LongDiffSets, Closeable
{ {
private static final MutableLongSet NOT_INITIALIZED = LongSets.mutable.empty(); void removeAll( LongIterator elements );

private final CollectionsFactory collectionsFactory;
private MutableLongSet addedElements;
private MutableLongSet removedElements;

public MutableLongDiffSets()
{
this( NOT_INITIALIZED, NOT_INITIALIZED, OnHeapCollectionsFactory.INSTANCE );
}

public MutableLongDiffSets( MutableLongSet addedElements, MutableLongSet removedElements, CollectionsFactory collectionsFactory )
{
this.addedElements = addedElements;
this.removedElements = removedElements;
this.collectionsFactory = collectionsFactory;
}

public MutableLongDiffSets( CollectionsFactory collectionsFactory )
{
this( NOT_INITIALIZED, NOT_INITIALIZED, collectionsFactory );
}

@Override
public boolean isAdded( long element )
{
return addedElements.contains( element );
}

@Override
public boolean isRemoved( long element )
{
return removedElements.contains( element );
}

public void removeAll( LongIterator elementsToRemove )
{
checkRemovedElements();
while ( elementsToRemove.hasNext() )
{
removeElement( elementsToRemove.next() );
}
}

public void addAll( LongIterator elementsToAdd )
{
checkAddedElements();
while ( elementsToAdd.hasNext() )
{
addElement( elementsToAdd.next() );
}
}

public void add( long element )
{
checkAddedElements();
addElement( element );
}

public boolean remove( long element )
{
checkRemovedElements();
return removeElement( element );
}

@Override
public LongIterator augment( LongIterator source )
{
return DiffApplyingPrimitiveLongIterator.augment( source, addedElements, removedElements );
}

@Override
public PrimitiveLongResourceIterator augment( PrimitiveLongResourceIterator source )
{
return DiffApplyingPrimitiveLongIterator.augment( source, addedElements, removedElements );
}

@Override
public int delta()
{
return addedElements.size() - removedElements.size();
}

@Override
public MutableLongSet getAdded()
{
return addedElements;
}

@Override
public MutableLongSet getRemoved()
{
return removedElements;
}

@Override
public MutableLongSet getAddedSnapshot()
{
return addedElements.toSet();
}

@Override
public boolean isEmpty()
{
return addedElements.isEmpty() && removedElements.isEmpty();
}

@Override
public boolean equals( Object o )
{
if ( this == o )
{
return true;
}
if ( o == null || getClass() != o.getClass() )
{
return false;
}
MutableLongDiffSets diffSets = (MutableLongDiffSets) o;
return Objects.equals( addedElements, diffSets.addedElements ) &&
Objects.equals( removedElements, diffSets.removedElements );
}

@Override
public int hashCode()
{
return Objects.hash( addedElements, removedElements );
}

private void addElement( long element )
{
boolean removed = removedElements.remove( element );
if ( !removed )
{
addedElements.add( element );
}
}


private boolean removeElement( long element ) void addAll( LongIterator elements );
{
boolean removed = addedElements.remove( element );
return removed || removedElements.add( element );
}


private void checkAddedElements() void add( long element );
{
if ( addedElements == NOT_INITIALIZED )
{
addedElements = collectionsFactory.newLongSet();
}
}


private void checkRemovedElements() boolean remove( long element );
{
if ( removedElements == NOT_INITIALIZED )
{
removedElements = collectionsFactory.newLongSet();
}
}


@Override @Override
public void close() void close();
{
// nop
}
} }

0 comments on commit 819c686

Please sign in to comment.