@Test public void readRelationshipCommandWithFixedReferenceFormat302() throws IOException { InMemoryClosableChannel channel = new InMemoryClosableChannel(); RelationshipRecord before = new RelationshipRecord( 42, true, 1, 2, 3, 4, 5, 6, 7, true, true ); before.setUseFixedReferences( true ); RelationshipRecord after = new RelationshipRecord( 42, true, 1, 8, 3, 4, 5, 6, 7, true, true ); after.setUseFixedReferences( true ); new Command.RelationshipCommand( before, after ).serialize( channel ); PhysicalLogCommandReaderV3_0_2 reader = new PhysicalLogCommandReaderV3_0_2(); Command command = reader.read( channel ); assertTrue( command instanceof Command.RelationshipCommand ); Command.RelationshipCommand relationshipCommand = (Command.RelationshipCommand) command; assertEquals( before, relationshipCommand.getBefore() ); assertTrue( relationshipCommand.getBefore().isUseFixedReferences() ); assertEquals( after, relationshipCommand.getAfter() ); assertTrue( relationshipCommand.getAfter().isUseFixedReferences() ); }
@Test public void readRelationshipCommandWithFixedReferenceFormat300() throws IOException { InMemoryClosableChannel channel = new InMemoryClosableChannel(); RelationshipRecord before = new RelationshipRecord( 42, true, 1, 2, 3, 4, 5, 6, 7, true, true ); before.setUseFixedReferences( true ); RelationshipRecord after = new RelationshipRecord( 42, true, 1, 8, 3, 4, 5, 6, 7, true, true ); after.setUseFixedReferences( true ); new Command.RelationshipCommand( before, after ).serialize( channel ); PhysicalLogCommandReaderV3_0 reader = new PhysicalLogCommandReaderV3_0(); Command command = reader.read( channel ); assertTrue( command instanceof Command.RelationshipCommand ); Command.RelationshipCommand relationshipCommand = (Command.RelationshipCommand) command; assertEquals( before, relationshipCommand.getBefore() ); assertTrue( relationshipCommand.getBefore().isUseFixedReferences() ); assertEquals( after, relationshipCommand.getAfter() ); assertTrue( relationshipCommand.getAfter().isUseFixedReferences() ); }
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() ); } } }
@Override protected void doReadInternal( RelationshipRecord record, PageCursor cursor, int recordSize, long headerByte, boolean inUse ) { int type = cursor.getShort() & 0xFFFF; if ( record.isUseFixedReferences() ) { // read record in fixed reference format readFixedReferencesRecord( record, cursor, headerByte, inUse, type ); record.setUseFixedReferences( true ); } else { long recordId = record.getId(); record.initialize( inUse, decodeCompressedReference( cursor, headerByte, HAS_PROPERTY_BIT, NULL ), decodeCompressedReference( cursor ), decodeCompressedReference( cursor ), type, decodeAbsoluteOrRelative( cursor, headerByte, FIRST_IN_FIRST_CHAIN_BIT, recordId ), decodeAbsoluteIfPresent( cursor, headerByte, HAS_FIRST_CHAIN_NEXT_BIT, recordId ), decodeAbsoluteOrRelative( cursor, headerByte, FIRST_IN_SECOND_CHAIN_BIT, recordId ), decodeAbsoluteIfPresent( cursor, headerByte, HAS_SECOND_CHAIN_NEXT_BIT, recordId ), has( headerByte, FIRST_IN_FIRST_CHAIN_BIT ), has( headerByte, FIRST_IN_SECOND_CHAIN_BIT ) ); } }
@Override protected void doReadInternal( RelationshipRecord record, PageCursor cursor, int recordSize, long headerByte, boolean inUse ) { if ( record.isUseFixedReferences() ) { int type = cursor.getShort() & 0xFFFF; // read record in fixed reference format readFixedReferencesRecord( record, cursor, headerByte, inUse, type ); record.setUseFixedReferences( true ); } else { int typeLowWord = cursor.getShort() & 0xFFFF; int typeHighWord = cursor.getByte() & 0xFF; int type = (typeHighWord << Short.SIZE) | typeLowWord; long recordId = record.getId(); record.initialize( inUse, decodeCompressedReference( cursor, headerByte, HAS_PROPERTY_BIT, NULL ), decodeCompressedReference( cursor ), decodeCompressedReference( cursor ), type, decodeAbsoluteOrRelative( cursor, headerByte, FIRST_IN_FIRST_CHAIN_BIT, recordId ), decodeAbsoluteIfPresent( cursor, headerByte, HAS_FIRST_CHAIN_NEXT_BIT, recordId ), decodeAbsoluteOrRelative( cursor, headerByte, FIRST_IN_SECOND_CHAIN_BIT, recordId ), decodeAbsoluteIfPresent( cursor, headerByte, HAS_SECOND_CHAIN_NEXT_BIT, recordId ), has( headerByte, FIRST_IN_FIRST_CHAIN_BIT ), has( headerByte, FIRST_IN_SECOND_CHAIN_BIT ) ); } }
@Override protected void doReadInternal( RelationshipRecord record, PageCursor cursor, int recordSize, long headerByte, boolean inUse ) { if ( record.isUseFixedReferences() ) { int type = cursor.getShort() & 0xFFFF; // read record in fixed reference format readFixedReferencesRecord( record, cursor, headerByte, inUse, type ); record.setUseFixedReferences( true ); } else { int typeLowWord = cursor.getShort() & 0xFFFF; int typeHighWord = cursor.getByte() & 0xFF; int type = (typeHighWord << Short.SIZE) | typeLowWord; long recordId = record.getId(); record.initialize( inUse, decodeCompressedReference( cursor, headerByte, HAS_PROPERTY_BIT, NULL ), decodeCompressedReference( cursor ), decodeCompressedReference( cursor ), type, decodeAbsoluteOrRelative( cursor, headerByte, FIRST_IN_FIRST_CHAIN_BIT, recordId ), decodeAbsoluteIfPresent( cursor, headerByte, HAS_FIRST_CHAIN_NEXT_BIT, recordId ), decodeAbsoluteOrRelative( cursor, headerByte, FIRST_IN_SECOND_CHAIN_BIT, recordId ), decodeAbsoluteIfPresent( cursor, headerByte, HAS_SECOND_CHAIN_NEXT_BIT, recordId ), has( headerByte, FIRST_IN_FIRST_CHAIN_BIT ), has( headerByte, FIRST_IN_SECOND_CHAIN_BIT ) ); } }
@Override protected void doReadInternal( RelationshipRecord record, PageCursor cursor, int recordSize, long headerByte, boolean inUse ) { if ( record.isUseFixedReferences() ) { int type = cursor.getShort() & 0xFFFF; // read record in fixed reference format readFixedReferencesRecord( record, cursor, headerByte, inUse, type ); record.setUseFixedReferences( true ); } else { int typeLowWord = cursor.getShort() & 0xFFFF; int typeHighWord = cursor.getByte() & 0xFF; int type = (typeHighWord << Short.SIZE) | typeLowWord; long recordId = record.getId(); record.initialize( inUse, decodeCompressedReference( cursor, headerByte, HAS_PROPERTY_BIT, NULL ), decodeCompressedReference( cursor ), decodeCompressedReference( cursor ), type, decodeAbsoluteOrRelative( cursor, headerByte, FIRST_IN_FIRST_CHAIN_BIT, recordId ), decodeAbsoluteIfPresent( cursor, headerByte, HAS_FIRST_CHAIN_NEXT_BIT, recordId ), decodeAbsoluteOrRelative( cursor, headerByte, FIRST_IN_SECOND_CHAIN_BIT, recordId ), decodeAbsoluteIfPresent( cursor, headerByte, HAS_SECOND_CHAIN_NEXT_BIT, recordId ), has( headerByte, FIRST_IN_FIRST_CHAIN_BIT ), has( headerByte, FIRST_IN_SECOND_CHAIN_BIT ) ); } }
@Override protected void doWriteInternal( RelationshipRecord record, PageCursor cursor ) { cursor.putShort( (short) record.getType() ); if ( record.isUseFixedReferences() ) { // write record in fixed reference format writeFixedReferencesRecord( record, cursor ); } else { long recordId = record.getId(); encode( cursor, record.getNextProp(), NULL ); encode( cursor, record.getFirstNode() ); encode( cursor, record.getSecondNode() ); encode( cursor, getFirstPrevReference( record, recordId ) ); if ( record.getFirstNextRel() != NULL ) { encode( cursor, toRelative( record.getFirstNextRel(), recordId ) ); } encode( cursor, getSecondPrevReference( record, recordId ) ); if ( record.getSecondNextRel() != NULL ) { encode( cursor, toRelative( record.getSecondNextRel(), recordId ) ); } } }
@Override protected void doWriteInternal( RelationshipRecord record, PageCursor cursor ) { if ( record.isUseFixedReferences() ) { // write record in fixed reference format writeFixedReferencesRecord( record, cursor ); } else { int type = record.getType(); cursor.putShort( (short) type ); cursor.putByte( (byte) (type >>> Short.SIZE) ); long recordId = record.getId(); encode( cursor, record.getNextProp(), NULL ); encode( cursor, record.getFirstNode() ); encode( cursor, record.getSecondNode() ); encode( cursor, getFirstPrevReference( record, recordId ) ); if ( record.getFirstNextRel() != NULL ) { encode( cursor, toRelative( record.getFirstNextRel(), recordId ) ); } encode( cursor, getSecondPrevReference( record, recordId ) ); if ( record.getSecondNextRel() != NULL ) { encode( cursor, toRelative( record.getSecondNextRel(), recordId ) ); } } }
@Override protected void doWriteInternal( RelationshipRecord record, PageCursor cursor ) { if ( record.isUseFixedReferences() ) { // write record in fixed reference format writeFixedReferencesRecord( record, cursor ); } else { int type = record.getType(); cursor.putShort( (short) type ); cursor.putByte( (byte) (type >>> Short.SIZE) ); long recordId = record.getId(); encode( cursor, record.getNextProp(), NULL ); encode( cursor, record.getFirstNode() ); encode( cursor, record.getSecondNode() ); encode( cursor, getFirstPrevReference( record, recordId ) ); if ( record.getFirstNextRel() != NULL ) { encode( cursor, toRelative( record.getFirstNextRel(), recordId ) ); } encode( cursor, getSecondPrevReference( record, recordId ) ); if ( record.getSecondNextRel() != NULL ) { encode( cursor, toRelative( record.getSecondNextRel(), recordId ) ); } } }
@Override protected void doWriteInternal( RelationshipRecord record, PageCursor cursor ) { if ( record.isUseFixedReferences() ) { // write record in fixed reference format writeFixedReferencesRecord( record, cursor ); } else { int type = record.getType(); cursor.putShort( (short) type ); cursor.putByte( (byte) (type >>> Short.SIZE) ); long recordId = record.getId(); encode( cursor, record.getNextProp(), NULL ); encode( cursor, record.getFirstNode() ); encode( cursor, record.getSecondNode() ); encode( cursor, getFirstPrevReference( record, recordId ) ); if ( record.getFirstNextRel() != NULL ) { encode( cursor, toRelative( record.getFirstNextRel(), recordId ) ); } encode( cursor, getSecondPrevReference( record, recordId ) ); if ( record.getSecondNextRel() != NULL ) { encode( cursor, toRelative( record.getSecondNextRel(), recordId ) ); } } }
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() ); } } }