Пейджинг через запрос неравенства для нескольких свойств - PullRequest
0 голосов
/ 29 марта 2012

У меня есть список контактов в хранилище данных, в котором хранятся свойства имени и фамилии. Я могу искать список контактов, для которых заданное имя начинается с заданного параметра запроса. Я делаю это так с Objectify4:

    Query<Contact> query = txn().consistency(Consistency.STRONG).load().type(Contact.class).ancestor(ancestor);
    if (criteria.getSearchString() != null) {
        query = query.filter(SEARCH_GIVEN_NAME + " >= ", criteria.getSearchString().toUpperCase());
        query = query.filter(SEARCH_GIVEN_NAME + " <= ", criteria.getSearchString().toUpperCase() + SENTINEL);

    }
    query = query.limit(criteria.getPageSize()).offset(criteria.getStartIndex());

Но для хорошего взаимодействия с пользователем требуется одновременный поиск контактов по «GivenName» ИЛИ «FamilyName», начиная с текста, введенного в поле поиска.

Я не могу объединить этот поиск в одном запросе к хранилищу данных (я думаю). Поэтому мне придется выполнить два запроса как со смещением, так и с ограничением.

Моя единственная идея на данный момент:

  • Предположим, запрос на результаты 150-200 для поискового термина = 'ab%'.

  • Запрос для данного имени, начинающегося с 'ab' с ограничением 200;

  • Запрос для familyName, начинающийся с 'ab' с лимитом 200;

  • Объединить оба результата в один отсортированный список результатов

  • Смещение в комбинированный результат для нахождения 150-200.

Последующий запрос для того же поискового запроса, но со смещением 200-250, потребует повторения всего поиска, но с ограничением 250 для обоих запросов.

Это ужасно неэффективно (и дорого)

1 Ответ

3 голосов
/ 29 марта 2012

Более простое решение состоит в том, чтобы поместить как имя, так и фамилию в свойство списка, и выполнить сравнение неравенства по этому.Это вернет любую запись, где любой элемент из свойства списка удовлетворяет вашим критериям.

...