package com.taobao.tddl.optimizer.core.plan.bean; import static com.taobao.tddl.optimizer.utils.OptimizerToString.appendField; import static com.taobao.tddl.optimizer.utils.OptimizerToString.appendln; import static com.taobao.tddl.optimizer.utils.OptimizerToString.printFilterString; import java.util.Map; import com.taobao.tddl.common.jdbc.ParameterContext; import com.taobao.tddl.optimizer.core.ASTNodeFactory; import com.taobao.tddl.optimizer.core.PlanVisitor; import com.taobao.tddl.optimizer.core.expression.IFilter; import com.taobao.tddl.optimizer.core.plan.IQueryTree; import com.taobao.tddl.optimizer.core.plan.query.IQuery; import com.taobao.tddl.optimizer.utils.OptimizerToString; public class Query extends QueryTree implements IQuery { protected IFilter keyFilter; protected LOCK_MODEL lockModel = LOCK_MODEL.SHARED_LOCK; protected String tableName; protected String indexName; protected IQueryTree subQuery; @Override public IFilter getKeyFilter() { return keyFilter; } @Override public IQuery setKeyFilter(IFilter keyFilter) { this.keyFilter = keyFilter; return this; } @Override public LOCK_MODEL getLockModel() { return lockModel; } @Override public IQuery setLockModel(LOCK_MODEL lockModel) { this.lockModel = lockModel; return this; } @Override public IQuery setTableName(String tableName) { this.tableName = tableName; return this; } @Override public String getTableName() { return tableName; } @Override public String getIndexName() { return indexName; } @Override public IQuery setIndexName(String indexName) { this.indexName = indexName; return this; } @Override public IQueryTree assignment(Map<Integer, ParameterContext> parameterSettings) { super.assignment(parameterSettings); IQueryTree iqc = getSubQuery(); if (iqc != null) { iqc.assignment(parameterSettings); } IFilter kf = getKeyFilter(); if (kf != null) { kf.assignment(parameterSettings); } return this; } @Override public IQuery setSubQuery(IQueryTree subQuery) { this.subQuery = subQuery; return this; } @Override public IQueryTree getSubQuery() { return subQuery; } @Override public IQuery copy() { IQuery query = ASTNodeFactory.getInstance().createQuery(); copySelfTo((QueryTree) query); query.setLockModel(this.getLockModel()); query.setSubQuery(this.getSubQuery()); query.setTableName(this.getTableName()); query.setKeyFilter(this.getKeyFilter()); return query; } @Override public void accept(PlanVisitor visitor) { visitor.visit(this); } @Override public String toStringWithInden(int inden) { String tabTittle = OptimizerToString.getTab(inden); String tabContent = OptimizerToString.getTab(inden + 1); StringBuilder sb = new StringBuilder(); if (this.getTableName() != null) { if (this.getAlias() != null) { appendln(sb, tabTittle + "Query from " + this.getIndexName() + " as " + this.getAlias()); } else { appendln(sb, tabTittle + "Query from " + this.getIndexName()); } } else { if (this.getAlias() != null) { appendln(sb, tabTittle + "Query" + " as " + this.getAlias()); } else { appendln(sb, tabTittle + "Query"); } } appendField(sb, "tableName", this.getTableName(), tabContent); appendField(sb, "keyFilter", printFilterString(this.getKeyFilter()), tabContent); appendField(sb, "resultFilter", printFilterString(this.getValueFilter()), tabContent); appendField(sb, "having", printFilterString(this.getHavingFilter()), tabContent); if (!(this.getLimitFrom() != null && this.getLimitFrom().equals(-1L) && this.getLimitTo() != null && this.getLimitTo() .equals(-1L))) { appendField(sb, "limitFrom", this.getLimitFrom(), tabContent); appendField(sb, "limitTo", this.getLimitTo(), tabContent); } if (this.isSubQuery() != null && this.isSubQuery()) { appendField(sb, "isSubQuery", this.isSubQuery(), tabContent); } appendField(sb, "orderBy", this.getOrderBys(), tabContent); appendField(sb, "queryConcurrency", this.getQueryConcurrency(), tabContent); appendField(sb, "lockModel", this.getLockModel(), tabContent); appendField(sb, "columns", this.getColumns(), tabContent); appendField(sb, "groupBys", this.getGroupBys(), tabContent); appendField(sb, "sql", this.getSql(), tabContent); appendField(sb, "executeOn", this.getDataNode(), tabContent); // appendField(sb, "requestID", // this.getRequestID(), tabContent); // appendField(sb, "subRequestID", // this.getSubRequestID(), tabContent); // if (this.getThread() != null) // appendField(sb, "thread", // this.getThread(), tabContent); if (this.getSubQuery() != null) { appendln(sb, tabContent + "from:"); sb.append(this.getSubQuery().toStringWithInden(inden + 2)); } return sb.toString(); } }