Приоритизация данных при сортировке в DbXML
Используя XQuery в DBXML, я хочу расставить приоритеты для некоторых элементов в зависимости от того, установлены ли для нескольких узлов определенные значения.
Я хочу показать три из этих элементов вверху, а остальные внизу.
<properties>
<property>
<zip_code>5550</zip_code>
<agency>ABC</agency>
</property>
<property>
<zip_code>5550</zip_code>
<agency>DEF</agency>
</property>
<property>
<zip_code>5550</zip_code>
<agency>DEF</agency>
</property>
<property>
<zip_code>XYZ</zip_code>
<agency>ABC</agency>
</property>
</properties>
Мы получаем этот XML на странице поиска недвижимости. Реальные результаты поиска будут иметь сотни записей, но мы берем только первые 10 записей для отображения на первой странице. Здесь нам нужно применить порядок сортировки, который покажет свойства агентства "ABC", за которым всегда следует почтовый индекс "XYZ". Если в общем наборе результатов нет этих агентств, мы можем показать их в обычном порядке сортировки.
1 ответ
FLWOR-выражения XQuery знают order by
, который можно упорядочить по произвольным значениям, которые также могут быть вычислены. Используйте выражение, которое решает, является ли какой-либо продукт "лучшим продуктом" или нет (что приводит к логическому значению).
Затем разделите последовательность результатов, чтобы выделить только несколько результатов и ограничить их общими результатами.
let $highlighted := 3
let $total := 10
let $sorted :=
for $p in //property
(: order by highlighting predicate :)
order by $p/agency eq "ABC" and $p/zip_code eq "XYZ" descending
return $p
return (
(: first $highlighted elements as defined by predicates above :)
$sorted[ position() = (1 to $highlighted) ],
(: the other elements, `/.` forces sorting back to document order :)
$sorted[ position() = ($highlighted + 1 to $total) ]/.
)
Булево выражение может быть произвольным для большей точности в топовых продуктах, например, ограничение на телевизоры или определение минимальной цены.