use of org.neo4j.consistency.checker.RecordLoading.NO_DYNAMIC_HANDLER in project neo4j by neo4j.
the class SafePropertyChainReader method read.
<PRIMITIVE extends PrimitiveRecord> boolean read(MutableIntObjectMap<Value> intoValues, PRIMITIVE entity, Function<PRIMITIVE, ConsistencyReport.PrimitiveConsistencyReport> primitiveReporter, CursorContext cursorContext) {
lightClear(seenRecords);
long propertyRecordId = entity.getNextProp();
long previousRecordId = NULL_REFERENCE.longValue();
boolean chainIsOk = true;
while (!NULL_REFERENCE.is(propertyRecordId) && !context.isCancelled()) {
if (!seenRecords.add(propertyRecordId)) {
primitiveReporter.apply(entity).propertyChainContainsCircularReference(propertyReader.record());
chainIsOk = false;
break;
}
PropertyRecord propertyRecord = propertyReader.read(propertyRecordId);
if (!propertyRecord.inUse()) {
primitiveReporter.apply(entity).propertyNotInUse(propertyRecord);
reporter.forProperty(context.recordLoader.property(previousRecordId, cursorContext)).nextNotInUse(propertyRecord);
chainIsOk = false;
} else {
if (propertyRecord.getPrevProp() != previousRecordId) {
if (NULL_REFERENCE.is(previousRecordId)) {
primitiveReporter.apply(entity).propertyNotFirstInChain(propertyRecord);
} else {
reporter.forProperty(context.recordLoader.property(previousRecordId, cursorContext)).nextDoesNotReferenceBack(propertyRecord);
// prevDoesNotReferenceBack is not reported, unnecessary double report (same inconsistency from different directions)
}
chainIsOk = false;
}
for (PropertyBlock block : propertyRecord) {
int propertyKeyId = block.getKeyIndexId();
if (!checkValidToken(propertyRecord, propertyKeyId, context.tokenHolders.propertyKeyTokens(), neoStores.getPropertyKeyTokenStore(), (property, token) -> reporter.forProperty(property).invalidPropertyKey(block), (property, token) -> reporter.forProperty(property).keyNotInUse(block, token), cursorContext)) {
chainIsOk = false;
}
PropertyType type = block.forceGetType();
Value value = Values.NO_VALUE;
if (type == null) {
reporter.forProperty(propertyRecord).invalidPropertyType(block);
} else {
try {
switch(type) {
case STRING:
dynamicRecords.clear();
if (safeLoadDynamicRecordChain(record -> dynamicRecords.add(record.copy()), stringReader, seenDynamicRecordIds, block.getSingleValueLong(), stringStoreBlockSize, NO_DYNAMIC_HANDLER, (id, record) -> reporter.forProperty(propertyRecord).stringNotInUse(block, record), (id, record) -> reporter.forDynamicBlock(RecordType.STRING_PROPERTY, stringReader.record()).nextNotInUse(record), (id, record) -> reporter.forProperty(propertyRecord).stringEmpty(block, record), record -> reporter.forDynamicBlock(RecordType.STRING_PROPERTY, record).recordNotFullReferencesNext(), record -> reporter.forDynamicBlock(RecordType.STRING_PROPERTY, record).invalidLength())) {
value = propertyStore.getTextValueFor(dynamicRecords, cursorContext);
}
break;
case ARRAY:
dynamicRecords.clear();
if (safeLoadDynamicRecordChain(record -> dynamicRecords.add(record.copy()), arrayReader, seenDynamicRecordIds, block.getSingleValueLong(), arrayStoreBlockSize, NO_DYNAMIC_HANDLER, (id, record) -> reporter.forProperty(propertyRecord).arrayNotInUse(block, record), (id, record) -> reporter.forDynamicBlock(RecordType.ARRAY_PROPERTY, arrayReader.record()).nextNotInUse(record), (id, record) -> reporter.forProperty(propertyRecord).arrayEmpty(block, record), record -> reporter.forDynamicBlock(RecordType.ARRAY_PROPERTY, record).recordNotFullReferencesNext(), record -> reporter.forDynamicBlock(RecordType.ARRAY_PROPERTY, record).invalidLength())) {
value = propertyStore.getArrayFor(dynamicRecords, cursorContext);
}
break;
default:
value = type.value(block, null, cursorContext);
break;
}
} catch (Exception e) {
reporter.forProperty(propertyRecord).invalidPropertyValue(propertyRecord.getId(), block.getKeyIndexId());
}
}
if (value == Values.NO_VALUE) {
chainIsOk = false;
} else if (propertyKeyId >= 0 && intoValues.put(propertyKeyId, value) != null) {
primitiveReporter.apply(entity).propertyKeyNotUniqueInChain();
chainIsOk = false;
}
}
}
previousRecordId = propertyRecordId;
propertyRecordId = propertyRecord.getNextProp();
}
return chainIsOk;
}
Aggregations