/* * Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * SPDX-License-Identifier: Apache-2.0 */ package com.amazonaws.dynamodb.bootstrap; import java.nio.ByteBuffer; import java.util.Iterator; import java.util.List; import java.util.Map; import com.amazonaws.dynamodb.bootstrap.constants.BootstrapConstants; import com.amazonaws.services.dynamodbv2.model.AttributeValue; import com.amazonaws.services.dynamodbv2.model.ScanResult; /** * Class used to calculate the size of a DynamoDB item in bytes. * */ public class ItemSizeCalculator { /** * Calculate DynamoDB item size. */ public static int calculateItemSizeInBytes(Map<String, AttributeValue> item) { int size = 0; if (item == null) { return size; } for (Map.Entry<String, AttributeValue> entry : item.entrySet()) { String name = entry.getKey(); AttributeValue value = entry.getValue(); size += name.getBytes(BootstrapConstants.UTF8).length; size += calculateAttributeSizeInBytes(value); } return size; } public static int calculateScanResultSizeInBytes(ScanResult result) { final Iterator<Map<String, AttributeValue>> it = result.getItems().iterator(); int totalBytes = 0; while(it.hasNext()){ totalBytes += calculateItemSizeInBytes(it.next()); } return totalBytes; } /** Calculate attribute value size */ private static int calculateAttributeSizeInBytes(AttributeValue value) { int attrValSize = 0; if (value == null) { return attrValSize; } if (value.getB() != null) { ByteBuffer b = value.getB(); attrValSize += b.remaining(); } else if (value.getS() != null) { String s = value.getS(); attrValSize += s.getBytes(BootstrapConstants.UTF8).length; } else if (value.getN() != null) { attrValSize += BootstrapConstants.MAX_NUMBER_OF_BYTES_FOR_NUMBER; } else if (value.getBS() != null) { List<ByteBuffer> bs = value.getBS(); for (ByteBuffer b : bs) { if (b != null) { attrValSize += b.remaining(); } } } else if (value.getSS() != null) { List<String> ss = value.getSS(); for (String s : ss) { if (s != null) { attrValSize += s.getBytes(BootstrapConstants.UTF8).length; } } } else if (value.getNS() != null) { List<String> ns = value.getNS(); for (String n : ns) { if (n != null) { attrValSize += BootstrapConstants.MAX_NUMBER_OF_BYTES_FOR_NUMBER; } } } else if (value.getBOOL() != null) { attrValSize += 1; } else if (value.getNULL() != null) { attrValSize += 1; } else if (value.getM() != null) { for (Map.Entry<String, AttributeValue> entry : value.getM() .entrySet()) { attrValSize += entry.getKey().getBytes(BootstrapConstants.UTF8).length; attrValSize += calculateAttributeSizeInBytes(entry.getValue()); attrValSize += BootstrapConstants.BASE_LOGICAL_SIZE_OF_NESTED_TYPES; } attrValSize += BootstrapConstants.LOGICAL_SIZE_OF_EMPTY_DOCUMENT; } else if (value.getL() != null) { List<AttributeValue> list = value.getL(); for (Integer i = 0; i < list.size(); i++) { attrValSize += calculateAttributeSizeInBytes(list.get(i)); attrValSize += BootstrapConstants.BASE_LOGICAL_SIZE_OF_NESTED_TYPES; } attrValSize += BootstrapConstants.LOGICAL_SIZE_OF_EMPTY_DOCUMENT; } return attrValSize; } }