package com.taobao.tddl.executor.cursor.test; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.junit.Assert; import org.junit.Test; import com.taobao.tddl.common.exception.TddlException; import com.taobao.tddl.executor.common.ExecutionContext; import com.taobao.tddl.executor.cursor.MockArrayCursor; import com.taobao.tddl.executor.cursor.SchematicCursor; import com.taobao.tddl.executor.cursor.impl.TempTableSortCursor; import com.taobao.tddl.executor.repo.RepositoryHolder; import com.taobao.tddl.executor.rowset.IRowSet; import com.taobao.tddl.executor.spi.CursorFactoryDefaultImpl; import com.taobao.tddl.executor.spi.ICursorFactory; import com.taobao.tddl.executor.spi.IRepository; import com.taobao.tddl.optimizer.config.table.StaticSchemaManager; 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 TempTableCursorTest { 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 testSort() throws TddlException { RepositoryHolder repoHolder = new RepositoryHolder(); StaticSchemaManager sm = new StaticSchemaManager("test_schema.xml", null, null); sm.init(); IRepository bdbRepo = repoHolder.getOrCreateRepository("BDB_JE", Collections.EMPTY_MAP); ICursorFactory cf = new CursorFactoryDefaultImpl(); MockArrayCursor mockCursor = this.getCursor("T1", new Integer[] { 5, 5, 4, 3, 2, 1 }); SchematicCursor subCursor = new SchematicCursor(mockCursor); IOrderBy order = new OrderBy(); order.setColumn(new Column().setColumnName("ID").setTableName("T1").setDataType(DataType.IntegerType)); List<IOrderBy> orderBys = new ArrayList(); orderBys.add(order); TempTableSortCursor c = new TempTableSortCursor(cf, bdbRepo, subCursor, orderBys, true, 0, new ExecutionContext()); Object[] expected = new Object[] { 1, 2, 3, 4, 5, 5 }; List actual = new ArrayList(); IRowSet row = null; while ((row = c.next()) != null) { System.out.println(row); actual.add(row.getObject(0)); } Assert.assertArrayEquals(expected, actual.toArray()); Assert.assertTrue(mockCursor.isClosed()); } @Test public void testNull() throws TddlException { RepositoryHolder repoHolder = new RepositoryHolder(); StaticSchemaManager sm = new StaticSchemaManager("test_schema.xml", null, null); sm.init(); IRepository bdbRepo = repoHolder.getOrCreateRepository("BDB_JE", Collections.EMPTY_MAP); ICursorFactory cf = new CursorFactoryDefaultImpl(); SchematicCursor subCursor = new SchematicCursor(this.getCursor("T1", new Integer[] { 5, null, 4, 3, 2, null, 1 })); IOrderBy order = new OrderBy(); order.setColumn(new Column().setColumnName("ID").setTableName("T1").setDataType(DataType.IntegerType)); List<IOrderBy> orderBys = new ArrayList(); orderBys.add(order); TempTableSortCursor c = new TempTableSortCursor(cf, bdbRepo, subCursor, orderBys, true, 0, new ExecutionContext()); Object[] expected = new Object[] { 1, 2, 3, 4, 5, null, null }; List actual = new ArrayList(); IRowSet row = null; while ((row = c.next()) != null) { System.out.println(row); actual.add(row.getObject(0)); } Assert.assertArrayEquals(expected, actual.toArray()); } @Test public void testEmpty() throws TddlException { RepositoryHolder repoHolder = new RepositoryHolder(); StaticSchemaManager sm = new StaticSchemaManager("test_schema.xml", null, null); sm.init(); IRepository bdbRepo = repoHolder.getOrCreateRepository("BDB_JE", Collections.EMPTY_MAP); ICursorFactory cf = new CursorFactoryDefaultImpl(); SchematicCursor subCursor = new SchematicCursor(this.getCursor("T1", new Integer[] {})); IOrderBy order = new OrderBy(); order.setColumn(new Column().setColumnName("ID").setTableName("T1").setDataType(DataType.IntegerType)); List<IOrderBy> orderBys = new ArrayList(); orderBys.add(order); TempTableSortCursor c = new TempTableSortCursor(cf, bdbRepo, subCursor, orderBys, true, 0, new ExecutionContext()); Object[] expected = new Object[] {}; List actual = new ArrayList(); IRowSet row = null; while ((row = c.next()) != null) { System.out.println(row); actual.add(row.getObject(0)); } Assert.assertArrayEquals(expected, actual.toArray()); } @Test public void testGetReturnColumnsBeforeNext() throws TddlException { RepositoryHolder repoHolder = new RepositoryHolder(); StaticSchemaManager sm = new StaticSchemaManager("test_schema.xml", null, null); sm.init(); IRepository bdbRepo = repoHolder.getOrCreateRepository("BDB_JE", Collections.EMPTY_MAP); ICursorFactory cf = new CursorFactoryDefaultImpl(); MockArrayCursor mockCursor = this.getCursor("T1", new Integer[] { 5, 5, 4, 3, 2, 1 }); SchematicCursor subCursor = new SchematicCursor(mockCursor); IOrderBy order = new OrderBy(); order.setColumn(new Column().setColumnName("ID").setTableName("T1").setDataType(DataType.IntegerType)); List<IOrderBy> orderBys = new ArrayList(); orderBys.add(order); TempTableSortCursor c = new TempTableSortCursor(cf, bdbRepo, subCursor, orderBys, true, 0, new ExecutionContext()); 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 testGetReturnColumnsAfterNext() throws TddlException { RepositoryHolder repoHolder = new RepositoryHolder(); StaticSchemaManager sm = new StaticSchemaManager("test_schema.xml", null, null); sm.init(); IRepository bdbRepo = repoHolder.getOrCreateRepository("BDB_JE", Collections.EMPTY_MAP); ICursorFactory cf = new CursorFactoryDefaultImpl(); MockArrayCursor mockCursor = this.getCursor("T1", new Integer[] { 5, 5, 4, 3, 2, 1 }); SchematicCursor subCursor = new SchematicCursor(mockCursor); IOrderBy order = new OrderBy(); order.setColumn(new Column().setColumnName("ID").setTableName("T1").setDataType(DataType.IntegerType)); List<IOrderBy> orderBys = new ArrayList(); orderBys.add(order); TempTableSortCursor c = new TempTableSortCursor(cf, bdbRepo, subCursor, orderBys, true, 0, new ExecutionContext()); while (c.next() != null) ; Assert.assertEquals("[T1.ID, T1.NAME, T1.SCHOOL]", c.getReturnColumns().toString()); Assert.assertEquals("[OrderBy [columnName=T1.ID, direction=true]]", c.getOrderBy().toString()); } }