use of org.neo4j.storageengine.api.StorageNodeCursor in project neo4j by neo4j.
the class GenerateIndexUpdatesStepTest method allNodeIds.
private static long[] allNodeIds(StubStorageCursors data) {
try (StorageNodeCursor cursor = data.allocateNodeCursor(NULL)) {
cursor.scan();
MutableLongList ids = LongLists.mutable.empty();
while (cursor.next()) {
ids.add(cursor.entityReference());
}
return ids.toArray();
}
}
use of org.neo4j.storageengine.api.StorageNodeCursor in project neo4j by neo4j.
the class GenerateIndexUpdatesStepTest method shouldGenerateEntityPropertyUpdatesForRelevantPropertyTokens.
@ValueSource(booleans = { true, false })
@ParameterizedTest
void shouldGenerateEntityPropertyUpdatesForRelevantPropertyTokens(boolean alsoWrite) throws Exception {
// given
StubStorageCursors data = new StubStorageCursors();
int numNodes = 10;
MutableLongSet relevantNodeIds = LongSets.mutable.empty();
for (int i = 0; i < numNodes; i++) {
StubStorageCursors.NodeData node = data.withNode(i).labels(LABEL);
Map<String, Value> properties = new HashMap<>();
properties.put(KEY, stringValue("name_" + i));
if (i % 2 == 0) {
properties.put(OTHER_KEY, intValue(i));
relevantNodeIds.add(i);
}
node.properties(properties);
}
int otherKeyId = data.propertyKeyTokenHolder().getIdByName(OTHER_KEY);
TestPropertyScanConsumer scanConsumer = new TestPropertyScanConsumer();
GenerateIndexUpdatesStep<StorageNodeCursor> step = new GenerateIndexUpdatesStep(new SimpleStageControl(), DEFAULT, data, pid -> pid == otherKeyId, new NodeCursorBehaviour(data), new int[] { LABEL }, scanConsumer, null, NO_LOCKING, 1, mebiBytes(1), alsoWrite, PageCacheTracer.NULL, INSTANCE);
// when
CapturingBatchSender<GeneratedIndexUpdates> sender = new CapturingBatchSender<>();
step.process(allNodeIds(data), sender, NULL);
// then
if (alsoWrite) {
for (TestPropertyScanConsumer.Record update : scanConsumer.batches.get(0)) {
assertThat(relevantNodeIds.remove(update.getEntityId())).isTrue();
}
} else {
GeneratedIndexUpdates updates = sender.batches.get(0);
updates.completeBatch();
for (TestPropertyScanConsumer.Record update : scanConsumer.batches.get(0)) {
assertThat(relevantNodeIds.remove(update.getEntityId())).isTrue();
}
}
assertThat(relevantNodeIds.isEmpty()).isTrue();
}
use of org.neo4j.storageengine.api.StorageNodeCursor in project neo4j by neo4j.
the class StoreScanStageTest method shouldApplyExternalUpdatesIfThereAreSuch.
@Test
void shouldApplyExternalUpdatesIfThereAreSuch() {
// given
StubStorageCursors data = someData();
EntityIdIterator entityIdIterator = new CursorEntityIdIterator<>(data.allocateNodeCursor(NULL));
AtomicInteger numBatchesProcessed = new AtomicInteger();
ControlledExternalUpdatesCheck externalUpdatesCheck = new ControlledExternalUpdatesCheck(config.batchSize(), 2, numBatchesProcessed);
var writer = new PropertyConsumer(() -> numBatchesProcessed.incrementAndGet());
StoreScanStage<StorageNodeCursor> scan = new StoreScanStage(dbConfig, config, ct -> entityIdIterator, externalUpdatesCheck, new AtomicBoolean(true), data, new int[] { LABEL }, alwaysTrue(), writer, null, new NodeCursorBehaviour(data), id -> null, true, jobScheduler, PageCacheTracer.NULL, EmptyMemoryTracker.INSTANCE);
// when
runScan(scan);
// then
assertThat(externalUpdatesCheck.applyCallCount).isEqualTo(1);
}
use of org.neo4j.storageengine.api.StorageNodeCursor in project neo4j by neo4j.
the class NeoStoresTest method allocateNodeCursor.
private StorageNodeCursor allocateNodeCursor(long nodeId) {
StorageNodeCursor nodeCursor = storageReader.allocateNodeCursor(NULL);
nodeCursor.single(nodeId);
return nodeCursor;
}
Aggregations