use of org.neo4j.kernel.impl.store.record.PropertyBlock in project neo4j by neo4j.
the class TransactionRecordStateTest method shouldWriteProperPropertyRecordsWhenOnlyChangingLinkage.
@Test
public void shouldWriteProperPropertyRecordsWhenOnlyChangingLinkage() throws Exception {
/* There was an issue where GIVEN:
*
* Legend: () = node, [] = property record
*
* ()-->[0:block{size:1}]
*
* WHEN adding a new property record in front of if, not changing any data in that record i.e:
*
* ()-->[1:block{size:4}]-->[0:block{size:1}]
*
* The state of property record 0 would be that it had loaded value records for that block,
* but those value records weren't heavy, so writing that record to the log would fail
* w/ an assertion data != null.
*/
// GIVEN
NeoStores neoStores = neoStoresRule.open();
TransactionRecordState recordState = newTransactionRecordState(neoStores);
int nodeId = 0;
recordState.nodeCreate(nodeId);
int index = 0;
// will require a block of size 1
recordState.nodeAddProperty(nodeId, index, string(70));
apply(neoStores, recordState);
// WHEN
recordState = newTransactionRecordState(neoStores);
int index2 = 1;
// will require a block of size 4
recordState.nodeAddProperty(nodeId, index2, string(40));
// THEN
PhysicalTransactionRepresentation representation = transactionRepresentationOf(recordState);
representation.accept(command -> ((Command) command).handle(new CommandVisitor.Adapter() {
@Override
public boolean visitPropertyCommand(PropertyCommand command) throws IOException {
verifyPropertyRecord(command.getBefore());
verifyPropertyRecord(command.getAfter());
return false;
}
private void verifyPropertyRecord(PropertyRecord record) {
if (record.getPrevProp() != Record.NO_NEXT_PROPERTY.intValue()) {
for (PropertyBlock block : record) {
assertTrue(block.isLight());
}
}
}
}));
}
use of org.neo4j.kernel.impl.store.record.PropertyBlock in project neo4j by neo4j.
the class MultipleIndexPopulatorUpdatesTest method getPropertyRecord.
private PropertyRecord getPropertyRecord() {
PropertyRecord propertyRecord = new PropertyRecord(1);
PropertyBlock propertyBlock = new PropertyBlock();
propertyBlock.setValueBlocks(new long[] { 0 });
propertyBlock.setKeyIndexId(1);
propertyBlock.setSingleBlock((0x000000000F000009L << 24) + 1);
propertyRecord.setPropertyBlock(propertyBlock);
return propertyRecord;
}
use of org.neo4j.kernel.impl.store.record.PropertyBlock in project neo4j by neo4j.
the class PropertyPhysicalToLogicalConverterTest method propertyRecord.
private PropertyRecord propertyRecord(PropertyBlock... propertyBlocks) {
PropertyRecord record = new PropertyRecord(0);
if (propertyBlocks != null) {
record.setInUse(true);
for (PropertyBlock propertyBlock : propertyBlocks) {
record.addPropertyBlock(propertyBlock);
}
}
record.setNodeId(0);
return record;
}
use of org.neo4j.kernel.impl.store.record.PropertyBlock in project neo4j by neo4j.
the class PropertyPhysicalToLogicalConverterTest method property.
private PropertyBlock property(long key, Object value) {
PropertyBlock block = new PropertyBlock();
store.encodeValue(block, (int) key, value);
return block;
}
use of org.neo4j.kernel.impl.store.record.PropertyBlock in project neo4j by neo4j.
the class StorePropertyCursorTest method createTwoPropertyValues.
private static PropertyRecord createTwoPropertyValues(PropertyStore store, int keyId1, Object value1, int keyId2, Object value2) {
DynamicRecordAllocator stringAllocator = store.getStringStore();
DynamicRecordAllocator arrayAllocator = store.getArrayStore();
PropertyBlock block1 = new PropertyBlock();
PropertyStore.encodeValue(block1, keyId1, value1, stringAllocator, arrayAllocator);
PropertyBlock block2 = new PropertyBlock();
PropertyStore.encodeValue(block2, keyId2, value2, stringAllocator, arrayAllocator);
PropertyRecord record = new PropertyRecord(store.nextId());
record.addPropertyBlock(block1);
if (block1.getSize() + block2.getSize() <= PropertyRecordFormat.DEFAULT_PAYLOAD_SIZE) {
record.addPropertyBlock(block2);
} else {
PropertyRecord nextRecord = new PropertyRecord(store.nextId());
record.setNextProp(nextRecord.getId());
nextRecord.addPropertyBlock(block2);
nextRecord.setPrevProp(record.getId());
nextRecord.setInUse(true);
updateRecord(store, nextRecord);
}
record.setInUse(true);
updateRecord(store, record);
return record;
}
Aggregations