ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

SQL to AsakusaFW:ある値がMAXであるレコードの取得

2021-12-07 00:00:00 | PG(分散処理)

AsakusaFW & Tsurugi Advent Calendar 2021の7日目です。

ある値が最大であるレコードを取得するSQLは、以下のように書きます。

select * from テーブル1 t1
where カラム1 = (select MAX(カラム1) from テーブル1 t2 where t2.カラム2 = t1.カラム2)
;

これを単純にAsakusaFW化すると、サブクエリーでひとつのOperatorを作り、さらにそれと結合するCoGroup演算子なりGroupViewなりが必要となります。
が、AsakusaFWではGroupSort演算子ひとつで実現できるので、むしろSQLより簡単です。

@GroupSort
public void getMaxRecord(
  @Key(group = {"カラム2"}, order = {"カラム1 desc"} @Once Iterable<テーブル1> inList,
  Result<テーブル1> out
) {
  for (テーブル1 in : inList) {
    out.add(in);
    break;
  }
}

カラム1を降順に並べて先頭1レコードを取れば、カラム1が最大であるレコードを取得できます。
(カラム1が最大であるレコードが複数ある場合は、カラム1が先頭レコードと同一である間だけ出力するようにすればいいです)


SQL to AsakusaFW:現在日時の取得について

2021-12-06 00:00:00 | PG(分散処理)

AsakusaFW & Tsurugi Advent Calendar 2021の6日目です。

SQLでは、sysdateだのcurrent_dateだので現在日付・現在日時を取得することが出来ます。
AsakusaFWはJavaなので、Javaの日付時刻APIを使えば現在日時を取得することが出来ます。

ただし、RDBMSによっては、時刻はトランザクション内で変わらないことがあります。
これをAsakusaFWで実現するためには、日時はAsakusaFWの外で取得して、バッチ引数で渡すようにするとよいと思います。

日付の使い道によっては、日付と比較してレコードを選択したりすることもあると思いますが、その場合は特に、バッチ引数で日付を渡すようにしておくと、過去日付でテストを実施しても同じ結果になるので便利です。


SQL to AsakusaFW:UPDATE その2

2021-12-05 00:00:00 | PG(分散処理)

AsakusaFW & Tsurugi Advent Calendar 2021の5日目です。

2019年のAsakusa Frameworkアドベントカレンダーの5日目で、SQLのUPDATE文を実現するのはUpdate演算子で出来ると書きました。
大抵のケースではそれで問題ないのですが、実はそれでは無理なケースがあります。

update テーブル set c1 = c2, c2 = c1;
のように、値を入れ替えるようなパターンです。
これをUpdate演算子で何も考えずに移植すると、以下のようになって、正しい結果が得られません。

@Update
public void update(テーブル in) {
  in.setC1Option(in.getC2Option());
  in.setC2Option(in.getC1Option()); // 更新された値を使ってしまう!
}

Update演算子でやるなら、一時変数に値を保存しておいて…みたいなコーディングをする必要があります。

この場合、Convert演算子を使えば素直に書けます。

@Convert
public テーブル update(テーブル in) {
  テーブル result = ~;
  result.copyFrom(in);
  result.setC1Option(in.getC2Option());
  result.setC2Option(in.getC1Option());
  return result;
}


SQL to AsakusaFW:COUNT(*) > 0

2021-12-04 21:55:45 | PG(分散処理)

AsakusaFW & Tsurugi Advent Calendar 2021の4日目です。

SQLをAsakusaFWに置き換えるときに困ることのひとつが、集約関数COUNTです。
SQLでは対象が無いときはCOUNTは0という値になります(そういう1レコードが返ります)が、AsakusaFWではそもそもレコードが無くなってしまう(何も返ってこない)からです。

ただ、SQLでCOUNT(*) > 0という条件で判定しているものについては、EXISTSに置き換えることができ、これはAsakusaFWではMasterCheck演算子に相当するので、実現可能です。


Tsurugiのググり方

2021-12-03 00:00:00 | PG(RDBMS)

AsakusaFW & Tsurugi Advent Calendar 2021の3日目です。

今日はTsurugiについてです。
まずは、RDBMSのTsurugiとは何か?を語っておくべきだと思うのですが、現在鋭意開発中のRDBMSであって自分は語れるほど詳しくはないので、割愛します(爆)

ただ、真っ先に言っておくべきことは、「Tsurugi」で検索すると色々なものが引っかかるので、検索キーワードとしては「TsurugiDB」とするのが良いのではないか、ということです。
自分はTwitter等のハッシュタグには #TsurugiDB(#tsurugidb)を使っています。