Skip to content

Commit

Permalink
ValueCreatorUtil generate random values of supported types instead of…
Browse files Browse the repository at this point in the history
… fixed set of values
  • Loading branch information
burqen committed Oct 3, 2018
1 parent 6e801ca commit fefc525
Show file tree
Hide file tree
Showing 14 changed files with 38 additions and 82 deletions.
Expand Up @@ -50,12 +50,6 @@ public class DateTimeValueCreatorUtil extends ValueCreatorUtil<ZonedDateTimeInde
super( schemaIndexDescriptor ); super( schemaIndexDescriptor );
} }


@Override
IndexEntryUpdate<IndexDescriptor>[] someUpdates()
{
return someUpdatesWithDuplicateValues();
}

@Override @Override
RandomValues.Type[] supportedTypes() RandomValues.Type[] supportedTypes()
{ {
Expand Down
Expand Up @@ -47,12 +47,6 @@ public class DateValueCreatorUtil extends ValueCreatorUtil<DateIndexKey,NativeIn
super( indexDescriptor ); super( indexDescriptor );
} }


@Override
IndexEntryUpdate<IndexDescriptor>[] someUpdates()
{
return someUpdatesWithDuplicateValues();
}

@Override @Override
RandomValues.Type[] supportedTypes() RandomValues.Type[] supportedTypes()
{ {
Expand Down
Expand Up @@ -48,12 +48,6 @@ public class DurationValueCreatorUtil extends ValueCreatorUtil<DurationIndexKey,
super( schemaIndexDescriptor ); super( schemaIndexDescriptor );
} }


@Override
IndexEntryUpdate<IndexDescriptor>[] someUpdates()
{
return someUpdatesWithDuplicateValues();
}

@Override @Override
RandomValues.Type[] supportedTypes() RandomValues.Type[] supportedTypes()
{ {
Expand Down
Expand Up @@ -67,12 +67,6 @@ class GenericValueCreatorUtil extends ValueCreatorUtil<CompositeGenericKey,Nativ
super( indexDescriptor ); super( indexDescriptor );
} }


@Override
IndexEntryUpdate<IndexDescriptor>[] someUpdates()
{
return someUpdatesWithDuplicateValues();
}

@Override @Override
RandomValues.Type[] supportedTypes() RandomValues.Type[] supportedTypes()
{ {
Expand Down
Expand Up @@ -47,12 +47,6 @@ public class LocalDateTimeValueCreatorUtil extends ValueCreatorUtil<LocalDateTim
super( schemaIndexDescriptor ); super( schemaIndexDescriptor );
} }


@Override
IndexEntryUpdate<IndexDescriptor>[] someUpdates()
{
return someUpdatesWithDuplicateValues();
}

@Override @Override
RandomValues.Type[] supportedTypes() RandomValues.Type[] supportedTypes()
{ {
Expand Down
Expand Up @@ -47,12 +47,6 @@ public class LocalTimeValueCreatorUtil extends ValueCreatorUtil<LocalTimeIndexKe
super( indexDescriptor ); super( indexDescriptor );
} }


@Override
IndexEntryUpdate<IndexDescriptor>[] someUpdates()
{
return someUpdatesWithDuplicateValues();
}

