Фильтрация данных в Dropwizard с использованием DAO на основе необязательных параметров - PullRequest
0 голосов
/ 25 ноября 2018

Я хочу реализовать фильтрацию данных на моем сервере Dropwizard.Допустим, мы хотим искать памятники.Пользователь может использовать фильтры, такие как имя, город, категория для фильтрации из списка памятников.

URI будет выглядеть примерно так: /monuments?name="Eiffel"&city"Paris"&category="Engineering Marvel"

Мне не ясно, как реализовать API для этого, потому что некоторые пользователи могут остановиться после простого указания фильтра имен, в то время как другие могут использовать все3.

В таком случае, как мне реализовать код Java и запросы в моем DAO, чтобы изменить запрос на основе того, какие фильтры были переданы?

Что я подумал и попробовал:

1 (наихудший случай) - иметь список всех возможных комбинаций запросов для этих фильтров и использовать один в зависимости от того, какая комбинация аргументов была передана.

2 - Я думал, что JDBI автоматически удалит пустые параметры при вызове метода DAO, но это не так, по крайней мере с предложением ilike (поскольку все вышеперечисленные параметры являются строками).

3 - Использовать Case в Postgres.Но это не масштабируется, так как у меня могут появиться другие параметры для поиска с течением времени по мере увеличения случаев использования.

4 - Использовать структуры данных Java вместе с DAO для внутренней фильтрации результатов, например сначала получить все памятники на основе (скажем, имени), а затем передать идентификаторы в SQL-запрос с предложением city, а затем с помощьюпункт категории.Но это займет много времени для обработки по мере увеличения данных.

Это кажется довольно распространенным сценарием, но я не могу найти хороших ответов на этот вопрос. Большинство говорят о URI и дизайне RESTful вместо реализации.детали.

Любое руководство будет полезно.

Спасибо

1 Ответ

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

Хотя ответ, предложенный @Hitobat, будет работать нормально, когда необязательных аргументов немного, но если вы имеете дело с множеством необязательных аргументов, более элегантным решением будет рассмотреть возможность создания запроса pojo и использования Критерии гибернации., где вы добавляете ограничение , только если аргумент не равен нулю.

Класс запроса:

public class FilteredRequest{
    String name;
    String city;
    String category;
}

Класс ресурса:

@GET
@Path("/monuments")
public Response searchMonuments(@ApiParam("filters") FilteredRequest filteredRequest){
    return Response.ok().entity(monumentsDAO.findAll(filteredRequest)).build()
}

DAO:

public List<Monuments> class MonumentsDAO() {
    public findAll(FilteredRequest filteredRequest){
        Criteria criteria = getSearchCriteria(filteredRequest);
        return list(criteria);
    }

    private Criteria getSearchCriteria(FilteredRequest filteredRequest){
        Criteria criteria = criteria();
        if (StringUtils.isNotEmpty(filteredRequest.getName())) {
            criteria.add(Restrictions.eq("name", filteredRequest.getName()));
        }
        if (StringUtils.isNotEmpty(filteredRequest.getCity())) {
            criteria.add(Restrictions.eq("city", filteredRequest.getCity()));
        }
        if (StringUtils.isNotEmpty(filteredRequest.getCategory())) {
            criteria.add(Restrictions.eq("category", filteredRequest.getCategory()));
        }
        return criteria;
    }
}
...