Class AbstractSqlMacro

java.lang.Object
jp.ecuacion.util.jpa.dao.sqlmacro.AbstractSqlMacro
Direct Known Subclasses:
SqlMacroComment, SqlMacroEmpty, SqlMacroEmptyColsAndPairs, SqlMacroIn, SqlMacroInCols, SqlMacroInsertAll, SqlMacroLikeEmpty, SqlMacroNull, SqlMacroOrderBy, SqlMacroPsqlLimit, SqlMacroPsqlOffset

public abstract class AbstractSqlMacro extends Object
{+xxx ~ } というひとつのマクロを含む文字列とパラメータを受け取り、それをもとにマクロ処理をした結果を返すオブジェクト。
言葉の表現ではわかりにくいので、具体例で詳しく説明する。(説明を書いておかないと、自分でもわからなくなる・・・)
 select * from testtable where {+in col1 in ? and} {+null col2 = ? and} col3 = 'a'
 
 というマクロを含んだSQLがあるものとする。
 1つめの?部分の引数は、new List<Object>形式で「"a", "b", "c"」の3つとが入っていて、
 2つめの?部分の引数は「"x"」だとする。
 adaptSqlMacroメソッドの処理として、マクロを一つずつ処理していくわけだが、前半のinマクロ部分で見ておく。
 このとき、マクロにはSqlMacroInputとして、以下の値が渡される。
 1.(String)   sqlId: エラーメッセージ出力用
 2.(String)   macroPartSql: "{+in col1 in ? and}"
 3.(Object[]) params: new Object[] {arr, "x"}
   ※arrは、以下を実施したもの:arr = new ArrayList<Object>(); arr.add("a"); arr.add("b"); arr.add("c");
 4.(int)      numOfQuestionMarksPassed: 0
   ※この処理の前までに処理した?の数を持つ。2つ目のnullマクロの処理をする場合は、既にinマクロでの?を処理済みなので、この値は1となる
 5.(Map<String, String>) macroParamMap: null
   ※{+xxx[param1=val1,param2=val2] ... } のようにマクロにパラメータがつく場合に、
   それをAbstactSqlMacroクラスのexecuteの中で読み取り個別macroに渡す。
  
 これに対して、inマクロで処理を実行した結果は以下のように返す
 
 1.macroAdaptedSql:       "col1 in (?, ?, ?) and"
 2.macroAdaptedParamList: "a", "b", "c" の3つが格納されたList<Object>
 
 それを受け取るAbstractDao側では、既に全体として積み上げているmacroAdaptedSql, macroAdaptedParamListが
 あるので、そこに追加する。
 ただし、1.については、macroを展開した結果、さらにマクロが記載されている場合も想定し、「macro適用後のsql」ではなく、「macro適用前のsql」に
 追加し、再度マクロがないかどうかの判断が入るようにする。
 
 
  • Constructor Details

    • AbstractSqlMacro

      public AbstractSqlMacro()
  • Method Details

    • adaptSqlMacro

      protected abstract OutputOfSqlMacro adaptSqlMacro(InputOfSqlMacro input) throws jp.ecuacion.lib.core.exception.checked.BizLogicAppException
      各マクロでの個別処理を実施。
      Throws:
      jp.ecuacion.lib.core.exception.checked.BizLogicAppException
    • getDefinedMacroParamMap

      protected abstract Map<String,Boolean> getDefinedMacroParamMap()
      マクロに必要なパラメータ情報を設定。 Stringにはパラメータ名を、booleanは、必須→true, 任意→false。
    • execute

      public OutputOfSqlMacro execute(InputOfSqlMacro input) throws jp.ecuacion.lib.core.exception.checked.BizLogicAppException
      マクロ処理したい側(AbstractDao)から呼び出される。
      Throws:
      jp.ecuacion.lib.core.exception.checked.BizLogicAppException
    • removeOutsideMacroStrFromMacroPartSql

      protected String removeOutsideMacroStrFromMacroPartSql(String macroPartSql, String macroName)
      {+xxx yyy }となっているmacroAdaptedSqlから、"{+xxx "と"{"を取り除く。
      名前に"Outside"が入っているのは、マクロが2重になっている場合"{+aaa bbb {+ccc ddd } eee}"は、 外側の"{+aaa "と"}"のみを取り除き、内側のマクロはそのままにしておく処理とする予定のため。
      パラメータがある場合は、それ毎除去する。例:"{+xxx[key=val] yyy}" -> "yyy"が残る
      パラメータがある場合で、閉じかっこ"]"の次の文字が空欄の場合はその空欄も削除 macroAdaptSqlの形式が正しくないパターンは、これを使用するまでにチェックされているので、フォーマットは正しい前提とする
    • doesSqlParamHaveListWithEffectiveValues

      protected boolean doesSqlParamHaveListWithEffectiveValues(Object paramObj, String sqlId, String macroPartSql, SkipPatternEnum[] skipPtn) throws jp.ecuacion.lib.core.exception.checked.BizLogicAppException
      0個のリスト、リストがnullなど、実質sqlマクロに展開されないようなsqlマクロの場合はfalseを返す。 List<Object[]>とかになると、チェックが複数あるのと、割とパターン化されているため共通化してみた。
      Throws:
      jp.ecuacion.lib.core.exception.checked.BizLogicAppException
    • doesSqlParamhaveObjectArrayWithEffectiveValuesInsideList

      protected boolean doesSqlParamhaveObjectArrayWithEffectiveValuesInsideList(Object paramObj, String sqlId, String macroPartSql, SkipPatternEnum[] skipPtn, Integer numOfdataInOneDataPair) throws jp.ecuacion.lib.core.exception.checked.BizLogicAppException
      Throws:
      jp.ecuacion.lib.core.exception.checked.BizLogicAppException
    • hasEffectiveVal

      protected boolean hasEffectiveVal(Set<SkipPatternEnum> skipPtnSet, Object obj)
      objectがeffectiveな値=skipしない値を持っているかを確認する処理。