С несколько предвзятой точки зрения, как автора фантома, я очень хорошо понимаю цели дизайна в фантоме. Существует существующее сравнение между Quill и Phantom, доступное на веб-сайте библиотеки Quill, которое, естественно, смещено в другую сторону.
Phantom стремится быть идеальным выбором для уровня приложения, тогда как Quill стремится быть самым причудливым генератором строк, что не очень полезно для сравнения, когда вы создаете большие приложения поверх Cassandra.
Плюсы использования фантома
Что касается безопасности типов и того, насколько хорошо DSL модернизирован для функций Cassandra, на самом деле нет никаких сомнений. DSL обладает очень "глубоким" знанием ваших структур данных и обеспечивает полную поддержку функций Cassandra. Во время компиляции он знает, что возможно в отношении Cassandra, а что нет.
Разработчики Quill утверждают, что у фантома гораздо больше зависимостей, но это не совсем точно, поскольку большинство из них являются необязательными, включая такие вещи, как итерации Play и поддержка потоков. То, чего вы не хотите, вы не получите, вот и все.
Сравнение Quill просто гласит: «Вы можете расширить Phantom, расширив DSL, чтобы добавить новые функции, хотя это может быть непростым процессом», что немного неточно. Будучи очень новым игроком в игре, Quill — это игрушка, когда дело доходит до поддержки функций Cassandra, и вы часто будете нуждаться в добавлении функций. У Phantom, без сомнения, есть свои пробелы, но это гораздо более зрелая альтернатива, и количество раз, когда требуется расширение, значительно реже.
Мы исправили большинство ошибок в течение нескольких дней или недель для более сложных функций, но, как правило, все, что вам может понадобиться, уже есть, а ряд функций, которых в настоящее время нет в Quill, даже на то, чтобы записать их, у меня ушли бы часы.
Я не очень хорошо разбираюсь в JPA, но сопоставление между Cassandra и phantom является чрезвычайно мощным уровнем, поскольку оно позволяет автоматически генерировать всю схему таблиц непосредственно из DSL сопоставления. Это также позволяет DSL полностью имитировать поведение Cassandra во время компиляции, он будет знать, какие запросы возможны в отношении вашего выбора первичного ключа и так далее, quill вообще не поддерживает такую поддержку.
Phantom имеет очень мощные уровни абстракции на уровне приложений, такие как коннекторы, базы данных, автоматическое создание баз данных, вещи, которые помогают запускать приложения в продакшене.
Код, лежащий в основе Quill, намного сложнее, и хотя я был бы первым, кто воздал должное инженерным возможностям, стоящим за ним, когда я думаю, что с удобством для пользователя история не так хороша.
Квилл пытается сделать гораздо больше за один раз. Это мини-движок для генерации, что-то, что scalaquery пытались сделать несколько лет назад, прежде чем они решили полностью сосредоточиться на базах данных SQL и отказались от поддержки чего-либо еще. Это предшественник современного Slick, в котором используется аналогичный подход с кавычками QDSL.
Quill — это текущая абстракция. Поскольку они нацелены на поддержку более широкого спектра баз данных, они значительно хуже поддерживают особенности специфики БД. Пример ниже:
Из самых простых примеров в сравнении вы читаете:
val getAllByCountry = quote {
(country: String) => query[WeatherStation]
.filter(_.country == country)
}
}
Пока все отлично, предположительно менее многословно, чем фантомный эквивалент, если мы включим необходимый код отображения.
select.where(_.country eqs country).fetch()
Но давайте рассмотрим это дальше. Что, если вы пытаетесь получить одну такую страну? Или что, если вы пытаетесь получить PagingState
информацию? Или добавьте существующий PagingState
, чтобы отобразить вещи через пользовательский интерфейс.
Именно здесь Quill, по крайней мере, в сравнении, не может дать пользователю реальный предварительный просмотр того, каким в конечном итоге будет его опыт. Естественно предположить, что всякий раз, когда вы переходите на страницу инструмента, он описывает себя как лучший инструмент в своей категории, как, конечно же, мы, создатели фантома, но это еще не все.
Чтобы быть более кратким, еще несколько интересных вещей:
select.where(_.country eqs country).fetchRecord()
select.where(_.country eqs country).one()
Как насчет частичного выбора?
select(_.country, _.city).where(_.country eqs country)
Phantom семантически различает все, что возможно во время выполнения с помощью Cassandra, и прежде всего пытается предотвратить ошибки во время выполнения, используя хитрость во время компиляции и знание предметной области. Как вы можете получить эквивалент Quill?
Кроме того, Quill прекрасно способен генерировать запросы непосредственно из файла case class
.
case class WeatherStation(
country: String,
city: String,
stationId: String,
entry: Int,
value: Int
)
object WeatherStation {
val getAllByCountry = quote {
(country: String) =>
query[WeatherStation].filter(_.country == country)
}
val getAllByCountryAndCity = quote {
(country: String, city: String) =>
getAllByCountry(country).filter(_.city == city)
}
val getAllByCountryCityAndId = quote {
(country: String, city: String, stationId: String) =>
getAllByCountryAndCity(country, city).filter(_.stationId == stationId)
}
}
Но ему не хватает каких-либо знаний о вашей схеме. Что делать, если страна не является частью первичной? Этот запрос недействителен, фантом не позволит вам его скомпилировать, и это только самый простой пример.
Phantom может автоматически генерировать ваш CQL непосредственно из таблицы, он может генерировать целые базы данных на лету, профессиональная версия может даже автоматически переносить таблицы и помогать вам справляться с несоответствиями схемы, а также предоставляет вам очень продвинутый пользовательский интерфейс и интерфейс мониторинга, где вы можете может обновлять и понижать схемы на лету.
Минусы
Phantom действительно сделал расширение таких вещей, как TypeCodec
, немного менее подробным, но начиная с phantom 2.9.0 мы представили чрезвычайно мощный механизм макросов для кодирования типов в Cassandra, который вообще не зависит от TypeCodec
!
Phantom требует минимального шаблона для определения DSL таблицы и по своей природе не очень хорошо работает с общими столбцами таблицы. Это можно сделать, но это не самый красивый код и не самый плохой.
В целом
- Quill — очень хорошая программа, написанная очень талантливыми ребятами, в этом нет никаких сомнений.
- It's better than phantom strictly at query generation, there's boilerplate that can be reduced through QDSLs that cannot be reduced through an EDSL, if we are fighting who's the leanest meanest string generator Quill wins.
- It's a vastly inferior tool at the application layer, and it's even more unnatural for most people. Slick popularised the concepts to some extent, but some of the most basic functionalities you would want as part of your application lifecycle are not as easily addressable through a QDSL or at least it has yet to happen.
- Phantom гораздо более зрелый и широко распространенный, с большим количеством ресурсов и вкладом команды основателей, долгосрочной дорожной картой и ключевым партнерством с Datastax, которое помогает нам оставаться в курсе всех функций.
person
flavian
schedule
21.06.2016