package org.araqne.logdb.query.expr;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.araqne.logdb.QueryContext;
import org.araqne.logdb.Row;
public class StringReplace extends FunctionExpression {
private final Expression targetExpr;
private final Expression patternExpr;
private final Expression replaceExpr;
private Expression flagExpr;
public StringReplace(QueryContext ctx, List<Expression> exprs) {
super("replace", exprs, 3);
this.targetExpr = exprs.get(0);
this.patternExpr = exprs.get(1);
this.replaceExpr = exprs.get(2);
if (exprs.size() > 3)
this.flagExpr = exprs.get(3); // regex flag
}
@Override
public Object eval(Row map) {
Object v = targetExpr.eval(map);
if (v == null)
return null;
String target = v.toString();
Object p = patternExpr.eval(map);
if (p == null)
return target;
String patternStr = p.toString();
Object r = replaceExpr.eval(map);
String replace = "";
if (r != null)
replace = r.toString();
Object f = null;
if (flagExpr != null)
f = flagExpr.eval(map);
if (f != null && f.toString().equals("re")) {
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(target);
return matcher.replaceAll(replace);
} else {
return target.replace(CharSequence.class.cast(patternStr), CharSequence.class.cast(replace));
}
}
}