Closed nakamura-to closed 7 years ago
明けましておめでとうございます。
面白い機能ですね。 ちょっと冗長にはなりますが、なんとなく下記のように使ってみたい欲望にかられました。
@Dao(config = AppConfig.class)
public interface MyDao {
@HandleSql
String getSelectSql(LocalDateTime startAt, LocalDateTime endAt, BiFunction<Config, Sql, String> handler);
}
@Dao(config = AppConfig.class)
public interface UnloadDao {
@HandleSql
void unload(String innerSql, S3BucketPath s3bucket, CustomAWSCredentials credentials, BiFunction<Config, Sql, Void> handler);
}
UnloadDao/unload.sql
UNLOAD
( /*^ innerSql */'select hoge from xx' )
to
/*^ s3bucket.buildPath() */'xxx'
credentials
/*^ String.format("aws_access_key_id=%s;aws_secret_access_key=%s",
credenials.getAccessKey(),
credenials.getSercretKey()) */'aws_access_key_id=xx;aws_secret_access_key=xx'
parallel off
汎用ハンドラ
public class Handlers {
public static String getRowSql(Config config, Sql sql) {
return sql.getRawSql();
}
public static void execute(Config config, Sql sql) {
DataSource dataSource = config.getDataSource();
Connection connection = dataSource.getConnection();
PreparedStatement ps = connection.preparedStatement(sql.getRawSql());
ps.executeUpdate();
}
}
利用するコード
S3BucketPath s3bucket = ...
CustomAWSCredentials credenials = ...
MyDao dao = ...
UnloadDao unloadDao = ...
unloadDao.unload(
dao.getSelectSql(startAt, endAt, Handlers::getRowSql), s3bucket, credenials, Handlers::execute);
また任意の場所でログ出力等、いろいろできそうですね。
なるほど。組み立てたSQLをパラメータで渡して、さらに別のSQLを組み立てるということですか。確かにそういう使い方もできますね。
例えばAmazon RedshiftのUNLOADコマンドのselect-statement部分をDomaのSQLテンプレートで表現し、UNLOADコマンドを実行したい。
https://gist.github.com/newta/03584d39116a362efde0d72ee83e68f1 のコードと同等のことを実現する場合は、次のようにすれば良いと思われる。
@ HandleSql
アノテーションをDomaで新規に実装し、組み立てたSQLをアプリで受け取って任意に利用できるようにする。SQLファイルは次のようなものを用意する。
利用するコードは次のようなものになる。
上のコードは冗長だが
UnloadCommnad
のようなクラスをアプリで用意してもらえれば簡潔に書ける。