in src/main/java/com/amazonaws/partners/saasfactory/metering/aggregation/BillingEventAggregation.java [98:159]
private List<BillingEvent> getBillingEventsForTenant(String tenantID) {
HashMap<String,String> expressionNames = new HashMap<>();
expressionNames.put(PRIMARY_KEY_EXPRESSION_NAME, PRIMARY_KEY_NAME);
expressionNames.put(SORT_KEY_EXPRESSION_NAME, SORT_KEY_NAME);
HashMap<String,AttributeValue> expressionValues = new HashMap<>();
AttributeValue tenantIDValue = AttributeValue.builder()
.s(tenantID)
.build();
AttributeValue eventPrefixValue = AttributeValue.builder()
.s(EVENT_PREFIX)
.build();
expressionValues.put(TENANT_ID_EXPRESSION_VALUE, tenantIDValue);
expressionValues.put(EVENT_PREFIX_ATTRIBUTE_VALUE, eventPrefixValue);
QueryResponse result = null;
List<BillingEvent> billingEvents = new ArrayList<>();
do {
QueryRequest request = QueryRequest.builder()
.tableName(this.tableConfig.getTableName())
.keyConditionExpression(String.format("%s = %s and begins_with(%s, %s)",
PRIMARY_KEY_EXPRESSION_NAME,
TENANT_ID_EXPRESSION_VALUE,
SORT_KEY_EXPRESSION_NAME,
EVENT_PREFIX_ATTRIBUTE_VALUE))
.expressionAttributeNames(expressionNames)
.expressionAttributeValues(expressionValues)
.build();
if (result != null && !result.lastEvaluatedKey().isEmpty()) {
request = request.toBuilder()
.exclusiveStartKey(result.lastEvaluatedKey())
.build();
}
try {
result = this.ddb.query(request);
} catch (ResourceNotFoundException e) {
this.logger.error("Table {} does not exist", this.tableConfig.getTableName());
} catch (InternalServerErrorException e) {
this.logger.error(e.getMessage());
// if there's a failure, return an empty array list rather than a partial array list
return new ArrayList<>();
}
if (result == null) {
return new ArrayList<>();
}
for (Map<String, AttributeValue> item : result.items()) {
String eventEntry = item.get(SORT_KEY_NAME).s();
long eventTimeInMilliseconds = Long.parseLong(eventEntry.split(ATTRIBUTE_DELIMITER)[EVENT_TIME_ARRAY_INDEX]);
String nonce = eventEntry.split(ATTRIBUTE_DELIMITER)[NONCE_ARRAY_INDEX];
Instant eventTime = Instant.ofEpochMilli(eventTimeInMilliseconds);
Long quantity = Long.valueOf(item.get(QUANTITY_ATTRIBUTE_NAME).n());
BillingEvent billingEvent = BillingEvent.createBillingEvent(tenantID, eventTime, quantity, nonce);
billingEvents.add(billingEvent);
}
} while (!result.lastEvaluatedKey().isEmpty());
return billingEvents;
}