Skip to content

Commit

Permalink
Let TxStateIndexChanges perform DESCENDING prefix and range seeks
Browse files Browse the repository at this point in the history
  • Loading branch information
fickludd committed Sep 17, 2018
1 parent c1f84e3 commit 57dea67
Show file tree
Hide file tree
Showing 3 changed files with 133 additions and 63 deletions.
Expand Up @@ -45,6 +45,15 @@


import static java.util.Arrays.stream; import static java.util.Arrays.stream;
import static org.neo4j.collection.PrimitiveLongCollections.mergeToSet; import static org.neo4j.collection.PrimitiveLongCollections.mergeToSet;
import static org.neo4j.kernel.impl.newapi.TxStateIndexChanges.indexUpdatesForRangeSeek;
import static org.neo4j.kernel.impl.newapi.TxStateIndexChanges.indexUpdatesForRangeSeekByPrefix;
import static org.neo4j.kernel.impl.newapi.TxStateIndexChanges.indexUpdatesForScan;
import static org.neo4j.kernel.impl.newapi.TxStateIndexChanges.indexUpdatesForSeek;
import static org.neo4j.kernel.impl.newapi.TxStateIndexChanges.indexUpdatesForSuffixOrContains;
import static org.neo4j.kernel.impl.newapi.TxStateIndexChanges.indexUpdatesWithValuesForRangeSeek;
import static org.neo4j.kernel.impl.newapi.TxStateIndexChanges.indexUpdatesWithValuesForRangeSeekByPrefix;
import static org.neo4j.kernel.impl.newapi.TxStateIndexChanges.indexUpdatesWithValuesForScan;
import static org.neo4j.kernel.impl.newapi.TxStateIndexChanges.indexUpdatesWithValuesForSuffixOrContains;
import static org.neo4j.kernel.impl.store.record.AbstractBaseRecord.NO_ID; import static org.neo4j.kernel.impl.store.record.AbstractBaseRecord.NO_ID;


