java.lang.Object
jp.ecuacion.util.jpa.dao.sqlmacro.AbstractSqlMacro
- Direct Known Subclasses:
SqlMacroComment,SqlMacroEmpty,SqlMacroEmptyColsAndPairs,SqlMacroIn,SqlMacroInCols,SqlMacroInsertAll,SqlMacroLikeEmpty,SqlMacroNull,SqlMacroOrderBy,SqlMacroPsqlLimit,SqlMacroPsqlOffset
{+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 Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected abstract OutputOfSqlMacroadaptSqlMacro(InputOfSqlMacro input) 各マクロでの個別処理を実施。protected booleandoesSqlParamHaveListWithEffectiveValues(Object paramObj, String sqlId, String macroPartSql, SkipPatternEnum[] skipPtn) 0個のリスト、リストがnullなど、実質sqlマクロに展開されないようなsqlマクロの場合はfalseを返す。protected booleandoesSqlParamhaveObjectArrayWithEffectiveValuesInsideList(Object paramObj, String sqlId, String macroPartSql, SkipPatternEnum[] skipPtn, Integer numOfdataInOneDataPair) execute(InputOfSqlMacro input) マクロ処理したい側(AbstractDao)から呼び出される。マクロに必要なパラメータ情報を設定。protected booleanhasEffectiveVal(Set<SkipPatternEnum> skipPtnSet, Object obj) objectがeffectiveな値=skipしない値を持っているかを確認する処理。protected StringremoveOutsideMacroStrFromMacroPartSql(String macroPartSql, String macroName) {+xxx yyy }となっているmacroAdaptedSqlから、"{+xxx "と"{"を取り除く。
-
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
マクロに必要なパラメータ情報を設定。 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
{+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
objectがeffectiveな値=skipしない値を持っているかを確認する処理。
-