private ImmutableList<Criterion> convertCriterias(FilterOperator filter) { return filter.getConditions().stream() .map(this::convert) .flatMap(sq -> sq.getCriterias().stream()) .collect(Guavate.toImmutableList()); } }
private QueryBuilder generateQueryBuilder(SearchQuery searchQuery) { List<SearchQuery.Criterion> criteria = searchQuery.getCriterias(); if (criteria.isEmpty()) { return criterionConverter.convertCriterion(SearchQuery.all()); } else if (criteria.size() == 1) { return criterionConverter.convertCriterion(criteria.get(0)); } else { return criterionConverter.convertCriterion(new SearchQuery.ConjunctionCriterion(SearchQuery.Conjunction.AND, criteria)); } }
/** * Does the row match the given criteria? * * @param message * <code>MailboxMessage</code>, not null * @return <code>true</code> if the row matches the given criteria, * <code>false</code> otherwise * @throws MailboxException */ private boolean isMatch(MailboxMessage message) throws MailboxException { final List<SearchQuery.Criterion> criteria = query.getCriterias(); final Collection<MessageUid> recentMessageUids = query.getRecentMessageUids(); if (criteria != null) { for (SearchQuery.Criterion criterion : criteria) { if (!isMatch(criterion, message, recentMessageUids)) { return false; } } } return true; }
private List<SearchResult> searchResults(MailboxSession session, Mailbox mailbox, SearchQuery query) throws MailboxException { MessageMapper mapper = messageMapperFactory.getMessageMapper(session); final SortedSet<MailboxMessage> hitSet = new TreeSet<>(); UidCriterion uidCrit = findConjugatedUidCriterion(query.getCriterias()); if (uidCrit != null) { // if there is a conjugated uid range criterion in the query tree we can optimize by // only fetching this uid range UidRange[] ranges = uidCrit.getOperator().getRange(); for (UidRange r : ranges) { Iterator<MailboxMessage> it = mapper.findInMailbox(mailbox, MessageRange.range(r.getLowValue(), r.getHighValue()), FetchType.Metadata, -1); while (it.hasNext()) { hitSet.add(it.next()); } } } else { // we have to fetch all messages Iterator<MailboxMessage> messages = mapper.findInMailbox(mailbox, MessageRange.all(), FetchType.Full, -1); while (messages.hasNext()) { MailboxMessage m = messages.next(); hitSet.add(m); } } return ImmutableList.copyOf(new MessageSearches(hitSet.iterator(), query, textExtractor).iterator()); }