Распознаватель запросов приложений AWS - PullRequest
0 голосов
/ 30 августа 2018

В настоящее время мой резольвер работает как лямбда-функция:

import boto3
from boto3.dynamodb.conditions import Key

def lambda_handler(event, context):

  list = []
  for device in event['source']['devices'] :
      dynamodb = boto3.resource('dynamodb')
      readings  = dynamodb.Table('readings')
      response = readings.query(
          KeyConditionExpression=Key('device').eq(device['device'])
      )
      items = response['Items']
      list.extend(items)
  return list

Я хотел бы иметь возможность использовать его в качестве распознавателя VTL на DynamodB. Моя проблема в том, что в моей таблице есть ключ сортировки enter image description here

Это означает, что я не могу использовать пакетный преобразователь для запросов по паре идентификаторов, потому что мне также нужно будет предоставить ключ сортировки, и я просто хочу получить все результаты по первичному ключу раздела.

Как вы выполняете запросы с помощью множества идентификаторов, используя VTL, в основном реплицируя мою лямбда-функцию в VTL. Это вообще возможно?

Схема добавлена, пожалуйста, извините за беспорядок, это работа в процессе и я пытаюсь много вещей. Все еще очень плохо знаком с graphQL

type Device {
    id: String
    device: String!
}

input DeviceInput {
    id: String
   device: String!
}

type DeviceReadings {
   devices: [Device]
}

type Mutation {
    createDevice(input: DeviceInput): Device
}

type PaginatedDevices {
   devices: [Device]
   readings: [Reading]
   cows: [cow]
   nextToken: String
}

type Query {
    getAllUserDevices(nextToken: String, count: Int): PaginatedDevices
    getAllDeviceReadings: DeviceReadings
    getAllUserReadings: DeviceReadings
    getAllReadings(deviceId: String!): Readings  
    getCowReadings(cowId: String!): UserCowReadings
}

type Reading {
   device: String
   time: Int
   cow: Int
   battery: String
}

type Readings {
    items: [Reading]
}

type UserCowReadings {
    devices: [Device]
    readings: [Reading]
}

type cow {
    id: Int
    device: String
    nait: String
}  

schema {
    query: Query
    mutation: Mutation
}

1 Ответ

0 голосов
/ 30 августа 2018

Да, вы можете сделать это, но вам нужно будет немного настроить схему. В этой лямбде вы, по сути, говорите: «Для каждого устройства выполните запрос DynamoDB, чтобы получить самые последние показания для этого устройства». Концептуально я бы сказал, что устройства имеют много показаний . Имея это в виду, давайте создадим схему:

type Device {
  id: ID!
  name: String
  # Get the most recent readings for this device.
  # Do a Query where "device = $ctx.source.id"
  readings(limit: Int, nextToken: String): ReadingConnection 
}

type Reading {
  # Use the source's device id in the table to fetch the real device
  # GetItem where device = $ctx.source.device (and any sort key condition)
  device: Device 
  time: Int
  cow: Int
  battery: String
}

type ReadingConnection {
  items: [Reading]
  nextToken: String
}

type DeviceConnection {
  items: [Device]
  nextToken: String
}

type Query {
  getAllDevices(limit: Int, nextToken: String): DeviceConnection
}

Затем вы можете разбивать на страницы на своих устройствах и разбивать на страницы для каждого устройства отдельно:

query GetAllDevicesAndReadings {
  getAllDevices(first: 10) {
    items {
      id
      name
      readings(limit: 10) {
        time
        cow
        battery
      }
    }
  }
}

Я рекомендую использовать раскрывающийся список на странице распознавателя консоли AppSync, чтобы получить больше идей о том, что можно сделать с помощью распознавателя VTL для реализации этих GetItems и запросов. Это хорошая отправная точка. Дайте мне знать, если у вас возникли проблемы с внедрением VTL.

...