diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/StateHandlingStatementOperations.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/StateHandlingStatementOperations.java
index 06030ace91c7e..3342f0efdad61 100644
--- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/StateHandlingStatementOperations.java
+++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/StateHandlingStatementOperations.java
@@ -829,19 +829,20 @@ public long nodeGetFromUniqueIndexSeek(
KernelStatement state, SchemaIndexDescriptor index, IndexQuery.ExactPredicate... query )
throws IndexNotFoundKernelException, IndexNotApplicableKernelException
{
- IndexReader reader = state.getStoreStatement().getFreshIndexReader( index );
-
- /* Here we have an intricate scenario where we need to return the PrimitiveLongIterator
- * since subsequent filtering will happen outside, but at the same time have the ability to
- * close the IndexReader when done iterating over the lookup result. This is because we get
- * a fresh reader that isn't associated with the current transaction and hence will not be
- * automatically closed. */
- PrimitiveLongResourceIterator committed = resourceIterator( reader.query( query ), reader );
- PrimitiveLongResourceIterator exactMatches = reader.hasFullValuePrecision( query )
- ? committed : LookupFilter.exactIndexMatches( this, state, committed, query );
- PrimitiveLongIterator changesFiltered =
- filterIndexStateChangesForSeek( state, exactMatches, index, IndexQuery.asValueTuple( query ) );
- return single( resourceIterator( changesFiltered, committed ), NO_SUCH_NODE );
+ try ( IndexReader reader = state.getStoreStatement().getFreshIndexReader( index ) )
+ {
+ /* Here we have an intricate scenario where we need to return the PrimitiveLongIterator
+ * since subsequent filtering will happen outside, but at the same time have the ability to
+ * close the IndexReader when done iterating over the lookup result. This is because we get
+ * a fresh reader that isn't associated with the current transaction and hence will not be
+ * automatically closed. */
+ PrimitiveLongResourceIterator committed = reader.query( query );
+ PrimitiveLongResourceIterator exactMatches = reader.hasFullValuePrecision( query )
+ ? committed : LookupFilter.exactIndexMatches( this, state, committed, query );
+ PrimitiveLongResourceIterator changesFiltered =
+ filterIndexStateChangesForSeek( state, exactMatches, index, IndexQuery.asValueTuple( query ) );
+ return single( resourceIterator( changesFiltered, committed ), NO_SUCH_NODE );
+ }
}
@Override
diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/TxState.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/TxState.java
index e475955f2468d..e3978cdc9e7c4 100644
--- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/TxState.java
+++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/TxState.java
@@ -33,7 +33,6 @@
import org.neo4j.collection.primitive.PrimitiveIntSet;
import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.collection.primitive.PrimitiveLongObjectMap;
-import org.neo4j.collection.primitive.PrimitiveLongResourceIterator;
import org.neo4j.collection.primitive.PrimitiveLongSet;
import org.neo4j.cursor.Cursor;
import org.neo4j.helpers.collection.Iterables;
@@ -1264,7 +1263,7 @@ private PropertyChanges nodePropertyChanges()
}
@Override
- public PrimitiveLongResourceIterator augmentNodesGetAll( PrimitiveLongIterator committed )
+ public PrimitiveLongIterator augmentNodesGetAll( PrimitiveLongIterator committed )
{
return addedAndRemovedNodes().augment( committed );
}
diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingIntIterator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingIntIterator.java
deleted file mode 100644
index 4cd2041d98018..0000000000000
--- a/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingIntIterator.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (c) 2002-2018 "Neo Technology,"
- * Network Engine for Objects in Lund AB [http://neotechnology.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 .
- */
-package org.neo4j.kernel.impl.util.diffsets;
-
-import java.util.Iterator;
-import java.util.Set;
-
-import org.neo4j.collection.primitive.PrimitiveIntCollections.PrimitiveIntBaseIterator;
-import org.neo4j.collection.primitive.PrimitiveIntIterator;
-import org.neo4j.graphdb.Resource;
-
-/**
- * Please dedup with {@link DiffApplyingLongIterator}
- * Applies a diffset to the given source PrimitiveIntIterator.
- * If the given source is a Resource, then so is this DiffApplyingPrimitiveIntIterator.
- */
-public final class DiffApplyingIntIterator extends PrimitiveIntBaseIterator implements Resource
-{
- private enum Phase
- {
- FILTERED_SOURCE
- {
- @Override
- boolean fetchNext( DiffApplyingIntIterator self )
- {
- return self.computeNextFromSourceAndFilter();
- }
- },
-
- ADDED_ELEMENTS
- {
- @Override
- boolean fetchNext( DiffApplyingIntIterator self )
- {
- return self.computeNextFromAddedElements();
- }
- },
-
- NO_ADDED_ELEMENTS
- {
- @Override
- boolean fetchNext( DiffApplyingIntIterator self )
- {
- return false;
- }
- };
-
- abstract boolean fetchNext( DiffApplyingIntIterator self );
- }
-
- private final PrimitiveIntIterator source;
- private final Iterator> addedElementsIterator;
- private final Set> addedElements;
- private final Set> removedElements;
- private Phase phase;
-
- public DiffApplyingIntIterator( PrimitiveIntIterator source,
- Set> addedElements, Set> removedElements )
- {
- this.source = source;
- this.addedElements = addedElements;
- this.addedElementsIterator = addedElements.iterator();
- this.removedElements = removedElements;
- phase = Phase.FILTERED_SOURCE;
- }
-
- @Override
- protected boolean fetchNext()
- {
- return phase.fetchNext( this );
- }
-
- private boolean computeNextFromSourceAndFilter()
- {
- while ( source.hasNext() )
- {
- int value = source.next();
- if ( !removedElements.contains( value ) && !addedElements.contains( value ) )
- {
- return next( value );
- }
- }
- transitionToAddedElements();
- return phase.fetchNext( this );
- }
-
- private void transitionToAddedElements()
- {
- phase = !addedElementsIterator.hasNext() ? Phase.NO_ADDED_ELEMENTS : Phase.ADDED_ELEMENTS;
- }
-
- private boolean computeNextFromAddedElements()
- {
- return addedElementsIterator.hasNext() && next( (Integer) addedElementsIterator.next() );
- }
-
- @Override
- public void close()
- {
- if ( source instanceof Resource )
- {
- ((Resource) source).close();
- }
- }
-}
diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingLongIterator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingLongIterator.java
index 2ef9adeabdaf0..6b7013937cf47 100644
--- a/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingLongIterator.java
+++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingLongIterator.java
@@ -21,6 +21,7 @@
import java.util.Iterator;
import java.util.Set;
+import javax.annotation.Nullable;
import org.neo4j.collection.primitive.PrimitiveLongCollections.PrimitiveLongBaseIterator;
import org.neo4j.collection.primitive.PrimitiveLongIterator;
@@ -32,7 +33,7 @@
* If the given source is a Resource, then so is this DiffApplyingPrimitiveLongIterator.
*/
-public class DiffApplyingLongIterator extends PrimitiveLongBaseIterator implements PrimitiveLongResourceIterator
+class DiffApplyingLongIterator extends PrimitiveLongBaseIterator implements PrimitiveLongResourceIterator
{
protected enum Phase
{
@@ -70,15 +71,28 @@ boolean fetchNext( DiffApplyingLongIterator self )
private final Iterator> addedElementsIterator;
private final Set> addedElements;
private final Set> removedElements;
+ @Nullable
+ private final Resource resource;
protected Phase phase;
- DiffApplyingLongIterator( PrimitiveLongIterator source, Set> addedElements, Set> removedElements )
+ DiffApplyingLongIterator( PrimitiveLongIterator source, Set> addedElements, Set> removedElements, @Nullable Resource resource )
{
this.source = source;
this.addedElements = addedElements;
this.addedElementsIterator = addedElements.iterator();
this.removedElements = removedElements;
- phase = Phase.FILTERED_SOURCE;
+ this.resource = resource;
+ this.phase = Phase.FILTERED_SOURCE;
+ }
+
+ static PrimitiveLongIterator augment( PrimitiveLongIterator source, Set> addedElements, Set> removedElements )
+ {
+ return new DiffApplyingLongIterator( source, addedElements, removedElements, null );
+ }
+
+ static PrimitiveLongResourceIterator augment( PrimitiveLongResourceIterator source, Set> addedElements, Set> removedElements )
+ {
+ return new DiffApplyingLongIterator( source, addedElements, removedElements, source );
}
@Override
@@ -103,20 +117,20 @@ private boolean computeNextFromSourceAndFilter()
private void transitionToAddedElements()
{
- phase = !addedElementsIterator.hasNext() ? Phase.NO_ADDED_ELEMENTS : Phase.ADDED_ELEMENTS;
+ phase = addedElementsIterator.hasNext() ? Phase.ADDED_ELEMENTS : Phase.NO_ADDED_ELEMENTS;
}
private boolean computeNextFromAddedElements()
{
- return addedElementsIterator.hasNext() && next((Long) addedElementsIterator.next());
+ return addedElementsIterator.hasNext() && next( (Long) addedElementsIterator.next() );
}
@Override
public void close()
{
- if ( source instanceof Resource )
+ if ( resource != null )
{
- ((Resource) source).close();
+ resource.close();
}
}
}
diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingPrimitiveLongIterator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingPrimitiveLongIterator.java
index 96ac034cb44a7..b8e32cf31c1af 100644
--- a/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingPrimitiveLongIterator.java
+++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingPrimitiveLongIterator.java
@@ -19,16 +19,18 @@
*/
package org.neo4j.kernel.impl.util.diffsets;
+import javax.annotation.Nullable;
+
import org.neo4j.collection.primitive.PrimitiveLongCollections.PrimitiveLongBaseIterator;
import org.neo4j.collection.primitive.PrimitiveLongIterator;
+import org.neo4j.collection.primitive.PrimitiveLongResourceIterator;
import org.neo4j.collection.primitive.PrimitiveLongSet;
import org.neo4j.graphdb.Resource;
/**
* Applies a diffset to the provided {@link PrimitiveLongIterator}.
- * If the given source is a {@link Resource}, it will be closed on {@link #close()}.
*/
-public class DiffApplyingPrimitiveLongIterator extends PrimitiveLongBaseIterator implements Resource
+class DiffApplyingPrimitiveLongIterator extends PrimitiveLongBaseIterator implements PrimitiveLongResourceIterator
{
protected enum Phase
{
@@ -66,16 +68,29 @@ boolean fetchNext( DiffApplyingPrimitiveLongIterator self )
private final PrimitiveLongIterator addedElementsIterator;
private final PrimitiveLongSet addedElements;
private final PrimitiveLongSet removedElements;
- protected Phase phase;
+ @Nullable
+ private final Resource resource;
+ private Phase phase;
- DiffApplyingPrimitiveLongIterator( PrimitiveLongIterator source, PrimitiveLongSet addedElements,
- PrimitiveLongSet removedElements )
+ private DiffApplyingPrimitiveLongIterator( PrimitiveLongIterator source, PrimitiveLongSet addedElements, PrimitiveLongSet removedElements,
+ @Nullable Resource resource )
{
this.source = source;
this.addedElements = addedElements;
this.addedElementsIterator = addedElements.iterator();
this.removedElements = removedElements;
- phase = Phase.FILTERED_SOURCE;
+ this.resource = resource;
+ this.phase = Phase.FILTERED_SOURCE;
+ }
+
+ static PrimitiveLongIterator augment( PrimitiveLongIterator source, PrimitiveLongSet addedElements, PrimitiveLongSet removedElements )
+ {
+ return new DiffApplyingPrimitiveLongIterator( source, addedElements, removedElements, null );
+ }
+
+ static PrimitiveLongResourceIterator augment( PrimitiveLongResourceIterator source, PrimitiveLongSet addedElements, PrimitiveLongSet removedElements )
+ {
+ return new DiffApplyingPrimitiveLongIterator( source, addedElements, removedElements, source );
}
@Override
@@ -100,7 +115,7 @@ private boolean computeNextFromSourceAndFilter()
private void transitionToAddedElements()
{
- phase = !addedElementsIterator.hasNext() ? Phase.NO_ADDED_ELEMENTS : Phase.ADDED_ELEMENTS;
+ phase = addedElementsIterator.hasNext() ? Phase.ADDED_ELEMENTS : Phase.NO_ADDED_ELEMENTS;
}
private boolean computeNextFromAddedElements()
@@ -111,9 +126,9 @@ private boolean computeNextFromAddedElements()
@Override
public void close()
{
- if ( source instanceof Resource )
+ if ( resource != null )
{
- ((Resource) source).close();
+ resource.close();
}
}
}
diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingRelationshipIterator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingRelationshipIterator.java
index 9b8c17e62f335..7d941f77ca1fa 100644
--- a/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingRelationshipIterator.java
+++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingRelationshipIterator.java
@@ -29,16 +29,14 @@
* Applies a diffset to the given source {@link RelationshipIterator}.
* If the given source is a {@link Resource}, then so is this {@link DiffApplyingRelationshipIterator}.
*/
-public class DiffApplyingRelationshipIterator extends DiffApplyingLongIterator implements RelationshipIterator
+class DiffApplyingRelationshipIterator extends DiffApplyingLongIterator implements RelationshipIterator
{
private final RelationshipVisitor.Home sourceHome;
private final RelationshipVisitor.Home addedHome;
- public DiffApplyingRelationshipIterator( RelationshipIterator source,
- Set> addedElements, Set> removedElements,
- RelationshipVisitor.Home addedHome )
+ DiffApplyingRelationshipIterator( RelationshipIterator source, Set> addedElements, Set> removedElements, RelationshipVisitor.Home addedHome )
{
- super( source, addedElements, removedElements );
+ super( source, addedElements, removedElements, null );
this.sourceHome = source;
this.addedHome = addedHome;
}
diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/DiffSets.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/DiffSets.java
index 0173735fe4e52..22145dc612538 100644
--- a/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/DiffSets.java
+++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/DiffSets.java
@@ -23,7 +23,6 @@
import java.util.Set;
import java.util.function.Predicate;
-import org.neo4j.collection.primitive.PrimitiveIntIterator;
import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.collection.primitive.PrimitiveLongResourceIterator;
import org.neo4j.helpers.collection.Iterables;
@@ -37,7 +36,7 @@
*
* @param type of elements
*/
-public class DiffSets extends SuperDiffSets implements ReadableDiffSets
+public class DiffSets extends SuperDiffSets implements ReadableDiffSets
{
public DiffSets()
{
@@ -50,21 +49,21 @@ public DiffSets( Set addedElements, Set removedElements )
}
@Override
- public PrimitiveLongResourceIterator augment( final PrimitiveLongIterator source )
+ public PrimitiveLongIterator augment( final PrimitiveLongIterator source )
{
- return new DiffApplyingLongIterator( source, added( false ), removed( false ) );
+ return DiffApplyingLongIterator.augment( source, added( false ), removed( false ) );
}
@Override
- public PrimitiveIntIterator augment( final PrimitiveIntIterator source )
+ public PrimitiveLongResourceIterator augment( PrimitiveLongResourceIterator source )
{
- return new DiffApplyingIntIterator( source, added( false ), removed( false ) );
+ return DiffApplyingLongIterator.augment( source, added( false ), removed( false ) );
}
@Override
- public PrimitiveLongResourceIterator augmentWithRemovals( final PrimitiveLongIterator source )
+ public PrimitiveLongResourceIterator augmentWithRemovals( PrimitiveLongResourceIterator source )
{
- return new DiffApplyingLongIterator( source, Collections.emptySet(), removed( false ) );
+ return DiffApplyingLongIterator.augment( source, Collections.emptySet(), removed( false ) );
}
@Override
diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/PrimitiveLongDiffSets.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/PrimitiveLongDiffSets.java
index 698caa970a276..7c857236e210b 100644
--- a/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/PrimitiveLongDiffSets.java
+++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/PrimitiveLongDiffSets.java
@@ -23,6 +23,7 @@
import java.util.Objects;
import org.neo4j.collection.primitive.PrimitiveLongIterator;
+import org.neo4j.collection.primitive.PrimitiveLongResourceIterator;
import org.neo4j.collection.primitive.PrimitiveLongSet;
import org.neo4j.kernel.impl.util.collection.CollectionsFactory;
import org.neo4j.kernel.impl.util.collection.OnHeapCollectionsFactory;
@@ -115,7 +116,13 @@ public void visit( PrimitiveLongDiffSetsVisitor visitor )
@Override
public PrimitiveLongIterator augment( PrimitiveLongIterator source )
{
- return new DiffApplyingPrimitiveLongIterator( source, addedElements, removedElements );
+ return DiffApplyingPrimitiveLongIterator.augment( source, addedElements, removedElements );
+ }
+
+ @Override
+ public PrimitiveLongResourceIterator augment( PrimitiveLongResourceIterator source )
+ {
+ return DiffApplyingPrimitiveLongIterator.augment( source, addedElements, removedElements );
}
@Override
diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/RelationshipDiffSets.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/RelationshipDiffSets.java
index a94d0026314e7..f3a77b9b728d0 100644
--- a/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/RelationshipDiffSets.java
+++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/RelationshipDiffSets.java
@@ -23,7 +23,6 @@
import java.util.Set;
import java.util.function.Predicate;
-import org.neo4j.collection.primitive.PrimitiveIntIterator;
import org.neo4j.helpers.collection.Iterables;
import org.neo4j.kernel.impl.api.RelationshipVisitor;
import org.neo4j.kernel.impl.api.RelationshipVisitor.Home;
@@ -38,18 +37,16 @@
*
* @param type of elements
*/
-public class RelationshipDiffSets extends SuperDiffSets
- implements ReadableRelationshipDiffSets
+public class RelationshipDiffSets extends SuperDiffSets implements ReadableRelationshipDiffSets
{
- private Home txStateRelationshipHome;
+ private final Home txStateRelationshipHome;
public RelationshipDiffSets( RelationshipVisitor.Home txStateRelationshipHome )
{
this( txStateRelationshipHome, null, null );
}
- public RelationshipDiffSets( RelationshipVisitor.Home txStateRelationshipHome,
- Set addedElements, Set removedElements )
+ private RelationshipDiffSets( RelationshipVisitor.Home txStateRelationshipHome, Set addedElements, Set removedElements )
{
super( addedElements, removedElements );
this.txStateRelationshipHome = txStateRelationshipHome;
@@ -61,12 +58,6 @@ public RelationshipIterator augment( final RelationshipIterator source )
return new DiffApplyingRelationshipIterator( source, added( false ), removed( false ), txStateRelationshipHome );
}
- @Override
- public PrimitiveIntIterator augment( final PrimitiveIntIterator source )
- {
- return new DiffApplyingIntIterator( source, added( false ), removed( false ) );
- }
-
@Override
public RelationshipIterator augmentWithRemovals( final RelationshipIterator source )
{
diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/SuperDiffSets.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/SuperDiffSets.java
index 820594de375c8..874d4ca9413e9 100644
--- a/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/SuperDiffSets.java
+++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/util/diffsets/SuperDiffSets.java
@@ -40,8 +40,7 @@
* Super class of readable diffsets where use of {@link PrimitiveLongIterator} can be parameterized
* to a specific subclass instead.
*/
-abstract class SuperDiffSets
- implements SuperReadableDiffSets
+abstract class SuperDiffSets implements SuperReadableDiffSets
{
private Set addedElements;
private Set removedElements;
diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/PrimitiveLongReadableDiffSets.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/PrimitiveLongReadableDiffSets.java
index a7db20f32eb95..8cbb095d6a515 100644
--- a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/PrimitiveLongReadableDiffSets.java
+++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/PrimitiveLongReadableDiffSets.java
@@ -20,6 +20,7 @@
package org.neo4j.storageengine.api.txstate;
import org.neo4j.collection.primitive.PrimitiveLongIterator;
+import org.neo4j.collection.primitive.PrimitiveLongResourceIterator;
import org.neo4j.collection.primitive.PrimitiveLongSet;
import static org.neo4j.collection.primitive.PrimitiveLongCollections.emptySet;
@@ -81,6 +82,12 @@ public PrimitiveLongIterator augment( PrimitiveLongIterator elements )
{
return elements;
}
+
+ @Override
+ public PrimitiveLongResourceIterator augment( PrimitiveLongResourceIterator elements )
+ {
+ return elements;
+ }
};
/**
@@ -134,4 +141,13 @@ public PrimitiveLongIterator augment( PrimitiveLongIterator elements )
* @return iterator that will iterate over augmented elements as well as over diff set
*/
PrimitiveLongIterator augment( PrimitiveLongIterator elements );
+
+ /**
+ * Augment current diff sets with elements. Provided element will be augmented if diffset
+ * does not remove and add that specific element.
+ *
+ * @param elements elements to augment with
+ * @return iterator that will iterate over augmented elements as well as over diff set
+ */
+ PrimitiveLongResourceIterator augment( PrimitiveLongResourceIterator elements );
}
diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableDiffSets.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableDiffSets.java
index 449c857789e62..3fbab7c3a30c2 100644
--- a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableDiffSets.java
+++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableDiffSets.java
@@ -24,15 +24,13 @@
import java.util.Set;
import java.util.function.Predicate;
-import org.neo4j.collection.primitive.PrimitiveIntIterator;
-import org.neo4j.collection.primitive.PrimitiveLongCollections;
import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.collection.primitive.PrimitiveLongResourceIterator;
/**
* {@link SuperReadableDiffSets} with added method for filtering added items.
*/
-public interface ReadableDiffSets extends SuperReadableDiffSets
+public interface ReadableDiffSets extends SuperReadableDiffSets
{
@Override
ReadableDiffSets filterAdded( Predicate addedFilter );
@@ -106,21 +104,21 @@ public int delta()
}
@Override
- public PrimitiveLongResourceIterator augment( PrimitiveLongIterator source )
+ public PrimitiveLongIterator augment( PrimitiveLongIterator source )
{
- return primitiveLongResourceIterator( source );
+ return source;
}
@Override
- public PrimitiveIntIterator augment( PrimitiveIntIterator source )
+ public PrimitiveLongResourceIterator augment( PrimitiveLongResourceIterator source )
{
return source;
}
@Override
- public PrimitiveLongResourceIterator augmentWithRemovals( PrimitiveLongIterator source )
+ public PrimitiveLongResourceIterator augmentWithRemovals( PrimitiveLongResourceIterator source )
{
- return primitiveLongResourceIterator( source );
+ return source;
}
@Override
@@ -133,17 +131,5 @@ public ReadableDiffSets filterAdded( Predicate addedFilter )
public void accept( DiffSetsVisitor visitor )
{
}
-
- private PrimitiveLongResourceIterator primitiveLongResourceIterator( PrimitiveLongIterator source )
- {
- if ( source instanceof PrimitiveLongResourceIterator )
- {
- return (PrimitiveLongResourceIterator) source;
- }
- else
- {
- return PrimitiveLongCollections.resourceIterator( source, null );
- }
- }
}
}
diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableRelationshipDiffSets.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableRelationshipDiffSets.java
index 15a3f549091eb..a6ae8cd0d794a 100644
--- a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableRelationshipDiffSets.java
+++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableRelationshipDiffSets.java
@@ -24,13 +24,14 @@
import java.util.Set;
import java.util.function.Predicate;
-import org.neo4j.collection.primitive.PrimitiveIntIterator;
+import org.neo4j.collection.primitive.PrimitiveLongIterator;
+import org.neo4j.collection.primitive.PrimitiveLongResourceIterator;
import org.neo4j.kernel.impl.api.store.RelationshipIterator;
/**
* {@link SuperReadableDiffSets} with added method for filtering added relationships.
*/
-public interface ReadableRelationshipDiffSets extends SuperReadableDiffSets
+public interface ReadableRelationshipDiffSets extends SuperReadableDiffSets
{
@Override
ReadableRelationshipDiffSets filterAdded( Predicate addedFilter );
@@ -105,12 +106,6 @@ public RelationshipIterator augment( RelationshipIterator source )
return source;
}
- @Override
- public PrimitiveIntIterator augment( PrimitiveIntIterator source )
- {
- return source;
- }
-
@Override
public RelationshipIterator augmentWithRemovals( RelationshipIterator source )
{
@@ -128,4 +123,26 @@ public void accept( DiffSetsVisitor visitor )
{
}
}
+
+ RelationshipIterator augment( RelationshipIterator source );
+
+ RelationshipIterator augmentWithRemovals( RelationshipIterator source );
+
+ @Override
+ default PrimitiveLongIterator augment( PrimitiveLongIterator source )
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ default PrimitiveLongResourceIterator augment( PrimitiveLongResourceIterator source )
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ default PrimitiveLongResourceIterator augmentWithRemovals( PrimitiveLongResourceIterator source )
+ {
+ throw new UnsupportedOperationException();
+ }
}
diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableTransactionState.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableTransactionState.java
index 1ec7aefb4f58a..8ca5f0197b974 100644
--- a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableTransactionState.java
+++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableTransactionState.java
@@ -23,7 +23,6 @@
import org.neo4j.collection.primitive.PrimitiveIntSet;
import org.neo4j.collection.primitive.PrimitiveLongIterator;
-import org.neo4j.collection.primitive.PrimitiveLongResourceIterator;
import org.neo4j.cursor.Cursor;
import org.neo4j.internal.kernel.api.IndexQuery;
import org.neo4j.internal.kernel.api.exceptions.schema.ConstraintValidationException;
@@ -110,7 +109,7 @@ public interface ReadableTransactionState
int augmentNodeDegree( long node, int committedDegree, Direction direction, int relType );
- PrimitiveLongResourceIterator augmentNodesGetAll( PrimitiveLongIterator committed );
+ PrimitiveLongIterator augmentNodesGetAll( PrimitiveLongIterator committed );
RelationshipIterator augmentRelationshipsGetAll( RelationshipIterator committed );
diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/SuperReadableDiffSets.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/SuperReadableDiffSets.java
index 420dc4c5ae51d..3a8119a356350 100644
--- a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/SuperReadableDiffSets.java
+++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/SuperReadableDiffSets.java
@@ -23,8 +23,8 @@
import java.util.Set;
import java.util.function.Predicate;
-import org.neo4j.collection.primitive.PrimitiveIntIterator;
import org.neo4j.collection.primitive.PrimitiveLongIterator;
+import org.neo4j.collection.primitive.PrimitiveLongResourceIterator;
import org.neo4j.internal.kernel.api.exceptions.schema.ConstraintValidationException;
import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException;
@@ -32,7 +32,7 @@
* Super class of diff sets where use of {@link PrimitiveLongIterator} can be parameterized
* to a specific subclass instead.
*/
-public interface SuperReadableDiffSets
+public interface SuperReadableDiffSets
{
boolean isAdded( T elem );
@@ -50,13 +50,13 @@ public interface SuperReadableDiffSets filterAdded( Predicate addedFilter );
+ SuperReadableDiffSets filterAdded( Predicate addedFilter );
void accept( DiffSetsVisitor visitor ) throws ConstraintValidationException, CreateConstraintFailureException;
}
diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingLongIteratorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingLongIteratorTest.java
new file mode 100644
index 0000000000000..89ed2de2fa479
--- /dev/null
+++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingLongIteratorTest.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2002-2018 "Neo Technology,"
+ * Network Engine for Objects in Lund AB [http://neotechnology.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 .
+ */
+
+package org.neo4j.kernel.impl.util.diffsets;
+
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import org.neo4j.collection.primitive.PrimitiveLongResourceIterator;
+import org.neo4j.graphdb.Resource;
+
+import static java.util.Collections.emptySet;
+import static org.neo4j.collection.primitive.PrimitiveLongCollections.emptyIterator;
+import static org.neo4j.collection.primitive.PrimitiveLongCollections.resourceIterator;
+
+public class DiffApplyingLongIteratorTest
+{
+ @Test
+ public void closeResource()
+ {
+ Resource resource = Mockito.mock( Resource.class );
+ PrimitiveLongResourceIterator source = resourceIterator( emptyIterator(), resource );
+
+ PrimitiveLongResourceIterator iterator = DiffApplyingLongIterator.augment( source, emptySet(), emptySet() );
+
+ iterator.close();
+
+ Mockito.verify( resource ).close();
+ }
+}
diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingPrimitiveLongIteratorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingPrimitiveLongIteratorTest.java
index df03110b50427..11f745fee502f 100644
--- a/community/kernel/src/test/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingPrimitiveLongIteratorTest.java
+++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/util/diffsets/DiffApplyingPrimitiveLongIteratorTest.java
@@ -21,11 +21,14 @@
import org.apache.commons.lang3.ArrayUtils;
import org.junit.Test;
+import org.mockito.Mockito;
import java.util.Set;
import org.neo4j.collection.primitive.PrimitiveLongIterator;
+import org.neo4j.collection.primitive.PrimitiveLongResourceIterator;
import org.neo4j.collection.primitive.PrimitiveLongSet;
+import org.neo4j.graphdb.Resource;
import static org.hamcrest.Matchers.arrayContainingInAnyOrder;
import static org.hamcrest.Matchers.arrayWithSize;
@@ -33,7 +36,9 @@
import static org.junit.Assert.assertThat;
import static org.neo4j.collection.primitive.PrimitiveLongCollections.asArray;
import static org.neo4j.collection.primitive.PrimitiveLongCollections.emptyIterator;
+import static org.neo4j.collection.primitive.PrimitiveLongCollections.emptySet;
import static org.neo4j.collection.primitive.PrimitiveLongCollections.iterator;
+import static org.neo4j.collection.primitive.PrimitiveLongCollections.resourceIterator;
import static org.neo4j.collection.primitive.PrimitiveLongCollections.setOf;
import static org.neo4j.collection.primitive.PrimitiveLongCollections.toSet;
@@ -46,7 +51,7 @@ public void iterateOnlyOverAddedElementsWhenSourceIsEmpty()
PrimitiveLongSet added = setOf( 1L, 2L );
PrimitiveLongSet removed = setOf( 3L );
- DiffApplyingPrimitiveLongIterator iterator = createIterator( emptySource, added, removed );
+ PrimitiveLongIterator iterator = DiffApplyingPrimitiveLongIterator.augment( emptySource, added, removed );
Set resultSet = toSet( iterator );
assertThat( resultSet, containsInAnyOrder(1L, 2L) );
}
@@ -58,7 +63,7 @@ public void appendSourceElementsDuringIteration()
PrimitiveLongSet added = setOf( 1L, 2L );
PrimitiveLongSet removed = setOf( 3L );
- DiffApplyingPrimitiveLongIterator iterator = createIterator( source, added, removed );
+ PrimitiveLongIterator iterator = DiffApplyingPrimitiveLongIterator.augment( source, added, removed );
Set resultSet = toSet( iterator );
assertThat( resultSet, containsInAnyOrder(1L, 2L, 4L, 5L) );
}
@@ -70,7 +75,7 @@ public void doNotIterateTwiceOverSameElementsWhenItsPartOfSourceAndAdded()
PrimitiveLongSet added = setOf( 1L, 4L );
PrimitiveLongSet removed = setOf( 3L );
- DiffApplyingPrimitiveLongIterator iterator = createIterator( source, added, removed );
+ PrimitiveLongIterator iterator = DiffApplyingPrimitiveLongIterator.augment( source, added, removed );
Long[] values = ArrayUtils.toObject( asArray( iterator ) );
assertThat( values, arrayContainingInAnyOrder( 1L, 4L, 5L ) );
assertThat( values, arrayWithSize( 3 ) );
@@ -83,14 +88,21 @@ public void doNotIterateOverDeletedElement()
PrimitiveLongSet added = setOf( 1L );
PrimitiveLongSet removed = setOf( 3L );
- DiffApplyingPrimitiveLongIterator iterator = createIterator( source, added, removed );
+ PrimitiveLongIterator iterator = DiffApplyingPrimitiveLongIterator.augment( source, added, removed );
Set resultSet = toSet( iterator );
assertThat( resultSet, containsInAnyOrder(1L, 5L) );
}
- private DiffApplyingPrimitiveLongIterator createIterator( PrimitiveLongIterator source, PrimitiveLongSet added,
- PrimitiveLongSet removed )
+ @Test
+ public void closeResource()
{
- return new DiffApplyingPrimitiveLongIterator( source, added, removed );
+ Resource resource = Mockito.mock( Resource.class );
+ PrimitiveLongResourceIterator source = resourceIterator( emptyIterator(), resource );
+
+ PrimitiveLongResourceIterator iterator = DiffApplyingPrimitiveLongIterator.augment( source, emptySet(), emptySet() );
+
+ iterator.close();
+
+ Mockito.verify( resource ).close();
}
}