📄 tablefilter.java
字号:
}
// check if it's ok
if (state == NULL_ROW || joinConditionOk) {
return true;
}
}
state = AFTER_LAST;
return false;
}
private void checkTimeout() throws SQLException {
session.checkCancelled();
// System.out.println(this.alias+ " " + table.getName() + ": " + scanCount);
}
private boolean isOk(Expression condition) throws SQLException {
if (condition == null) {
return true;
}
return Boolean.TRUE.equals(condition.getBooleanValue(session));
}
public Row get() throws SQLException {
if (current == null && currentSearchRow != null) {
if (table.isClustered()) {
current = table.getTemplateRow();
for (int i = 0; i < currentSearchRow.getColumnCount(); i++) {
current.setValue(i, currentSearchRow.getValue(i));
}
} else {
current = cursor.get();
}
}
return current;
}
public void set(Row current) {
// this is currently only used so that check constraints work - to set
// the current (new) row
this.current = current;
this.currentSearchRow = current;
}
public String getTableAlias() {
if (alias != null) {
return alias;
}
return table.getName();
}
public void addIndexCondition(IndexCondition condition) {
indexConditions.add(condition);
}
public void addFilterCondition(Expression condition, boolean join) {
if (join) {
if (joinCondition == null) {
joinCondition = condition;
} else {
joinCondition = new ConditionAndOr(ConditionAndOr.AND, joinCondition, condition);
}
} else {
if (filterCondition == null) {
filterCondition = condition;
} else {
filterCondition = new ConditionAndOr(ConditionAndOr.AND, filterCondition, condition);
}
}
}
public void addJoin(TableFilter filter, boolean outer, Expression on) throws SQLException {
if (on != null) {
on.mapColumns(this, 0);
}
if (join == null) {
this.join = filter;
filter.outerJoin = outer;
if (on != null) {
filter.mapAndAddFilter(on);
}
} else {
join.addJoin(filter, outer, on);
}
}
private void mapAndAddFilter(Expression on) throws SQLException {
on.mapColumns(this, 0);
addFilterCondition(on, true);
on.createIndexConditions(session, this);
if (join != null) {
join.mapAndAddFilter(on);
}
}
public TableFilter getJoin() {
return join;
}
public boolean isJoinOuter() {
return outerJoin;
}
public String getPlanSQL(boolean join) {
StringBuffer buff = new StringBuffer();
if (join) {
if (outerJoin) {
buff.append("LEFT OUTER JOIN ");
} else {
buff.append("INNER JOIN ");
}
}
buff.append(table.getSQL());
if (alias != null) {
buff.append(' ');
buff.append(Parser.quoteIdentifier(alias));
}
buff.append(" /* ");
StringBuffer planBuff = new StringBuffer();
planBuff.append(index.getPlanSQL());
if (indexConditions.size() > 0) {
planBuff.append(": ");
for (int i = 0; i < indexConditions.size(); i++) {
IndexCondition condition = (IndexCondition) indexConditions.get(i);
if (i > 0) {
planBuff.append(" AND ");
}
planBuff.append(condition.getSQL());
}
}
String plan = planBuff.toString();
plan = StringUtils.quoteRemarkSQL(plan);
buff.append(plan);
buff.append(" */");
if (joinCondition != null) {
buff.append(" ON ");
buff.append(StringUtils.unEnclose(joinCondition.getSQL()));
}
if (filterCondition != null) {
buff.append(" /* WHERE ");
String condition = StringUtils.unEnclose(filterCondition.getSQL());
condition = StringUtils.quoteRemarkSQL(condition);
buff.append(condition);
buff.append(" */");
}
return buff.toString();
}
public void removeUnusableIndexConditions() {
for (int i = 0; i < indexConditions.size(); i++) {
IndexCondition cond = (IndexCondition) indexConditions.get(i);
if (!cond.isEvaluatable()) {
indexConditions.remove(i--);
}
}
}
public Index getIndex() {
return index;
}
public void setIndex(Index index) {
this.index = index;
Column[] columns = table.getColumns();
indexColumns = new IndexColumn[columns.length];
IndexColumn[] idxCols = index.getIndexColumns();
if (idxCols != null) {
for (int i = 0; i < columns.length; i++) {
int idx = index.getColumnIndex(columns[i]);
if (idx >= 0) {
indexColumns[i] = idxCols[idx];
}
}
}
}
public void setUsed(boolean used) {
this.used = used;
}
public boolean getUsed() {
return used;
}
public void setSession(Session session) {
this.session = session;
}
public void removeJoin() {
this.join = null;
}
public Expression getJoinCondition() {
return joinCondition;
}
public void removeJoinCondition() {
this.joinCondition = null;
}
public Expression getFilterCondition() {
return filterCondition;
}
public void removeFilterCondition() {
this.filterCondition = null;
}
public void setFullCondition(Expression condition) {
this.fullCondition = condition;
if (join != null) {
join.setFullCondition(condition);
}
}
public void optimizeFullCondition(boolean fromOuterJoin) {
if (fullCondition != null) {
fullCondition.addFilterConditions(this, fromOuterJoin || outerJoin);
if (join != null) {
join.optimizeFullCondition(fromOuterJoin || outerJoin);
}
}
}
public void setEvaluatable(TableFilter filter, boolean b) {
if (filterCondition != null) {
filterCondition.setEvaluatable(filter, b);
}
if (joinCondition != null) {
joinCondition.setEvaluatable(filter, b);
}
if (join != null) {
join.setEvaluatable(filter, b);
}
}
public String getSchemaName() {
return table.getSchema().getName();
}
public Column[] getColumns() {
return table.getColumns();
}
public Column[] getSystemColumns() {
if (!session.getDatabase().getMode().systemColumns) {
return null;
}
Column[] sys = new Column[3];
sys[0] = new Column("oid", Value.INT);
sys[0].setTable(table, 0);
sys[1] = new Column("ctid", Value.STRING);
sys[1].setTable(table, 0);
sys[2] = new Column("CTID", Value.STRING);
sys[2].setTable(table, 0);
return sys;
}
public Value getValue(Column column) throws SQLException {
if (currentSearchRow == null) {
return null;
}
int columnId = column.getColumnId();
if (current == null) {
Value v = currentSearchRow.getValue(columnId);
if (v != null) {
return v;
}
current = cursor.get();
}
return current.getValue(columnId);
}
public TableFilter getTableFilter() {
return this;
}
public void setAlias(String alias) {
this.alias = alias;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -