Как создать распознаватель AppSyn c DynamoDB для объекта со связями - PullRequest
0 голосов
/ 11 января 2020

У меня есть одна таблица DynamoDB, которая имеет Games и Players. В настоящее время у меня есть следующий лямбда-преобразователь, который работает для моего запроса AppSyn c getGame. Вопрос в том, можно ли написать решатель DynamoDB, используя шаблоны скорости, которые делают то же самое, чтобы я мог избежать лямбда-вызова.

const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();

exports.handler = async (event) => {
    let result = null;
    let params;
    switch(event.field) {
        case "getGame":
            const id = event.arguments.id;
            if (!id) {
                throw new Error('Missing game id');
            };
            params = {
                TableName: 'games',
                KeyConditionExpression: 'pk = :pk AND sk = :sk',
                ExpressionAttributeValues: {
                  ':pk': 'game',
                  ':sk': `meta_${id}`
                }
            };
            const game = (await docClient.query(params).promise()).Items[0];

            // get players
            const gameKey = `game_${game.sk.split('_')[1]}_${game.sk.split('_')[2]}`;            
            params = {
                TableName: 'games',
                KeyConditionExpression: 'pk = :pk AND begins_with(sk, :sk)',
                ExpressionAttributeValues: {
                    ':pk': gameKey,
                    ':sk': 'player_'
                }
            };
            game.players = (await docClient.query(params).promise()).Items;
            result = game;
            break;            
    }
    return result;
};

И результат выглядит как

{
  "gsipk": "NEW_OPEN",
  "sk": "meta_1578241126110_35660fcc-3cde-4d30-9ebd-09abba1aedf7",
  "gsisk": "level_1_players_4",
  "pk": "game",
  "players": [
    {
      "gsipk": "player_3a7bb19c-0ccd-42df-a606-acd8b1f5e288",
      "gsisk": "game_1578241126110_35660fcc-3cde-4d30-9ebd-09abba1aedf7",
      "points": 0,
      "num": 4,
      "place": null,
      "sk": "player_3a7bb19c-0ccd-42df-a606-acd8b1f5e288",
      "pieces": [],
      "wilds": 0,
      "pk": "game_1578241126110_35660fcc-3cde-4d30-9ebd-09abba1aedf7",
      "color": "gold",
      "pows": 0
    },
    {
      "gsipk": "player_96b772b1-4127-43da-b550-029d5c632675",
      "gsisk": "game_1578241126110_35660fcc-3cde-4d30-9ebd-09abba1aedf7",
      "points": 0,
      "num": 2,
      "place": null,
      "sk": "player_96b772b1-4127-43da-b550-029d5c632675",
      "pieces": [],
      "wilds": 0,
      "pk": "game_1578241126110_35660fcc-3cde-4d30-9ebd-09abba1aedf7",
      "color": "blue",
      "pows": 0
    },
    {
      "gsipk": "player_9d30c675-930f-401b-ac5f-8db32bb2acb8",
      "gsisk": "game_1578241126110_35660fcc-3cde-4d30-9ebd-09abba1aedf7",
      "points": 0,
      "num": 3,
      "place": null,
      "sk": "player_9d30c675-930f-401b-ac5f-8db32bb2acb8",
      "pieces": [],
      "wilds": 0,
      "pk": "game_1578241126110_35660fcc-3cde-4d30-9ebd-09abba1aedf7",
      "color": "green",
      "pows": 0
    },
    {
      "gsipk": "player_ab179ad1-a160-44f8-b438-0e93385b6c47",
      "gsisk": "game_1578241126110_35660fcc-3cde-4d30-9ebd-09abba1aedf7",
      "points": 0,
      "num": 1,
      "place": null,
      "sk": "player_ab179ad1-a160-44f8-b438-0e93385b6c47",
      "pieces": [],
      "wilds": 0,
      "pk": "game_1578241126110_35660fcc-3cde-4d30-9ebd-09abba1aedf7",
      "color": "red",
      "pows": 0
    }
  ]
}

Ответы [ 2 ]

1 голос
/ 14 января 2020

Если вы не переназначаете свои данные, чтобы иметь возможность выбрать все элементы в одном запросе, вам понадобится Конвейерные преобразователи. . Таким образом, конвейер представляет собой количество преобразователей в строке, заключенных в шаблон до и после. Pipeline Resolvers

В вашем случае эти шаблоны до / после на самом деле не используются, поэтому базовая настройка c будет:

Перед шаблоном (ничего не нужно, так что пустое json в порядке)

{}

После шаблона (для передачи результата предыдущих вызовов)

$util.toJson($ctx.result)

Тогда у вас будет 2 преобразователя DynamoDB. Это то же самое, что и другие преобразователи DynamoDB, которые вы, возможно, ранее делали, за исключением того, что во втором сеансе для доступа к первому результату преобразователей DynamoDB вы будете использовать $ctx.prev.result. Допустим, вы передали идентификатор игры в ответе на первый вызов как:

{
   "game_id": "$ctx.result.get('theGameId')",
    ...
}

Затем к нему можно обратиться во втором шаблоне запроса как $ctx.prev.result.game_id. Вы также можете использовать sta sh вместо - $ctx.stash.put() и $ctx.prev.get(). Sta sh полезен, если вам нужно что-то сделать в запросе BEFORE (самый первый, который у нас пока пуст), и передать его всем распознавателям.

0 голосов
/ 19 января 2020

Хорошо, благодаря комментарию @ cyberwombat:

Если вы не переназначаете свои данные, чтобы иметь возможность выбрать все элементы за один запрос

Мне удалось вычислить это вне. Во-первых, мне пришлось немного реорганизовать свой стол. Я изменил первичный ключ (ха sh) на game_<uuid>, а затем связал детали игры с помощью ключа (диапазона) сортировки, например meta_<timestamp>, и игроков с ключом сортировки, например player_<uuid>.

После того, как я это сделал, я смог использовать этот преобразователь в Query и вернуть детали игры и всех игроков с этим шаблоном сопоставления запросов:

{
    "version": "2017-02-28",
    "operation": "Query",
    "query" : {
        "expression" : "pk = :pk",
        "expressionValues" : {
            ":pk": { "S":  "$ctx.arguments.pk" }
        }
    }
}

Приведенный выше запрос возвращает 5 элементов ( 4 игрока и метаданные игры). Затем я использовал шаблон сопоставления ответов, например:

#set($game = {})
#set($players = [])
#foreach($item in $ctx.result.items)
    #if($util.matches('meta_\d*', $item.sk))
        ## main game object
        #set($game = $item)
    #else
        ## player
        $util.qr($players.add($item))
    #end
#end

$util.qr($game.put("players", $players))
$util.toJson($game)

Теперь у меня ОДИН запрос к DynamoDB, и нет лямбда-преобразователей ... Beautiful.

...