Предположения о производительности / эффективности JSONata

#jsonata

#jsonata

Вопрос:

Мне действительно нравится JSONata — потрясающая библиотека, спасибо!

Одна из вещей, с которой я играл, — это объединение двух массивов объектов с определенным значением ключа.

Рассмотрим пример библиотеки (немного упрощенный):

 library.loans@$L.books@$B[$L.isbn=$B.isbn].{
  'customer': $L.customer,
  'book': $B.title
}
  

У меня создается впечатление (из ваших документов и т. Д.), Что это повторяет массив books для каждой записи в массиве loans, а затем фильтрует вывод.

Вопрос 1: Правильно ли это думать об этом с точки зрения производительности? Имеет ли значение, начинается ли с .кредиты или .books ? Быстрый тест показывает, что код может быть написан любым способом… Интуитивно я бы предположил, что если бы у меня был предварительный фильтр (например, просто просмотр «просроченных» кредитов), то, если бы я начал с кредитов и сначала отфильтровал их, я мог бы повысить производительность. Звучит разумно, или это поспешные выводы?

Вопрос 2. Может ли быть более эффективным (очевидно, для больших наборов данных) переписать этот запрос с использованием map для O (m n) вместо O (m * n)? Я имею в виду что-то вроде:

 (
  $booksById := library.books{$.isbn: $};

  library.loans.{
    'customer': $.customer,
    'book': $lookup( $booksById, $.isbn ).title
  }
)
  

Еще раз спасибо за библиотеку — она проста в освоении и очень полезна.

Ответ №1:

Q1: В этом случае не будет иметь никакого значения, в какую сторону вы его напишете. Внутренне он создает поток кортежей, содержащий все перестановки кредитов и книг, которые затем фильтруются выражением предиката.

Q2: Это может быть более эффективным (подсказка: посмотрите на $distict() функцию), но это даст разные результаты. Исходное выражение выполняет внутреннее соединение (в терминах SQL), тогда как вашим альтернативным является внешнее соединение, то есть оно создаст объект для ссуды, даже если книга не существует.

Кстати, спасибо за отзыв.