use of org.neo4j.storageengine.api.StorageNodeCursor in project neo4j by neo4j.
the class RecordStorageReaderRelTypesAndDegreeTest method testDegreesForDenseNodeWithPartiallyDeletedRelGroupChain.
protected void testDegreesForDenseNodeWithPartiallyDeletedRelGroupChain(TestRelType... typesToDelete) throws Exception {
int inRelCount = randomRelCount();
int outRelCount = randomRelCount();
int loopRelCount = randomRelCount();
long nodeId = createNode(inRelCount, outRelCount, loopRelCount);
StorageNodeCursor cursor = newCursor(nodeId);
for (TestRelType type : typesToDelete) {
markRelGroupNotInUse(nodeId, type);
switch(type) {
case IN:
inRelCount = 0;
break;
case OUT:
outRelCount = 0;
break;
case LOOP:
loopRelCount = 0;
break;
default:
throw new IllegalArgumentException("Unknown type: " + type);
}
}
Set<TestDegreeItem> expectedDegrees = new HashSet<>();
if (outRelCount != 0) {
expectedDegrees.add(new TestDegreeItem(relTypeId(OUT), outRelCount, 0));
}
if (inRelCount != 0) {
expectedDegrees.add(new TestDegreeItem(relTypeId(IN), 0, inRelCount));
}
if (loopRelCount != 0) {
expectedDegrees.add(new TestDegreeItem(relTypeId(LOOP), loopRelCount, loopRelCount));
}
Set<TestDegreeItem> actualDegrees = degrees(cursor);
assertEquals(expectedDegrees, actualDegrees);
}
use of org.neo4j.storageengine.api.StorageNodeCursor in project neo4j by neo4j.
the class RecordStorageReaderRelTypesAndDegreeTest method newCursor.
protected StorageNodeCursor newCursor(long nodeId) {
StorageNodeCursor nodeCursor = storageReader.allocateNodeCursor(NULL);
nodeCursor.single(nodeId);
assertTrue(nodeCursor.next());
return nodeCursor;
}
use of org.neo4j.storageengine.api.StorageNodeCursor in project neo4j by neo4j.
the class GenerateIndexUpdatesStepTest method shouldGenerateBothEntityTokenAndPropertyUpdates.
@ValueSource(booleans = { true, false })
@ParameterizedTest
void shouldGenerateBothEntityTokenAndPropertyUpdates(boolean alsoWrite) throws Exception {
// given
int numNodes = 10;
StubStorageCursors data = someUniformData(numNodes);
TestPropertyScanConsumer propertyScanConsumer = new TestPropertyScanConsumer();
TestTokenScanConsumer tokenScanConsumer = new TestTokenScanConsumer();
GenerateIndexUpdatesStep<StorageNodeCursor> step = new GenerateIndexUpdatesStep<>(new SimpleStageControl(), DEFAULT, data, alwaysTrue(), new NodeCursorBehaviour(data), new int[] { LABEL }, propertyScanConsumer, tokenScanConsumer, NO_LOCKING, 1, mebiBytes(1), alsoWrite, PageCacheTracer.NULL, INSTANCE);
// when
CapturingBatchSender<GeneratedIndexUpdates> sender = new CapturingBatchSender<>();
step.process(allNodeIds(data), sender, NULL);
// then
if (alsoWrite) {
assertThat(propertyScanConsumer.batches.size()).isEqualTo(1);
assertThat(propertyScanConsumer.batches.get(0).size()).isEqualTo(numNodes);
assertThat(tokenScanConsumer.batches.size()).isEqualTo(1);
assertThat(tokenScanConsumer.batches.get(0).size()).isEqualTo(numNodes);
} else {
GeneratedIndexUpdates updates = sender.batches.get(0);
updates.completeBatch();
assertThat(propertyScanConsumer.batches.size()).isEqualTo(1);
assertThat(propertyScanConsumer.batches.get(0).size()).isEqualTo(numNodes);
assertThat(tokenScanConsumer.batches.size()).isEqualTo(1);
assertThat(tokenScanConsumer.batches.get(0).size()).isEqualTo(numNodes);
}
}
use of org.neo4j.storageengine.api.StorageNodeCursor in project neo4j by neo4j.
the class GenerateIndexUpdatesStepTest method shouldGenerateEntityPropertyUpdates.
@ValueSource(booleans = { true, false })
@ParameterizedTest
void shouldGenerateEntityPropertyUpdates(boolean alsoWrite) throws Exception {
// given
StubStorageCursors data = someUniformData(10);
TestPropertyScanConsumer scanConsumer = new TestPropertyScanConsumer();
GenerateIndexUpdatesStep<StorageNodeCursor> step = new GenerateIndexUpdatesStep<>(new SimpleStageControl(), DEFAULT, data, alwaysTrue(), new NodeCursorBehaviour(data), new int[] { LABEL }, scanConsumer, null, NO_LOCKING, 1, mebiBytes(1), alsoWrite, PageCacheTracer.NULL, INSTANCE);
Set<TestPropertyScanConsumer.Record> expectedUpdates = new HashSet<>();
try (StorageNodeCursor cursor = data.allocateNodeCursor(NULL);
StoragePropertyCursor propertyCursor = data.allocatePropertyCursor(NULL, INSTANCE)) {
cursor.scan();
while (cursor.next()) {
cursor.properties(propertyCursor);
Map<Integer, Value> properties = new HashMap<>();
while (propertyCursor.next()) {
properties.put(propertyCursor.propertyKey(), propertyCursor.propertyValue());
}
expectedUpdates.add(new TestPropertyScanConsumer.Record(cursor.entityReference(), cursor.labels(), properties));
}
}
// when
CapturingBatchSender<GeneratedIndexUpdates> sender = new CapturingBatchSender<>();
step.process(allNodeIds(data), sender, NULL);
// then
if (alsoWrite) {
for (TestPropertyScanConsumer.Record update : scanConsumer.batches.get(0)) {
assertThat(expectedUpdates.remove(update)).isTrue();
}
} else {
GeneratedIndexUpdates updates = sender.batches.get(0);
updates.completeBatch();
for (TestPropertyScanConsumer.Record update : scanConsumer.batches.get(0)) {
assertThat(expectedUpdates.remove(update)).isTrue();
}
}
assertThat(expectedUpdates).isEmpty();
}
use of org.neo4j.storageengine.api.StorageNodeCursor in project neo4j by neo4j.
the class GenerateIndexUpdatesStepTest method shouldSendBatchesOverMaxByteSizeThreshold.
@ValueSource(booleans = { true, false })
@ParameterizedTest
void shouldSendBatchesOverMaxByteSizeThreshold(boolean alsoWrite) throws Exception {
// given
StubStorageCursors data = someUniformData(10);
TestPropertyScanConsumer scanConsumer = new TestPropertyScanConsumer();
GenerateIndexUpdatesStep<StorageNodeCursor> step = new GenerateIndexUpdatesStep<>(new SimpleStageControl(), DEFAULT, data, alwaysTrue(), new NodeCursorBehaviour(data), new int[] { LABEL }, scanConsumer, null, NO_LOCKING, 1, 100, alsoWrite, PageCacheTracer.NULL, INSTANCE);
// when
CapturingBatchSender<GeneratedIndexUpdates> sender = new CapturingBatchSender<>();
step.process(allNodeIds(data), sender, NULL);
// then
if (alsoWrite) {
assertThat(scanConsumer.batches.size()).isGreaterThan(1);
assertThat(sender.batches).isEmpty();
} else {
assertThat(scanConsumer.batches).isEmpty();
assertThat(sender.batches.size()).isGreaterThan(1);
}
}
Aggregations