package com.w11k.lsql.tests;
import com.w11k.lsql.query.RowQuery;
import com.w11k.lsql.ResultSetWithColumns;
import com.w11k.lsql.Row;
import org.testng.annotations.Test;
import rx.Observable;
import rx.functions.Action1;
import rx.functions.Func1;
import java.sql.SQLException;
import java.util.List;
import static org.testng.Assert.*;
public class RowQueryTest extends AbstractLSqlTest {
@Test
public void query() {
createTable("CREATE TABLE table1 (name TEXT, age INT)");
lSql.executeRawSql("INSERT INTO table1 (name, age) VALUES ('cus1', 20)");
RowQuery rows = lSql.executeRawQuery("SELECT * FROM table1");
assertNotNull(rows);
}
@Test
public void queryList() {
createTable("CREATE TABLE table1 (name TEXT, age INT)");
lSql.executeRawSql("INSERT INTO table1 (name, age) VALUES ('cus1', 20)");
lSql.executeRawSql("INSERT INTO table1 (name, age) VALUES ('cus1', 30)");
List<Row> rows = lSql.executeRawQuery("SELECT * FROM table1").toList();
assertEquals(rows.size(), 2);
}
@Test
public void queryMap() {
createTable("CREATE TABLE table1 (name TEXT, age INT)");
lSql.executeRawSql("INSERT INTO table1 (name, age) VALUES ('cus1', 20)");
lSql.executeRawSql("INSERT INTO table1 (name, age) VALUES ('cus1', 30)");
Observable<Row> rx = lSql.executeRawQuery("SELECT * FROM table1").rx();
List<Integer> ages = rx.map(new Func1<Row, Integer>() {
public Integer call(Row row) {
System.out.println("MAPPPP");
return row.getInt("age");
}
}).toList().toBlocking().first();
assertTrue(ages.contains(20));
assertTrue(ages.contains(30));
}
@Test(expectedExceptions = IllegalStateException.class)
public void failOnDuplicateColumnsInTheResultSet() {
createTable("CREATE TABLE table1 (name TEXT, age INT)");
lSql.executeRawSql("INSERT INTO table1 (name, age) VALUES ('cus1', 20)");
lSql.executeRawQuery("SELECT name, name, age FROM table1").first().get();
}
@Test
public void ignoreDuplicateColumnsInTheResultSet() {
createTable("CREATE TABLE table1 (name TEXT, age INT)");
lSql.executeRawSql("INSERT INTO table1 (name, age) VALUES ('cus1', 20)");
lSql.executeRawQuery("SELECT name, name, age FROM table1").ignoreDuplicateColumns().first().get();
}
@Test
public void queryGetFirstRow() {
createTable("CREATE TABLE table1 (name TEXT, age INT)");
lSql.executeRawSql("INSERT INTO table1 (name, age) VALUES ('cus1', 20)");
Row row = lSql.executeRawQuery("SELECT * FROM table1").first().get();
assertNotNull(row);
assertEquals(row.getString("name"), "cus1");
assertEquals(row.getInt("age"), (Integer) 20);
}
@Test(expectedExceptions = IllegalStateException.class)
public void failsOnDublicateColumnsInResultSet() {
createTable("CREATE TABLE table1 (name TEXT, age INT)");
createTable("CREATE TABLE table2 (name TEXT, age INT)");
lSql.executeRawSql("INSERT INTO table1 (name, age) VALUES ('cus1', 20)");
lSql.executeRawSql("INSERT INTO table2 (name, age) VALUES ('cus2', 30)");
RowQuery query = lSql.executeRawQuery("SELECT *, count(*) AS c FROM table1, table2");
query.toList();
}
@Test
public void flatMap() {
createTable("CREATE TABLE table1 (name TEXT, age INT)");
lSql.executeRawSql("INSERT INTO table1 (name, age) VALUES ('cus1', null)");
lSql.executeRawSql("INSERT INTO table1 (name, age) VALUES ('cus2', 20)");
Observable<Row> rx = lSql.executeRawQuery("SELECT * FROM table1").rx();
List<Integer> ages = rx.flatMap(new Func1<Row, Observable<Integer>>() {
@Override
public Observable<Integer> call(Row row) {
Integer age = row.getInt("age");
if (age != null) {
return Observable.just(age);
} else {
return Observable.empty();
}
}
}).toList().toBlocking().first();
assertEquals(ages.size(), 1);
assertEquals(ages.get(0).intValue(), 20);
}
@Test
public void rxResultSet() {
createTable("CREATE TABLE table1 (name TEXT, age INT)");
lSql.executeRawSql("INSERT INTO table1 (name, age) VALUES ('cus1', 10)");
lSql.executeRawSql("INSERT INTO table1 (name, age) VALUES ('cus2', 20)");
final RowQuery query = lSql.executeRawQuery("SELECT * FROM table1");
Observable<ResultSetWithColumns> rx = query.rxResultSet();
List<Row> result = rx.filter(new Func1<ResultSetWithColumns, Boolean>() {
@Override
public Boolean call(ResultSetWithColumns resultSetWithColumns) {
try {
return resultSetWithColumns.getResultSet().getInt("age") > 15;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}).map(new Func1<ResultSetWithColumns, Row>() {
@Override
public Row call(ResultSetWithColumns resultSetWithColumns) {
try {
return Row.fromKeyVals("age", resultSetWithColumns.getResultSet().getInt("age"));
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}).toList().toBlocking().first();
assertEquals(result.size(), 1);
}
@Test
public void rxApiTests() {
createTable("CREATE TABLE table1 (name TEXT, age INT)");
lSql.executeRawSql("INSERT INTO table1 (name, age) VALUES ('cus1', 10)");
lSql.executeRawSql("INSERT INTO table1 (name, age) VALUES ('cus2', 20)");
RowQuery query = lSql.executeRawQuery("SELECT * FROM table1");
Observable<Row> rx = query.rx();
rx.filter(new Func1<Row, Boolean>() {
@Override
public Boolean call(Row row) {
return row.getInt("age") < 100;
}
}).subscribe(new Action1<Row>() {
@Override
public void call(Row row) {
System.out.println("row = " + row);
}
});
}
}