final class DefaultNodeValueIndexCursor extends IndexCursor<IndexProgressor> final class DefaultNodeValueIndexCursor extends IndexCursor<IndexProgressor>
Expand Down Expand Up @@ -258,14 +267,13 @@ private void prefixQuery( IndexDescriptor descriptor, IndexQuery.StringPrefixPre


if ( needsValues ) if ( needsValues )
{ {
AddedWithValuesAndRemoved changes = AddedWithValuesAndRemoved changes = indexUpdatesWithValuesForRangeSeekByPrefix( txState, descriptor, predicate.prefix(), indexOrder );
TxStateIndexChanges.indexUpdatesWithValuesForRangeSeekByPrefix( txState, descriptor, predicate.prefix() );
addedWithValues = changes.added.iterator(); addedWithValues = changes.added.iterator();
removed = removed( txState, changes.removed ); removed = removed( txState, changes.removed );
} }
else else
{ {
AddedAndRemoved changes = TxStateIndexChanges.indexUpdatesForRangeSeekByPrefix( txState, descriptor, predicate.prefix() ); AddedAndRemoved changes = indexUpdatesForRangeSeekByPrefix( txState, descriptor, predicate.prefix(), indexOrder );
added = changes.added.longIterator(); added = changes.added.longIterator();
removed = removed( txState, changes.removed ); removed = removed( txState, changes.removed );
} }
Expand All @@ -286,15 +294,13 @@ private void rangeQuery( IndexDescriptor descriptor, IndexQuery.RangePredicate<?


if ( needsValues ) if ( needsValues )
{ {
AddedWithValuesAndRemoved changes = AddedWithValuesAndRemoved changes = indexUpdatesWithValuesForRangeSeek( txState, descriptor, predicate, indexOrder );
TxStateIndexChanges.indexUpdatesWithValuesForRangeSeek( txState, descriptor, predicate );
addedWithValues = changes.added.iterator(); addedWithValues = changes.added.iterator();
removed = removed( txState, changes.removed ); removed = removed( txState, changes.removed );
} }
else else
{ {
AddedAndRemoved changes = AddedAndRemoved changes = indexUpdatesForRangeSeek( txState, descriptor, predicate, indexOrder );
TxStateIndexChanges.indexUpdatesForRangeSeek( txState, descriptor, predicate );
added = changes.added.longIterator(); added = changes.added.longIterator();
removed = removed( txState, changes.removed ); removed = removed( txState, changes.removed );
} }
Expand All @@ -309,14 +315,13 @@ private void scanQuery( IndexDescriptor descriptor )


if ( needsValues ) if ( needsValues )
{ {
AddedWithValuesAndRemoved changes = AddedWithValuesAndRemoved changes = indexUpdatesWithValuesForScan( txState, descriptor, indexOrder );
TxStateIndexChanges.indexUpdatesWithValuesForScan( txState, descriptor, indexOrder );
addedWithValues = changes.added.iterator(); addedWithValues = changes.added.iterator();
removed = removed( txState, changes.removed ); removed = removed( txState, changes.removed );
} }
else else
{ {
AddedAndRemoved changes = TxStateIndexChanges.indexUpdatesForScan( txState, descriptor, indexOrder ); AddedAndRemoved changes = indexUpdatesForScan( txState, descriptor, indexOrder );
added = changes.added.longIterator(); added = changes.added.longIterator();
removed = removed( txState, changes.removed ); removed = removed( txState, changes.removed );
} }
Expand All @@ -331,14 +336,13 @@ private void suffixOrContainsQuery( IndexDescriptor descriptor, IndexQuery query


if ( needsValues ) if ( needsValues )
{ {
AddedWithValuesAndRemoved changes = AddedWithValuesAndRemoved changes = indexUpdatesWithValuesForSuffixOrContains( txState, descriptor, query );
TxStateIndexChanges.indexUpdatesWithValuesForSuffixOrContains( txState, descriptor, query );
addedWithValues = changes.added.iterator(); addedWithValues = changes.added.iterator();
removed = removed( txState, changes.removed ); removed = removed( txState, changes.removed );
} }
else else
{ {
AddedAndRemoved changes = TxStateIndexChanges.indexUpdatesForSuffixOrContains( txState, descriptor, query ); AddedAndRemoved changes = indexUpdatesForSuffixOrContains( txState, descriptor, query );
added = changes.added.longIterator(); added = changes.added.longIterator();
removed = removed( txState, changes.removed ); removed = removed( txState, changes.removed );
} }
Expand All @@ -356,7 +360,7 @@ private void seekQuery( IndexDescriptor descriptor, IndexQuery[] query )
{ {
TransactionState txState = read.txState(); TransactionState txState = read.txState();


AddedAndRemoved changes = TxStateIndexChanges.indexUpdatesForSeek( txState, descriptor, IndexQuery.asValueTuple( exactPreds ) ); AddedAndRemoved changes = indexUpdatesForSeek( txState, descriptor, IndexQuery.asValueTuple( exactPreds ) );
added = changes.added.longIterator(); added = changes.added.longIterator();
removed = removed( txState, changes.removed ); removed = removed( txState, changes.removed );
} }
Expand Down
Expand Up @@ -58,6 +58,8 @@ class TxStateIndexChanges
new AddedAndRemoved( LongLists.immutable.empty(), LongSets.immutable.empty() ); new AddedAndRemoved( LongLists.immutable.empty(), LongSets.immutable.empty() );
private static final ValueTuple MAX_STRING_TUPLE = ValueTuple.of( Values.MAX_STRING ); private static final ValueTuple MAX_STRING_TUPLE = ValueTuple.of( Values.MAX_STRING );


// SCAN

static AddedAndRemoved indexUpdatesForScan( ReadableTransactionState txState, IndexDescriptor descriptor, IndexOrder indexOrder ) static AddedAndRemoved indexUpdatesForScan( ReadableTransactionState txState, IndexDescriptor descriptor, IndexOrder indexOrder )
{ {
Map<ValueTuple,? extends LongDiffSets> updates = Map<ValueTuple,? extends LongDiffSets> updates =
Expand Down Expand Up @@ -109,6 +111,8 @@ static AddedWithValuesAndRemoved indexUpdatesWithValuesForScan( ReadableTransact
return new AddedWithValuesAndRemoved( indexOrder == IndexOrder.DESCENDING ? added.asReversed() : added, removed ); return new AddedWithValuesAndRemoved( indexOrder == IndexOrder.DESCENDING ? added.asReversed() : added, removed );
} }


// SUFFIX

static AddedAndRemoved indexUpdatesForSuffixOrContains( ReadableTransactionState txState, IndexDescriptor descriptor, IndexQuery query ) static AddedAndRemoved indexUpdatesForSuffixOrContains( ReadableTransactionState txState, IndexDescriptor descriptor, IndexQuery query )
{ {
if ( descriptor.schema().getPropertyIds().length != 1 ) if ( descriptor.schema().getPropertyIds().length != 1 )
Expand Down Expand Up @@ -167,6 +171,8 @@ static AddedWithValuesAndRemoved indexUpdatesWithValuesForSuffixOrContains( Read
return new AddedWithValuesAndRemoved( added, removed ); return new AddedWithValuesAndRemoved( added, removed );
} }


// SEEK

static AddedAndRemoved indexUpdatesForSeek( ReadableTransactionState txState, IndexDescriptor descriptor, ValueTuple values ) static AddedAndRemoved indexUpdatesForSeek( ReadableTransactionState txState, IndexDescriptor descriptor, ValueTuple values )
{ {
UnmodifiableMap<ValueTuple,? extends LongDiffSets> updates = txState.getIndexUpdates( descriptor.schema() ); UnmodifiableMap<ValueTuple,? extends LongDiffSets> updates = txState.getIndexUpdates( descriptor.schema() );
Expand All @@ -179,9 +185,12 @@ static AddedAndRemoved indexUpdatesForSeek( ReadableTransactionState txState, In
return EMPTY_ADDED_AND_REMOVED; return EMPTY_ADDED_AND_REMOVED;
} }


// RANGE SEEK

static AddedAndRemoved indexUpdatesForRangeSeek( ReadableTransactionState txState, static AddedAndRemoved indexUpdatesForRangeSeek( ReadableTransactionState txState,
IndexDescriptor descriptor, IndexDescriptor descriptor,
IndexQuery.RangePredicate<?> predicate ) IndexQuery.RangePredicate<?> predicate,
IndexOrder indexOrder )
{ {
Value lower = predicate.fromValue(); Value lower = predicate.fromValue();
Value upper = predicate.toValue(); Value upper = predicate.toValue();
Expand Down Expand Up @@ -241,11 +250,13 @@ static AddedAndRemoved indexUpdatesForRangeSeek( ReadableTransactionState txStat
removed.addAll( diffForSpecificValue.getRemoved() ); removed.addAll( diffForSpecificValue.getRemoved() );
} }
} }
return new AddedAndRemoved( added, removed ); return new AddedAndRemoved( indexOrder == IndexOrder.DESCENDING ? added.asReversed() : added, removed );
} }


static AddedWithValuesAndRemoved indexUpdatesWithValuesForRangeSeek( ReadableTransactionState txState, IndexDescriptor descriptor, static AddedWithValuesAndRemoved indexUpdatesWithValuesForRangeSeek( ReadableTransactionState txState,
IndexQuery.RangePredicate<?> predicate ) IndexDescriptor descriptor,
IndexQuery.RangePredicate<?> predicate,
IndexOrder indexOrder )
{ {
Value lower = predicate.fromValue(); Value lower = predicate.fromValue();
Value upper = predicate.toValue(); Value upper = predicate.toValue();
Expand Down Expand Up @@ -306,10 +317,14 @@ static AddedWithValuesAndRemoved indexUpdatesWithValuesForRangeSeek( ReadableTra
removed.addAll( diffForSpecificValue.getRemoved() ); removed.addAll( diffForSpecificValue.getRemoved() );
} }
} }
return new AddedWithValuesAndRemoved( added, removed ); return new AddedWithValuesAndRemoved( indexOrder == IndexOrder.DESCENDING ? added.asReversed() : added, removed );
} }


