package com.taobao.tddl.executor.cursor.test;
import java.util.ArrayList;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import com.taobao.tddl.common.exception.TddlException;
import com.taobao.tddl.executor.cursor.ISchematicCursor;
import com.taobao.tddl.executor.cursor.MockArrayCursor;
import com.taobao.tddl.executor.cursor.SchematicCursor;
import com.taobao.tddl.executor.cursor.impl.DistinctCursor;
import com.taobao.tddl.executor.cursor.impl.MergeSortedCursors;
import com.taobao.tddl.executor.rowset.IRowSet;
import com.taobao.tddl.optimizer.core.datatype.DataType;
import com.taobao.tddl.optimizer.core.expression.IOrderBy;
import com.taobao.tddl.optimizer.core.expression.bean.Column;
import com.taobao.tddl.optimizer.core.expression.bean.OrderBy;
public class DistinctCursorTest {
MockArrayCursor getCursor(String tableName, Integer[] ids) throws TddlException {
MockArrayCursor cursor = new MockArrayCursor(tableName);
cursor.addColumn("id", DataType.IntegerType);
cursor.addColumn("name", DataType.StringType);
cursor.addColumn("school", DataType.StringType);
cursor.initMeta();
for (Integer id : ids) {
cursor.addRow(new Object[] { id, "name" + id, "school" + id });
}
cursor.init();
return cursor;
}
@Test
public void testSortDuplicated() throws TddlException {
MockArrayCursor mockCursor1 = this.getCursor("T1", new Integer[] { 1, 3, 5, 8, 8, 9, 10 });
MockArrayCursor mockCursor2 = this.getCursor("T1", new Integer[] { 2, 2, 4, 5, 6, 7, 7, 9, 9, 10, 13 });
IOrderBy order = new OrderBy();
order.setColumn(new Column().setColumnName("ID").setTableName("T1").setDataType(DataType.IntegerType));
List<IOrderBy> orderBys = new ArrayList();
orderBys.add(order);
List<ISchematicCursor> cursors = new ArrayList();
cursors.add(new SchematicCursor(mockCursor1, orderBys));
cursors.add(new SchematicCursor(mockCursor2, orderBys));
DistinctCursor c = new DistinctCursor(new MergeSortedCursors(cursors, true), orderBys);
Object[] expected = new Object[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13 };
List actual = new ArrayList();
IRowSet row = null;
while ((row = c.next()) != null) {
System.out.println(row);
actual.add(row.getObject(0));
}
c.close(new ArrayList());
Assert.assertArrayEquals(expected, actual.toArray());
Assert.assertTrue(mockCursor1.isClosed());
}
@Test
public void testGetOrderBysBeforeNext() throws TddlException {
MockArrayCursor mockCursor1 = this.getCursor("T1", new Integer[] { 1, 3, 5, 8, 8, 9, 10 });
MockArrayCursor mockCursor2 = this.getCursor("T1", new Integer[] { 2, 2, 4, 5, 6, 7, 7, 9, 9, 10, 13 });
IOrderBy order = new OrderBy();
order.setColumn(new Column().setColumnName("ID").setTableName("T1").setDataType(DataType.IntegerType));
List<IOrderBy> orderBys = new ArrayList();
orderBys.add(order);
List<ISchematicCursor> cursors = new ArrayList();
cursors.add(new SchematicCursor(mockCursor1, orderBys));
cursors.add(new SchematicCursor(mockCursor2, orderBys));
DistinctCursor c = new DistinctCursor(new MergeSortedCursors(cursors, true), orderBys);
Assert.assertEquals("[T1.ID, T1.NAME, T1.SCHOOL]", c.getReturnColumns().toString());
Assert.assertEquals("[OrderBy [columnName=T1.ID, direction=true]]", c.getOrderBy().toString());
}
@Test
public void testGetOrderBysAfterNext() throws TddlException {
MockArrayCursor mockCursor1 = this.getCursor("T1", new Integer[] { 1, 3, 5, 8, 8, 9, 10 });
MockArrayCursor mockCursor2 = this.getCursor("T1", new Integer[] { 2, 2, 4, 5, 6, 7, 7, 9, 9, 10, 13 });
IOrderBy order = new OrderBy();
order.setColumn(new Column().setColumnName("ID").setTableName("T1").setDataType(DataType.IntegerType));
List<IOrderBy> orderBys = new ArrayList();
orderBys.add(order);
List<ISchematicCursor> cursors = new ArrayList();
cursors.add(new SchematicCursor(mockCursor1, orderBys));
cursors.add(new SchematicCursor(mockCursor2, orderBys));
DistinctCursor c = new DistinctCursor(new MergeSortedCursors(cursors, true), orderBys);
c.next();
Assert.assertEquals("[T1.ID, T1.NAME, T1.SCHOOL]", c.getReturnColumns().toString());
Assert.assertEquals("[OrderBy [columnName=T1.ID, direction=true]]", c.getOrderBy().toString());
}
}