@Override @Override
RandomValues.Type[] supportedTypes() RandomValues.Type[] supportedTypes()
{ {
Expand Down
Expand Up @@ -157,7 +157,7 @@ public void shouldIndexChange() throws Exception
// given // given
IndexEntryUpdate<IndexDescriptor>[] updates = someUpdatesSingleType(); IndexEntryUpdate<IndexDescriptor>[] updates = someUpdatesSingleType();
processAll( updates ); processAll( updates );
Iterator<IndexEntryUpdate<IndexDescriptor>> generator = filter( skipExisting( updates ), valueCreatorUtil.randomUpdateGenerator( random ) ); Iterator<IndexEntryUpdate<IndexDescriptor>> generator = filter( skipExisting( updates ), valueCreatorUtil.randomUpdateGenerator() );


for ( int i = 0; i < updates.length; i++ ) for ( int i = 0; i < updates.length; i++ )
{ {
Expand Down Expand Up @@ -200,7 +200,7 @@ public void shouldHandleRandomUpdates() throws Exception
{ {
// given // given
Set<IndexEntryUpdate<IndexDescriptor>> expectedData = new HashSet<>(); Set<IndexEntryUpdate<IndexDescriptor>> expectedData = new HashSet<>();
Iterator<IndexEntryUpdate<IndexDescriptor>> newDataGenerator = valueCreatorUtil.randomUpdateGenerator( random ); Iterator<IndexEntryUpdate<IndexDescriptor>> newDataGenerator = valueCreatorUtil.randomUpdateGenerator();


// when // when
int rounds = 50; int rounds = 50;
Expand Down Expand Up @@ -229,7 +229,7 @@ public void shouldReturnZeroCountForEmptyIndex()
try ( IndexReader reader = accessor.newReader() ) try ( IndexReader reader = accessor.newReader() )
{ {
// when // when
IndexEntryUpdate<IndexDescriptor> update = valueCreatorUtil.randomUpdateGenerator( random ).next(); IndexEntryUpdate<IndexDescriptor> update = valueCreatorUtil.randomUpdateGenerator().next();
long count = reader.countIndexedNodes( 123, valueCreatorUtil.indexDescriptor.properties(), update.values()[0] ); long count = reader.countIndexedNodes( 123, valueCreatorUtil.indexDescriptor.properties(), update.values()[0] );


// then // then
Expand All @@ -256,7 +256,7 @@ public void shouldReturnCountOneForExistingData() throws Exception
} }


// and when // and when
Iterator<IndexEntryUpdate<IndexDescriptor>> generator = filter( skipExisting( updates ), valueCreatorUtil.randomUpdateGenerator( random ) ); Iterator<IndexEntryUpdate<IndexDescriptor>> generator = filter( skipExisting( updates ), valueCreatorUtil.randomUpdateGenerator() );
long count = reader.countIndexedNodes( 123, valueCreatorUtil.indexDescriptor.properties(), generator.next().values()[0] ); long count = reader.countIndexedNodes( 123, valueCreatorUtil.indexDescriptor.properties(), generator.next().values()[0] );


// then // then
Expand Down Expand Up @@ -788,7 +788,7 @@ public void shouldNotSeeFilteredEntries() throws Exception


private Value generateUniqueValue( IndexEntryUpdate<IndexDescriptor>[] updates ) private Value generateUniqueValue( IndexEntryUpdate<IndexDescriptor>[] updates )
{ {
return filter( skipExisting( updates ), valueCreatorUtil.randomUpdateGenerator( random ) ).next().values()[0]; return filter( skipExisting( updates ), valueCreatorUtil.randomUpdateGenerator() ).next().values()[0];
} }


private static Predicate<IndexEntryUpdate<IndexDescriptor>> skipExisting( IndexEntryUpdate<IndexDescriptor>[] existing ) private static Predicate<IndexEntryUpdate<IndexDescriptor>> skipExisting( IndexEntryUpdate<IndexDescriptor>[] existing )
Expand Down
Expand Up @@ -370,15 +370,15 @@ public void shouldApplyLargeAmountOfInterleavedRandomUpdates() throws Exception
populator.create(); populator.create();
random.reset(); random.reset();
Random updaterRandom = new Random( random.seed() ); Random updaterRandom = new Random( random.seed() );
Iterator<IndexEntryUpdate<IndexDescriptor>> updates = valueCreatorUtil.randomUpdateGenerator( random ); Iterator<IndexEntryUpdate<IndexDescriptor>> updates = valueCreatorUtil.randomUpdateGenerator();


// when // when
int count = interleaveLargeAmountOfUpdates( updaterRandom, updates ); int count = interleaveLargeAmountOfUpdates( updaterRandom, updates );


// then // then
populator.close( true ); populator.close( true );
random.reset(); random.reset();
verifyUpdates( valueCreatorUtil.randomUpdateGenerator( random ), count ); verifyUpdates( valueCreatorUtil.randomUpdateGenerator(), count );
} }


@Test @Test
Expand Down Expand Up @@ -605,7 +605,7 @@ public void shouldSampleUpdatesIfConfiguredForOnlineSampling() throws Exception
populator.create(); populator.create();
IndexEntryUpdate<IndexDescriptor>[] scanUpdates = valueCreatorUtil.someUpdates(); IndexEntryUpdate<IndexDescriptor>[] scanUpdates = valueCreatorUtil.someUpdates();
populator.add( Arrays.asList( scanUpdates ) ); populator.add( Arrays.asList( scanUpdates ) );
Iterator<IndexEntryUpdate<IndexDescriptor>> generator = valueCreatorUtil.randomUpdateGenerator( random ); Iterator<IndexEntryUpdate<IndexDescriptor>> generator = valueCreatorUtil.randomUpdateGenerator();
Object[] updates = new Object[5]; Object[] updates = new Object[5];
updates[0] = generator.next().values()[0].asObject(); updates[0] = generator.next().values()[0].asObject();
updates[1] = generator.next().values()[0].asObject(); updates[1] = generator.next().values()[0].asObject();
Expand Down
Expand Up @@ -82,6 +82,7 @@ public abstract class NativeIndexTestUtil<KEY extends NativeIndexKey<KEY>,VALUE
public void setup() public void setup()
{ {
valueCreatorUtil = createValueCreatorUtil(); valueCreatorUtil = createValueCreatorUtil();
valueCreatorUtil.setRandom( random.randomValues() );
indexDescriptor = valueCreatorUtil.indexDescriptor(); indexDescriptor = valueCreatorUtil.indexDescriptor();
layout = createLayout(); layout = createLayout();
indexFile = directory.file( "index" ); indexFile = directory.file( "index" );
Expand Down
Expand Up @@ -56,12 +56,6 @@ class NumberValueCreatorUtil extends ValueCreatorUtil<NumberIndexKey,NativeIndex
super( indexDescriptor ); super( indexDescriptor );
} }


@Override
IndexEntryUpdate<IndexDescriptor>[] someUpdates()
{
return someUpdatesWithDuplicateValues();
}

@Override @Override
RandomValues.Type[] supportedTypes() RandomValues.Type[] supportedTypes()
{ {
Expand Down
Expand Up @@ -48,12 +48,6 @@ int compareIndexedPropertyValue( StringIndexKey key1, StringIndexKey key2 )
copyOf( key2.bytes, key2.bytesLength ) ); copyOf( key2.bytes, key2.bytesLength ) );
} }


@Override
IndexEntryUpdate<IndexDescriptor>[] someUpdates()
{
return someUpdatesWithDuplicateValues();
}

@Override @Override
RandomValues.Type[] supportedTypes() RandomValues.Type[] supportedTypes()
{ {
Expand Down
Expand Up @@ -50,12 +50,6 @@ public class TimeValueCreatorUtil extends ValueCreatorUtil<ZonedTimeIndexKey,Nat
super( indexDescriptor ); super( indexDescriptor );
} }


@Override
IndexEntryUpdate<IndexDescriptor>[] someUpdates()
{
return someUpdatesWithDuplicateValues();
}

@Override @Override
RandomValues.Type[] supportedTypes() RandomValues.Type[] supportedTypes()
{ {
Expand Down
Expand Up @@ -37,12 +37,6 @@ class UniqueValueCreatorUtil<KEY extends NativeIndexKey<KEY>, VALUE extends Nati
this.delegate = delegate; this.delegate = delegate;
} }


@Override
IndexEntryUpdate<IndexDescriptor>[] someUpdates()
{
return delegate.someUpdatesNoDuplicateValues();
}

@Override @Override
RandomValues.Type[] supportedTypes() RandomValues.Type[] supportedTypes()
{ {
Expand All @@ -56,7 +50,7 @@ int compareIndexedPropertyValue( KEY key1, KEY key2 )
} }


@Override @Override
Value newUniqueValue( RandomValues random, Set<Object> uniqueCompareValues, List<Value> uniqueValues ) Value newUniqueValue( RandomValues random, Set<Value> uniqueCompareValues, List<Value> uniqueValues )
{ {
return delegate.newUniqueValue( random, uniqueCompareValues, uniqueValues ); return delegate.newUniqueValue( random, uniqueCompareValues, uniqueValues );
} }
Expand Down
Expand Up @@ -34,7 +34,6 @@
import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.index.IndexEntryUpdate;
import org.neo4j.storageengine.api.schema.IndexDescriptor; import org.neo4j.storageengine.api.schema.IndexDescriptor;
import org.neo4j.storageengine.api.schema.StoreIndexDescriptor; import org.neo4j.storageengine.api.schema.StoreIndexDescriptor;
import org.neo4j.test.rule.RandomRule;
import org.neo4j.values.storable.RandomValues; import org.neo4j.values.storable.RandomValues;
import org.neo4j.values.storable.Value; import org.neo4j.values.storable.Value;
import org.neo4j.values.storable.Values; import org.neo4j.values.storable.Values;
Expand All @@ -43,15 +42,35 @@ abstract class ValueCreatorUtil<KEY extends NativeIndexKey<KEY>, VALUE extends N
{ {
private static final Comparator<IndexEntryUpdate<IndexDescriptor>> UPDATE_COMPARATOR = ( u1, u2 ) -> private static final Comparator<IndexEntryUpdate<IndexDescriptor>> UPDATE_COMPARATOR = ( u1, u2 ) ->
Values.COMPARATOR.compare( u1.values()[0], u2.values()[0] ); Values.COMPARATOR.compare( u1.values()[0], u2.values()[0] );
private static final int N_VALUES = 10;


final StoreIndexDescriptor indexDescriptor; final StoreIndexDescriptor indexDescriptor;
private RandomValues randomValues;


/**
* Don't forget to {@link #setRandom(RandomValues)}. Done separately to make it easier to reset random while debugging.
*/
ValueCreatorUtil( StoreIndexDescriptor indexDescriptor ) ValueCreatorUtil( StoreIndexDescriptor indexDescriptor )
{ {
this.indexDescriptor = indexDescriptor; this.indexDescriptor = indexDescriptor;
} }


abstract IndexEntryUpdate<IndexDescriptor>[] someUpdates(); void setRandom( RandomValues randomValues )
{
this.randomValues = randomValues;
}

IndexEntryUpdate<IndexDescriptor>[] someUpdates()
{
Iterator<IndexEntryUpdate<IndexDescriptor>> randomUpdateGenerator = randomUpdateGenerator();
//noinspection unchecked
IndexEntryUpdate<IndexDescriptor>[] result = new IndexEntryUpdate[N_VALUES];
for ( int i = 0; i < N_VALUES; i++ )
{
result[i] = randomUpdateGenerator.next();
}
return result;
}


abstract RandomValues.Type[] supportedTypes(); abstract RandomValues.Type[] supportedTypes();


Expand All @@ -73,15 +92,15 @@ StoreIndexDescriptor indexDescriptor()
} }


void copyValue( VALUE value, VALUE intoValue ) void copyValue( VALUE value, VALUE intoValue )
{ { // no-op until we decide to use value for something
} }


Iterator<IndexEntryUpdate<IndexDescriptor>> randomUpdateGenerator( RandomRule random ) Iterator<IndexEntryUpdate<IndexDescriptor>> randomUpdateGenerator()
{ {
double fractionDuplicates = fractionDuplicates(); double fractionDuplicates = fractionDuplicates();
return new PrefetchingIterator<IndexEntryUpdate<IndexDescriptor>>() return new PrefetchingIterator<IndexEntryUpdate<IndexDescriptor>>()
{ {
private final Set<Object> uniqueCompareValues = new HashSet<>(); private final Set<Value> uniqueCompareValues = new HashSet<>();
private final List<Value> uniqueValues = new ArrayList<>(); private final List<Value> uniqueValues = new ArrayList<>();
private long currentEntityId; private long currentEntityId;


Expand All @@ -90,26 +109,22 @@ protected IndexEntryUpdate<IndexDescriptor> fetchNextOrNull()
{ {
Value value; Value value;
if ( fractionDuplicates > 0 && !uniqueValues.isEmpty() && if ( fractionDuplicates > 0 && !uniqueValues.isEmpty() &&
random.nextFloat() < fractionDuplicates ) randomValues.nextFloat() < fractionDuplicates )
{ {
value = existingNonUniqueValue( random ); value = randomValues.among( uniqueValues );
} }
else else
{ {
value = newUniqueValue( random.randomValues(), uniqueCompareValues, uniqueValues ); value = newUniqueValue( randomValues, uniqueCompareValues, uniqueValues );
} }


return add( currentEntityId++, value ); return add( currentEntityId++, value );
} }


private Value existingNonUniqueValue( RandomRule randomRule )
{
return uniqueValues.get( randomRule.nextInt( uniqueValues.size() ) );
}
}; };
} }


Value newUniqueValue( RandomValues random, Set<Object> uniqueCompareValues, List<Value> uniqueValues ) Value newUniqueValue( RandomValues random, Set<Value> uniqueCompareValues, List<Value> uniqueValues )
{ {
Value value; Value value;
do do
Expand Down

0 comments on commit fefc525

Please sign in to comment.