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()); }
public UidCriterion(UidRange[] ranges) { super(); this.operator = new UidInOperator(ranges); }
private BoolQueryBuilder convertUid(SearchQuery.UidCriterion uidCriterion) { if (uidCriterion.getOperator().getRange().length == 0) { return boolQuery(); } return boolQuery().filter( convertToBoolQuery( Arrays.stream(uidCriterion.getOperator().getRange()) .map(this::uidRangeFilter), BoolQueryBuilder::should)); }
private boolean matches(SearchQuery.UidCriterion criterion, MailboxMessage message) { SearchQuery.UidInOperator operator = criterion.getOperator(); UidRange[] ranges = operator.getRange(); MessageUid uid = message.getUid(); return Arrays.stream(ranges) .anyMatch(numericRange -> numericRange.isIn(uid)); }