
fr.ght1pc9kc.juery.basic.parser.QueryStringParserImpl Maven / Gradle / Ivy
package fr.ght1pc9kc.juery.basic.parser;
import fr.ght1pc9kc.juery.api.Criteria;
import fr.ght1pc9kc.juery.api.PageRequest;
import fr.ght1pc9kc.juery.api.Pagination;
import fr.ght1pc9kc.juery.api.filter.CriterionProperty;
import fr.ght1pc9kc.juery.api.pagination.Direction;
import fr.ght1pc9kc.juery.api.pagination.Order;
import fr.ght1pc9kc.juery.api.pagination.Sort;
import fr.ght1pc9kc.juery.basic.ParserConfiguration;
import fr.ght1pc9kc.juery.basic.QueryStringParser;
import fr.ght1pc9kc.juery.basic.common.lang3.BooleanUtils;
import fr.ght1pc9kc.juery.basic.common.lang3.NumberUtils;
import fr.ght1pc9kc.juery.basic.common.lang3.StringUtils;
import fr.ght1pc9kc.juery.basic.filter.QueryStringFilterVisitor;
import fr.ght1pc9kc.juery.basic.utils.TemporalUtils;
import lombok.RequiredArgsConstructor;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.BiFunction;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static fr.ght1pc9kc.juery.basic.filter.QueryStringFilterVisitor.QS_CONTAINS_CHAR;
import static fr.ght1pc9kc.juery.basic.filter.QueryStringFilterVisitor.QS_END_CHAR;
import static fr.ght1pc9kc.juery.basic.filter.QueryStringFilterVisitor.QS_GTE_CHAR;
import static fr.ght1pc9kc.juery.basic.filter.QueryStringFilterVisitor.QS_GT_CHAR;
import static fr.ght1pc9kc.juery.basic.filter.QueryStringFilterVisitor.QS_LTE_CHAR;
import static fr.ght1pc9kc.juery.basic.filter.QueryStringFilterVisitor.QS_LT_CHAR;
import static fr.ght1pc9kc.juery.basic.filter.QueryStringFilterVisitor.QS_START_CHAR;
import static java.util.function.Predicate.not;
@RequiredArgsConstructor
public final class QueryStringParserImpl implements QueryStringParser {
private static final int PAGE_START_INDEX = 0;
private static final QueryStringFilterVisitor CRITERIA_FORMATTER = new QueryStringFilterVisitor();
private final ParserConfiguration config;
@Override
public String format(PageRequest pr) {
var qs = new StringBuilder();
if (pr.pagination().offset() > 1) {
qs.append(config.fromParameter()).append("=").append(pr.pagination().offset()).append('&');
}
if (pr.pagination().size() < config.maxPageSize()) {
qs.append(config.sizeParameter()).append("=").append(pr.pagination().size()).append('&');
}
if (!pr.pagination().sort().equals(Sort.of())) {
qs.append(config.sortParameter()).append("=").append(formatSortValue(pr.pagination().sort())).append('&');
}
if (!pr.filter().isEmpty()) {
qs.append(pr.filter().accept(CRITERIA_FORMATTER));
}
if (qs.length() == 0) {
return "";
}
var c = qs.charAt(qs.length() - 1);
if (c == '&') {
qs.setLength(qs.length() - 1);
}
return qs.toString();
}
@Override
public String formatSortValue(Sort sort) {
var qs = new StringBuilder();
for (Order order : sort.orders()) {
if (order.direction() == Direction.DESC) {
qs.append('-');
}
qs.append(URLEncoder.encode(order.property(), StandardCharsets.UTF_8));
qs.append(',');
}
qs.setLength(qs.length() - 1);
return qs.toString();
}
@Override
public PageRequest parse(Map> queryString) {
if (queryString == null || queryString.isEmpty()) {
return PageRequest.all();
}
Pagination pagination = (queryString.containsKey(config.pageParameter()))
? parsePaginationByPage(queryString)
: parsePaginationByOffset(queryString);
Criteria[] filters = queryString.entrySet().stream()
.filter(e -> !config.excludeFilterParameters().contains(e.getKey()))
.sorted(Map.Entry.comparingByKey())
.map(e -> parseCriterionParameter(e.getKey(), e.getValue()))
.toArray(Criteria[]::new);
return PageRequest.of(pagination, Criteria.and(filters));
}
@Override
public PageRequest parse(String queryString) {
return parse(queryStringToMap(queryString));
}
@Override
public Criteria parseCriterionParameter(String key, List paramValue) {
if (paramValue == null || paramValue.isEmpty()) {
return Criteria.property(key).eq(Boolean.TRUE);
}
List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy