@Override public Map<String,Object> getRelationshipProperties( long relId ) { RelationshipRecord record = recordAccess.getRelRecords().getOrLoad( relId, null ).forChangingData(); if ( record.getNextProp() != Record.NO_NEXT_PROPERTY.intValue() ) { return getPropertyChain( record.getNextProp() ); } return Collections.emptyMap(); }
@Override public String toString() { return "Relationship[" + getId() + ",used=" + inUse() + ",source=" + firstNode + ",target=" + secondNode + ",type=" + type + (firstInFirstChain ? ",sCount=" : ",sPrev=") + firstPrevRel + ",sNext=" + firstNextRel + (firstInSecondChain ? ",tCount=" : ",tPrev=") + secondPrevRel + ",tNext=" + secondNextRel + ",prop=" + getNextProp() + ",secondaryUnitId=" + getSecondaryUnitId() + (firstInFirstChain ? ", sFirst" : ",!sFirst") + (firstInSecondChain ? ", tFirst" : ",!tFirst") + "]"; }
Record( RelationshipRecord record, Record next ) { if ( record != null ) { id = record.getId(); type = record.getType(); nextProp = record.getNextProp(); firstNode = record.getFirstNode(); secondNode = record.getSecondNode(); } else { id = NO_ID; type = NO_ID; nextProp = NO_ID; firstNode = NO_ID; secondNode = NO_ID; } this.next = next; } }
private <RECEIVER extends PropertyReceiver> void relLoadProperties( long relId, RECEIVER receiver ) { RelationshipRecord relRecord = relStore.getRecord( relId, relStore.newRecord(), NORMAL ); loadProperties( relRecord.getNextProp(), receiver ); }
@Override public void setRelationshipProperties( long rel, Map<String, Object> properties ) { RelationshipRecord record = recordAccess.getRelRecords().getOrLoad( rel, null ).forChangingData(); if ( record.getNextProp() != Record.NO_NEXT_PROPERTY.intValue() ) { propertyDeletor.deletePropertyChain( record, recordAccess.getPropertyRecords() ); } record.setNextProp( propertyCreator.createPropertyChain( record, propertiesIterator( properties ), recordAccess.getPropertyRecords() ) ); flushStrategy.flush(); }
@Override protected void assertRecordsEqual( RelationshipRecord actualRecord, RelationshipRecord expectedRecord ) { assertNotNull( "actualRecord", actualRecord ); assertNotNull( "expectedRecord", expectedRecord ); assertThat( "getFirstNextRel", actualRecord.getFirstNextRel(), is( expectedRecord.getFirstNextRel() ) ); assertThat( "getFirstNode", actualRecord.getFirstNode(), is( expectedRecord.getFirstNode() ) ); assertThat( "getFirstPrevRel", actualRecord.getFirstPrevRel(), is( expectedRecord.getFirstPrevRel() ) ); assertThat( "getSecondNextRel", actualRecord.getSecondNextRel(), is( expectedRecord.getSecondNextRel() ) ); assertThat( "getSecondNode", actualRecord.getSecondNode(), is( expectedRecord.getSecondNode() ) ); assertThat( "getSecondPrevRel", actualRecord.getSecondPrevRel(), is( expectedRecord.getSecondPrevRel() ) ); assertThat( "getType", actualRecord.getType(), is( expectedRecord.getType() ) ); assertThat( "isFirstInFirstChain", actualRecord.isFirstInFirstChain(), is( expectedRecord.isFirstInFirstChain() ) ); assertThat( "isFirstInSecondChain", actualRecord.isFirstInSecondChain(), is( expectedRecord.isFirstInSecondChain() ) ); assertThat( "getId", actualRecord.getId(), is( expectedRecord.getId() ) ); assertThat( "getLongId", actualRecord.getId(), is( expectedRecord.getId() ) ); assertThat( "getNextProp", actualRecord.getNextProp(), is( expectedRecord.getNextProp() ) ); assertThat( "inUse", actualRecord.inUse(), is( expectedRecord.inUse() ) ); }
Collection<PropertyRecord> propertyRecs = propertyReader.getPropertyRecordChain( record.getNextProp() ); propertyMap = properties( propertyReader.propertyBlocks( propertyRecs ) );
@Test void shouldReportTwoRelationshipsWithSamePropertyChain() { // given OwnerCheck decorator = new OwnerCheck( true ); RecordCheck<RelationshipRecord, ConsistencyReport.RelationshipConsistencyReport> relationshipChecker = decorator.decorateRelationshipChecker( dummyRelationshipChecker() ); RecordAccessStub records = new RecordAccessStub(); RelationshipRecord relationship1 = records.add( inUse( new RelationshipRecord( 1, 0, 1, 0 ) ) ); relationship1.setNextProp( 7 ); RelationshipRecord relationship2 = records.add( inUse( new RelationshipRecord( 2, 0, 1, 0 ) ) ); relationship2.setNextProp( relationship1.getNextProp() ); // when ConsistencyReport.RelationshipConsistencyReport report1 = check( ConsistencyReport.RelationshipConsistencyReport.class, relationshipChecker, relationship1, records ); ConsistencyReport.RelationshipConsistencyReport report2 = check( ConsistencyReport.RelationshipConsistencyReport.class, relationshipChecker, relationship2, records ); // then verifyZeroInteractions( report1 ); verify( report2 ).multipleOwners( relationship1 ); }
@Override public RecordKey<RelationshipRecord> relationship() { return ( written, read ) -> { assertEquals( written.getNextProp(), read.getNextProp() ); assertEquals( written.getFirstNode(), read.getFirstNode() ); assertEquals( written.getSecondNode(), read.getSecondNode() ); assertEquals( written.getType(), read.getType() ); assertEquals( written.getFirstPrevRel(), read.getFirstPrevRel() ); assertEquals( written.getFirstNextRel(), read.getFirstNextRel() ); assertEquals( written.getSecondPrevRel(), read.getSecondPrevRel() ); assertEquals( written.getSecondNextRel(), read.getSecondNextRel() ); assertEquals( written.isFirstInFirstChain(), read.isFirstInFirstChain() ); assertEquals( written.isFirstInSecondChain(), read.isFirstInSecondChain() ); }; }
long secondNextRelMod = secondNextRel == Record.NO_NEXT_RELATIONSHIP.intValue() ? 0 : (secondNextRel & 0x700000000L) >> 16; long nextProp = record.getNextProp(); long nextPropMod = nextProp == Record.NO_NEXT_PROPERTY.intValue() ? 0 : (nextProp & 0xF00000000L) >> 28;
private void writeRelationshipRecord( WritableChannel channel, RelationshipRecord record ) throws IOException { byte flags = bitFlags( bitFlag( record.inUse(), Record.IN_USE.byteValue() ), bitFlag( record.isCreated(), Record.CREATED_IN_TX ), bitFlag( record.requiresSecondaryUnit(), Record.REQUIRE_SECONDARY_UNIT ), bitFlag( record.hasSecondaryUnitId(), Record.HAS_SECONDARY_UNIT ), bitFlag( record.isUseFixedReferences(), Record.USES_FIXED_REFERENCE_FORMAT ) ); channel.put( flags ); if ( record.inUse() ) { channel.putLong( record.getFirstNode() ).putLong( record.getSecondNode() ).putInt( record.getType() ) .putLong( record.getFirstPrevRel() ).putLong( record.getFirstNextRel() ) .putLong( record.getSecondPrevRel() ).putLong( record.getSecondNextRel() ) .putLong( record.getNextProp() ) .put( (byte) ((record.isFirstInFirstChain() ? 1 : 0) | (record.isFirstInSecondChain() ? 2 : 0)) ); if ( record.hasSecondaryUnitId() ) { channel.putLong( record.getSecondaryUnitId() ); } } else { channel.putInt( record.getType() ); } } }
RelationshipRecord record = stores.getRelationshipStore().newRecord(); record = stores.getRelationshipStore().getRecord( relId, record, RecordLoad.NORMAL ); long propId = record.getNextProp(); record.setNextProp( AbstractBaseRecord.NO_ID ); stores.getRelationshipStore().updateRecord( record );
@Override public Map<String,Object> getRelationshipProperties( long relId ) { RelationshipRecord record = recordAccess.getRelRecords().getOrLoad( relId, null ).forChangingData(); if ( record.getNextProp() != Record.NO_NEXT_PROPERTY.intValue() ) { return getPropertyChain( record.getNextProp() ); } return Collections.emptyMap(); }
@Override protected boolean canUseFixedReferences( RelationshipRecord record, int recordSize ) { return (isRecordBigEnoughForFixedReferences( recordSize ) && (record.getFirstNode() & ONE_BIT_OVERFLOW_BIT_MASK) == 0) && ((record.getSecondNode() & ONE_BIT_OVERFLOW_BIT_MASK) == 0) && ((record.getFirstPrevRel() == NULL) || ((record.getFirstPrevRel() & ONE_BIT_OVERFLOW_BIT_MASK) == 0)) && ((record.getFirstNextRel() == NULL) || ((record.getFirstNextRel() & ONE_BIT_OVERFLOW_BIT_MASK) == 0)) && ((record.getSecondPrevRel() == NULL) || ((record.getSecondPrevRel() & ONE_BIT_OVERFLOW_BIT_MASK) == 0)) && ((record.getSecondNextRel() == NULL) || ((record.getSecondNextRel() & ONE_BIT_OVERFLOW_BIT_MASK) == 0)) && ((record.getNextProp() == NULL) || ((record.getNextProp() & THREE_BITS_OVERFLOW_BIT_MASK) == 0)); }
@Override protected byte headerBits( RelationshipRecord record ) { byte header = 0; header = set( header, FIRST_IN_FIRST_CHAIN_BIT, record.isFirstInFirstChain() ); header = set( header, FIRST_IN_SECOND_CHAIN_BIT, record.isFirstInSecondChain() ); header = set( header, HAS_PROPERTY_BIT, record.getNextProp(), NULL ); header = set( header, HAS_FIRST_CHAIN_NEXT_BIT, record.getFirstNextRel(), NULL ); header = set( header, HAS_SECOND_CHAIN_NEXT_BIT, record.getSecondNextRel(), NULL ); return header; }
@Override protected byte headerBits( RelationshipRecord record ) { byte header = 0; header = set( header, FIRST_IN_FIRST_CHAIN_BIT, record.isFirstInFirstChain() ); header = set( header, FIRST_IN_SECOND_CHAIN_BIT, record.isFirstInSecondChain() ); header = set( header, HAS_PROPERTY_BIT, record.getNextProp(), NULL ); header = set( header, HAS_FIRST_CHAIN_NEXT_BIT, record.getFirstNextRel(), NULL ); header = set( header, HAS_SECOND_CHAIN_NEXT_BIT, record.getSecondNextRel(), NULL ); return header; }
@Override protected byte headerBits( RelationshipRecord record ) { byte header = 0; header = set( header, FIRST_IN_FIRST_CHAIN_BIT, record.isFirstInFirstChain() ); header = set( header, FIRST_IN_SECOND_CHAIN_BIT, record.isFirstInSecondChain() ); header = set( header, HAS_PROPERTY_BIT, record.getNextProp(), NULL ); header = set( header, HAS_FIRST_CHAIN_NEXT_BIT, record.getFirstNextRel(), NULL ); header = set( header, HAS_SECOND_CHAIN_NEXT_BIT, record.getSecondNextRel(), NULL ); return header; }
@Override protected byte headerBits( RelationshipRecord record ) { byte header = 0; header = set( header, FIRST_IN_FIRST_CHAIN_BIT, record.isFirstInFirstChain() ); header = set( header, FIRST_IN_SECOND_CHAIN_BIT, record.isFirstInSecondChain() ); header = set( header, HAS_PROPERTY_BIT, record.getNextProp(), NULL ); header = set( header, HAS_FIRST_CHAIN_NEXT_BIT, record.getFirstNextRel(), NULL ); header = set( header, HAS_SECOND_CHAIN_NEXT_BIT, record.getSecondNextRel(), NULL ); return header; }
@Override protected byte headerBits( RelationshipRecord record ) { byte header = 0; header = set( header, FIRST_IN_FIRST_CHAIN_BIT, record.isFirstInFirstChain() ); header = set( header, FIRST_IN_SECOND_CHAIN_BIT, record.isFirstInSecondChain() ); header = set( header, HAS_PROPERTY_BIT, record.getNextProp(), NULL ); header = set( header, HAS_FIRST_CHAIN_NEXT_BIT, record.getFirstNextRel(), NULL ); header = set( header, HAS_SECOND_CHAIN_NEXT_BIT, record.getSecondNextRel(), NULL ); return header; }
@Override public void setRelationshipProperties( long rel, Map<String, Object> properties ) { RelationshipRecord record = recordAccess.getRelRecords().getOrLoad( rel, null ).forChangingData(); if ( record.getNextProp() != Record.NO_NEXT_PROPERTY.intValue() ) { propertyDeletor.deletePropertyChain( record, recordAccess.getPropertyRecords() ); } record.setNextProp( propertyCreator.createPropertyChain( record, propertiesIterator( properties ), recordAccess.getPropertyRecords() ) ); flushStrategy.flush(); }