@Override public Void caseSimpleSchemaField(SimpleSchemaField field) { if (field.isIndexed()) ObjectType.this.indexedSimpleFields.add(field); return null; } @Override
@Override public Void caseSimpleSchemaField(SimpleSchemaField field) { if (field.isIndexed()) JsckInfo.this.addStorage(schemaVersion, new SimpleFieldIndex(JsckInfo.this, schemaVersion, field)); return null; }
@Override public Void caseMapSchemaField(MapSchemaField field) { if (field.getKeyField().isIndexed()) JsckInfo.this.addStorage(schemaVersion, new MapKeyIndex(JsckInfo.this, schemaVersion, field)); if (field.getValueField().isIndexed()) JsckInfo.this.addStorage(schemaVersion, new MapValueIndex(JsckInfo.this, schemaVersion, field)); return null; }
@Override public Void caseSetSchemaField(SetSchemaField field) { if (field.getElementField().isIndexed()) JsckInfo.this.addStorage(schemaVersion, new SetElementIndex(JsckInfo.this, schemaVersion, field)); return null; }
@Override public Void caseListSchemaField(ListSchemaField field) { if (field.getElementField().isIndexed()) JsckInfo.this.addStorage(schemaVersion, new ListElementIndex(JsckInfo.this, schemaVersion, field)); return null; }
SimpleIndex(JsckInfo info, int schemaVersion, SimpleSchemaField field) { super(info, field.getStorageId()); assert field.isIndexed(); this.type = this.info.findFieldType(schemaVersion, field).genericizeForIndex(); }
private <T> SimpleField<T> buildSimpleField(SimpleSchemaField field, String fieldName, FieldType<T> fieldType) { assert field.getEncodingSignature() == fieldType.getEncodingSignature(); return new SimpleField<>(fieldName, field.getStorageId(), this.schema, fieldType, field.isIndexed()); }
private void checkMapField(JsckInfo info, ObjId id, MapSchemaField field, byte[] prefix, PeekingIterator<KVPair> i) { // Get key and value fields final SimpleSchemaField keyField = field.getKeyField(); final SimpleSchemaField valField = field.getValueField(); // Iterate over set elements while (i.hasNext() && ByteUtil.isPrefixOf(prefix, i.peek().getKey())) { final KVPair pair = i.next(); // Verify encoded key final ByteReader keyReader = new ByteReader(pair.getKey(), prefix.length); if (!this.validateSimpleFieldValue(info, id, keyField, pair, keyReader)) continue; // Verify encoded value final ByteReader valReader = new ByteReader(pair.getValue()); if (!this.validateSimpleFieldValue(info, id, valField, pair, valReader)) continue; // Verify index entries if (keyField.isIndexed()) this.verifySimpleIndexEntry(info, id, keyField, field, keyReader.getBytes(prefix.length), ByteUtil.EMPTY); if (valField.isIndexed()) this.verifySimpleIndexEntry(info, id, valField, field, pair.getValue(), keyReader.getBytes(prefix.length)); } }
private void checkSetField(JsckInfo info, ObjId id, SetSchemaField field, byte[] prefix, PeekingIterator<KVPair> i) { // Get element field final SimpleSchemaField elementField = field.getElementField(); // Iterate over set elements while (i.hasNext() && ByteUtil.isPrefixOf(prefix, i.peek().getKey())) { final KVPair pair = i.next(); // Verify encoded element final ByteReader reader = new ByteReader(pair.getKey(), prefix.length); if (!this.validateSimpleFieldValue(info, id, elementField, pair, reader)) continue; // Value should be empty if (pair.getValue().length != 0) info.handle(new InvalidValue(pair, ByteUtil.EMPTY).setDetail(id, elementField, "should be empty")); // Verify index entry if (elementField.isIndexed()) this.verifySimpleIndexEntry(info, id, elementField, field, reader.getBytes(prefix.length), ByteUtil.EMPTY); } }
if (elementField.isIndexed()) this.verifySimpleIndexEntry(info, id, elementField, field, pair.getValue(), encodedIndex);
private byte[] checkSimpleField(JsckInfo info, ObjId id, SimpleSchemaField field, byte[] prefix, PeekingIterator<KVPair> i) { // Get field type final FieldType<?> fieldType = this.simpleFieldTypes.get(field.getStorageId()); assert fieldType != null; // Get field key/value pair final KVPair pair = i.next(); assert pair != null; assert ByteUtil.isPrefixOf(prefix, pair.getKey()); // Check for trailing garbage in key if (pair.getKey().length > prefix.length) { info.handle(new InvalidKey(pair).setDetail(id, field, "trailing garbage " + Jsck.ds(new ByteReader(pair.getKey(), prefix.length)))); return null; } // Decode value byte[] value = pair.getValue(); final ByteReader reader = new ByteReader(pair.getValue()); if (!this.validateSimpleFieldValue(info, id, field, pair, reader)) value = null; // We should not see default values in simple fields that are not sub-fields of complex fields if (value != null && ByteUtil.compare(value, fieldType.getDefaultValue()) == 0) { info.handle(new InvalidValue(pair).setDetail("default value; should not be present")); value = null; } // Verify index entry if (field.isIndexed()) this.verifySimpleIndexEntry(info, id, field, value != null ? value : fieldType.getDefaultValue()); // Done return value; }