続)生成除外指定の例外指定
除外テーブルで指定したパターンの一部を除外しない。 - mokkouyou2001の日記
の続き
生成除外指定のうち、特定テーブルだけは生成させたい。
と思ったのでdbfluteに手を入れてみた。
ちなみに、ついでに正規表現指定も出来るようにしよう!ということで、
正規表現だけ入れてみる。
他と同じように、テーブル名は小文字で評価するが、
正規表現は、\d、\Dを区別するために、小文字化しない。
CASE_INSENSITIVE指定もよいけど・・・
場合によりけりなのでやめておく。
そういった場合、
指定時に埋め込みフラグ表現で対応する。
regexp:(?i:^L.*)
こんな感じ。
を想定。
テストはばっちり。さて実行・・・
なんか、実際に正規表現を指定すると、たいがいの場合において
java.lang.IllegalStateException: Final remainderString must be empty string:
となる。
正規表現と、・・・??
list:{}とかは何記法なんだろ?
なんとなく使っているけど・・・
まぁいいや。
とりあえず、記述に関しては色々相性が悪いようだ・・・
public static final String REGEXP_MARK = "regexp:"; public static boolean isHitByTheHint(String name, String hint) { final String prefixMark = PREFIX_MARK; final String suffixMark = SUFFIX_MARK; final String containMark = CONTAIN_MARK; //add start 正規表現 final String regexpMark = REGEXP_MARK; //add end 正規表現 if (hint.toLowerCase().startsWith(prefixMark.toLowerCase())) { final String pureHint = hint.substring(prefixMark.length(), hint.length()); if (name.toLowerCase().startsWith(pureHint.toLowerCase())) { return true; } } else if (hint.toLowerCase().startsWith(suffixMark.toLowerCase())) { final String pureHint = hint.substring(suffixMark.length(), hint.length()); if (name.toLowerCase().endsWith(pureHint.toLowerCase())) { return true; } } else if (hint.toLowerCase().startsWith(containMark.toLowerCase())) { final String pureHint = hint.substring(containMark.length(), hint.length()); if (name.toLowerCase().contains(pureHint.toLowerCase())) { return true; } //add start 正規表現 } else if(hint.toLowerCase().startsWith(regexpMark.toLowerCase())) { final String pureHint = hint.substring(regexpMark.length(), hint.length()); //正規表現は、小文字化しない。定義済み文字クラスとの兼ね合い。 return name.toLowerCase().matches(pureHint); //add end 正規表現 } else { if (name.equalsIgnoreCase(hint)) { return true; } } return false; }
除外の除外
さてさて気を取り直して。
やりたいことを整理するとこんな感じ
A={torque.table.target.listによる(except以外の)指定}
B={torque.table.target.listによるexcept指定}
C={torque.table.except.listによる(except以外の)指定}
D={torque.table.except.listによるexcept指定}
また、targetを指定した場合、exceptは評価されなかったのも対応。
結果=(A-B)-(C-D)
のようなイメージの集合演算
注意点・・・
Dに一致するからといって、A-Bに含まれない場合、Dは含まれない。
A-B-C+Dという展開は出来ないので注意
package org.seasar.dbflute.util; import java.util.Iterator; import java.util.List; import java.util.regex.Pattern; /** * @author jflute */ public class DfNameHintUtil { public static final String PREFIX_MARK = "prefix:"; public static final String SUFFIX_MARK = "suffix:"; public static final String CONTAIN_MARK = "contain:"; public static final String EXCEPT_PREFIX_MARK = "except_prefix:"; public static final String EXCEPT_SUFFIX_MARK = "except_suffix:"; public static final String EXCEPT_CONTAIN_MARK = "except_contain:"; public static final String EXCEPT_FULL_MATCH_MARK = "except:"; public static boolean isExceptByHint(final String name, final List<String> targetList, final List<String> exceptList) { //除外リストに合致か? boolean isExceptListMatch = false; //except_keyword(一部例外)での除外か? boolean isExceptListExceptMatch = false; //先に除外リストを精査する。 for (final Iterator<String> ite = exceptList.iterator(); ite.hasNext();) { final String tableHint = (String) ite.next(); if (isHitByTheHint(name, tableHint)) { //除外指定に合致 isExceptListMatch = true; } else if(isHitByTheExceptHint(name, tableHint)) { //一部例外に合致 isExceptListExceptMatch = true; } } //除外で指定された条件に合致し、かつ一部例外指定されていない場合 if(isExceptListMatch && !isExceptListExceptMatch) { //除外対象 return true; } //対象リストに合致か? boolean isTargetListMatch = false; boolean isTargetListExceptMatch = false; if (!targetList.isEmpty()) { for (final Iterator<String> ite = targetList.iterator(); ite.hasNext();) { final String targetTableHint = (String) ite.next(); if (isHitByTheHint(name, targetTableHint)) { //対象リストに合致 isTargetListMatch = true; } else if(isHitByTheExceptHint(name, targetTableHint)) { //一部例外に合致 isTargetListExceptMatch = true; } } } else { //全nameが対象となる。 isTargetListMatch = true; } if(isTargetListMatch && !isTargetListExceptMatch) { return false; } return true; } public static boolean isHitByTheHint(String name, String hint) { final String prefixMark = PREFIX_MARK; final String suffixMark = SUFFIX_MARK; final String containMark = CONTAIN_MARK; if (hint.toLowerCase().startsWith(prefixMark.toLowerCase())) { final String pureHint = hint.substring(prefixMark.length(), hint.length()); if (name.toLowerCase().startsWith(pureHint.toLowerCase())) { return true; } } else if (hint.toLowerCase().startsWith(suffixMark.toLowerCase())) { final String pureHint = hint.substring(suffixMark.length(), hint.length()); if (name.toLowerCase().endsWith(pureHint.toLowerCase())) { return true; } } else if (hint.toLowerCase().startsWith(containMark.toLowerCase())) { final String pureHint = hint.substring(containMark.length(), hint.length()); if (name.toLowerCase().contains(pureHint.toLowerCase())) { return true; } } else { if (name.equalsIgnoreCase(hint)) { return true; } } return false; } //add start /** * 除外の指定に該当した場合、<code>true</code>を返す。 * @param name 検査対象名 * @param hint 条件文字列 * @return 除外の指定に該当した場合、<code>true</code>を返す */ public static boolean isHitByTheExceptHint(String name, String hint) { final String exceptPrefixMark = EXCEPT_PREFIX_MARK; final String exceptSuffixMark = EXCEPT_SUFFIX_MARK; final String exceptContainMark = EXCEPT_CONTAIN_MARK; final String exceptMark = EXCEPT_FULL_MATCH_MARK; if (hint.toLowerCase().startsWith(exceptPrefixMark.toLowerCase())) { final String pureHint = hint.substring(exceptPrefixMark.length(), hint.length()); if (name.toLowerCase().startsWith(pureHint.toLowerCase())) { return true; } } else if (hint.toLowerCase().startsWith(exceptSuffixMark.toLowerCase())) { final String pureHint = hint.substring(exceptSuffixMark.length(), hint.length()); if (name.toLowerCase().endsWith(pureHint.toLowerCase())) { return true; } } else if (hint.toLowerCase().startsWith(exceptContainMark.toLowerCase())) { final String pureHint = hint.substring(exceptContainMark.length(), hint.length()); if (name.toLowerCase().contains(pureHint.toLowerCase())) { return true; } } else if(hint.toLowerCase().startsWith(exceptMark.toLowerCase())) { final String pureHint = hint.substring(exceptMark.length(), hint.length()); if (name.equalsIgnoreCase(pureHint)) { return true; } } return false; } //add end }
単体も一応作ったけど、乗っけるのもあれなんで・・・
まぁこの辺をいじればこういうことも出来るよ。
といったちょっとした話でした。