Фильтрация по диапазонам в API хранилища данных

Документация по API хранилища данных по адресу http://docs.ckan.org/en/ckan-2.2/datastore.html описывает, как такие методы, как datastore_delete или datastore_search, могут включать параметр filter для фильтрации результатов.

фильтры (словарь) — фильтры, которые необходимо применить перед удалением (например, {"name": "fred"}). Если отсутствует, удалите всю таблицу и все зависимые представления. (необязательный)

Принимая во внимание пример {"name": "fred"}, кажется, что фильтрация основана на точном совпадении. Однако также возможно указать диапазон, например. получить результаты больше/меньше заданного значения?

Например, если у меня есть хранилище данных с полем «дата» со значениями от «2014-06-12T12:03:10.052000» (самое старое) до «2014-06-12T16:08:39.54.542000» (самое новое) в моей записи , как я могу получить, например, записи старше 2014-06-12T14:00:00 или новее 2014-06-12T15:00:00?

Любой пример или указатель на документацию приветствуется. Спасибо!


person fgalan    schedule 13.06.2014    source источник


Ответы (2)


Ответ заключается в том, что начиная с CKAN 2.2 это невозможно. действия datastore_delete и datastore_search принимают только фильтры типа "поле = значение".

Для datastore_search есть альтернатива: datastore_search_sql, который позволяет вам предоставить свой собственный SQL-запрос и, таким образом, реализовать поиск по диапазону. (Я думаю, ограничения заключаются в том, что это работает только с общедоступными наборами данных и требует пользователя базы данных только для чтения, который CKAN поддерживает только для Postgres 9.1+).

В настоящее время разрабатывается экспериментальная ветка 1725, которая позволит подключаемым модулям расширить SQL-запросы, выполняемые хранилищем данных. Это позволит плагинам реализовать новые типы фильтров, например диапазоны. Если вы разработчик, вы можете попробовать эту ветку.

person Alice Heaton    schedule 13.06.2014
comment
На самом деле мотивация этого вопроса заключается в том, чтобы решить проблему удаления старых строк в таблице хранилища данных на основе поля метки времени. После разъяснения функциональности API (спасибо!) Я снова прошу сосредоточиться на этой конкретной проблеме: stackoverflow.com/questions/24288744/ - person fgalan; 18.06.2014

Хитрость заключается в том, чтобы пометить значения так, чтобы фильтр улавливал все значения, которые вы хотите удалить сразу.

  • Сначала загрузите данные, которые вы хотите удалить, с помощью SQL-запроса через CKAN API.
  • Затем измените два столбца в этих данных, чтобы все они были одним и тем же хорошо идентифицируемым числом, где эти значения никогда не будут найдены вместе во всей таблице.
  • Затем обновите данные через «datastore_upsert», используя метод «update», чтобы убедиться, что вы каким-то образом не добавляете новые данные в таблицу.
  • Наконец, реализуйте «datastore_delete» с фильтром, который идентифицирует оба столбца с этим хорошо идентифицируемым номером.

Вот пример фильтра:

filter = {"col1": 9876543210, "col2": 9876543210}
person Cameron Stark    schedule 15.10.2019