Вычисляемое поле в Hasura, которое возвращает массив целых чисел - PullRequest
1 голос
/ 10 апреля 2020

Проблема

Я пытаюсь добавить вычисляемое поле, которое возвращает массив целых чисел. Hasura в настоящее время поддерживает типы возвращаемых данных типа SETOF <table-name> или BASE. Я попытался вернуть integer[], но это не удалось (это не тип BASE). Есть ли обходной путь?

Вот что я пробовал

У меня есть две таблицы: курсы и тесты, курс имеет много тестов, каждый тест имеет целочисленное поле с именем трудность. Я хочу добавить вычисляемое поле в таблицу курсов, в которой перечислены различные трудности связанных тестов.

С помощью SQL мы можем создать массив, который создает этот список с помощью этого запроса:

SELECT array(SELECT DISTINCT difficulty FROM quizzes
  WHERE course_id = 1 ORDER BY difficulty ASC);

Поэтому я создаю функцию, которая возвращает результат этого запроса, и добавляю его в качестве вычисляемого поля в таблицу курсов.

CREATE OR REPLACE FUNCTION courses_quiz_difficulties(course_row courses)
RETURNS integer[] AS $$
  SELECT array(SELECT DISTINCT difficulty FROM quizzes
  WHERE course_id = course_row.id ORDER BY difficulty ASC);
$$
LANGUAGE SQL STABLE;

Когда я пытаюсь добавить вычисляемое поле, я получаю сообщение об ошибке, потому что и массив int не является типом BASE.

в таблице "курсы": в вычисляемом поле "quiz_difficulty": вычисляемое поле "quiz_difficulty" нельзя добавить в таблицу "курсы", поскольку функция " courses_quiz_difficulty "возвращаемый тип _int4 не является типом BASE

Есть ли способ заставить его работать с Hasura?

Вот соответствующая документация:

https://hasura.io/docs/1.0/graphql/manual/schema/computed-fields.html#supportedsql -функции

1 Ответ

1 голос
/ 10 апреля 2020

Простое представление дало мне желаемый результат:

CREATE VIEW course_quiz_difficulties AS        
    SELECT 
        course_id, 
        array_agg(DISTINCT difficulty ORDER BY difficulty) as quiz_difficulties
    FROM quizzes GROUP BY course_id

После этого мы можем вручную добавить связь между курсами и новым представлением: courses . id → course_quiz_difficulties . course_id

Хасура позволяет нам запрос quiz_difficulty from courses:

query MyCourseQuizDifficulties {
  courses(limit: 1) {
    id
    quiz_difficulties {
      quiz_difficulties
    }
  }
}

И мы получаем такой результат:

{
  "data": {
    "courses": [
      {
        "id": 1,
        "quiz_difficulties": {
          "quiz_difficulties": [
            1,
            2
          ]
        }
      }
    ]
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...