2012-03-29 2 views
0

У меня есть список контактов в хранилище данных, в котором хранятся свойства givenName и familyName. Я могу найти список контактов, для которых «givenName» начинается с заданного параметра запроса. Я делаю это так с 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' с лимитом 200;

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

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

  • Offset в комбинированном результате найти 150-200.

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

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

ответ

3

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

+0

Хорошо, я должен попробовать это ... Итак, я создаю свойство списка List , которое я заполняю заглавными значениями givenName и familyName каждый раз, когда я храню/обновляю контакт. Как бы выглядел запрос, если я хочу искать «startsWith» в любом значении списка? Спасибо !! – koma

+0

@koma Исправить. Запрос будет выглядеть так же, как ваш существующий запрос диапазона для данного имени. –

+0

работает как шарм :-) – koma

Смежные вопросы