private int addDeserialisedProperty(final byte[] bytes, final int carriage, final Properties properties, final SchemaElementDefinition elementDefinition, final String propertyName) throws SerialisationException { int rtn = carriage; final TypeDefinition typeDefinition = elementDefinition.getPropertyTypeDef(propertyName); final ToBytesSerialiser serialiser = (null != typeDefinition) ? (ToBytesSerialiser) typeDefinition.getSerialiser() : null; if (null != serialiser) { final int numBytesForLength = CompactRawSerialisationUtils.decodeVIntSize(bytes[rtn]); final int currentPropLength = getCurrentPropLength(bytes, rtn); int from = rtn += numBytesForLength; rtn += currentPropLength; Object deserialisedObject = getDeserialisedObject(serialiser, bytes, from, currentPropLength); properties.put(propertyName, deserialisedObject); } return rtn; }
/** * Clone an {@link Element}, based on a target {@link Schema}. * * @param element the element to clone * @param schema the schema * @return the cloned element */ public Element cloneElement(final Element element, final Schema schema) { try { final Element clone = element.emptyClone(); final SchemaElementDefinition sed = schema.getElement(clone.getGroup()); for (final String propertyName : element.getProperties().keySet()) { final Object property = element.getProperty(propertyName); if (null == sed.getPropertyTypeDef(propertyName) || null == sed.getPropertyTypeDef(propertyName).getSerialiser()) { // This can happen if transient properties are derived - they will not have serialisers. LOGGER.warn("Can't find Serialisation for {}, returning uncloned property", propertyName); clone.putProperty(propertyName, property); } else if (null != property) { final Serialiser serialiser = sed.getPropertyTypeDef(propertyName).getSerialiser(); clone.putProperty(propertyName, serialiser.deserialise(serialiser.serialise(property))); } else { clone.putProperty(propertyName, null); } } return clone; } catch (final SerialisationException e) { throw new RuntimeException("SerialisationException converting elements", e); } } }
@Override protected void validateSchema(final ValidationResult validationResult, final Serialiser serialiser) { super.validateSchema(validationResult, serialiser); final String timestampProperty = getSchema().getConfig(AccumuloStoreConstants.TIMESTAMP_PROPERTY); if (null != timestampProperty) { final Iterable<SchemaElementDefinition> defs = new ChainedIterable<>(getSchema().getEntities().values(), getSchema().getEdges().values()); for (final SchemaElementDefinition def : defs) { final TypeDefinition typeDef = def.getPropertyTypeDef(timestampProperty); if (null != typeDef && null != typeDef.getAggregateFunction() && !(typeDef.getAggregateFunction() instanceof Max)) { validationResult.addError("The aggregator for the " + timestampProperty + " property must be set to: " + Max.class.getName() + " this cannot be overridden for this Accumulo Store, as you have told Accumulo to store this property in the timestamp column."); } } } }
protected void serialiseSizeAndPropertyValue(final String propertyName, final SchemaElementDefinition elementDefinition, final Properties properties, final ByteArrayOutputStream stream) { try { final TypeDefinition typeDefinition = elementDefinition.getPropertyTypeDef(propertyName); final ToBytesSerialiser serialiser = (null == typeDefinition) ? null : (ToBytesSerialiser) typeDefinition.getSerialiser(); byte[] bytes; if (null == serialiser) { bytes = AccumuloStoreConstants.EMPTY_BYTES; } else { Object value = properties.get(propertyName); //serialiseNull could be different to AccumuloStoreConstants.EMPTY_BYTES bytes = (null == value) ? serialiser.serialiseNull() : serialiser.serialise(value); } writeBytes(bytes, stream); } catch (final IOException e) { throw new AccumuloElementConversionException("Failed to write serialised property to ByteArrayOutputStream" + propertyName, e); } }
@Override public byte[] buildColumnVisibility(final String group, final Properties properties) { byte[] rtn = AccumuloStoreConstants.EMPTY_BYTES; final SchemaElementDefinition elementDefinition = getSchemaElementDefinition(group); if (null != schema.getVisibilityProperty()) { final TypeDefinition propertyDef = elementDefinition.getPropertyTypeDef(schema.getVisibilityProperty()); if (null != propertyDef) { final Object property = properties.get(schema.getVisibilityProperty()); final ToBytesSerialiser serialiser = (ToBytesSerialiser) propertyDef.getSerialiser(); if (null != property) { try { rtn = serialiser.serialise(property); } catch (final SerialisationException e) { throw new AccumuloElementConversionException(e.getMessage(), e); } } else { rtn = serialiser.serialiseNull(); } } } return rtn; }
@Override public Properties getPropertiesFromColumnVisibility(final String group, final byte[] columnVisibility) { final Properties properties = new Properties(); final SchemaElementDefinition elementDefinition = getSchemaElementDefinition(group); if (null != schema.getVisibilityProperty()) { final TypeDefinition propertyDef = elementDefinition.getPropertyTypeDef(schema.getVisibilityProperty()); if (null != propertyDef) { final ToBytesSerialiser serialiser = (ToBytesSerialiser) propertyDef.getSerialiser(); try { if (null == columnVisibility || columnVisibility.length == 0) { final Object value = serialiser.deserialiseEmpty(); if (null != value) { properties.put(schema.getVisibilityProperty(), value); } } else { properties.put(schema.getVisibilityProperty(), serialiser.deserialise(columnVisibility)); } } catch (final SerialisationException e) { throw new AccumuloElementConversionException(e.getMessage(), e); } } } return properties; }