package com.taobao.tddl.executor.rowset; import java.util.ArrayList; import java.util.List; import com.taobao.tddl.executor.cursor.ICursorMeta; import com.taobao.tddl.optimizer.config.table.ColumnMeta; /** * @author mengshi.sunmengshi 2013-12-3 上午11:05:48 * @since 5.0.0 */ public class JoinRowSet extends AbstractRowSet implements IRowSet { private int rightCursorOffset; private IRowSet leftRowSet; private IRowSet rightRowSet; public JoinRowSet(int rightCursorOffset, IRowSet leftRowSet, IRowSet rightRowSet, ICursorMeta iCursorMeta){ super(iCursorMeta); this.rightCursorOffset = rightCursorOffset; this.leftRowSet = leftRowSet; this.rightRowSet = rightRowSet; } public int getRightCursorOffset() { return rightCursorOffset; } public void setRightCursorOffset(int rightCursorOffset) { this.rightCursorOffset = rightCursorOffset; } public IRowSet getLeftRowSet() { return leftRowSet; } public void setLeftRowSet(IRowSet leftRowSet) { this.leftRowSet = leftRowSet; } public IRowSet getRightRowSet() { return rightRowSet; } public void setRightRowSet(IRowSet rightRowSet) { this.rightRowSet = rightRowSet; } @Override public Object getObject(int index) { if (rightCursorOffset <= index) { if (rightRowSet == null) return null; return rightRowSet.getObject(index - rightCursorOffset); } if (leftRowSet == null) return null; return leftRowSet.getObject(index); } @Override public void setObject(int index, Object value) { if (rightCursorOffset <= index) { rightRowSet.setObject(index - rightCursorOffset, value); return; } leftRowSet.setObject(index, value); } @Override public List<Object> getValues() { ArrayList<Object> values = new ArrayList<Object>(); if (leftRowSet == null && rightRowSet == null) { int size = this.getParentCursorMeta().getColumns().size(); for (int i = 0; i < size; i++) { values.add(null); } } else if (rightRowSet == null) { values.addAll(leftRowSet.getValues()); for (int i = 0; i < this.getParentCursorMeta().getColumns().size() - leftRowSet.getValues().size(); i++) values.add(null); } else if (leftRowSet == null) { for (int i = 0; i < this.getParentCursorMeta().getColumns().size() - rightRowSet.getValues().size(); i++) values.add(null); values.addAll(rightRowSet.getValues()); } else { values.addAll(leftRowSet.getValues()); values.addAll(rightRowSet.getValues()); } return values; } @Override public String toString() { StringBuilder sb = new StringBuilder(); for (ColumnMeta cm : this.getParentCursorMeta().getColumns()) { Integer index = this.getParentCursorMeta().getIndex(cm.getTableName(), cm.getName()); sb.append(cm.getName() + ":" + this.getValues().get(index) + " "); } return sb.toString(); } }