package com.querydsl.sql;
import static com.querydsl.core.Target.ORACLE;
import static com.querydsl.sql.Constants.employee;
import static com.querydsl.sql.oracle.OracleGrammar.level;
import java.sql.SQLException;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.querydsl.core.testutil.IncludeIn;
import com.querydsl.sql.domain.QEmployee;
import com.querydsl.sql.oracle.OracleQuery;
public class SelectOracleBase extends AbstractBaseTest {
private static final Logger logger = LoggerFactory.getLogger(AbstractSQLQuery.class);
protected OracleQuery<?> oracleQuery() {
return new OracleQuery<Void>(connection, configuration) {
@Override
protected SQLSerializer serialize(boolean forCountRow) {
SQLSerializer serializer = super.serialize(forCountRow);
String rv = serializer.toString();
if (expectedQuery != null) {
Assert.assertEquals(expectedQuery, rv.replace('\n', ' '));
expectedQuery = null;
}
logger.debug(rv);
return serializer;
}
};
}
@Test
@Ignore
public void connectBy() throws SQLException {
// TODO : come up with a legal case
oracleQuery().from(employee)
.where(level.eq(-1))
.connectBy(level.lt(1000))
.select(employee.id).fetch();
}
@Test
@IncludeIn(ORACLE)
@SkipForQuoted
public void connectByPrior() throws SQLException {
expectedQuery = "select e.ID, e.LASTNAME, e.SUPERIOR_ID " +
"from EMPLOYEE e " +
"connect by prior e.ID = e.SUPERIOR_ID";
oracleQuery().from(employee)
.connectByPrior(employee.id.eq(employee.superiorId))
.select(employee.id, employee.lastname, employee.superiorId).fetch();
}
@Test
@IncludeIn(ORACLE)
@SkipForQuoted
public void connectByPrior2() throws SQLException {
if (configuration.getUseLiterals()) {
return;
}
expectedQuery =
"select e.ID, e.LASTNAME, e.SUPERIOR_ID " +
"from EMPLOYEE e " +
"start with e.ID = ? " +
"connect by prior e.ID = e.SUPERIOR_ID";
oracleQuery().from(employee)
.startWith(employee.id.eq(1))
.connectByPrior(employee.id.eq(employee.superiorId))
.select(employee.id, employee.lastname, employee.superiorId).fetch();
}
@Test
@IncludeIn(ORACLE)
@SkipForQuoted
public void connectByPrior3() throws SQLException {
if (configuration.getUseLiterals()) {
return;
}
expectedQuery =
"select e.ID, e.LASTNAME, e.SUPERIOR_ID " +
"from EMPLOYEE e " +
"start with e.ID = ? " +
"connect by prior e.ID = e.SUPERIOR_ID " +
"order siblings by e.LASTNAME";
oracleQuery().from(employee)
.startWith(employee.id.eq(1))
.connectByPrior(employee.id.eq(employee.superiorId))
.orderSiblingsBy(employee.lastname)
.select(employee.id, employee.lastname, employee.superiorId).fetch();
}
@Test
@IncludeIn(ORACLE)
@SkipForQuoted
public void connectByPrior4() throws SQLException {
if (configuration.getUseLiterals()) {
return;
}
expectedQuery =
"select e.ID, e.LASTNAME, e.SUPERIOR_ID " +
"from EMPLOYEE e " +
"connect by nocycle prior e.ID = e.SUPERIOR_ID";
oracleQuery().from(employee)
.connectByNocyclePrior(employee.id.eq(employee.superiorId))
.select(employee.id, employee.lastname, employee.superiorId).fetch();
}
@Test
@IncludeIn(ORACLE)
@SkipForQuoted
public void sumOver() throws SQLException {
// SQL> select deptno,
// 2 ename,
// 3 sal,
// 4 sum(sal) over (partition by deptno
// 5 order by sal,ename) CumDeptTot,
// 6 sum(sal) over (partition by deptno) SalByDept,
// 7 sum(sal) over (order by deptno, sal) CumTot,
// 8 sum(sal) over () TotSal
// 9 from emp
// 10 order by deptno, sal;
expectedQuery = "select e.LASTNAME, e.SALARY, " +
"sum(e.SALARY) over (partition by e.SUPERIOR_ID order by e.LASTNAME asc, e.SALARY asc), " +
"sum(e.SALARY) over (order by e.SUPERIOR_ID asc, e.SALARY asc), " +
"sum(e.SALARY) over () from EMPLOYEE e order by e.SALARY asc, e.SUPERIOR_ID asc";
oracleQuery().from(employee)
.orderBy(employee.salary.asc(), employee.superiorId.asc())
.select(
employee.lastname,
employee.salary,
SQLExpressions.sum(employee.salary).over().partitionBy(employee.superiorId).orderBy(employee.lastname, employee.salary),
SQLExpressions.sum(employee.salary).over().orderBy(employee.superiorId, employee.salary),
SQLExpressions.sum(employee.salary).over()).fetch();
// shorter version
QEmployee e = employee;
oracleQuery().from(e)
.orderBy(e.salary.asc(), e.superiorId.asc())
.select(e.lastname, e.salary,
SQLExpressions.sum(e.salary).over().partitionBy(e.superiorId).orderBy(e.lastname, e.salary),
SQLExpressions.sum(e.salary).over().orderBy(e.superiorId, e.salary),
SQLExpressions.sum(e.salary).over()).fetch();
}
}