static AddedAndRemoved indexUpdatesForRangeSeekByPrefix( ReadableTransactionState txState, IndexDescriptor descriptor, String prefix ) // PREFIX

static AddedAndRemoved indexUpdatesForRangeSeekByPrefix( ReadableTransactionState txState,
IndexDescriptor descriptor, String prefix,
IndexOrder indexOrder )
{ {
NavigableMap<ValueTuple,? extends LongDiffSets> sortedUpdates = txState.getSortedIndexUpdates( descriptor.schema() ); NavigableMap<ValueTuple,? extends LongDiffSets> sortedUpdates = txState.getSortedIndexUpdates( descriptor.schema() );
if ( sortedUpdates == null ) if ( sortedUpdates == null )
Expand All @@ -335,11 +350,13 @@ static AddedAndRemoved indexUpdatesForRangeSeekByPrefix( ReadableTransactionStat
break; break;
} }
} }
return new AddedAndRemoved( added, removed ); return new AddedAndRemoved( indexOrder == IndexOrder.DESCENDING ? added.asReversed() : added, removed );
} }


static AddedWithValuesAndRemoved indexUpdatesWithValuesForRangeSeekByPrefix( ReadableTransactionState txState, IndexDescriptor descriptor, static AddedWithValuesAndRemoved indexUpdatesWithValuesForRangeSeekByPrefix( ReadableTransactionState txState,
String prefix ) IndexDescriptor descriptor,
String prefix,
IndexOrder indexOrder )
{ {
NavigableMap<ValueTuple,? extends LongDiffSets> sortedUpdates = txState.getSortedIndexUpdates( descriptor.schema() ); NavigableMap<ValueTuple,? extends LongDiffSets> sortedUpdates = txState.getSortedIndexUpdates( descriptor.schema() );
if ( sortedUpdates == null ) if ( sortedUpdates == null )
Expand All @@ -366,9 +383,11 @@ static AddedWithValuesAndRemoved indexUpdatesWithValuesForRangeSeekByPrefix( Rea
break; break;
} }
} }
return new AddedWithValuesAndRemoved( added, removed ); return new AddedWithValuesAndRemoved( indexOrder == IndexOrder.DESCENDING ? added.asReversed() : added, removed );
} }


// HELPERS

public static class AddedAndRemoved public static class AddedAndRemoved
{ {
public final LongIterable added; public final LongIterable added;
Expand Down

0 comments on commit 57dea67

Please sign in to comment.