Search in sources :

Example 1 with NO_DYNAMIC_HANDLER

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;
}
Also used : PropertyType(org.neo4j.kernel.impl.store.PropertyType) CursorContext(org.neo4j.io.pagecache.context.CursorContext) IOUtils.closeAllUnchecked(org.neo4j.io.IOUtils.closeAllUnchecked) NULL_REFERENCE(org.neo4j.kernel.impl.store.record.Record.NULL_REFERENCE) PropertyRecord(org.neo4j.kernel.impl.store.record.PropertyRecord) NO_DYNAMIC_HANDLER(org.neo4j.consistency.checker.RecordLoading.NO_DYNAMIC_HANDLER) RecordLoading.checkValidToken(org.neo4j.consistency.checker.RecordLoading.checkValidToken) MutableIntObjectMap(org.eclipse.collections.api.map.primitive.MutableIntObjectMap) RecordType(org.neo4j.consistency.RecordType) Value(org.neo4j.values.storable.Value) Function(java.util.function.Function) ArrayList(java.util.ArrayList) DynamicRecord(org.neo4j.kernel.impl.store.record.DynamicRecord) Values(org.neo4j.values.storable.Values) MutableLongSet(org.eclipse.collections.api.set.primitive.MutableLongSet) List(java.util.List) PrimitiveRecord(org.neo4j.kernel.impl.store.record.PrimitiveRecord) RecordLoading.lightClear(org.neo4j.consistency.checker.RecordLoading.lightClear) NeoStores(org.neo4j.kernel.impl.store.NeoStores) RecordLoading.safeLoadDynamicRecordChain(org.neo4j.consistency.checker.RecordLoading.safeLoadDynamicRecordChain) LongHashSet(org.eclipse.collections.impl.set.mutable.primitive.LongHashSet) PropertyBlock(org.neo4j.kernel.impl.store.record.PropertyBlock) ConsistencyReport(org.neo4j.consistency.report.ConsistencyReport) PropertyStore(org.neo4j.kernel.impl.store.PropertyStore) PropertyRecord(org.neo4j.kernel.impl.store.record.PropertyRecord) PropertyBlock(org.neo4j.kernel.impl.store.record.PropertyBlock) Value(org.neo4j.values.storable.Value) PropertyType(org.neo4j.kernel.impl.store.PropertyType)

Aggregations

ArrayList (java.util.ArrayList)1 List (java.util.List)1 Function (java.util.function.Function)1 MutableIntObjectMap (org.eclipse.collections.api.map.primitive.MutableIntObjectMap)1 MutableLongSet (org.eclipse.collections.api.set.primitive.MutableLongSet)1 LongHashSet (org.eclipse.collections.impl.set.mutable.primitive.LongHashSet)1 RecordType (org.neo4j.consistency.RecordType)1 NO_DYNAMIC_HANDLER (org.neo4j.consistency.checker.RecordLoading.NO_DYNAMIC_HANDLER)1 RecordLoading.checkValidToken (org.neo4j.consistency.checker.RecordLoading.checkValidToken)1 RecordLoading.lightClear (org.neo4j.consistency.checker.RecordLoading.lightClear)1 RecordLoading.safeLoadDynamicRecordChain (org.neo4j.consistency.checker.RecordLoading.safeLoadDynamicRecordChain)1 ConsistencyReport (org.neo4j.consistency.report.ConsistencyReport)1 IOUtils.closeAllUnchecked (org.neo4j.io.IOUtils.closeAllUnchecked)1 CursorContext (org.neo4j.io.pagecache.context.CursorContext)1 NeoStores (org.neo4j.kernel.impl.store.NeoStores)1 PropertyStore (org.neo4j.kernel.impl.store.PropertyStore)1 PropertyType (org.neo4j.kernel.impl.store.PropertyType)1 DynamicRecord (org.neo4j.kernel.impl.store.record.DynamicRecord)1 PrimitiveRecord (org.neo4j.kernel.impl.store.record.PrimitiveRecord)1 PropertyBlock (org.neo4j.kernel.impl.store.record.PropertyBlock)1