private <E extends Element, S extends DocumentSchema<E>> Pair<S, SearchSourceBuilder> createSearchBuilder(Map.Entry<S, QueryBuilder> kv, SearchQuery<E> query) { SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().query(kv.getValue()) .size(query.getLimit() == -1 || query.getLimit() > 10000 ? maxLimit : query.getLimit()); if (query.getPropertyKeys() == null) searchSourceBuilder.fetchSource(true); else { Set<String> fields = kv.getKey().toFields(query.getPropertyKeys()); if (fields.size() == 0) searchSourceBuilder.fetchSource(false); else searchSourceBuilder.fetchSource(fields.toArray(new String[fields.size()]), null); } List<Pair<String, Order>> orders = query.getOrders(); if (orders != null) { orders.forEach(order -> { Order orderValue = order.getValue1(); switch (orderValue) { case decr: searchSourceBuilder.sort(kv.getKey() .getFieldByPropertyKey(order.getValue0()), SortOrder.DESC); break; case incr: searchSourceBuilder.sort(kv.getKey() .getFieldByPropertyKey(order.getValue0()), SortOrder.ASC); break; case shuffle: break; } }); } return Pair.with(kv.getKey(), searchSourceBuilder); }
@Override public Select getSearch(SearchQuery<E> query, PredicatesHolder predicatesHolder) { if (predicatesHolder.isAborted()) { return null; } Condition conditions = new JdbcPredicatesTranslator().translate(predicatesHolder); int finalLimit = query.getLimit() < 0 ? Integer.MAX_VALUE : query.getLimit(); SelectConditionStep<Record> where = createSqlQuery(query.getPropertyKeys()) .where(conditions); List<Pair<String, Order>> orders = query.getOrders(); if (orders != null){ List<SortField<Object>> orderValues = orders.stream().filter(order -> !order.getValue1().equals(Order.shuffle)) .filter(order -> getFieldByPropertyKey(order.getValue0()) != null) .map(order -> order.getValue1().equals(Order.incr) ? field(getFieldByPropertyKey(order.getValue0())).asc() : field(getFieldByPropertyKey(order.getValue0())).desc()).collect(Collectors.toList()); if (orderValues.size() > 0) return where.orderBy(orderValues).limit(finalLimit); } return where.limit(finalLimit); }
protected SearchSourceBuilder createSearch(SearchQuery<E> query, QueryBuilder queryBuilder) { if(queryBuilder == null) return null; SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().query(queryBuilder) .size(query.getLimit() == -1 ? 10000 : query.getLimit()); if(query.getPropertyKeys() == null) searchSourceBuilder.fetchSource(true); else { Set<String> fields = toFields(query.getPropertyKeys()); if(fields.size() == 0) searchSourceBuilder.fetchSource(false); else searchSourceBuilder.fetchSource(fields.toArray(new String[fields.size()]), null); } List<Pair<String, Order>> orders = query.getOrders(); if (orders != null){ orders.forEach(order -> { Order orderValue = order.getValue1(); switch (orderValue){ case decr: searchSourceBuilder.sort(getFieldByPropertyKey(order.getValue0()), SortOrder.DESC); break; case incr: searchSourceBuilder.sort(getFieldByPropertyKey(order.getValue0()), SortOrder.ASC); break; case shuffle: break; } }); } return searchSourceBuilder; }