Запрос ThinkinSphinx не работает с sphinx_select с четырьмя условиями

Я пытаюсь использовать ThinkingSphinx для возврата записей, у которых есть начальная дата в пределах диапазона ИЛИ конечная дата в том же диапазоне, в основном любая запись, которая начинается или заканчивается в этом диапазоне.

Чтобы сделать это, я использую вычисляемый атрибут и sphinx_select в соответствии с документацией в сочетании с тем, что этот пост предлагает для диапазонов дат, следующим образом (предположим, что есть две записи, запись_а начинается за пределами диапазона, но заканчивается в пределах диапазона и начинается запись_b) и заканчивается в пределах диапазона):

with_display = "*, IF(start_at >= #{range_start.to_i}, 1, 0) + " + 
                  "IF(start_at <= #{range_end.to_i}, 1, 0) + " + 
                  "IF(end_at   >= #{range_start.to_i}, 10, 0) + " + 
                  "IF(end_at   <= #{range_end.to_i}, 10, 0) AS display"
{
  sphinx_select: with_display,
  with: {'display' =>  [2, 20, 22]},
}
=> [record_b]

Однако, если я использую только условия start_at, я получаю одну запись, и если я использую только условия end_at, она возвращает обе записи.

with_display = "*, IF(start_at >= #{range_start.to_i}, 1, 0) + " + 
                  "IF(start_at <= #{range_end.to_i}, 1, 0)  AS display" 
=> [record_b]

with_display = "*, IF(end_at >= #{range_start.to_i}, 10, 0) + " + 
                  "IF(end_at <= #{range_end.to_i}, 10, 0) AS display"
=> [record_a, record_b]

Если я правильно понимаю, наличие всех четырех условий должно привести к возвращению и record_a, и record_b, так как record_a должна иметь display значение 20, в то время как record_b должен иметь display значение 22.

Я что-то пропустил?

1 ответ

Решение

Я просто понял, что моя математика была неправильной, учитывая случаи, которые я хочу обработать:

  • record_a будет иметь display из 21
  • record_b будет иметь display из 22

Что мне нужно было сделать, это изменить мой массив на:

{
  sphinx_select: with_display,
  with: {'display' =>  [12, 21, 22]},
} 

чтобы обрабатывать случаи записей, которые заканчиваются в диапазоне (21), записи, которые начинаются в диапазоне (12), и записи, которые начинаются и заканчиваются в диапазоне (22)

Другие вопросы по тегам