use of com.google.storage.onestore.v3.OnestoreEntity.Property in project appengine-java-standard by GoogleCloudPlatform.
the class EntityStorageConversions method restoreStashedProperties.
/**
* Moves stashed properties back from raw properties to properties.
*
* <p>Note: this piece of code assumes that stashed properties appear in the raw property list in
* stashed index order.
*
* @param storageEntity The EntityProto to modify.
*/
static void restoreStashedProperties(EntityProto storageEntity) {
ImmutableList<Property> properties = ImmutableList.copyOf(storageEntity.propertys());
ImmutableList<Property> rawProperties = ImmutableList.copyOf(storageEntity.rawPropertys());
ImmutableList.Builder<Property> badlyStashedProperties = ImmutableList.builder();
int propertyListIndex = 0;
storageEntity.clearProperty();
storageEntity.clearRawProperty();
for (Property rawProperty : rawProperties) {
if (rawProperty.hasStashed()) {
int stashed = rawProperty.getStashed();
int advance = stashed - storageEntity.propertySize();
if (// Not at the end (out-of-order, duplicate)
stashed < storageEntity.propertySize() || propertyListIndex + advance > properties.size()) {
// Past the end
// The value of stashed is bad.
badlyStashedProperties.add(rawProperty.clearStashed());
} else {
// Copy until before the position where the stashed property needs to be restored.
if (advance > 0) {
storageEntity.mutablePropertys().addAll(properties.subList(propertyListIndex, propertyListIndex + advance));
propertyListIndex = propertyListIndex + advance;
}
storageEntity.addProperty(rawProperty.clearStashed());
}
} else {
storageEntity.addRawProperty(rawProperty);
}
}
storageEntity.mutablePropertys().addAll(properties.subList(propertyListIndex, properties.size()));
storageEntity.mutablePropertys().addAll(badlyStashedProperties.build());
}
use of com.google.storage.onestore.v3.OnestoreEntity.Property in project appengine-java-standard by GoogleCloudPlatform.
the class EntityStorageConversions method createComputedAndStashedValuesForEntityValues.
/**
* Modifies an entity by marking all indexed entity values for stashing, and flattening all leaf
* sub-properties into top-level properties. Does not perform any kind of validation.
*
* @param diskEntity The EntityProto to modify.
*/
private static void createComputedAndStashedValuesForEntityValues(EntityProto diskEntity) {
ImmutableList.Builder<Property> computedProperties = ImmutableList.builder();
for (int i = 0; i < diskEntity.propertySize(); i++) {
Property property = diskEntity.getProperty(i);
if (isEntityValue(property)) {
// Mark for stashing.
property.setStashed(i);
flattenIndexedEntityValues(property.getName(), property.isMultiple(), property.getValue().getStringValueAsBytes(), computedProperties);
}
}
diskEntity.mutablePropertys().addAll(computedProperties.build());
}
use of com.google.storage.onestore.v3.OnestoreEntity.Property in project appengine-java-standard by GoogleCloudPlatform.
the class EntityStorageConversions method flattenIndexedEntityValues.
/**
* Recursively walk the given entity value and flattens all leaf sub-properties into
* flattenedProperties. In the top level call pathPrefix and multiplePath should be respectively
* the name and the multiple bit of the property enclosing the entity value. This method is
* designed for internal use, do not make it public.
*
* @param pathPrefix Prefix to be added to property names for the current recursion level.
* @param multiplePath Whether a multiple property has been encountered in the path.
* @param currentSerializedEntityValue The serialized entity value to inspect recursively.
* @param flattenedProperties The list where flattened sub-properties are to be added.
*/
private static void flattenIndexedEntityValues(String pathPrefix, boolean multiplePath, byte[] currentSerializedEntityValue, ImmutableList.Builder<Property> flattenedProperties) {
checkArgument(!Strings.isNullOrEmpty(pathPrefix));
EntityProto currentEntityValue = deserializeEmbeddedEntityProto(currentSerializedEntityValue, pathPrefix);
if (currentEntityValue.getKey().getPath().elementSize() > 0) {
// Path is not empty
flattenedProperties.add(new Property().setName(pathPrefix + Kinds.PROPERTY_PATH_DELIMITER_AND_KEY_SUFFIX).setValue(ReferenceValues.toReferenceProperty(currentEntityValue.getKey())).setMultiple(multiplePath).setComputed(true));
}
for (Property property : currentEntityValue.propertys()) {
if (isEntityValue(property)) {
// This is a nested entity value.
flattenIndexedEntityValues(pathPrefix + Kinds.PROPERTY_PATH_DELIMITER + property.getName(), multiplePath || property.isMultiple(), property.getValue().getStringValueAsBytes(), flattenedProperties);
} else {
// This is a leaf sub-property.
flattenedProperties.add(property.setName(pathPrefix + Kinds.PROPERTY_PATH_DELIMITER + property.getName()).setMultiple(multiplePath || property.isMultiple()).setComputed(true));
}
}
}
Aggregations