/** * Shorthand of sequence() that returns an fj.data.List */ public static <A> DB<fj.data.List<A>> sequence(Iterable<DB<A>> xs) { return sequence(xs, fjListCanBuildFrom()); }
public BatchDeleteOptimized(String tableName, List<String> whereColumns, Iterable<A> xs, Try3<Integer, PreparedStatement, A, Integer, SQLException> binder, int batchSize) { int whereColumnsLength = whereColumns.size(); op = DbOps.toChunks(xs, ys -> { String colsSegment = "(" + StringUtil.join(whereColumns, ", ") + ")"; String sql = MessageFormat.format(SQL_TEMPLATE, tableName, colsSegment, SqlStringUtils.placeholderRows(Collections.size(xs), whereColumnsLength)); TryEffect1<PreparedStatement, SQLException> populatedBinder = iterableBinder(binder, xs); return new DB<Integer>() { @Override public Integer run(Connection c) throws SQLException { try (PreparedStatement ps = c.prepareStatement(sql)) { populatedBinder.f(ps); return ps.executeUpdate(); } } }; }, batchSize); }
private static DB<Option<String>> selectByUniqueDescOp(String desc) { return DbOps.unique(new SelectOp.FjList<>("SELECT * FROM MySqlTest_DATA WHERE DESCRIPTION=?", (preparedStatement) -> preparedStatement.setString(1, desc), resultSet -> resultSet.getString(2))); }
@After public void cleanup() { SyncDbInterpreter dbi = new SyncDbInterpreter( () -> DriverManager.getConnection("jdbc:hsqldb:mem:DescribeVsInterpret", "sa", "") ); DB<List<String>> selectAllTables = new SelectOp.FjList<>( "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='DescribeVsInterpret'", NO_BINDER, rs -> rs.getString(1) ); DB<Unit> dropAllTables = selectAllTables .bind(tables -> sequence(tables.map(tableName -> new UpdateOp(format("DROP TABLE {0}", tableName), NO_BINDER)), fjListCanBuildFrom())) .map(ignore -> Unit.unit()); dbi.submit(dropAllTables); } }
public static DB<Option<Stuff>> selectByKey(int id) { //given a regular operation which returns an iterable: DB<List<Stuff>> temp = new SelectOp.FjList<>( "SELECT ID, DESCRIPTION FROM STUFF WHERE ID=?", ps -> ps.setInt(1, id), rs -> new Stuff(rs.getInt(1), rs.getString(2))); // using the unique() function, // we can convert it to an operation which expects at most one result, and returns that optional result: return unique(temp); }
@Test public void chunkEmptyIterable() throws SQLException { DB<Integer> db = DbOps.toChunks(List.<Integer>list(), xs -> { throw new RuntimeException(); }, 10); Integer result = db.run(null); assertThat(result, is(0)); }
@Test public void testIt() { SyncDbInterpreter dbi = new SyncDbInterpreter( () -> DriverManager.getConnection("jdbc:hsqldb:mem:test", "sa", "") ); //given an iterable of DB's List<DB<String>> dbList = arrayList( DB.unit("foo"), DB.unit("bar"), DB.unit("baz") ); //we can treat it as a DB<List> DB<List<String>> db = sequence(dbList); List<String> result = dbi.submit(db); assertThat(result, is(arrayList("foo", "bar", "baz"))); } }
private static DB<Option<User>> selectUser(String email) { return unique(new SelectOp.FjList<>( "SELECT * FROM USERS WHERE EMAIL=?", ps -> ps.setString(1, email), rs -> new User(rs.getString(1), rs.getString(2)) )); }
@Test(expected = RuntimeException.class) public void toChunksLabdaThrows() throws SQLException { fj.control.db.DB<Integer> db = DbOps.toChunks(list(1, 2, 3), x -> { throw new RuntimeException(); }, 2).bind(x -> fj.control.db.DB.unit(3)); db.run(null); }
@BeforeClass public static void setupSuite() { fj.control.db.DB<Unit> createSchema = sequence( arrayList(new EffectOp("CREATE TABLE MySqlTest_IDS (ID INTEGER PRIMARY KEY IDENTITY, DUMMY CHAR)"), new EffectOp("CREATE TABLE MySqlTest_DATA (ID INTEGER PRIMARY KEY, DESCRIPTION VARCHAR(100))"), new EffectOp("CREATE TABLE MySqlTest_EXPIRING_STUFF (ID INTEGER PRIMARY KEY IDENTITY," + " DESCRIPTION VARCHAR(100), STAMP BIGINT)"), new EffectOp("CREATE TABLE MySqlTest_FOO (X VARCHAR (100), Y VARCHAR(100))") )).map(ignore -> Unit.unit()); DB.transact(createSchema); }
@Test public void insertGenKeys() { Integer id = DB.transact(new InsertGenKeysOp.Int( "INSERT INTO MySqlTest_IDS(DUMMY) VALUES (?)", ps -> ps.setString(1, "a"))); assertThat(id, is(notNullValue())); String str = DB.submit(DbOps .unique(new SelectOp.List<>("SELECT DUMMY FROM MySqlTest_IDS WHERE ID=?", ps -> ps.setInt(1, id), rs -> rs.getString(1)))).some(); assertThat(str, is("a")); }
@Test public void dbSequence() { DB.transact(insertDataOp(arrayList(p(1, "foo"), p(2, "bar"), p(3, "zzz")))); List<DB<Option<String>>> dbs = arrayList(selectByUniqueDescOp("foo"), selectByUniqueDescOp("zzz"), selectByUniqueDescOp("no_such")); List<Option<String>> result = DB.submit(sequence(dbs, fjListCanBuildFrom())); assertThat(result, is(arrayList(some("foo"), some("zzz"), none()))); }
@Test public void nextValFromSequence() { DB.submit(new EffectOp("CREATE SEQUENCE MY_SEQ START WITH 1 MINVALUE 1")); final Option<Long> firstValFromSeqOp = DB.submit(unique(new SelectOp.FjList<>("call NEXT VALUE FOR MY_SEQ", NO_BINDER, rs -> rs.getLong(1)))); assertThat(firstValFromSeqOp.some(), is(1L)); final Option<Long> secondsValFromSeqOp = DB.submit(unique(new SelectOp.FjList<>("call NEXT VALUE FOR MY_SEQ", NO_BINDER, rs -> rs.getLong(1)))); assertThat(secondsValFromSeqOp.some(), is(2L)); }