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 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;

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

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

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

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

if ( needsValues )
{
AddedWithValuesAndRemoved changes =
TxStateIndexChanges.indexUpdatesWithValuesForSuffixOrContains( txState, descriptor, query );
AddedWithValuesAndRemoved changes = indexUpdatesWithValuesForSuffixOrContains( txState, descriptor, query );
addedWithValues = changes.added.iterator();
removed = removed( txState, changes.removed );
}
else
{
AddedAndRemoved changes = TxStateIndexChanges.indexUpdatesForSuffixOrContains( txState, descriptor, query );
AddedAndRemoved changes = indexUpdatesForSuffixOrContains( txState, descriptor, query );
added = changes.added.longIterator();
removed = removed( txState, changes.removed );
}
Expand All @@ -356,7 +360,7 @@ private void seekQuery( IndexDescriptor descriptor, IndexQuery[] query )
{
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();
removed = removed( txState, changes.removed );
}
Expand Down
Expand Up @@ -58,6 +58,8 @@ class TxStateIndexChanges
new AddedAndRemoved( LongLists.immutable.empty(), LongSets.immutable.empty() );
private static final ValueTuple MAX_STRING_TUPLE = ValueTuple.of( Values.MAX_STRING );

// SCAN

static AddedAndRemoved indexUpdatesForScan( ReadableTransactionState txState, IndexDescriptor descriptor, IndexOrder indexOrder )
{
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 );
}

// SUFFIX

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

// SEEK

static AddedAndRemoved indexUpdatesForSeek( ReadableTransactionState txState, IndexDescriptor descriptor, ValueTuple values )
{
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;
}

// RANGE SEEK

static AddedAndRemoved indexUpdatesForRangeSeek( ReadableTransactionState txState,
IndexDescriptor descriptor,
IndexQuery.RangePredicate<?> predicate )
IndexQuery.RangePredicate<?> predicate,
IndexOrder indexOrder )
{
Value lower = predicate.fromValue();
Value upper = predicate.toValue();
Expand Down Expand Up @@ -241,11 +250,13 @@ static AddedAndRemoved indexUpdatesForRangeSeek( ReadableTransactionState txStat
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,
IndexQuery.RangePredicate<?> predicate )
static AddedWithValuesAndRemoved indexUpdatesWithValuesForRangeSeek( ReadableTransactionState txState,
IndexDescriptor descriptor,
IndexQuery.RangePredicate<?> predicate,
IndexOrder indexOrder )
{
Value lower = predicate.fromValue();
Value upper = predicate.toValue();
Expand Down Expand Up @@ -306,10 +317,14 @@ static AddedWithValuesAndRemoved indexUpdatesWithValuesForRangeSeek( ReadableTra
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() );
if ( sortedUpdates == null )
Expand All @@ -335,11 +350,13 @@ static AddedAndRemoved indexUpdatesForRangeSeekByPrefix( ReadableTransactionStat
break;
}
}
return new AddedAndRemoved( added, removed );
return new AddedAndRemoved( indexOrder == IndexOrder.DESCENDING ? added.asReversed() : added, removed );
}

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

// HELPERS

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

0 comments on commit 57dea67

Please sign in to comment.