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.stream;
public final class FunctionFactory {
public static DecayFunctionGenerator gaussGenerator() {
return new DecayFunctionGenerator("gauss");
}
public static DecayFunctionGenerator expGenerator() {
return new DecayFunctionGenerator("exp");
}
public static DecayFunctionGenerator linearGenerator() {
return new DecayFunctionGenerator("linear");
}
public static WeightGenerator weightGenerator() {
return new WeightGenerator();
}
public static ScriptScoreGenerator scriptScoreGenerator() {
return new ScriptScoreGenerator();
}
public static RandomScoreGenerator randomScoreGenerator() {
return new RandomScoreGenerator();
}
public static FieldValueFactorGenerator fieldValueFactorGenerator() {
return new FieldValueFactorGenerator();
}
public static class WeightGenerator
extends QueryGenerator {
private WeightGenerator() {}
@Override
public String generate(QueryTypeArrayList<QueryTypeItem> queryBag) {
Map<String, String> childItems = stream(queryBag)
.toMap(q -> q.getName(), q -> q.getValue());
return generateFunctionChildren(childItems);
}
}
public static class ScriptScoreGenerator
extends QueryGenerator {
private ScriptScoreGenerator() {}
@Override
public String generate(QueryTypeArrayList<QueryTypeItem> queryBag) {
Map<String, String> childItems = stream(queryBag)
.toMap(q -> q.getName(), q -> q.getValue());
return generateScriptScoreChildren("script_score", childItems);
}
}
public static class RandomScoreGenerator
extends QueryGenerator {
private RandomScoreGenerator() {}
@Override
public String generate(QueryTypeArrayList<QueryTypeItem> queryBag) {
Map<String, String> childItems = stream(queryBag)
.toMap(q -> q.getName(), q -> q.getValue());
return generateFunctionChildren("random_score", childItems);
}
}
public static class FieldValueFactorGenerator
extends QueryGenerator {
private FieldValueFactorGenerator() {}
@Override
public String generate(QueryTypeArrayList<QueryTypeItem> queryBag) {
Map<String, String> childItems = stream(queryBag)
.toMap(q -> q.getName(), q -> q.getValue());
return generateFunctionChildren("field_value_factor", childItems);
}
}
public static class DecayFunctionGenerator
extends QueryGenerator {
private String functionName;
private DecayFunctionGenerator(String functionName) {
this.functionName = functionName;
}
@Override
public String generate(QueryTypeArrayList<QueryTypeItem> queryBag) {
QueryTypeItem parent = stream(queryBag)
.firstOrNull(q -> q.isParent());
Map<String, String> childItems = stream(queryBag)
.where(q -> !q.isParent())
.toMap(q -> q.getName(), q -> q.getValue());
return generateDecayFunction(functionName, parent, childItems);
}
}
}