GAE/J JDO Query 流れるインターフェース Typesafe

GAE/Jの場合、結合はすべて ANDなので、Filterの自動作成がやり易い。

下記 Utilityを作成した。

これを使うと、

query.setFilter( ( new QueryFilter( ) ).sEq("delete", "N").toString());

と書ける。(勿論流れる インターフェスなので複数連続できる)

このままでは typesafeにならないし、あえてMETA Classに定義するのは
面倒なので、entity Classに下記定義を行う。

static public final String C_delete = "delete";

これにより、上記は、次の様に書ける。

query.setFilter ( ( new QueryFilter( )).sEq(Table.C_delete, "N").toString());


これも、いちいち手作業で間違えたら元も子もないし、EclipseのPluginを作る
程でもないので、下記 GenerateEntityConstant Classを作ったので、

mainから呼び出して、ConsoleにPrintして コピペで OK.

これで使い易くなった。

public class QueryFilter {
private StringBuffer fstring = new StringBuffer();

public QueryFilter eq(String element, Object value) {
checkAnd();
fstring.append(element +" == "+value);
return this;
}

public QueryFilter sEq(String element, String value) {
checkAnd();
fstring.append(element +" == '"+value+"'");
return this;
}

public QueryFilter ge(String element, Object value) {
checkAnd();
fstring.append(element +" >= "+value);
return this;
}

public QueryFilter sGe(String element, String value) {
checkAnd();
fstring.append(element +" >= '"+value+"'");
return this;
}

public QueryFilter gr(String element, Object value) {
checkAnd();
fstring.append(element +" > "+value);
return this;
}

public QueryFilter sGr(String element, String value) {
checkAnd();
fstring.append(element +" > '"+value+"'");
return this;
}
public QueryFilter le(String element, Object value) {
checkAnd();
fstring.append(element +" <= "+value);
return this;
}

public QueryFilter sLe(String element, String value) {
checkAnd();
fstring.append(element +" <= '"+value+"'");
return this;
}

public QueryFilter between(String element, Object from, Object to) {
checkAnd();
fstring.append(element +" >= "+from + " && "+element + " <= " +to);
return this;
}

public QueryFilter sBetween(String element, Object from, Object to) {
checkAnd();
fstring.append(element +" >= '"+from + "' && "+element + " <= '" +to+"'");
return this;
}

public QueryFilter lt(String element, Object value) {
checkAnd();
fstring.append(element +" < "+value);
return this;
}

public QueryFilter sLt(String element, String value) {
checkAnd();
fstring.append(element +" < '"+value+"'");
return this;
}

public QueryFilter startWith(String element, String value) {
checkAnd();
char c = 255;
fstring.append(element +" >= '"+value+"' && "+element +" <= '"+value+Character.toString(c)+"'");
return this;
}

public String toString(){
return fstring.toString();
}
private void checkAnd() {
if (fstring.length() > 0) {
fstring.append(" && ");
}
}

}

public static void main(String[] args) {
System.out.print(GenerateEntityConstant.getGenerateProgram(Table.class));

}

public class GenerateEntityConstant {

static public String getGenerateProgram(Class clazz){
StringBuffer sb = new StringBuffer();
try {
BeanInfo info = Introspector.getBeanInfo(clazz, Object.class);
PropertyDescriptor[] pds= info.getPropertyDescriptors();
for (PropertyDescriptor pdone : pds) {
String name = pdone.getName();
sb.append("static public final String C_"+name+" = \""+name+"\";\n");
}
} catch (IntrospectionException e) {

e.printStackTrace();
}
return sb.toString();
}

}