package com.taobao.tddl.optimizer.utils;
import java.util.List;
import com.taobao.tddl.common.exception.NotSupportException;
import com.taobao.tddl.optimizer.core.ast.QueryTreeNode;
import com.taobao.tddl.optimizer.core.expression.IBooleanFilter;
import com.taobao.tddl.optimizer.core.expression.IFilter;
import com.taobao.tddl.optimizer.core.expression.IFilter.OPERATION;
import com.taobao.tddl.optimizer.core.expression.ILogicalFilter;
import com.taobao.tddl.optimizer.core.expression.ISelectable;
/**
* {@linkplain IFilter}的toString()方法
*
* @author mengshi.sunmengshi
* @author <a href="jianghang.loujh@taobao.com">jianghang</a>
*/
public class OptimizerToString {
public static String printFilterString(IFilter filter) {
return printFilterString(filter, 0, true);
}
public static String printFilterString(IFilter filter, int inden) {
return printFilterString(filter, inden, true);
}
public static String getTab(int count) {
StringBuffer tab = new StringBuffer();
for (int i = 0; i < count; i++)
tab.append(" ");
return tab.toString();
}
/**
* 根据给定的inden进行拼接filed : value
*
* @param sb
* @param field
* @param value
* @param inden
*/
public static void appendField(StringBuilder sb, String field, Object value, String inden) {
if (value == null || value.toString().equals("") || value.toString().equals("[]")
|| value.toString().equals("SEQUENTIAL") || value.toString().equals("SHARED_LOCK")) {
return;
}
appendln(sb, inden + field + ":" + value);
}
/**
* 拼接换行符
*/
public static void appendln(StringBuilder sb, String v) {
sb.append(v).append("\n");
}
public static String printFilterString(IFilter filter, int inden, boolean needTable) {
if (filter == null) {
return null;
}
if (filter instanceof IBooleanFilter) {
StringBuilder builder = new StringBuilder();
if (filter.isNot()) {
builder.append("NOT (");
}
IBooleanFilter bf = (IBooleanFilter) filter;
if (bf.getColumn() != null && (bf.getValue() != null || bf.getValues() != null)) {
if (bf.getOperation().equals(OPERATION.IN)) {
builder.append(getColumnName(bf, inden, needTable))
.append(" ")
.append(bf.getOperation().getOPERATIONString())
.append(" ")
.append(getValueName(bf, inden, needTable, true));
} else {
builder.append(getColumnName(bf, inden, needTable))
.append(" ")
.append(bf.getOperation().getOPERATIONString())
.append(" ")
.append(getValueName(bf, inden, needTable, false));
}
} else if (bf.getOperation().equals(OPERATION.IS_NULL) || bf.getOperation().equals(OPERATION.IS_NOT_NULL)) {
builder.append(getColumnName(bf, inden, needTable))
.append(" ")
.append(bf.getOperation().getOPERATIONString());
} else {
builder.append(getColumnName(bf, inden, needTable));
}
if (filter.isNot()) {
builder.append(")");
}
return builder.toString();
} else if (filter instanceof ILogicalFilter) {
ILogicalFilter lf = (ILogicalFilter) filter;
StringBuilder builder = new StringBuilder("(");
if (filter.isNot()) {
builder.append("NOT (");
}
builder.append(printFilterString(lf.getSubFilter().get(0)));
for (int i = 1; i < lf.getSubFilter().size(); i++) {
builder.append(" ")
.append(lf.getOperation().getOPERATIONString())
.append(" ")
.append(printFilterString(lf.getSubFilter().get(i)));
}
if (filter.isNot()) {
builder.append(")");
}
builder.append(")");
return builder.toString();
} else {
throw new NotSupportException();
}
}
private static String getColumnName(IBooleanFilter bf, int inden, boolean needTable) {
if (bf == null) {
return null;
}
if (needTable) {
return bf.getColumn().toString();
} else {
List args = bf.getArgs();
if (!args.isEmpty()) {
Object obj = args.get(0);
if (obj instanceof ISelectable) {
return ((ISelectable) obj).getColumnName();
} else if (obj instanceof Comparable) {
return obj.toString();
}
}
return null;
}
}
private static String getValueName(IBooleanFilter bf, int inden, boolean needTable, boolean isIn) {
if (bf == null) {
return null;
}
if (needTable) {
if (isIn) {
return bf.getValues().toString();
} else {
if (bf.getValue() instanceof QueryTreeNode) {
return "\n" + ((QueryTreeNode) bf.getValue()).toString(inden);
} else {
return bf.getValue().toString();
}
}
} else {
List args = bf.getArgs();
if (args.size() == 2) {
Object obj = args.get(1);
if (obj instanceof ISelectable) {
return ((ISelectable) obj).getColumnName();
} else if (obj instanceof Comparable) {
return obj.toString();
}
}
return null;
}
}
}