提交 42edd760 authored 作者: Thomas Mueller's avatar Thomas Mueller

JaQu: simplify the code a bit.

上级 4509a848
...@@ -56,12 +56,7 @@ public class Db { ...@@ -56,12 +56,7 @@ public class Db {
public Db(Connection conn) { public Db(Connection conn) {
this.conn = conn; this.conn = conn;
dialect = getDialect(conn); dialect = new DefaultSQLDialect();
}
private SQLDialect getDialect(Connection conn) {
// TODO add special cases here
return new DefaultSQLDialect();
} }
static <X> X registerToken(X x, Token token) { static <X> X registerToken(X x, Token token) {
......
...@@ -121,7 +121,7 @@ public class ModelUtils { ...@@ -121,7 +121,7 @@ public class ModelUtils {
if (SUPPORTED_TYPES.containsKey(fieldClass)) { if (SUPPORTED_TYPES.containsKey(fieldClass)) {
String type = SUPPORTED_TYPES.get(fieldClass); String type = SUPPORTED_TYPES.get(fieldClass);
if (type.equals("VARCHAR") && fieldDef.maxLength <= 0) { if (type.equals("VARCHAR") && fieldDef.maxLength <= 0) {
// Unspecified length strings are TEXT, not VARCHAR // unspecified length strings are TEXT, not VARCHAR
return "TEXT"; return "TEXT";
} }
return type; return type;
......
...@@ -54,9 +54,10 @@ public class Query<T> { ...@@ -54,9 +54,10 @@ public class Query<T> {
} }
public long selectCount() { public long selectCount() {
SQLStatement selectList = new SQLStatement(db); SQLStatement stat = getSelectStatement(false);
selectList.setSQL("COUNT(*)"); stat.appendSQL("COUNT(*) ");
ResultSet rs = prepare(selectList, false).executeQuery(); appendFromWhere(stat);
ResultSet rs = stat.executeQuery();
try { try {
rs.next(); rs.next();
long value = rs.getLong(1); long value = rs.getLong(1);
...@@ -64,7 +65,6 @@ public class Query<T> { ...@@ -64,7 +65,6 @@ public class Query<T> {
} catch (SQLException e) { } catch (SQLException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} finally { } finally {
int whyTrue;
JdbcUtils.closeSilently(rs, true); JdbcUtils.closeSilently(rs, true);
} }
} }
...@@ -88,16 +88,19 @@ public class Query<T> { ...@@ -88,16 +88,19 @@ public class Query<T> {
} }
public String getSQL() { public String getSQL() {
SQLStatement selectList = new SQLStatement(db); SQLStatement stat = getSelectStatement(false);
selectList.setSQL("*"); stat.appendSQL("*");
return prepare(selectList, false).getSQL().trim(); appendFromWhere(stat);
return stat.getSQL().trim();
} }
private List<T> select(boolean distinct) { private List<T> select(boolean distinct) {
List<T> result = Utils.newArrayList(); List<T> result = Utils.newArrayList();
TableDefinition<T> def = from.getAliasDefinition(); TableDefinition<T> def = from.getAliasDefinition();
SQLStatement selectList = def.getSelectList(db); SQLStatement stat = getSelectStatement(distinct);
ResultSet rs = prepare(selectList, distinct).executeQuery(); def.appendSelectList(stat);
appendFromWhere(stat);
ResultSet rs = stat.executeQuery();
try { try {
while (rs.next()) { while (rs.next()) {
T item = from.newObject(); T item = from.newObject();
...@@ -161,7 +164,7 @@ public class Query<T> { ...@@ -161,7 +164,7 @@ public class Query<T> {
private <X, Z> List<X> select(Z x, boolean distinct) { private <X, Z> List<X> select(Z x, boolean distinct) {
Class<?> clazz = x.getClass(); Class<?> clazz = x.getClass();
if (Utils.isSimpleType(clazz)) { if (Utils.isSimpleType(clazz)) {
return getSimple((X) x, distinct); return selectSimple((X) x, distinct);
} }
clazz = clazz.getSuperclass(); clazz = clazz.getSuperclass();
return select((Class<X>) clazz, (X) x, distinct); return select((Class<X>) clazz, (X) x, distinct);
...@@ -170,8 +173,10 @@ public class Query<T> { ...@@ -170,8 +173,10 @@ public class Query<T> {
private <X> List<X> select(Class<X> clazz, X x, boolean distinct) { private <X> List<X> select(Class<X> clazz, X x, boolean distinct) {
List<X> result = Utils.newArrayList(); List<X> result = Utils.newArrayList();
TableDefinition<X> def = db.define(clazz); TableDefinition<X> def = db.define(clazz);
SQLStatement selectList = def.getSelectList(this, x); SQLStatement stat = getSelectStatement(distinct);
ResultSet rs = prepare(selectList, distinct).executeQuery(); def.appendSelectList(stat, this, x);
appendFromWhere(stat);
ResultSet rs = stat.executeQuery();
try { try {
while (rs.next()) { while (rs.next()) {
X row = Utils.newObject(clazz); X row = Utils.newObject(clazz);
...@@ -187,10 +192,11 @@ public class Query<T> { ...@@ -187,10 +192,11 @@ public class Query<T> {
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private <X> List<X> getSimple(X x, boolean distinct) { private <X> List<X> selectSimple(X x, boolean distinct) {
SQLStatement selectList = new SQLStatement(db); SQLStatement stat = getSelectStatement(distinct);
appendSQL(selectList, x); appendSQL(stat, x);
ResultSet rs = prepare(selectList, distinct).executeQuery(); appendFromWhere(stat);
ResultSet rs = stat.executeQuery();
List<X> result = Utils.newArrayList(); List<X> result = Utils.newArrayList();
try { try {
while (rs.next()) { while (rs.next()) {
...@@ -216,6 +222,15 @@ public class Query<T> { ...@@ -216,6 +222,15 @@ public class Query<T> {
return result; return result;
} }
private SQLStatement getSelectStatement(boolean distinct) {
SQLStatement stat = new SQLStatement(db);
stat.appendSQL("SELECT ");
if (distinct) {
stat.appendSQL("DISTINCT ");
}
return stat;
}
public <A> QueryCondition<T, A> where(A x) { public <A> QueryCondition<T, A> where(A x) {
return new QueryCondition<T, A>(this, x); return new QueryCondition<T, A>(this, x);
} }
...@@ -341,16 +356,7 @@ public class Query<T> { ...@@ -341,16 +356,7 @@ public class Query<T> {
} }
} }
@SuppressWarnings("unchecked") void appendFromWhere(SQLStatement stat) {
SQLStatement prepare(SQLStatement selectList, boolean distinct) {
SQLStatement stat = selectList;
String selectSQL = stat.getSQL();
stat.setSQL("");
stat.appendSQL("SELECT ");
if (distinct) {
stat.appendSQL("DISTINCT ");
}
stat.appendSQL(selectSQL);
stat.appendSQL(" FROM "); stat.appendSQL(" FROM ");
from.appendSQL(stat); from.appendSQL(stat);
for (SelectTable join : joins) { for (SelectTable join : joins) {
...@@ -386,7 +392,6 @@ public class Query<T> { ...@@ -386,7 +392,6 @@ public class Query<T> {
db.getDialect().appendOffset(stat, offset); db.getDialect().appendOffset(stat, offset);
} }
StatementLogger.select(stat.getSQL()); StatementLogger.select(stat.getSQL());
return stat;
} }
//## Java 1.5 end ## //## Java 1.5 end ##
......
...@@ -49,9 +49,10 @@ public class QueryWhere<T> { ...@@ -49,9 +49,10 @@ public class QueryWhere<T> {
} }
public String getSQL() { public String getSQL() {
SQLStatement selectList = new SQLStatement(query.getDb()); SQLStatement stat = new SQLStatement(query.getDb());
selectList.appendSQL("*"); stat.appendSQL("SELECT *");
return query.prepare(selectList, false).getSQL().trim(); query.appendFromWhere(stat);
return stat.getSQL().trim();
} }
public <X, Z> List<X> selectDistinct(Z x) { public <X, Z> List<X> selectDistinct(Z x) {
......
...@@ -612,29 +612,25 @@ class TableDefinition<T> { ...@@ -612,29 +612,25 @@ class TableDefinition<T> {
} }
} }
SQLStatement getSelectList(Db db) { void appendSelectList(SQLStatement stat) {
SQLStatement selectList = new SQLStatement(db);
for (int i = 0; i < fields.size(); i++) { for (int i = 0; i < fields.size(); i++) {
if (i > 0) { if (i > 0) {
selectList.appendSQL(", "); stat.appendSQL(", ");
} }
FieldDefinition def = fields.get(i); FieldDefinition def = fields.get(i);
selectList.appendSQL(def.columnName); stat.appendSQL(def.columnName);
} }
return selectList;
} }
<Y, X> SQLStatement getSelectList(Query<Y> query, X x) { <Y, X> void appendSelectList(SQLStatement stat, Query<Y> query, X x) {
SQLStatement selectList = new SQLStatement(query.getDb());
for (int i = 0; i < fields.size(); i++) { for (int i = 0; i < fields.size(); i++) {
if (i > 0) { if (i > 0) {
selectList.appendSQL(", "); stat.appendSQL(", ");
} }
FieldDefinition def = fields.get(i); FieldDefinition def = fields.get(i);
Object obj = def.getValue(x); Object obj = def.getValue(x);
query.appendSQL(selectList, obj); query.appendSQL(stat, obj);
} }
return selectList;
} }
<Y, X> void copyAttributeValues(Query<Y> query, X to, X map) { <Y, X> void copyAttributeValues(Query<Y> query, X to, X map) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论