This commit is contained in:
kamhung
2015-12-02 11:51:46 +08:00
parent 1b5358a2a7
commit 323ce78a05
5 changed files with 493 additions and 132 deletions

View File

@@ -0,0 +1,338 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.wentch.redkale.service;
import com.wentch.redkale.source.*;
import com.wentch.redkale.util.*;
import java.io.*;
import java.util.*;
import javax.annotation.*;
/**
*
* @author zhangjx
*/
public class DataSourceService implements DataSource, Service {
@Resource(name = "$")
private DataSource source;
@Override
public DataConnection createReadConnection() {
return source.createReadConnection();
}
@Override
public DataConnection createWriteConnection() {
return source.createWriteConnection();
}
@Override
public <T> void insert(T... values) {
source.insert(values);
}
@Override
public <T> void insert(DataConnection conn, T... values) {
source.insert(conn, values);
}
@Override
public <T> void refreshCache(Class<T> clazz) {
source.refreshCache(clazz);
}
@Override
public <T> void delete(T... values) {
source.delete(values);
}
@Override
public <T> void delete(DataConnection conn, T... values) {
source.delete(conn, values);
}
@Override
public <T> void delete(Class<T> clazz, Serializable... ids) {
source.delete(clazz, ids);
}
@Override
public <T> void delete(DataConnection conn, Class<T> clazz, Serializable... ids) {
source.delete(conn, clazz, ids);
}
@Override
public <T> void delete(Class<T> clazz, FilterNode node) {
source.delete(clazz, node);
}
@Override
public <T> void delete(DataConnection conn, Class<T> clazz, FilterNode node) {
source.delete(conn, clazz, node);
}
@Override
public <T> void update(T... values) {
source.update(values);
}
@Override
public <T> void update(DataConnection conn, T... values) {
source.update(conn, values);
}
@Override
public <T> void updateColumn(Class<T> clazz, Serializable id, String column, Serializable value) {
source.updateColumn(clazz, id, column, value);
}
@Override
public <T> void updateColumn(DataConnection conn, Class<T> clazz, Serializable id, String column, Serializable value) {
source.updateColumn(conn, clazz, id, column, value);
}
@Override
public <T> void updateColumns(T value, String... columns) {
source.updateColumns(value, columns);
}
@Override
public <T> void updateColumns(DataConnection conn, T value, String... columns) {
source.updateColumns(conn, value, columns);
}
@Override
public <T> void updateColumnIncrement(Class<T> clazz, Serializable id, String column, long incvalue) {
source.updateColumnIncrement(clazz, id, column, incvalue);
}
@Override
public <T> void updateColumnIncrement(DataConnection conn, Class<T> clazz, Serializable id, String column, long incvalue) {
source.updateColumnIncrement(conn, clazz, id, column, incvalue);
}
@Override
public <T> void updateColumnAnd(Class<T> clazz, Serializable id, String column, long incvalue) {
source.updateColumnAnd(clazz, id, column, incvalue);
}
@Override
public <T> void updateColumnAnd(DataConnection conn, Class<T> clazz, Serializable id, String column, long incvalue) {
source.updateColumnAnd(conn, clazz, id, column, incvalue);
}
@Override
public <T> void updateColumnOr(Class<T> clazz, Serializable id, String column, long incvalue) {
source.updateColumnOr(clazz, id, column, incvalue);
}
@Override
public <T> void updateColumnOr(DataConnection conn, Class<T> clazz, Serializable id, String column, long incvalue) {
source.updateColumnOr(conn, clazz, id, column, incvalue);
}
@Override
public Number getNumberResult(Class entityClass, Reckon reckon, String column) {
return source.getNumberResult(entityClass, reckon, column);
}
@Override
public Number getNumberResult(Class entityClass, Reckon reckon, String column, FilterBean bean) {
return source.getNumberResult(entityClass, reckon, column, bean);
}
@Override
public Number getNumberResult(Class entityClass, Reckon reckon, String column, FilterNode node) {
return source.getNumberResult(entityClass, reckon, column, node);
}
@Override
public <K extends Serializable, V extends Number> Map<K, V> getMapResult(Class entityClass, String keyColumn, Reckon reckon, String reckonColumn) {
return source.getMapResult(entityClass, keyColumn, reckon, reckonColumn);
}
@Override
public <K extends Serializable, V extends Number> Map<K, V> getMapResult(Class entityClass, String keyColumn, Reckon reckon, String reckonColumn, FilterBean bean) {
return source.getMapResult(entityClass, keyColumn, reckon, reckonColumn, bean);
}
@Override
public <K extends Serializable, V extends Number> Map<K, V> getMapResult(Class entityClass, String keyColumn, Reckon reckon, String reckonColumn, FilterNode node) {
return source.getMapResult(entityClass, keyColumn, reckon, reckonColumn, node);
}
@Override
public <T> T find(Class<T> clazz, Serializable pk) {
return source.find(clazz, pk);
}
@Override
public <T> T find(Class<T> clazz, SelectColumn selects, Serializable pk) {
return source.find(clazz, selects, pk);
}
@Override
public <T> T findByColumn(Class<T> clazz, String column, Serializable key) {
return source.findByColumn(clazz, column, key);
}
@Override
public <T> T find(Class<T> clazz, FilterNode node) {
return source.find(clazz, node);
}
@Override
public <T> T find(Class<T> clazz, FilterBean bean) {
return source.find(clazz, bean);
}
@Override
public <T> boolean exists(Class<T> clazz, Serializable pk) {
return source.exists(clazz, pk);
}
@Override
public <T> boolean exists(Class<T> clazz, FilterNode node) {
return source.exists(clazz, node);
}
@Override
public <T> boolean exists(Class<T> clazz, FilterBean bean) {
return source.exists(clazz, bean);
}
@Override
public <T, V> HashSet<V> queryColumnSet(String selectedColumn, Class<T> clazz, String column, Serializable key) {
return source.queryColumnSet(selectedColumn, clazz, column, key);
}
@Override
public <T, V> HashSet<V> queryColumnSet(String selectedColumn, Class<T> clazz, FilterNode node) {
return source.queryColumnSet(selectedColumn, clazz, node);
}
@Override
public <T, V> HashSet<V> queryColumnSet(String selectedColumn, Class<T> clazz, FilterBean bean) {
return source.queryColumnSet(selectedColumn, clazz, bean);
}
@Override
public <T, V> List<V> queryColumnList(String selectedColumn, Class<T> clazz, String column, Serializable key) {
return source.queryColumnList(selectedColumn, clazz, column, key);
}
@Override
public <T, V> List<V> queryColumnList(String selectedColumn, Class<T> clazz, FilterNode node) {
return source.queryColumnList(selectedColumn, clazz, node);
}
@Override
public <T, V> List<V> queryColumnList(String selectedColumn, Class<T> clazz, FilterBean bean) {
return source.queryColumnList(selectedColumn, clazz, bean);
}
@Override
public <K extends Serializable, T> Map<K, T> queryMap(Class<T> clazz, FilterNode node) {
return source.queryMap(clazz, node);
}
@Override
public <K extends Serializable, T> Map<K, T> queryMap(Class<T> clazz, FilterBean bean) {
return source.queryMap(clazz, bean);
}
@Override
public <K extends Serializable, T> Map<K, T> queryMap(Class<T> clazz, SelectColumn selects, FilterNode node) {
return source.queryMap(clazz, selects, node);
}
@Override
public <K extends Serializable, T> Map<K, T> queryMap(Class<T> clazz, SelectColumn selects, FilterBean bean) {
return source.queryMap(clazz, selects, bean);
}
@Override
public <T> List<T> queryList(Class<T> clazz, String column, Serializable key) {
return source.queryList(clazz, column, key);
}
@Override
public <T> List<T> queryList(Class<T> clazz, FilterNode node) {
return source.queryList(clazz, node);
}
@Override
public <T> List<T> queryList(Class<T> clazz, FilterBean bean) {
return source.queryList(clazz, bean);
}
@Override
public <T> List<T> queryList(Class<T> clazz, SelectColumn selects, FilterNode node) {
return source.queryList(clazz, selects, node);
}
@Override
public <T> List<T> queryList(Class<T> clazz, SelectColumn selects, FilterBean bean) {
return source.queryList(clazz, bean);
}
@Override
public <T> List<T> queryList(Class<T> clazz, Flipper flipper, String column, Serializable key) {
return source.queryList(clazz, flipper, column, key);
}
@Override
public <T> List<T> queryList(Class<T> clazz, Flipper flipper, FilterNode node) {
return source.queryList(clazz, flipper, node);
}
@Override
public <T> List<T> queryList(Class<T> clazz, Flipper flipper, FilterBean bean) {
return source.queryList(clazz, flipper, bean);
}
@Override
public <T> List<T> queryList(Class<T> clazz, SelectColumn selects, Flipper flipper, FilterNode node) {
return source.queryList(clazz, selects, flipper, node);
}
@Override
public <T> List<T> queryList(Class<T> clazz, SelectColumn selects, Flipper flipper, FilterBean bean) {
return source.queryList(clazz, selects, flipper, bean);
}
@Override
public <T, V> Sheet<V> queryColumnSheet(String selectedColumn, Class<T> clazz, Flipper flipper, FilterBean bean) {
return source.queryColumnSheet(selectedColumn, clazz, flipper, bean);
}
@Override
public <T, V> Sheet<V> queryColumnSheet(String selectedColumn, Class<T> clazz, Flipper flipper, FilterNode node) {
return source.queryColumnSheet(selectedColumn, clazz, flipper, node);
}
@Override
public <T> Sheet<T> querySheet(Class<T> clazz, Flipper flipper, FilterBean bean) {
return source.querySheet(clazz, flipper, bean);
}
@Override
public <T> Sheet<T> querySheet(Class<T> clazz, Flipper flipper, FilterNode node) {
return source.querySheet(clazz, flipper, node);
}
@Override
public <T> Sheet<T> querySheet(Class<T> clazz, SelectColumn selects, Flipper flipper, FilterBean bean) {
return source.querySheet(clazz, selects, flipper, bean);
}
@Override
public <T> Sheet<T> querySheet(Class<T> clazz, SelectColumn selects, Flipper flipper, FilterNode node) {
return source.querySheet(clazz, selects, flipper, node);
}
}

