| 70 | }; |
| 71 | |
| 72 | Aws::Utils::Json::JsonValue query(criteria const cr, Aws::DynamoDB::DynamoDBClient const& client) |
| 73 | { |
| 74 | using namespace Aws::DynamoDB; |
| 75 | using namespace Aws::DynamoDB::Model; |
| 76 | using namespace Aws::Utils::Json; |
| 77 | |
| 78 | AWS_LOGSTREAM_DEBUG( |
| 79 | TAG, |
| 80 | "criteria is: product_id: " << cr.product_id << " start_date epoch: " << cr.start_date.Millis() |
| 81 | << " end_date epoch: " << cr.end_date.Millis()); |
| 82 | |
| 83 | QueryRequest query; |
| 84 | |
| 85 | auto const& table_name = Aws::Environment::GetEnv("TABLE_NAME"); |
| 86 | query.SetTableName(table_name); |
| 87 | query.SetKeyConditionExpression("#H = :h AND #R BETWEEN :s AND :e"); |
| 88 | query.AddExpressionAttributeNames("#H", "product_id"); |
| 89 | query.AddExpressionAttributeNames("#R", "date_time"); |
| 90 | |
| 91 | query.AddExpressionAttributeValues(":h", AttributeValue(cr.product_id)); |
| 92 | AttributeValue date; |
| 93 | date.SetN(std::to_string(cr.start_date.Millis() / 1000)); |
| 94 | query.AddExpressionAttributeValues(":s", date); |
| 95 | |
| 96 | date.SetN(std::to_string(cr.end_date.Millis() / 1000)); |
| 97 | query.AddExpressionAttributeValues(":e", date); |
| 98 | |
| 99 | auto outcome = client.Query(query); |
| 100 | if (outcome.IsSuccess()) { |
| 101 | auto const& maps = outcome.GetResult().GetItems(); // returns vector of map<column, attibute value> |
| 102 | if (maps.empty()) { |
| 103 | AWS_LOGSTREAM_DEBUG(TAG, "No data returned from query"); |
| 104 | return {}; |
| 105 | } |
| 106 | |
| 107 | // Schema |
| 108 | // string_attr :product_id, hash_key: true |
| 109 | // epoch_time_attr :date_time, range_key: true |
| 110 | // string_attr :product_title |
| 111 | // string_attr :marketplace |
| 112 | // string_attr :product_category |
| 113 | // date_attr :review_date |
| 114 | // integer_attr :star_rating |
| 115 | // float_attr :postive |
| 116 | // float_attr :mixed |
| 117 | // float_attr :neutral |
| 118 | // float_attr :negative |
| 119 | |
| 120 | JsonValue output; |
| 121 | output.WithString("product", maps[0].find("product_title")->second.GetS()); |
| 122 | output.WithString("category", maps[0].find("product_category")->second.GetS()); |
| 123 | Aws::Utils::Array<JsonValue> sentiments(maps.size()); |
| 124 | for (size_t i = 0; i < maps.size(); i++) { |
| 125 | JsonValue review; |
| 126 | auto&& m = maps[i]; |
| 127 | |
| 128 | auto it = m.find("review_date"); |
| 129 | if (it != m.end()) { |
no test coverage detected