private Stream<User> limit(Stream<User> results, Limit limit) { return limit.getValue() .map(results::limit) .orElse(results); }
public static Limit unlimited() { return new Limit(Optional.empty()); }
public QuotaQuery build() { return new QuotaQuery( QuotaClause.and(clauses.build()), limit.orElse(Limit.unlimited()), offset.orElse(Offset.none())); } }
@Override public List<User> search(QuotaQuery query) { Stream<User> results = new ScrollIterable(client, prepareSearch(query)) .stream() .flatMap(searchResponse -> Arrays.stream(searchResponse.getHits() .getHits())) .map(hit -> hit.field(USER)) .map(field -> (String) field.getValue()) .map(User::fromUsername) .skip(query.getOffset().getValue()); return query.getLimit().getValue() .map(results::limit) .orElse(results) .collect(Guavate.toImmutableList()); }
public static Limit of(int value) { Preconditions.checkArgument(value >= 0, "A limit need to be positive"); return new Limit(Optional.of(value)); }
public SearchRequestBuilder prepareSearch(QuotaQuery query) { SearchRequestBuilder searchRequestBuilder = client.prepareSearch(readAlias.getValue()) .setTypes(QUOTA_RATIO_TYPE.getValue()) .setScroll(TIMEOUT) .addFields(USER) .setQuery(quotaQueryConverter.from(query)); query.getLimit() .getValue() .ifPresent(searchRequestBuilder::setSize); searchRequestBuilder.addSort( SortBuilders.fieldSort(USER) .order(SortOrder.ASC)); return searchRequestBuilder; }