use of org.neo4j.kernel.impl.store.record.RelationshipGroupRecord in project neo4j by neo4j.
the class StorageLayer method relationshipTypes.
@Override
public PrimitiveIntSet relationshipTypes(StorageStatement statement, NodeItem node) {
PrimitiveIntSet set = intSet();
if (node.isDense()) {
RelationshipGroupRecord groupRecord = relationshipGroupStore.newRecord();
RecordCursor<RelationshipGroupRecord> cursor = statement.recordCursors().relationshipGroup();
for (long id = node.nextGroupId(); id != NO_NEXT_RELATIONSHIP.intValue(); id = groupRecord.getNext()) {
if (cursor.next(id, groupRecord, FORCE)) {
set.add(groupRecord.getType());
}
}
} else {
nodeGetRelationships(statement, node, Direction.BOTH).forAll(relationship -> set.add(relationship.type()));
}
return set;
}
use of org.neo4j.kernel.impl.store.record.RelationshipGroupRecord in project neo4j by neo4j.
the class StorageLayer method degreeRelationshipsInGroup.
@Override
public int degreeRelationshipsInGroup(StorageStatement storeStatement, long nodeId, long groupId, Direction direction, Integer relType) {
RelationshipRecord relationshipRecord = relationshipStore.newRecord();
RelationshipGroupRecord relationshipGroupRecord = relationshipGroupStore.newRecord();
return countRelationshipsInGroup(groupId, direction, relType, nodeId, relationshipRecord, relationshipGroupRecord, storeStatement.recordCursors());
}
use of org.neo4j.kernel.impl.store.record.RelationshipGroupRecord in project neo4j by neo4j.
the class StorageLayer method visitDenseNode.
private void visitDenseNode(StorageStatement statement, NodeItem nodeItem, DegreeVisitor visitor) {
RelationshipGroupRecord relationshipGroupRecord = relationshipGroupStore.newRecord();
RecordCursor<RelationshipGroupRecord> relationshipGroupCursor = statement.recordCursors().relationshipGroup();
RelationshipRecord relationshipRecord = relationshipStore.newRecord();
RecordCursor<RelationshipRecord> relationshipCursor = statement.recordCursors().relationship();
long groupId = nodeItem.nextGroupId();
while (groupId != NO_NEXT_RELATIONSHIP.longValue()) {
relationshipGroupCursor.next(groupId, relationshipGroupRecord, FORCE);
if (relationshipGroupRecord.inUse()) {
int type = relationshipGroupRecord.getType();
long firstLoop = relationshipGroupRecord.getFirstLoop();
long firstOut = relationshipGroupRecord.getFirstOut();
long firstIn = relationshipGroupRecord.getFirstIn();
long loop = countByFirstPrevPointer(firstLoop, relationshipCursor, nodeItem.id(), relationshipRecord);
long outgoing = countByFirstPrevPointer(firstOut, relationshipCursor, nodeItem.id(), relationshipRecord) + loop;
long incoming = countByFirstPrevPointer(firstIn, relationshipCursor, nodeItem.id(), relationshipRecord) + loop;
visitor.visitDegree(type, outgoing, incoming);
}
groupId = relationshipGroupRecord.getNext();
}
}
use of org.neo4j.kernel.impl.store.record.RelationshipGroupRecord in project neo4j by neo4j.
the class EncodeGroupsStepTest method shouldEncodeGroupChains.
@SuppressWarnings("unchecked")
@Test
public void shouldEncodeGroupChains() throws Throwable {
// GIVEN
StageControl control = mock(StageControl.class);
final AtomicLong nextId = new AtomicLong();
RecordStore<RelationshipGroupRecord> store = mock(RecordStore.class);
when(store.nextId()).thenAnswer(invocation -> nextId.incrementAndGet());
doAnswer(invocation -> {
invocation.getArgumentAt(0, RelationshipGroupRecord.class).setFirstOut(1);
return null;
}).when(store).prepareForCommit(any(RelationshipGroupRecord.class));
Configuration config = Configuration.withBatchSize(DEFAULT, 10);
EncodeGroupsStep encoder = new EncodeGroupsStep(control, config, store);
// WHEN
encoder.start(Step.ORDER_SEND_DOWNSTREAM);
Catcher catcher = new Catcher();
encoder.process(batch(new Group(1, 3), new Group(2, 3), new Group(3, 4)), catcher);
encoder.process(batch(new Group(4, 2), new Group(5, 10)), catcher);
encoder.process(batch(new Group(6, 35)), catcher);
encoder.process(batch(new Group(7, 2)), catcher);
encoder.endOfUpstream();
while (!encoder.isCompleted()) {
Thread.sleep(10);
}
encoder.close();
// THEN
assertEquals(4, catcher.batches.size());
long lastOwningNodeLastBatch = -1;
for (RelationshipGroupRecord[] batch : catcher.batches) {
assertBatch(batch, lastOwningNodeLastBatch);
lastOwningNodeLastBatch = batch[batch.length - 1].getOwningNode();
}
}
use of org.neo4j.kernel.impl.store.record.RelationshipGroupRecord in project neo4j by neo4j.
the class RelationshipGroupRecordFormatTest method useFixedReferenceFormatWhenRecordCanFitInRecordSizeRecord.
@Test
public void useFixedReferenceFormatWhenRecordCanFitInRecordSizeRecord() throws IOException {
RelationshipGroupRecord source = new RelationshipGroupRecord(1);
RelationshipGroupRecord target = new RelationshipGroupRecord(1);
source.initialize(true, randomType(), randomFixedReference(), randomFixedReference(), randomFixedReference(), randomFixedReference(), randomFixedReference());
writeReadRecord(source, target, RelationshipGroupRecordFormat.FIXED_FORMAT_RECORD_SIZE);
assertTrue("Record should use fixed reference if can fit in format record.", target.isUseFixedReferences());
verifySame(source, target);
}
Aggregations