private IDatatype approximate(IDatatype dt1, IDatatype dt2, String parameter, String algs, double threshold, Environment env, Expr exp) {
String s1 = stringValue(dt1);
String s2 = stringValue(dt2);
Expr var = exp.getExp(0);
ApproximateSearchEnv appxEnv = env.getAppxSearchEnv();
Double combinedSim;
Double singleSim = appxEnv.getSimilarity(var, dt1, algs);
boolean notExisted = (singleSim == null);
if (s1.equalsIgnoreCase(s2)) {
singleSim = ISimAlgorithm.MAX;
combinedSim = ISimAlgorithm.MAX;
} else {
if (notExisted) {
ISimAlgorithm alg = SimAlgorithmFactory.createCombined(algs, false);
singleSim = alg.calculate(s1, s2, parameter);
}
combinedSim = appxEnv.aggregate(env, var, singleSim);
}
boolean filtered = combinedSim > threshold;
msg("\t [Similarity,\t " + dt1 + ",\t" + dt2 + "]: c:" + format(singleSim) + ", all:" + format(combinedSim) + ", " + filtered);
if (notExisted) {
appxEnv.add(var, dt2, dt1, algs, singleSim);
}
return filtered ? TRUE : FALSE;
}