Как сделать арифметику c с метками времени и интервалами в Rust Diesel - PullRequest
1 голос
/ 30 января 2020

Я пытался создать дизельный запрос с выражениями фильтра, которые выполняют арифметику c, и сравнивают временные метки и временные интервалы. Я считаю, что следующие выражения невозможно написать с использованием готового дизельного двигателя. К сожалению, я прибег к методу кувалды с использованием функции sql(...):

let query = videos::table
    .inner_join(events::table)
    .filter(sql(r#""events"."start_date" <= NOW() + interval '60 seconds'"#))
    .filter(sql(r#""events"."start_date" + ("videos"."duration" * interval '1 second') > NOW()"#))

Моя (сокращенная) схема:

table! {
    events (id) {
        id -> Int4,
        video_id -> Int4,
        start_date -> Timestamp,
    }
}

table! {
    videos (id) {
        id -> Int4,
        duration -> Float4,
    }
}

Мои вопросы:

  1. Я не прав? Может ли это быть написано на дизельном топливе без пользовательских типов?
  2. Если это не может быть написано на ванильном дизеле, как я могу разбить это на более безопасное для типов, дизельное дружественное выражение? Какие части являются нестандартными и какие черты мне нужно реализовать?

1 Ответ

2 голосов
/ 31 января 2020

Я не прав? Может ли это быть написано на дизеле без пользовательских типов?

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

. Дизель требует, чтобы вы могли только добавлять / вычитать интервалы из временных отметок. Это подразумевает, что вам нужна ваша схема, чтобы сделать это возможным:

table! {
    videos (id) {
        id -> Int4,
        duration -> Interval,
    }
}

Ваш запрос тогда будет выглядеть так:

let query = videos::table
    .inner_join(events::table)
    .filter(events::start_date.le(now + 60.seconds()))
    .filter(now.lt(events::start_date + videos::duration))

Если это невозможно записать в Ванильный дизель, как я могу разбить это на более безопасное для типов, дизельное дружественное выражение? Какие части являются заказными, и какие черты мне нужно реализовать?

Теоретически должна быть возможность реализовать это вне дизеля. Код, скорее всего, будет тем же, который используется для реализации самого дизеля. Вероятно, вам нужно будет использовать локальные типы и более конкретные значения. Поэтому, если вы не можете изменить тип videos::duration, возможно, имеет смысл go по этому маршруту.

...