package com.ldbc.driver.workloads.ldbc.snb.interactive;
import com.google.common.collect.EvictingQueue;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.ldbc.driver.Operation;
import com.ldbc.driver.WorkloadException;
import com.ldbc.driver.generator.RandomDataGeneratorFactory;
import com.ldbc.driver.workloads.ldbc.snb.interactive.db.DummyLdbcSnbInteractiveOperationInstances;
import com.ldbc.driver.workloads.ldbc.snb.interactive.db.DummyLdbcSnbInteractiveOperationResultInstances;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.assertThat;
public class InteractiveShortReadGeneratorTest
{
@Test
public void shouldReturnExpectedOperationsWhenAllEnabled() throws WorkloadException {
// Given
long updateInterleaveAsMilli = 100;
long longReadInterleaveAsMilli = 1000;
Map<Integer, Long> longReadInterleavesAsMilli = new HashMap<>();
longReadInterleavesAsMilli.put(LdbcQuery1.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery2.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery3.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery4.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery5.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery6.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery7.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery8.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery9.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery10.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery11.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery12.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery13.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery14.TYPE, longReadInterleaveAsMilli);
Set<Class> enabledShortReadOperationTypes = Sets.<Class>newHashSet(
LdbcShortQuery1PersonProfile.class,
LdbcShortQuery2PersonPosts.class,
LdbcShortQuery3PersonFriends.class,
LdbcShortQuery4MessageContent.class,
LdbcShortQuery5MessageCreator.class,
LdbcShortQuery6MessageForum.class,
LdbcShortQuery7MessageReplies.class
);
double initialProbability = Double.MAX_VALUE;
double probabilityDegradationFactor = 0.1;
double compressionRatio = 1.0;
EvictingQueue<Long> personIdBuffer = EvictingQueue.create(100);
personIdBuffer.addAll(Lists.newArrayList(1l, 2l, 3l, 4l, 5l));
EvictingQueue<Long> messageIdBuffer = EvictingQueue.create(100);
messageIdBuffer.addAll(Lists.newArrayList(1l, 2l, 3l, 4l, 5l));
RandomDataGeneratorFactory randomFactory = new RandomDataGeneratorFactory(1l);
LdbcSnbShortReadGenerator shortReadGenerator = new LdbcSnbShortReadGenerator(
initialProbability,
probabilityDegradationFactor,
updateInterleaveAsMilli,
enabledShortReadOperationTypes,
compressionRatio,
personIdBuffer,
messageIdBuffer,
randomFactory,
longReadInterleavesAsMilli,
LdbcSnbShortReadGenerator.SCHEDULED_START_TIME_POLICY.PREVIOUS_OPERATION_ACTUAL_FINISH_TIME,
new LdbcSnbShortReadGenerator.ResultBufferReplenishFun(personIdBuffer, messageIdBuffer)
);
// When
double state = shortReadGenerator.initialState();
assertThat(state, is(initialProbability));
Operation operation = shortReadGenerator.nextOperation(
state,
DummyLdbcSnbInteractiveOperationInstances.read1(),
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.read1Result(),
DummyLdbcSnbInteractiveOperationResultInstances.read1Result(),
DummyLdbcSnbInteractiveOperationResultInstances.read1Result()
),
1,
TimeUnit.MILLISECONDS.toNanos(1)
);
// Then
// round robbin will choose short read 1 before short read 4
assertThat(operation.type(), equalTo(LdbcShortQuery1PersonProfile.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(2l));
assertThat(state, is(initialProbability));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability));
operation = shortReadGenerator.nextOperation(
state,
operation,
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.short1Result()
),
2,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery2PersonPosts.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(3l));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability));
operation = shortReadGenerator.nextOperation(
state,
operation,
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.short2Result(),
DummyLdbcSnbInteractiveOperationResultInstances.short2Result()
),
3,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery3PersonFriends.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(4l));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability - probabilityDegradationFactor));
operation = shortReadGenerator.nextOperation(
state,
operation,
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.short3Result(),
DummyLdbcSnbInteractiveOperationResultInstances.short3Result()
),
4,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery4MessageContent.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(5l));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability - probabilityDegradationFactor));
operation = shortReadGenerator.nextOperation(
state,
operation,
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.short4Result(),
DummyLdbcSnbInteractiveOperationResultInstances.short4Result()
),
5,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery5MessageCreator.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(6l));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability - probabilityDegradationFactor));
operation = shortReadGenerator.nextOperation(
state,
operation,
DummyLdbcSnbInteractiveOperationResultInstances.short5Result(),
6,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery6MessageForum.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(7l));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability - probabilityDegradationFactor));
operation = shortReadGenerator.nextOperation(
state,
operation,
DummyLdbcSnbInteractiveOperationResultInstances.short6Result(),
7,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery7MessageReplies.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(8l));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability - probabilityDegradationFactor - probabilityDegradationFactor));
operation = shortReadGenerator.nextOperation(
state,
operation,
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.short7Result(),
DummyLdbcSnbInteractiveOperationResultInstances.short7Result()
),
8,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery1PersonProfile.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(9l));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability - probabilityDegradationFactor - probabilityDegradationFactor));
operation = shortReadGenerator.nextOperation(
state,
operation,
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.short1Result(),
DummyLdbcSnbInteractiveOperationResultInstances.short1Result()
),
9,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery2PersonPosts.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(10l));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability - probabilityDegradationFactor - probabilityDegradationFactor));
operation = shortReadGenerator.nextOperation(
state,
operation,
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.short2Result(),
DummyLdbcSnbInteractiveOperationResultInstances.short2Result()
),
10,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery3PersonFriends.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(11l));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability - probabilityDegradationFactor - probabilityDegradationFactor - probabilityDegradationFactor));
operation = shortReadGenerator.nextOperation(
state,
operation,
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.short3Result(),
DummyLdbcSnbInteractiveOperationResultInstances.short3Result()
),
11,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery4MessageContent.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(12l));
}
@Test
public void shouldReturnExpectedOperationsWhenSomeAreDisabled1() throws WorkloadException {
// Given
double initialProbability = Double.MAX_VALUE;
double probabilityDegradationFactor = 0.1;
long updateInterleaveAsMilli = 100;
long longReadInterleaveAsMilli = 1000;
Map<Integer, Long> longReadInterleavesAsMilli = new HashMap<>();
longReadInterleavesAsMilli.put(LdbcQuery1.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery2.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery3.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery4.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery5.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery6.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery7.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery8.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery9.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery10.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery11.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery12.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery13.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery14.TYPE, longReadInterleaveAsMilli);
Set<Class> enabledShortReadOperationTypes = Sets.<Class>newHashSet(
// LdbcShortQuery1PersonProfile.class,
LdbcShortQuery2PersonPosts.class,
// LdbcShortQuery3PersonFriends.class,
LdbcShortQuery4MessageContent.class,
LdbcShortQuery5MessageCreator.class,
// LdbcShortQuery6MessageForum.class,
LdbcShortQuery7MessageReplies.class
);
double compressionRatio = 0.9;
EvictingQueue<Long> personIdBuffer = EvictingQueue.create(100);
personIdBuffer.addAll(Lists.newArrayList(1l, 2l, 3l, 4l, 5l));
EvictingQueue<Long> messageIdBuffer = EvictingQueue.create(100);
messageIdBuffer.addAll(Lists.newArrayList(1l, 2l, 3l, 4l, 5l));
RandomDataGeneratorFactory randomFactory = new RandomDataGeneratorFactory(1l);
LdbcSnbShortReadGenerator shortReadGenerator = new LdbcSnbShortReadGenerator(
initialProbability,
probabilityDegradationFactor,
updateInterleaveAsMilli,
enabledShortReadOperationTypes,
compressionRatio,
personIdBuffer,
messageIdBuffer,
randomFactory,
longReadInterleavesAsMilli,
LdbcSnbShortReadGenerator.SCHEDULED_START_TIME_POLICY.PREVIOUS_OPERATION_ACTUAL_FINISH_TIME,
new LdbcSnbShortReadGenerator.ResultBufferReplenishFun(personIdBuffer, messageIdBuffer)
);
// When
double state = shortReadGenerator.initialState();
assertThat(state, is(initialProbability));
Operation operation = shortReadGenerator.nextOperation(
state,
DummyLdbcSnbInteractiveOperationInstances.read2(),
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.read2Result(),
DummyLdbcSnbInteractiveOperationResultInstances.read2Result(),
DummyLdbcSnbInteractiveOperationResultInstances.read2Result()
),
1,
TimeUnit.MILLISECONDS.toNanos(1)
);
// Then
// round robbin will choose short read 2 before short read 4
assertThat(operation.type(), equalTo(LdbcShortQuery2PersonPosts.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(2l));
assertThat(state, is(initialProbability));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability - probabilityDegradationFactor));
operation = shortReadGenerator.nextOperation(
state,
operation,
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.short2Result(),
DummyLdbcSnbInteractiveOperationResultInstances.short2Result()
),
2,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery4MessageContent.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(3l));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability - probabilityDegradationFactor));
operation = shortReadGenerator.nextOperation(
state,
operation,
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.short4Result(),
DummyLdbcSnbInteractiveOperationResultInstances.short4Result()
),
3,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery5MessageCreator.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(4l));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability - probabilityDegradationFactor));
operation = shortReadGenerator.nextOperation(
state,
operation,
DummyLdbcSnbInteractiveOperationResultInstances.short5Result(),
4,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery7MessageReplies.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(5l));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability - probabilityDegradationFactor - probabilityDegradationFactor));
operation = shortReadGenerator.nextOperation(
state,
operation,
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.short7Result(),
DummyLdbcSnbInteractiveOperationResultInstances.short7Result()
),
5,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery2PersonPosts.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(6l));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability - probabilityDegradationFactor - probabilityDegradationFactor - probabilityDegradationFactor));
operation = shortReadGenerator.nextOperation(
state,
operation,
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.short2Result(),
DummyLdbcSnbInteractiveOperationResultInstances.short2Result()
),
6,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery4MessageContent.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(7l));
}
@Test
public void shouldReturnExpectedOperationsWhenSomeAreDisabled2() throws WorkloadException {
// Given
double initialProbability = Double.MAX_VALUE;
double probabilityDegradationFactor = 0.1;
long updateInterleaveAsMilli = 100;
long longReadInterleaveAsMilli = 1000;
Map<Integer, Long> longReadInterleavesAsMilli = new HashMap<>();
longReadInterleavesAsMilli.put(LdbcQuery1.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery2.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery3.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery4.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery5.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery6.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery7.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery8.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery9.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery10.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery11.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery12.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery13.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery14.TYPE, longReadInterleaveAsMilli);
Set<Class> enabledShortReadOperationTypes = Sets.<Class>newHashSet(
// LdbcShortQuery1PersonProfile.class,
// LdbcShortQuery2PersonPosts.class,
// LdbcShortQuery3PersonFriends.class,
LdbcShortQuery4MessageContent.class,
LdbcShortQuery5MessageCreator.class,
// LdbcShortQuery6MessageForum.class,
LdbcShortQuery7MessageReplies.class
);
double compressionRatio = 2.5;
EvictingQueue<Long> personIdBuffer = EvictingQueue.create(100);
personIdBuffer.addAll(Lists.newArrayList(1l, 2l, 3l, 4l, 5l));
EvictingQueue<Long> messageIdBuffer = EvictingQueue.create(100);
messageIdBuffer.addAll(Lists.newArrayList(1l, 2l, 3l, 4l, 5l));
RandomDataGeneratorFactory randomFactory = new RandomDataGeneratorFactory(1l);
LdbcSnbShortReadGenerator shortReadGenerator = new LdbcSnbShortReadGenerator(
initialProbability,
probabilityDegradationFactor,
updateInterleaveAsMilli,
enabledShortReadOperationTypes,
compressionRatio,
personIdBuffer,
messageIdBuffer,
randomFactory,
longReadInterleavesAsMilli,
LdbcSnbShortReadGenerator.SCHEDULED_START_TIME_POLICY.PREVIOUS_OPERATION_ACTUAL_FINISH_TIME,
new LdbcSnbShortReadGenerator.ResultBufferReplenishFun(personIdBuffer, messageIdBuffer)
);
// When
double state = shortReadGenerator.initialState();
assertThat(state, is(initialProbability));
Operation operation = shortReadGenerator.nextOperation(
state,
DummyLdbcSnbInteractiveOperationInstances.read3(),
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.read3Result(),
DummyLdbcSnbInteractiveOperationResultInstances.read3Result(),
DummyLdbcSnbInteractiveOperationResultInstances.read3Result()
),
1,
TimeUnit.MILLISECONDS.toNanos(1)
);
// Then
assertThat(operation.type(), equalTo(LdbcShortQuery4MessageContent.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(2l));
assertThat(state, is(initialProbability));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability));
operation = shortReadGenerator.nextOperation(
state,
operation,
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.short4Result(),
DummyLdbcSnbInteractiveOperationResultInstances.short4Result()
),
2,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery5MessageCreator.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(3l));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability));
operation = shortReadGenerator.nextOperation(
state,
operation,
DummyLdbcSnbInteractiveOperationResultInstances.short5Result(),
3,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery7MessageReplies.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(4l));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability - probabilityDegradationFactor));
operation = shortReadGenerator.nextOperation(
state,
operation,
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.short7Result(),
DummyLdbcSnbInteractiveOperationResultInstances.short7Result()
),
4,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery4MessageContent.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(5l));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability - probabilityDegradationFactor));
operation = shortReadGenerator.nextOperation(
state,
operation,
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.short4Result(),
DummyLdbcSnbInteractiveOperationResultInstances.short4Result()
),
5,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery5MessageCreator.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(6l));
}
@Test
public void shouldReturnExpectedOperationsWhenSomeAreDisabled3() throws WorkloadException {
// Given
double initialProbability = Double.MAX_VALUE;
double probabilityDegradationFactor = 0.1;
long updateInterleaveAsMilli = 100;
long longReadInterleaveAsMilli = 1000;
Map<Integer, Long> longReadInterleavesAsMilli = new HashMap<>();
longReadInterleavesAsMilli.put(LdbcQuery1.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery2.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery3.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery4.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery5.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery6.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery7.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery8.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery9.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery10.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery11.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery12.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery13.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery14.TYPE, longReadInterleaveAsMilli);
Set<Class> enabledShortReadOperationTypes = Sets.<Class>newHashSet(
// LdbcShortQuery1PersonProfile.class,
// LdbcShortQuery2PersonPosts.class,
// LdbcShortQuery3PersonFriends.class,
// LdbcShortQuery4MessageContent.class,
// LdbcShortQuery5MessageCreator.class,
// LdbcShortQuery6MessageForum.class,
LdbcShortQuery7MessageReplies.class
);
double compressionRatio = 0.2;
EvictingQueue<Long> personIdBuffer = EvictingQueue.create(100);
personIdBuffer.addAll(Lists.newArrayList(1l, 2l, 3l, 4l, 5l));
EvictingQueue<Long> messageIdBuffer = EvictingQueue.create(100);
messageIdBuffer.addAll(Lists.newArrayList(1l, 2l, 3l, 4l, 5l));
RandomDataGeneratorFactory randomFactory = new RandomDataGeneratorFactory(1l);
LdbcSnbShortReadGenerator shortReadGenerator = new LdbcSnbShortReadGenerator(
initialProbability,
probabilityDegradationFactor,
updateInterleaveAsMilli,
enabledShortReadOperationTypes,
compressionRatio,
personIdBuffer,
messageIdBuffer,
randomFactory,
longReadInterleavesAsMilli,
LdbcSnbShortReadGenerator.SCHEDULED_START_TIME_POLICY.PREVIOUS_OPERATION_ACTUAL_FINISH_TIME,
new LdbcSnbShortReadGenerator.ResultBufferReplenishFun(personIdBuffer, messageIdBuffer)
);
// When
double state = shortReadGenerator.initialState();
assertThat(state, is(initialProbability));
Operation operation = shortReadGenerator.nextOperation(
state,
DummyLdbcSnbInteractiveOperationInstances.read1(),
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.read1Result(),
DummyLdbcSnbInteractiveOperationResultInstances.read1Result(),
DummyLdbcSnbInteractiveOperationResultInstances.read1Result()
),
1,
TimeUnit.MILLISECONDS.toNanos(1)
);
// Then
assertThat(operation.type(), equalTo(LdbcShortQuery7MessageReplies.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(2l));
assertThat(state, is(initialProbability));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability - probabilityDegradationFactor));
operation = shortReadGenerator.nextOperation(
state,
operation,
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.short7Result(),
DummyLdbcSnbInteractiveOperationResultInstances.short7Result()
),
2,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery7MessageReplies.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(3l));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability - probabilityDegradationFactor - probabilityDegradationFactor));
operation = shortReadGenerator.nextOperation(
state,
operation,
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.short7Result(),
DummyLdbcSnbInteractiveOperationResultInstances.short7Result()
),
3,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery7MessageReplies.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(4l));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability - probabilityDegradationFactor - probabilityDegradationFactor - probabilityDegradationFactor));
operation = shortReadGenerator.nextOperation(
state,
operation,
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.short7Result(),
DummyLdbcSnbInteractiveOperationResultInstances.short7Result()
),
4,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery7MessageReplies.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(5l));
state = shortReadGenerator.updateState(state, operation.type());
assertThat(state, is(initialProbability - probabilityDegradationFactor - probabilityDegradationFactor - probabilityDegradationFactor - probabilityDegradationFactor));
operation = shortReadGenerator.nextOperation(
state,
operation,
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.short7Result(),
DummyLdbcSnbInteractiveOperationResultInstances.short7Result()
),
5,
TimeUnit.MILLISECONDS.toNanos(1)
);
assertThat(operation.type(), equalTo(LdbcShortQuery7MessageReplies.TYPE));
assertThat(operation.scheduledStartTimeAsMilli(), equalTo(6l));
}
@Test
public void shouldReturnExpectedOperationsWhenAllAreDisabled() throws WorkloadException {
// Given
double initialProbability = Double.MAX_VALUE;
double probabilityDegradationFactor = 0.1;
long updateInterleaveAsMilli = 100;
long longReadInterleaveAsMilli = 1000;
Map<Integer, Long> longReadInterleavesAsMilli = new HashMap<>();
longReadInterleavesAsMilli.put(LdbcQuery1.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery2.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery3.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery4.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery5.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery6.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery7.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery8.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery9.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery10.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery11.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery12.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery13.TYPE, longReadInterleaveAsMilli);
longReadInterleavesAsMilli.put(LdbcQuery14.TYPE, longReadInterleaveAsMilli);
Set<Class> enabledShortReadOperationTypes = Sets.newHashSet(
// LdbcShortQuery1PersonProfile.class,
// LdbcShortQuery2PersonPosts.class,
// LdbcShortQuery3PersonFriends.class,
// LdbcShortQuery4MessageContent.class,
// LdbcShortQuery5MessageCreator.class,
// LdbcShortQuery6MessageForum.class,
// LdbcShortQuery7MessageReplies.class
);
double compressionRatio = 1.0;
EvictingQueue<Long> personIdBuffer = EvictingQueue.create(100);
personIdBuffer.addAll(Lists.newArrayList(1l, 2l, 3l, 4l, 5l));
EvictingQueue<Long> messageIdBuffer = EvictingQueue.create(100);
messageIdBuffer.addAll(Lists.newArrayList(1l, 2l, 3l, 4l, 5l));
RandomDataGeneratorFactory randomFactory = new RandomDataGeneratorFactory(1l);
LdbcSnbShortReadGenerator shortReadGenerator = new LdbcSnbShortReadGenerator(
initialProbability,
probabilityDegradationFactor,
updateInterleaveAsMilli,
enabledShortReadOperationTypes,
compressionRatio,
personIdBuffer,
messageIdBuffer,
randomFactory,
longReadInterleavesAsMilli,
LdbcSnbShortReadGenerator.SCHEDULED_START_TIME_POLICY.PREVIOUS_OPERATION_ACTUAL_FINISH_TIME,
new LdbcSnbShortReadGenerator.ResultBufferReplenishFun(personIdBuffer, messageIdBuffer)
);
// When
double state = shortReadGenerator.initialState();
assertThat(state, is(initialProbability));
Operation operation = shortReadGenerator.nextOperation(
state,
DummyLdbcSnbInteractiveOperationInstances.read1(),
Lists.newArrayList(
DummyLdbcSnbInteractiveOperationResultInstances.read1Result(),
DummyLdbcSnbInteractiveOperationResultInstances.read1Result(),
DummyLdbcSnbInteractiveOperationResultInstances.read1Result()
),
1,
TimeUnit.MILLISECONDS.toNanos(1)
);
// Then
assertThat(operation, is(nullValue()));
assertThat(state, is(initialProbability));
}
}