Поиск по элементу range-query в поле даты, если в некоторых документах есть пустые элементы - PullRequest
0 голосов
/ 16 января 2019

У меня есть элемент-диапазон-индекс, созданный для элемента modificationDateTime.

Наш xml выглядит примерно так:

<data>
  <id>456789</id>
  <modificationDateTime>2018-10-15T15:16:37.047Z</modificationDateTime>
  <otherElementsFollow> ... </otherElementsFollow>
</data>

Я использую следующий запрос для получения документов на 15th Oct 2018 или даже в диапазоне от 15 до 16:

cts:search(/, (
    cts:and-query((
       cts:directory-query("/my-directory/", "1")
       , cts:element-range-query(xs:QName("modificationDateTime"), ">=", xs:dateTime("2018-10-15T00:00:00.000+05:30"))
       , cts:element-range-query(xs:QName("modificationDateTime"), "<=", xs:dateTime("2018-10-15T23:59:59.000+05:30"))
    ))
)

При выполнении запроса я получаю следующую ошибку:

[1.0-ml] XDMP-CAST: (err:FORG0001) cts:search(fn:collection(), cts:and-query((cts:directory-query("/my-directory/", "1"), cts:element-range-query(xs:QName("modificationDateTime"), ">=", xs:dateTime("2018-10-15T00:00:00+05:30"), (), 1), cts:element-range-query(xs:QName("modificationDateTime"), "<=", xs:dateTime("2018-10-15T23:59:59+05:30"), (), 1)), ())) -- Invalid cast: "" cast as xs:dateTime

После некоторого анализа я обнаружил, что есть некоторые XML, в которых значение элемента <modificationDateTime> пусто, например:

<data>
  <id>1234567</id>
  <modificationDateTime></modificationDateTime>
  <otherElementsFollow> ... </otherElementsFollow>
</data>

Так вот что является причиной этой проблемы, и мы не можем удалить этот элемент, а также не можем иметь какое-либо значение, так как empty является допустимым значением.

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

1 Ответ

0 голосов
/ 16 января 2019

Если опция исключения документов с этими пустыми элементами является опцией, вы можете добавить этот not-query к вашему and-query для этого:

cts:not-query(
  cts:element-value-query(xs:QName("modificationDateTime"), "")
)

НТН!

...