View File

@@ -24,7 +24,7 @@ import javax.xml.stream.*;
* @author zhangjx
*/
@SuppressWarnings("unchecked")
public final class DataDefaultSource implements DataSource, Nameable {
public final class DataDefaultSource implements DataSource, Nameable, Function<Class, EntityInfo> {
public static final String DATASOURCE_CONFPATH = "DATASOURCE_CONFPATH";
@@ -326,6 +326,11 @@ public final class DataDefaultSource implements DataSource, Nameable {
}
}
@Override
public EntityInfo apply(Class t) {
return loadEntityInfo(t);
}
private <T> EntityInfo<T> loadEntityInfo(Class<T> clazz) {
return EntityInfo.load(clazz, this.nodeid, this.cacheForbidden, fullloader);
}
@@ -640,7 +645,7 @@ public final class DataDefaultSource implements DataSource, Nameable {
private <T> void delete(final Connection conn, final EntityInfo<T> info, final FilterNode node) {
try {
if (!info.isVirtualEntity()) {
CharSequence join = node.createSQLJoin(info);
CharSequence join = node.createSQLJoin(this, info);
CharSequence where = node.createSQLExpress(info, null);
String sql = "DELETE FROM " + info.getTable() + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where));
if (debug.get()) logger.finest(info.getType().getSimpleName() + " delete sql=" + sql);
@@ -1085,7 +1090,7 @@ public final class DataDefaultSource implements DataSource, Nameable {
return cache.getNumberResult(reckon, column, node, bean);
}
}
final CharSequence join = node == null ? null : node.createSQLJoin(info);
final CharSequence join = node == null ? null : node.createSQLJoin(this, info);
final CharSequence where = node == null ? null : node.createSQLExpress(info, bean);
final String sql = "SELECT " + reckon.getColumn((column == null || column.isEmpty() ? "*" : ("a." + column))) + " FROM " + info.getTable() + " a"
+ (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where));
@@ -1134,7 +1139,7 @@ public final class DataDefaultSource implements DataSource, Nameable {
}
}
final String sqlkey = info.getSQLColumn(keyColumn);
final CharSequence join = node == null ? null : node.createSQLJoin(info);
final CharSequence join = node == null ? null : node.createSQLJoin(this, info);
final CharSequence where = node == null ? null : node.createSQLExpress(info, bean);
final String sql = "SELECT a." + sqlkey + ", " + reckon.getColumn((reckonColumn == null || reckonColumn.isEmpty() ? "*" : ("a." + reckonColumn)))
+ " FROM " + info.getTable() + " a" + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where)) + " GROUP BY a." + sqlkey;
@@ -1219,7 +1224,7 @@ public final class DataDefaultSource implements DataSource, Nameable {
final Connection conn = createReadSQLConnection();
try {
final SelectColumn sels = selects;
final CharSequence join = node == null ? null : node.createSQLJoin(info);
final CharSequence join = node == null ? null : node.createSQLJoin(this, info);
final CharSequence where = node == null ? null : node.createSQLExpress(info, bean);
final String sql = "SELECT a.* FROM " + info.getTable() + " a" + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where));
if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(clazz.getSimpleName() + " find sql=" + sql);
@@ -1277,7 +1282,7 @@ public final class DataDefaultSource implements DataSource, Nameable {
final Connection conn = createReadSQLConnection();
try {
final CharSequence join = node == null ? null : node.createSQLJoin(info);
final CharSequence join = node == null ? null : node.createSQLJoin(this, info);
final CharSequence where = node == null ? null : node.createSQLExpress(info, bean);
final String sql = "SELECT COUNT(a." + info.getPrimarySQLColumn() + ") FROM " + info.getTable() + " a" + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where));
if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(clazz.getSimpleName() + " exists sql=" + sql);
@@ -1531,7 +1536,7 @@ public final class DataDefaultSource implements DataSource, Nameable {
try {
final SelectColumn sels = selects;
final List<T> list = new ArrayList();
final CharSequence join = node == null ? null : node.createSQLJoin(info);
final CharSequence join = node == null ? null : node.createSQLJoin(this, info);
final CharSequence where = node == null ? null : node.createSQLExpress(info, bean);
final String sql = "SELECT a.* FROM " + info.getTable() + " a" + (join == null ? "" : join)
+ ((where == null || where.length() == 0) ? "" : (" WHERE " + where)) + info.createSQLOrderby(flipper);

View File

@@ -228,7 +228,7 @@ final class FilterBeanNode extends FilterNode {
}
@Override
protected <T> CharSequence createSQLJoin(final EntityInfo<T> info) {
protected <T> CharSequence createSQLJoin(final Function<Class, EntityInfo> func, final EntityInfo<T> info) {
if (joinSQL == null) return null;
return joinSQL;
}

View File

@@ -0,0 +1,17 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.wentch.redkale.source;
/**
*
* @author zhangjx
*/
public class FilterJoinNode extends FilterNode {
private Class joinClass;
private String joinColumn;
}

View File

@@ -140,10 +140,11 @@ public class FilterNode {
* 该方法需要重载
*
* @param <T>
* @param func
* @param info
* @return
*/
protected <T> CharSequence createSQLJoin(final EntityInfo<T> info) {
protected <T> CharSequence createSQLJoin(final Function<Class, EntityInfo> func, final EntityInfo<T> info) {
return null;
}
@@ -273,28 +274,28 @@ public class FilterNode {
if (express == ISNULL) return new Predicate<T>() {
@Override
public boolean test(T t) {
return attr.get(t) == null;
}
@Override
public boolean test(T t) {
return attr.get(t) == null;
}
@Override
public String toString() {
return attr.field() + " = null";
}
};
@Override
public String toString() {
return attr.field() + " = null";
}
};
if (express == ISNOTNULL) return new Predicate<T>() {
@Override
public boolean test(T t) {
return attr.get(t) != null;
}
@Override
public boolean test(T t) {
return attr.get(t) != null;
}
@Override
public String toString() {
return attr.field() + " != null";
}
};
@Override
public String toString() {
return attr.field() + " != null";
}
};
if (attr == null) return null;
Serializable val0 = getElementValue(bean);
if (val0 == null) return null;
@@ -401,113 +402,113 @@ public class FilterNode {
switch (express) {
case EQUAL: return new Predicate<T>() {
@Override
public boolean test(T t) {
return val.equals(attr.get(t));
}
@Override
public boolean test(T t) {
return val.equals(attr.get(t));
}
@Override
public String toString() {
return attr.field() + ' ' + express.value() + ' ' + val;
}
};
@Override
public String toString() {
return attr.field() + ' ' + express.value() + ' ' + val;
}
};
case NOTEQUAL: return new Predicate<T>() {
@Override
public boolean test(T t) {
return !val.equals(attr.get(t));
}
@Override
public boolean test(T t) {
return !val.equals(attr.get(t));
}
@Override
public String toString() {
return attr.field() + ' ' + express.value() + ' ' + val;
}
};
@Override
public String toString() {
return attr.field() + ' ' + express.value() + ' ' + val;
}
};
case GREATERTHAN: return new Predicate<T>() {
@Override
public boolean test(T t) {
return ((Number) attr.get(t)).longValue() > ((Number) val).longValue();
}
@Override
public boolean test(T t) {
return ((Number) attr.get(t)).longValue() > ((Number) val).longValue();
}
@Override
public String toString() {
return attr.field() + ' ' + express.value() + ' ' + val;
}
};
@Override
public String toString() {
return attr.field() + ' ' + express.value() + ' ' + val;
}
};
case LESSTHAN: return new Predicate<T>() {
@Override
public boolean test(T t) {
return ((Number) attr.get(t)).longValue() < ((Number) val).longValue();
}
@Override
public boolean test(T t) {
return ((Number) attr.get(t)).longValue() < ((Number) val).longValue();
}
@Override
public String toString() {
return attr.field() + ' ' + express.value() + ' ' + val;
}
};
@Override
public String toString() {
return attr.field() + ' ' + express.value() + ' ' + val;
}
};
case GREATERTHANOREQUALTO: return new Predicate<T>() {
@Override
public boolean test(T t) {
return ((Number) attr.get(t)).longValue() >= ((Number) val).longValue();
}
@Override
public boolean test(T t) {
return ((Number) attr.get(t)).longValue() >= ((Number) val).longValue();
}
@Override
public String toString() {
return attr.field() + ' ' + express.value() + ' ' + val;
}
};
@Override
public String toString() {
return attr.field() + ' ' + express.value() + ' ' + val;
}
};
case LESSTHANOREQUALTO: return new Predicate<T>() {
@Override
public boolean test(T t) {
return ((Number) attr.get(t)).longValue() <= ((Number) val).longValue();
}
@Override
public boolean test(T t) {
return ((Number) attr.get(t)).longValue() <= ((Number) val).longValue();
}
@Override
public String toString() {
return attr.field() + ' ' + express.value() + ' ' + val;
}
};
@Override
public String toString() {
return attr.field() + ' ' + express.value() + ' ' + val;
}
};
case OPAND: return new Predicate<T>() {
@Override
public boolean test(T t) {
return (((Number) attr.get(t)).longValue() & ((Number) val).longValue()) > 0;
}
@Override
public boolean test(T t) {
return (((Number) attr.get(t)).longValue() & ((Number) val).longValue()) > 0;
}
@Override
public String toString() {
return attr.field() + " & " + val + " > 0";
}
};
@Override
public String toString() {
return attr.field() + " & " + val + " > 0";
}
};
case OPOR: return new Predicate<T>() {
@Override
public boolean test(T t) {
return (((Number) attr.get(t)).longValue() | ((Number) val).longValue()) > 0;
}
@Override
public boolean test(T t) {
return (((Number) attr.get(t)).longValue() | ((Number) val).longValue()) > 0;
}
@Override
public String toString() {
return attr.field() + " | " + val + " > 0";
}
};
@Override
public String toString() {
return attr.field() + " | " + val + " > 0";
}
};
case OPANDNO: return new Predicate<T>() {
@Override
public boolean test(T t) {
return (((Number) attr.get(t)).longValue() & ((Number) val).longValue()) == 0;
}
@Override
public boolean test(T t) {
return (((Number) attr.get(t)).longValue() & ((Number) val).longValue()) == 0;
}
@Override
public String toString() {
return attr.field() + " & " + val + " = 0";
}
};
@Override
public String toString() {
return attr.field() + " & " + val + " = 0";
}
};
case LIKE:
return new Predicate<T>() {
@@ -573,34 +574,34 @@ public class FilterNode {
final Comparable max = range.getMax();
if (express == BETWEEN) return new Predicate<T>() {
@Override
public boolean test(T t) {
Comparable rs = (Comparable) attr.get(t);
if (rs == null) return false;
if (min != null && min.compareTo(rs) >= 0) return false;
return !(max != null && max.compareTo(rs) <= 0);
}
@Override
public boolean test(T t) {
Comparable rs = (Comparable) attr.get(t);
if (rs == null) return false;
if (min != null && min.compareTo(rs) >= 0) return false;
return !(max != null && max.compareTo(rs) <= 0);
}
@Override
public String toString() {
return attr.field() + " BETWEEN " + min + " AND " + max;
}
};
@Override
public String toString() {
return attr.field() + " BETWEEN " + min + " AND " + max;
}
};
if (express == NOTBETWEEN) return new Predicate<T>() {
@Override
public boolean test(T t) {
Comparable rs = (Comparable) attr.get(t);
if (rs == null) return true;
if (min != null && min.compareTo(rs) >= 0) return true;
return (max != null && max.compareTo(rs) <= 0);
}
@Override
public boolean test(T t) {
Comparable rs = (Comparable) attr.get(t);
if (rs == null) return true;
if (min != null && min.compareTo(rs) >= 0) return true;
return (max != null && max.compareTo(rs) <= 0);
}
@Override
public String toString() {
return attr.field() + " NOT BETWEEN " + min + " AND " + max;
}
};
@Override
public String toString() {
return attr.field() + " NOT BETWEEN " + min + " AND " + max;
}
};
return null;
case IN:
case NOTIN: