package com.silverforge.elasticsearchrawclient.queryDSL.generator;
import com.silverforge.elasticsearchrawclient.model.QueryTypeItem;
import com.silverforge.elasticsearchrawclient.utils.QueryTypeArrayList;
import java.util.Map;
import static br.com.zbra.androidlinq.Linq.*;
public final class SortQueryFactory {
public static SortGenerator sortGenerator() {
return new SortGenerator();
}
public static ScriptBasedSortingGenerator scriptBasedSortingGenerator() {
return new ScriptBasedSortingGenerator();
}
public static GeoDistanceSortingGenerator geoDistanceSortingGenerator() {
return new GeoDistanceSortingGenerator();
}
public static class GeoDistanceSortingGenerator
extends QueryGenerator {
private GeoDistanceSortingGenerator() {}
@Override
public String generate(QueryTypeArrayList<QueryTypeItem> queryBag) {
QueryTypeItem parent = stream(queryBag)
.firstOrNull(qb -> qb.isParent());
Map<String, String> childItems = stream(queryBag)
.where(qb -> !qb.isParent())
.toMap(qb -> qb.getName(), qb -> qb.getValue());
return generateGeoDistance("_geo_distance", parent, childItems);
}
}
public static class ScriptBasedSortingGenerator
extends QueryGenerator {
private ScriptBasedSortingGenerator() {}
@Override
public String generate(QueryTypeArrayList<QueryTypeItem> queryBag) {
Map<String, String> childItems = stream(queryBag)
.toMap(qb -> qb.getName(), qb -> qb.getValue());
return generateChildren("_script", childItems);
}
}
public static class SortGenerator
extends QueryGenerator {
private SortGenerator() {}
@Override
public String generate(QueryTypeArrayList<QueryTypeItem> queryBag) {
QueryTypeItem parent = stream(queryBag)
.firstOrNull(qb -> qb.isParent());
Map<String, String> childItems = stream(queryBag)
.where(qb -> !qb.isParent())
.toMap(qb -> qb.getName(), qb -> qb.getValue());
return generateParentChildren(parent, childItems);
}
}
}