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