package org.n3r.eql.parser;
import com.google.common.collect.Lists;
import lombok.val;
import org.n3r.eql.ex.EqlConfigException;
import org.n3r.eql.map.EqlDynamic;
import org.n3r.eql.param.EqlParamPlaceholder;
import org.n3r.eql.param.PlaceholderType;
import org.n3r.eql.util.S;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DynamicParser {
private static Pattern DYNAMIC_PATTERN = Pattern.compile("'?\\$(.*?)\\$'?");
private EqlDynamic dynamicSql;
private String rawSql;
public EqlDynamic parseRawSql(String rawSql) {
this.rawSql = rawSql;
this.dynamicSql = new EqlDynamic();
Matcher matcher = DYNAMIC_PATTERN.matcher(rawSql);
List<String> placeHolders = Lists.<String>newArrayList();
List<String> sqlPieces = Lists.<String>newArrayList();
int startPos = 0;
while (matcher.find()) {
String placeHolder = matcher.group(1).trim();
placeHolders.add(placeHolder);
sqlPieces.add(rawSql.substring(startPos, matcher.start()));
startPos = matcher.end();
}
if (startPos == 0) return null;
sqlPieces.add(rawSql.substring(startPos));
dynamicSql.setSqlPieces(sqlPieces);
parsePlaceholders(placeHolders);
return dynamicSql;
}
private void parsePlaceholders(List<String> placeHolders) {
List<EqlParamPlaceholder> paramPlaceholders = new ArrayList<EqlParamPlaceholder>();
PlaceholderType placeHoldertype = PlaceholderType.UNSET;
for (String placeHolder : placeHolders) {
val paramPlaceholder = new EqlParamPlaceholder();
paramPlaceholders.add(paramPlaceholder);
paramPlaceholder.setPlaceholder(placeHolder);
if (placeHolder.length() == 0) {
paramPlaceholder.setPlaceholderType(PlaceholderType.AUTO_SEQ);
} else if (S.isInteger(placeHolder)) {
paramPlaceholder.setPlaceholderType(PlaceholderType.MANU_SEQ);
paramPlaceholder.setSeq(Integer.valueOf(placeHolder));
} else {
paramPlaceholder.setPlaceholderType(PlaceholderType.VAR_NAME);
}
placeHoldertype = paramPlaceholder.getPlaceholderType();
}
for (val pPlaceholder : paramPlaceholders) {
if (placeHoldertype == pPlaceholder.getPlaceholderType()) continue;
throw new EqlConfigException("[" + rawSql + "]中定义的SQL动态替换设置类型不一致");
}
dynamicSql.setPlaceholdertype(placeHoldertype);
val placeholders = paramPlaceholders.toArray(new EqlParamPlaceholder[0]);
dynamicSql.setPlaceholders(placeholders);
}
}