private List getBillingEventsForTenant()

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;
    }