.
This commit is contained in:
File diff suppressed because one or more lines are too long
7
pom.xml
7
pom.xml
@@ -21,6 +21,13 @@
|
|||||||
<version>1.9.9</version>
|
<version>1.9.9</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- mysql连接 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>mysql</groupId>
|
||||||
|
<artifactId>mysql-connector-java</artifactId>
|
||||||
|
<version>5.1.46</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!-- arangodb支持 -->
|
<!-- arangodb支持 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.arangodb</groupId>
|
<groupId>com.arangodb</groupId>
|
||||||
|
|||||||
@@ -1,29 +1,19 @@
|
|||||||
|
<style>
|
||||||
|
.panel-body {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
<row class="meta-service">
|
<row class="meta-service">
|
||||||
<div class="col-md-12" style="padding-top: 10px;">
|
<div class="col-md-12" style="padding-top: 10px;">
|
||||||
<div class="input-group list-head">
|
<div class="input-group list-head">
|
||||||
|
|
||||||
<!--<span class="input-group-btn">
|
|
||||||
<button class="btn btn-default" type="button">数据平台</button>
|
|
||||||
</span>
|
|
||||||
<select class="form-control" v-model="filter.dbPlatId" style="width: 100px;">
|
|
||||||
<option></option>
|
|
||||||
<option v-for="item in dbPlats" :value="item.key">{{item.name}}</option>
|
|
||||||
</select>-->
|
|
||||||
|
|
||||||
<span class="input-group-btn">
|
<span class="input-group-btn">
|
||||||
<button class="btn btn-default" type="button">选择业务类型</button>
|
<button class="btn btn-default" type="button">选择业务类型</button>
|
||||||
</span>
|
</span>
|
||||||
<select class="form-control" v-model="table" style="width: 180px;">
|
<select class="form-control" v-model="table" style="width: 180px;">
|
||||||
<option v-for="item in tables" :value="item.name"> {{item.name}} [{{item.comment}}]</option>
|
<option v-for="item in services" :value="item.name"> {{item.name}} [{{item.comment}}]</option>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<span class="input-group-btn">
|
|
||||||
<button @click="status=1" :class="['btn',{'btn-primary':status==1}]" type="button"> 排序</button>
|
|
||||||
</span>
|
|
||||||
<span class="input-group-btn">
|
|
||||||
<button @click="status=2" :class="['btn',{'btn-primary':status==2}]" type="button"> 编辑属性</button>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
<span class="input-group-btn" style="padding-left: 20px">
|
<span class="input-group-btn" style="padding-left: 20px">
|
||||||
<button @click="status=5" :class="['btn',{'btn-primary':status==5}]" type="button"> 列表配置</button>
|
<button @click="status=5" :class="['btn',{'btn-primary':status==5}]" type="button"> 列表配置</button>
|
||||||
</span>
|
</span>
|
||||||
@@ -38,11 +28,6 @@
|
|||||||
<button @click="status=4" :class="['btn',{'btn-primary':status==4}]" type="button"> 导入配置</button>
|
<button @click="status=4" :class="['btn',{'btn-primary':status==4}]" type="button"> 导入配置</button>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<span class="input-group-btn" style="padding-left: 20px">
|
|
||||||
<button @click="status=7;dbPlatList();" :class="['btn',{'btn-primary':status==7}]" type="button"> 数据平台</button>
|
|
||||||
</span>
|
|
||||||
<!-- fixme: 加入数据平台相关操作, 1、关联数据平台,2、表结构入库 -->
|
|
||||||
|
|
||||||
<span class="input-group-btn" style="padding-left: 30px">
|
<span class="input-group-btn" style="padding-left: 30px">
|
||||||
<button @click="save()" :class="['btn',{'btn-primary':status!=0},{'disabled':status==0}]" type="button"> 保存</button>
|
<button @click="save()" :class="['btn',{'btn-primary':status!=0},{'disabled':status==0}]" type="button"> 保存</button>
|
||||||
</span>
|
</span>
|
||||||
@@ -98,7 +83,8 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-md-5" v-show="false">
|
<!-- sort -->
|
||||||
|
<!--<div class="col-md-5" v-show="false">
|
||||||
<table class="table-bordered table-auto">
|
<table class="table-bordered table-auto">
|
||||||
<thead>
|
<thead>
|
||||||
<tr style="background-color: #f1f1f1">
|
<tr style="background-color: #f1f1f1">
|
||||||
@@ -117,7 +103,9 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>-->
|
||||||
|
|
||||||
|
<!-- shows -->
|
||||||
<div class="col-md-5" v-show="status==5">
|
<div class="col-md-5" v-show="status==5">
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
<div class="panel-heading">列表展示的属性</div>
|
<div class="panel-heading">列表展示的属性</div>
|
||||||
@@ -284,6 +272,8 @@
|
|||||||
filterCate: ["EQUAL", "NOTEQUAL", "LIKE", "IN"],
|
filterCate: ["EQUAL", "NOTEQUAL", "LIKE", "IN"],
|
||||||
tables: [],//所有的业务类型,【测试用】
|
tables: [],//所有的业务类型,【测试用】
|
||||||
meta: {
|
meta: {
|
||||||
|
name:"",
|
||||||
|
table:"",
|
||||||
items: [],
|
items: [],
|
||||||
shows: [],
|
shows: [],
|
||||||
exports: [],
|
exports: [],
|
||||||
@@ -346,9 +336,9 @@
|
|||||||
vm.row = {key:v.key, dbPlatId: v.dbPlatId, catalog: v.catalog};
|
vm.row = {key:v.key, dbPlatId: v.dbPlatId, catalog: v.catalog};
|
||||||
vm.filters = v.filters;
|
vm.filters = v.filters;
|
||||||
var filterArr = [];
|
var filterArr = [];
|
||||||
vm.filters.forEach(function (item) {
|
/*vm.filters.forEach(function (item) {
|
||||||
filterArr.push(item.name);
|
filterArr.push(item.name);
|
||||||
})
|
})*/
|
||||||
vm.filterArr = filterArr;
|
vm.filterArr = filterArr;
|
||||||
},
|
},
|
||||||
filterArr: function (v) {
|
filterArr: function (v) {
|
||||||
@@ -381,6 +371,11 @@
|
|||||||
//this.status = 0;
|
//this.status = 0;
|
||||||
red.getJSON("/meta/tableinfo",{name: cate}, function (json) {
|
red.getJSON("/meta/tableinfo",{name: cate}, function (json) {
|
||||||
var row = json;
|
var row = json;
|
||||||
|
row.shows = row.shows || [];
|
||||||
|
row.exports = row.exports || [];
|
||||||
|
row.imports = row.imports || [];
|
||||||
|
row.filters = row.filters || [];
|
||||||
|
|
||||||
vm.meta = row;
|
vm.meta = row;
|
||||||
|
|
||||||
var oldItems = [];
|
var oldItems = [];
|
||||||
|
|||||||
@@ -5,19 +5,14 @@ import java.lang.reflect.InvocationTargetException;
|
|||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by liangxianyou@eversec.cn at 2018/3/12 14:17.
|
* Created by liangxianyou@eversec.cn at 2018/3/12 14:17.
|
||||||
*/
|
*/
|
||||||
public class Kv<K,V> extends LinkedHashMap {
|
public class Kv<K,V> extends LinkedHashMap<K,V> {
|
||||||
public static Kv of(){
|
public static Kv of(){
|
||||||
return new Kv();
|
return new Kv();
|
||||||
}
|
}
|
||||||
@@ -77,69 +72,31 @@ public class Kv<K,V> extends LinkedHashMap {
|
|||||||
|| t == Double.class || t == double.class
|
|| t == Double.class || t == double.class
|
||||||
;
|
;
|
||||||
};
|
};
|
||||||
public static <T> T toBean(Map<String, Object> m, Class<T> type) {
|
public static <T> T toBean(Map m, Class<T> type) {
|
||||||
try {
|
try {
|
||||||
Object obj = type.newInstance();
|
Object obj = type.newInstance();
|
||||||
m.forEach((k, v) -> {
|
m.forEach((k, v) -> {
|
||||||
String methodName = "set" + upFirst.apply(k);
|
String methodName = "set" + upFirst.apply(k+"");
|
||||||
Method method = null;
|
|
||||||
Class[] clazzs = clazzMap.get(v == null ? null : v.getClass());
|
Class[] clazzs = clazzMap.get(v == null ? null : v.getClass());
|
||||||
if (clazzs == null) {
|
if (clazzs == null) {
|
||||||
//doc.set(k, v);
|
//doc.set(k, v);
|
||||||
} else {
|
} else {
|
||||||
for (Class clazz : clazzs) {
|
for (Class clazz : clazzs) {
|
||||||
|
Method method = null;
|
||||||
try {
|
try {
|
||||||
method = type.getDeclaredMethod(methodName, clazz);
|
method = type.getDeclaredMethod(methodName, clazz);
|
||||||
} catch (NoSuchMethodException e) {
|
} catch (NoSuchMethodException e) {
|
||||||
}
|
}
|
||||||
if (method != null) {
|
if (method != null) {
|
||||||
try {
|
try {
|
||||||
if (v == null || "".equals(v)) {
|
Object _v = toAs(v, clazz);
|
||||||
|
//如发现 映射异常,打开下面的注释查看 进行映射的值,并对上面的值转换过程升级
|
||||||
} else if (v.getClass() == Long.class && clazz != Long.class) {//多种数值类型的处理
|
//System.out.printf("%s:%s %s%n", k,v, v.getClass());
|
||||||
Object _v;
|
|
||||||
switch (clazz.getSimpleName()) {
|
|
||||||
case "int":
|
|
||||||
case "Long": _v = v; break;
|
|
||||||
case "Integer": _v = (int)((long) v); break;
|
|
||||||
case "short":
|
|
||||||
case "Short": _v = (short)((long) v); break;
|
|
||||||
default: _v = v;
|
|
||||||
}
|
|
||||||
method.invoke(obj, _v);
|
method.invoke(obj, _v);
|
||||||
} else if (v.getClass() == Double.class) {
|
|
||||||
Object _v = null;
|
|
||||||
if (isNumber.test(clazz)) {
|
|
||||||
switch (clazz.getSimpleName()) {
|
|
||||||
case "long":
|
|
||||||
case "Long": _v = (long)(double) v; break;
|
|
||||||
case "int":
|
|
||||||
case "Integer": _v = (int)((double) v); break;
|
|
||||||
case "short":
|
|
||||||
case "Short": _v = (int)(double) v; break;
|
|
||||||
default: _v = v;
|
|
||||||
}
|
|
||||||
} else if (clazz == String.class){
|
|
||||||
_v = String.valueOf(v);
|
|
||||||
}
|
|
||||||
method.invoke(obj, _v);
|
|
||||||
} else if (v.getClass() == String.class && clazz == Date.class) {
|
|
||||||
Date _v = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse((String) v);
|
|
||||||
method.invoke(obj, _v);
|
|
||||||
} else if (v.getClass() == String.class && clazz == Integer.class) {
|
|
||||||
Object _v = (int)Double.parseDouble((String) v);
|
|
||||||
method.invoke(obj, _v);
|
|
||||||
}
|
|
||||||
|
|
||||||
else {
|
|
||||||
method.invoke(obj, v);
|
|
||||||
}
|
|
||||||
} catch (IllegalAccessException e) {
|
} catch (IllegalAccessException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (InvocationTargetException e) {
|
} catch (InvocationTargetException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (ParseException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -153,4 +110,70 @@ public class Kv<K,V> extends LinkedHashMap {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static <T> T toAs(Object v, Class<T> clazz) {
|
||||||
|
if (v == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (v.getClass() == clazz) {
|
||||||
|
return (T) v;
|
||||||
|
}
|
||||||
|
|
||||||
|
Object _v = null;
|
||||||
|
try {
|
||||||
|
if (v == null || "".equals(v)) {
|
||||||
|
|
||||||
|
} else if (v.getClass() == Long.class && clazz != Long.class) {//多种数值类型的处理: Long => x
|
||||||
|
switch (clazz.getSimpleName()) {
|
||||||
|
case "int":
|
||||||
|
case "Integer": _v = (int)(long) v; break;
|
||||||
|
case "short":
|
||||||
|
case "Short": _v = (short)(long) v; break;
|
||||||
|
case "float":
|
||||||
|
case "Float": _v = (float)(long) v; break;
|
||||||
|
default: _v = v;
|
||||||
|
}
|
||||||
|
} else if (v.getClass() == Double.class && clazz != Double.class) {
|
||||||
|
if (isNumber.test(clazz)) {
|
||||||
|
switch (clazz.getSimpleName()) {
|
||||||
|
case "long":
|
||||||
|
case "Long": _v = (long)(double) v; break;
|
||||||
|
case "int":
|
||||||
|
case "Integer": _v = (int)(double) v; break;
|
||||||
|
case "short":
|
||||||
|
case "Short": _v = (short)(double) v; break;
|
||||||
|
case "float":
|
||||||
|
case "Float": _v = (float)(double) v; break;
|
||||||
|
default: _v = v;
|
||||||
|
}
|
||||||
|
} else if (clazz == String.class){
|
||||||
|
_v = String.valueOf(v);
|
||||||
|
}
|
||||||
|
} else if (v.getClass() == String.class) {
|
||||||
|
switch (clazz.getSimpleName()) {
|
||||||
|
case "Date":
|
||||||
|
_v = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse((String) v); break;
|
||||||
|
//string ==> number
|
||||||
|
case "short":
|
||||||
|
case "Short": _v = (short)Double.parseDouble((String) v); break;
|
||||||
|
case "float":
|
||||||
|
case "Float": _v = (float)Double.parseDouble((String) v); break;
|
||||||
|
case "int":
|
||||||
|
case "Integer": _v = (int)Double.parseDouble((String) v); break;
|
||||||
|
case "long":
|
||||||
|
case "Long": _v = (long)Double.parseDouble((String) v); break;
|
||||||
|
case "double":
|
||||||
|
case "Double": _v = Double.parseDouble((String) v); break;
|
||||||
|
default: _v = v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
_v = v;
|
||||||
|
}
|
||||||
|
} catch (ParseException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return (T) _v;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
19
src/main/java/net/tccn/base/RealType.java
Normal file
19
src/main/java/net/tccn/base/RealType.java
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package net.tccn.base;
|
||||||
|
|
||||||
|
import java.lang.reflect.ParameterizedType;
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by liangxianyou at 2019/3/15 16:39.
|
||||||
|
*/
|
||||||
|
public class RealType<T> {
|
||||||
|
public Class<T> getType() {
|
||||||
|
|
||||||
|
Type type = this.getClass().getGenericSuperclass();
|
||||||
|
ParameterizedType p=(ParameterizedType)type;
|
||||||
|
|
||||||
|
Class<T> c=(Class<T>) p.getActualTypeArguments()[0];
|
||||||
|
System.out.println(c.getName());
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -55,7 +55,7 @@ public abstract class Doc<T extends Doc> {
|
|||||||
return (V)attr.get(k);
|
return (V)attr.get(k);
|
||||||
}
|
}
|
||||||
|
|
||||||
public T setShows(String... show) {
|
/*public T setShows(String... show) {
|
||||||
if (_shows == null) {
|
if (_shows == null) {
|
||||||
_shows = new HashSet<>();
|
_shows = new HashSet<>();
|
||||||
}
|
}
|
||||||
@@ -63,15 +63,15 @@ public abstract class Doc<T extends Doc> {
|
|||||||
_shows.add(s);
|
_shows.add(s);
|
||||||
}
|
}
|
||||||
return (T) this;
|
return (T) this;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
public Set<String> get_Shows() {
|
public Set<String> get_Shows() {
|
||||||
return _shows;
|
return _shows;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void set_Shows(Set<String> shows) {
|
/*public void set_Shows(Set<String> shows) {
|
||||||
this._shows = shows;
|
this._shows = shows;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
public T setOrder(String col, int desc) {
|
public T setOrder(String col, int desc) {
|
||||||
if (_order == null) {
|
if (_order == null) {
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ public class FBean {
|
|||||||
|
|
||||||
//-----------------------------------
|
//-----------------------------------
|
||||||
//组装查询sql,[list, count]
|
//组装查询sql,[list, count]
|
||||||
|
@Deprecated
|
||||||
public String[] buildSqlFilter() {
|
public String[] buildSqlFilter() {
|
||||||
//where 1=1 and x=1 and y=1 order by x,y limit 1,3;
|
//where 1=1 and x=1 and y=1 order by x,y limit 1,3;
|
||||||
String where = Filter.filter(filters);
|
String where = Filter.filter(filters);
|
||||||
@@ -63,7 +64,7 @@ public class FBean {
|
|||||||
return new String[]{list, count};
|
return new String[]{list, count};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public void setLimit(int pn, int ps) {
|
public void setLimit(int pn, int ps) {
|
||||||
limit.setPn(pn);
|
limit.setPn(pn);
|
||||||
limit.setPs(ps);
|
limit.setPs(ps);
|
||||||
|
|||||||
@@ -1,29 +1,12 @@
|
|||||||
package net.tccn.dbq.fbean;
|
package net.tccn.dbq.fbean;
|
||||||
|
|
||||||
import net.tccn.meta.MetaService;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by liangxianyou at 2018/12/24 15:49.
|
* Created by liangxianyou at 2018/12/24 15:49.
|
||||||
*/
|
*/
|
||||||
public class ParseArango implements Parser {
|
public class ParseArango implements Parser {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String parse(FBean fBean) {
|
public String[] parse(FBean fBean) {
|
||||||
|
return new String[0];
|
||||||
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String parse(Filter filter) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String parseSave(MetaService ms, Map data) {
|
|
||||||
return "";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +1,13 @@
|
|||||||
package net.tccn.dbq.fbean;
|
package net.tccn.dbq.fbean;
|
||||||
|
|
||||||
import net.tccn.meta.MetaService;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by liangxianyou at 2018/12/24 15:49.
|
* Created by liangxianyou at 2018/12/24 15:49.
|
||||||
*/
|
*/
|
||||||
public class ParseEs implements Parser {
|
public class ParseEs implements Parser {
|
||||||
|
|
||||||
@Override
|
|
||||||
public String parse(FBean fBean) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String parse(Filter filter) {
|
public String[] parse(FBean fBean) {
|
||||||
return null;
|
return new String[0];
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String parseSave(MetaService ms, Map data) {
|
|
||||||
return "";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package net.tccn.dbq.fbean;
|
package net.tccn.dbq.fbean;
|
||||||
|
|
||||||
|
import net.tccn.base.Kv;
|
||||||
import net.tccn.meta.MetaKit;
|
import net.tccn.meta.MetaKit;
|
||||||
import net.tccn.meta.MetaLink;
|
import net.tccn.meta.MetaLink;
|
||||||
import net.tccn.meta.MetaService;
|
import net.tccn.meta.MetaService;
|
||||||
@@ -8,9 +9,17 @@ import net.tccn.meta.MetaTable;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.function.BiFunction;
|
||||||
|
import java.util.function.Function;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static java.util.Arrays.asList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* 查询的数据是否同库,
|
||||||
|
* 是:支持副表过滤
|
||||||
|
* 否:只支持主表过滤
|
||||||
* Created by liangxianyou at 2018/12/24 15:49.
|
* Created by liangxianyou at 2018/12/24 15:49.
|
||||||
*/
|
*/
|
||||||
public class ParseMysql implements Parser {
|
public class ParseMysql implements Parser {
|
||||||
@@ -29,75 +38,154 @@ public class ParseMysql implements Parser {
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
BiFunction<Filter, String, String> buildFilter = (f, cate) -> {
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
Function<FBean, Kv<String, MetaTable>> tablesFun = fbean -> {
|
||||||
|
MetaService metaService = MetaKit.metaService(fbean.getName());
|
||||||
|
List<Filter> filters = fbean.getFilters();
|
||||||
|
List<String> shows = metaService.getShows();
|
||||||
|
|
||||||
|
Kv tables = Kv.of();
|
||||||
|
|
||||||
|
shows.forEach(x-> {
|
||||||
|
String table = x.split("[.]")[0];
|
||||||
|
tables.set(table, MetaKit.getMetaTableByAlias(table));
|
||||||
|
});
|
||||||
|
filters.forEach(f -> {
|
||||||
|
String table = f.getCol().split("[.]")[0];
|
||||||
|
if (!tables.containsKey(table)) {
|
||||||
|
tables.set(table, MetaKit.getMetaTableByAlias(table));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
metaService.getShows();
|
||||||
|
|
||||||
|
//查询用的过滤条件
|
||||||
|
Map<String, List<Filter>> filterMap = filters.stream().collect(Collectors.groupingBy(x -> x.getCol().split("[.]")[0]));
|
||||||
|
//要展示的数据
|
||||||
|
Map<String, List<String>> showMap = shows.stream().collect(Collectors.groupingBy(x -> x.split("[.]")[0]));
|
||||||
|
|
||||||
|
|
||||||
|
StringBuffer bufWhere = new StringBuffer();
|
||||||
|
|
||||||
|
filterMap.getOrDefault(metaService.getTable(), asList()).forEach(f -> {
|
||||||
|
|
||||||
|
|
||||||
|
bufWhere.append(f.getCol()).append(f.getType()).append(f.getValue());
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
//select * from tableA a left join tableB b on a.xx = b.yy where b.zz = xxx;
|
||||||
|
//where tableB where b.
|
||||||
|
|
||||||
|
//是否跨库
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return tables;
|
||||||
|
};
|
||||||
|
|
||||||
|
Predicate<Kv<String, MetaTable>> sameDbFun = (kv) -> {
|
||||||
|
String dbPlatId = null;
|
||||||
|
for (MetaTable table : kv.values()) {
|
||||||
|
if (dbPlatId == null) {
|
||||||
|
dbPlatId = table.getDbPlatId();
|
||||||
|
} else if (!dbPlatId.equals(table.getDbPlatId())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String parse(FBean fBean) {
|
public String[] parse(FBean fBean) {
|
||||||
MetaService metaService = MetaKit.metaService(fBean.getName());
|
MetaService metaService = MetaKit.metaService(fBean.getName());
|
||||||
|
|
||||||
//基础属性
|
Kv<String, MetaTable> tables = tablesFun.apply(fBean);//所有的关联表信息
|
||||||
MetaTable metaTable = metaService.getMetaTable();//基础元数据
|
MetaTable metaTable = tables.get(metaService.getTable());//基础元数据
|
||||||
List<MetaLink> linkTables = metaService.getMetaLinks();//表关联条件
|
|
||||||
Map<String, MetaTable> attachTable = metaService.getTables();//用到的关联表
|
|
||||||
List<String> shows = metaService.getShows();//查询的属性
|
List<String> shows = metaService.getShows();//查询的属性
|
||||||
|
|
||||||
|
List<String> _filters = fBean.getFilters().stream().map(Filter::getCol).collect(Collectors.toList());
|
||||||
|
List<MetaLink> links = MetaKit.getMetaLinks(metaService.getTable(), shows, _filters);
|
||||||
|
|
||||||
//查询条件
|
//查询条件
|
||||||
List<Filter> filters = fBean.getFilters();
|
List<Filter> filters = fBean.getFilters();
|
||||||
Limit limit = fBean.getLimit();
|
Limit limit = fBean.getLimit();
|
||||||
List<Order> orders = fBean.getOrders();
|
List<Order> orders = fBean.getOrders();
|
||||||
|
|
||||||
StringBuilder buf = new StringBuilder();
|
//Map<String, List<Filter>> filterMap = filters.stream().collect(Collectors.groupingBy(x -> x.getCol().split("[.]")[0]));
|
||||||
//select
|
//Map<String, List<String>> showMap = shows.stream().collect(Collectors.groupingBy(x -> x.split("[.]")[0]));
|
||||||
buf.append("select ");
|
|
||||||
|
|
||||||
|
//判断是否为同库
|
||||||
|
if (sameDbFun.test(tables)) {
|
||||||
|
// where 1=1 and xx=xx
|
||||||
|
StringBuffer bufWhere = new StringBuffer();
|
||||||
|
if (!isEmpty.test(filters)) {
|
||||||
|
bufWhere.append(Filter.filter(filters, DbType.MYSQL));
|
||||||
|
}
|
||||||
|
|
||||||
|
//select a.x, b.y, c.z
|
||||||
|
StringBuffer bufSelect = new StringBuffer();
|
||||||
|
bufSelect.append("select ");
|
||||||
if (!isEmpty.test(shows)) {
|
if (!isEmpty.test(shows)) {
|
||||||
shows.forEach(x -> {
|
shows.forEach(x -> {
|
||||||
//buf.append("`").append("x").append("`").append(",");
|
//buf.append("`").append("x").append("`").append(",");
|
||||||
buf.append(x).append(",");
|
bufSelect.append(x).append(",");
|
||||||
});
|
});
|
||||||
buf.deleteCharAt(buf.length() - 1);
|
bufSelect.deleteCharAt(bufSelect.length() - 1);
|
||||||
} else {
|
} else {
|
||||||
buf.append("*");
|
bufSelect.append("*");
|
||||||
}
|
}
|
||||||
|
|
||||||
//from
|
//from
|
||||||
buf.append(" from ").append("`").append(metaTable.getName()).append("` ").append(metaTable.getAlias());
|
StringBuilder bufFrom = new StringBuilder();
|
||||||
|
bufFrom.append(" from ").append(metaTable.getCatalog()).append(".`").append(metaTable.getName()).append("` ").append(metaTable.getAlias());
|
||||||
//left join
|
//left join
|
||||||
if (!isEmpty.test(linkTables)) {
|
if (!isEmpty.test(links)) {
|
||||||
linkTables.forEach(x -> {
|
links.forEach(x -> {
|
||||||
MetaTable leftTable = attachTable.get(metaTable.getAlias().equals(x.getTables()[0]) ? x.getTables()[1] : x.getTables()[0]);
|
MetaTable rightTable = tables.get(metaTable.getAlias().equals(x.getTables()[0]) ? x.getTables()[1] : x.getTables()[0]);
|
||||||
|
bufFrom.append(" left join ").append(rightTable.getCatalog()).append(".").append(rightTable.getName()).append(" ").append(rightTable.getAlias()).append(" on ");
|
||||||
buf.append(" left join ").append(leftTable.getName()).append(" ").append(leftTable.getAlias()).append(" on ");
|
int tag = bufFrom.length();
|
||||||
int tag = buf.length();
|
|
||||||
x.getLink().forEach((k,v) -> {
|
x.getLink().forEach((k,v) -> {
|
||||||
if (buf.length() > tag) {
|
if (bufFrom.length() > tag) {
|
||||||
buf.append(" and ");
|
bufFrom.append(" and ");
|
||||||
}
|
}
|
||||||
buf.append(k).append("=").append(v);
|
bufFrom.append(k).append("=").append(v);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
//where
|
StringBuffer bufOth = new StringBuffer();
|
||||||
if (!isEmpty.test(filters)) {
|
|
||||||
buf.append(Filter.filter(filters, DbType.MYSQL));
|
|
||||||
}
|
|
||||||
|
|
||||||
//order by
|
//order by
|
||||||
if (!isEmpty.test(orders)) {
|
if (!isEmpty.test(orders)) {
|
||||||
buf.append(" ").append(Order.order(orders, DbType.MYSQL));
|
bufOth.append(" ").append(Order.order(orders, DbType.MYSQL));
|
||||||
}
|
}
|
||||||
|
|
||||||
//limit
|
//limit
|
||||||
buf.append(" ").append(limit.limit());
|
bufOth.append(" ").append(limit.limit());
|
||||||
return buf.toString();
|
|
||||||
|
return new String[]{
|
||||||
|
"select count(1) " + bufFrom + bufWhere,
|
||||||
|
"" + bufSelect + bufFrom + bufWhere + bufOth
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*@Override
|
||||||
public String parse(Filter filter) {
|
public String parse(Filter filter) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String parseSave(MetaService ms, Map data) {
|
public String parseSave(MetaService ms, Map data) {
|
||||||
|
MetaTable metaTable = MetaKit.getMetaTableByAlias(ms.getName());//基础元数据
|
||||||
|
|
||||||
String sqlTpl = "insert %s (%s) value (%s)";
|
String sqlTpl = "insert %s (%s) value (%s)";
|
||||||
StringBuilder bufK = new StringBuilder();
|
StringBuilder bufK = new StringBuilder();
|
||||||
StringBuilder bufV = new StringBuilder();
|
StringBuilder bufV = new StringBuilder();
|
||||||
@@ -113,6 +201,6 @@ public class ParseMysql implements Parser {
|
|||||||
});
|
});
|
||||||
bufK.deleteCharAt(bufK.length() - 1);
|
bufK.deleteCharAt(bufK.length() - 1);
|
||||||
bufV.deleteCharAt(bufV.length() - 1);
|
bufV.deleteCharAt(bufV.length() - 1);
|
||||||
return String.format(sqlTpl, ms.getMetaTable().getName(), bufK.toString(), bufV.toString());
|
return String.format(sqlTpl, metaTable.getName(), bufK.toString(), bufV.toString());
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,22 +10,23 @@ import java.util.Map;
|
|||||||
public interface Parser {
|
public interface Parser {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 组装完整的查询条件
|
* 组装完整分页查询
|
||||||
* @param fBean
|
* @param fBean
|
||||||
|
* @return [countSql, listSql]
|
||||||
*/
|
*/
|
||||||
String parse(FBean fBean);
|
String[] parse(FBean fBean);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 解析一个查询条件
|
* 解析一个查询条件
|
||||||
* @param filter
|
* @param filter
|
||||||
*/
|
*/
|
||||||
String parse(Filter filter);
|
//String parse(Filter filter);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 解析入库语句
|
* 解析入库语句
|
||||||
* @param data
|
* @param data
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
String parseSave(MetaService ms, Map data);
|
//String parseSave(MetaService ms, Map data);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,10 +10,11 @@ public class JdbcAccount {
|
|||||||
private String url;
|
private String url;
|
||||||
private String user;
|
private String user;
|
||||||
private String pwd;
|
private String pwd;
|
||||||
|
private String cate;//数据库类型
|
||||||
private Integer connectMax = 5;//默认最大连接数5
|
private Integer connectMax = 5;//默认最大连接数5
|
||||||
|
|
||||||
public JdbcAccount() {
|
/*public JdbcAccount() {
|
||||||
}
|
}*/
|
||||||
|
|
||||||
public JdbcAccount(String url, String user, String pwd) {
|
public JdbcAccount(String url, String user, String pwd) {
|
||||||
this.url = url;
|
this.url = url;
|
||||||
@@ -45,6 +46,14 @@ public class JdbcAccount {
|
|||||||
this.pwd = pwd;
|
this.pwd = pwd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getCate() {
|
||||||
|
return cate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCate(String cate) {
|
||||||
|
this.cate = cate;
|
||||||
|
}
|
||||||
|
|
||||||
public Integer getConnectMax() {
|
public Integer getConnectMax() {
|
||||||
return connectMax;
|
return connectMax;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,9 @@
|
|||||||
package net.tccn.dbq.jdbc;
|
package net.tccn.dbq.jdbc;
|
||||||
|
|
||||||
|
import net.tccn.dbq.table.Table;
|
||||||
import org.redkale.util.Comment;
|
import org.redkale.util.Comment;
|
||||||
|
|
||||||
import java.sql.Connection;
|
import java.sql.*;
|
||||||
import java.sql.DriverManager;
|
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.sql.ResultSet;
|
|
||||||
import java.sql.ResultSetMetaData;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -63,6 +59,9 @@ public class JdbcService {
|
|||||||
connection = DriverManager.getConnection(account.getUrl(), account.getUser(), account.getPwd());
|
connection = DriverManager.getConnection(account.getUrl(), account.getUser(), account.getPwd());
|
||||||
jdbcPool.put(account, connection);
|
jdbcPool.put(account, connection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int i = 8000 * 12;//96000;
|
||||||
|
|
||||||
return connection;
|
return connection;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,7 +144,11 @@ public class JdbcService {
|
|||||||
|
|
||||||
System.out.println(connection);
|
System.out.println(connection);
|
||||||
|
|
||||||
String sql = "select * from basic_concat";
|
|
||||||
|
String sql = "select * from basic_concat limit 10";
|
||||||
|
List<Map> list = JdbcService.findList(connection, sql);
|
||||||
|
System.out.println(list);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,21 +1,9 @@
|
|||||||
package net.tccn.dbq.jdbc;
|
package net.tccn.dbq.jdbc;
|
||||||
|
|
||||||
import net.tccn.dbq.qtask.Qtask;
|
import java.sql.*;
|
||||||
|
import java.util.*;
|
||||||
import java.sql.Connection;
|
|
||||||
import java.sql.DriverManager;
|
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.sql.ResultSet;
|
|
||||||
import java.sql.ResultSetMetaData;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Queue;
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.LinkedBlockingDeque;
|
|
||||||
import java.util.concurrent.LinkedBlockingQueue;
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
@@ -26,7 +14,6 @@ import java.util.function.Function;
|
|||||||
public class JdbcSource {
|
public class JdbcSource {
|
||||||
|
|
||||||
private JdbcAccount account;
|
private JdbcAccount account;
|
||||||
private Queue<Qtask> queue = new LinkedBlockingDeque();
|
|
||||||
private static ConcurrentHashMap<String, JdbcSource> sources = new ConcurrentHashMap<>();
|
private static ConcurrentHashMap<String, JdbcSource> sources = new ConcurrentHashMap<>();
|
||||||
private List<Connection> connections = new ArrayList<>();
|
private List<Connection> connections = new ArrayList<>();
|
||||||
private AtomicInteger connectNum = new AtomicInteger();
|
private AtomicInteger connectNum = new AtomicInteger();
|
||||||
|
|||||||
@@ -1,21 +1,19 @@
|
|||||||
package net.tccn.dbq;
|
package net.tccn.dbq.jdbc.api;
|
||||||
|
|
||||||
import net.tccn.base.arango.Doc;
|
import net.tccn.base.arango.Doc;
|
||||||
import net.tccn.dbq.jdbc.JdbcAccount;
|
|
||||||
import org.redkale.convert.json.JsonConvert;
|
import org.redkale.convert.json.JsonConvert;
|
||||||
|
|
||||||
import javax.persistence.Table;
|
import javax.persistence.Table;
|
||||||
import java.sql.Connection;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 数据库平台
|
* 数据库平台
|
||||||
* @author: liangxianyou at 2018/11/14 12:58.
|
* @author: liangxianyou at 2018/11/14 12:58.
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("Duplicates")
|
||||||
@Table(name = "db_plat", catalog = "db_dev")
|
@Table(name = "db_plat", catalog = "db_dev")
|
||||||
public class DbPlat extends Doc<DbPlat> {
|
public class DbAccount extends Doc<DbAccount> {
|
||||||
public static DbPlat dao = dao(DbPlat.class);
|
public static DbAccount dao = dao(DbAccount.class);
|
||||||
|
|
||||||
private String name; //名称
|
private String name; //名称
|
||||||
private String cate; //类型 mysql|ArangoDb
|
private String cate; //类型 mysql|ArangoDb
|
||||||
@@ -25,7 +23,7 @@ public class DbPlat extends Doc<DbPlat> {
|
|||||||
private String pwd; //密码
|
private String pwd; //密码
|
||||||
private List<String> catalogs; //库
|
private List<String> catalogs; //库
|
||||||
|
|
||||||
private JdbcAccount jdbcAccount;
|
//private JdbcAccount jdbcAccount;
|
||||||
//------------- setter/getter ---------------
|
//------------- setter/getter ---------------
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
@@ -89,10 +87,21 @@ public class DbPlat extends Doc<DbPlat> {
|
|||||||
}
|
}
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
|
|
||||||
protected Connection connection() throws SQLException {
|
/*protected Connection connection() throws SQLException {
|
||||||
if (jdbcAccount == null) {
|
if (jdbcAccount == null) {
|
||||||
jdbcAccount = new JdbcAccount(url, user, pwd);
|
jdbcAccount = new JdbcAccount(url, user, pwd);
|
||||||
}
|
}
|
||||||
return jdbcAccount.getConnection();
|
return jdbcAccount.getConnection();
|
||||||
|
}*/
|
||||||
|
|
||||||
|
public String accountKey() {
|
||||||
|
int start = url.indexOf("//") + 2;
|
||||||
|
int end = url.indexOf("/", start);
|
||||||
|
int endDef = url.indexOf("?", end);
|
||||||
|
if (endDef == -1) {
|
||||||
|
endDef = url.length();
|
||||||
|
}
|
||||||
|
String host = url.substring(start, end == -1 ? url.length() : end);
|
||||||
|
return user + "@" + host;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
57
src/main/java/net/tccn/dbq/jdbc/api/DbKit.java
Normal file
57
src/main/java/net/tccn/dbq/jdbc/api/DbKit.java
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
package net.tccn.dbq.jdbc.api;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by liangxianyou at 2019/3/12 14:11.
|
||||||
|
*/
|
||||||
|
public class DbKit implements DbSource{
|
||||||
|
|
||||||
|
private DbAccount dbAccount;
|
||||||
|
private DbSource dbSource;
|
||||||
|
|
||||||
|
public DbKit(DbAccount dbAccount) {
|
||||||
|
this.dbAccount = dbAccount;
|
||||||
|
if ("mysql".equalsIgnoreCase(dbAccount.getCate())) {
|
||||||
|
dbSource = new DbSourceMysql(dbAccount);
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException(String.format("创建DbKit失败:数据库类型[cate:%s]未知", dbAccount.getCate()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> List<T> findList(String sql, Class<T> type) {
|
||||||
|
return dbSource.findList(sql, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> T findfirst(String sql, Class<T> type) {
|
||||||
|
return dbSource.findfirst(sql, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> T queryColumn(String sql, Class<T> type) {
|
||||||
|
return dbSource.queryColumn(sql, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> T queryInt(String sql) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> T queryLong(String sql) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> T queryDouble(String sql) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> T queryDate(String sql) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
33
src/main/java/net/tccn/dbq/jdbc/api/DbSource.java
Normal file
33
src/main/java/net/tccn/dbq/jdbc/api/DbSource.java
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
package net.tccn.dbq.jdbc.api;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by liangxianyou at 2019/3/12 14:07.
|
||||||
|
*/
|
||||||
|
public interface DbSource {
|
||||||
|
|
||||||
|
<T> List<T> findList(String sql, Class<T> type);
|
||||||
|
|
||||||
|
<T> T findfirst(String sql, Class<T> type);
|
||||||
|
|
||||||
|
<T> T queryColumn(String sql, Class<T> type);
|
||||||
|
|
||||||
|
default <T> void save(String tableName, T t) {}
|
||||||
|
|
||||||
|
default <T> void update(String tableName, T t) {}
|
||||||
|
|
||||||
|
default int queryInt(String sql) {
|
||||||
|
return queryColumn(sql, int.class);
|
||||||
|
}
|
||||||
|
default long queryLong(String sql) {
|
||||||
|
return queryColumn(sql, long.class);
|
||||||
|
}
|
||||||
|
default double queryDouble(String sql) {
|
||||||
|
return queryColumn(sql, double.class);
|
||||||
|
}
|
||||||
|
default Date queryDate(String sql) {
|
||||||
|
return queryColumn(sql, Date.class);
|
||||||
|
}
|
||||||
|
}
|
||||||
167
src/main/java/net/tccn/dbq/jdbc/api/DbSourceMysql.java
Normal file
167
src/main/java/net/tccn/dbq/jdbc/api/DbSourceMysql.java
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
package net.tccn.dbq.jdbc.api;
|
||||||
|
|
||||||
|
import net.tccn.base.Kv;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
import java.util.concurrent.atomic.AtomicReferenceArray;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by liangxianyou at 2019/3/12 14:20.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("Duplicates")
|
||||||
|
public class DbSourceMysql implements DbSource {
|
||||||
|
|
||||||
|
private static ConcurrentHashMap<String, AtomicReferenceArray<Connection>> conns = new ConcurrentHashMap<>();
|
||||||
|
private static ConcurrentHashMap<String, AtomicInteger> counter = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
private String accountKey;
|
||||||
|
private DbAccount dbAccount;
|
||||||
|
|
||||||
|
public DbSourceMysql(DbAccount dbAccount) {
|
||||||
|
this.dbAccount = dbAccount;
|
||||||
|
this.accountKey = dbAccount.accountKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> List<T> findList(String sql, Class<T> type) {
|
||||||
|
Connection connection = connection();
|
||||||
|
try (
|
||||||
|
PreparedStatement ps = connection.prepareStatement(sql);
|
||||||
|
ResultSet rs = ps.executeQuery()) {
|
||||||
|
List list = new ArrayList();
|
||||||
|
while (rs.next()) {
|
||||||
|
ResultSetMetaData metaData = rs.getMetaData();
|
||||||
|
int count = metaData.getColumnCount();
|
||||||
|
|
||||||
|
Map row = new HashMap();
|
||||||
|
for (int i = 1; i <= count; i++) {
|
||||||
|
String columnTypeName = metaData.getColumnTypeName(i);
|
||||||
|
String columnName = metaData.getColumnName(i);
|
||||||
|
row.put(columnName, null);
|
||||||
|
|
||||||
|
if (rs.getObject(i) != null) {
|
||||||
|
switch (columnTypeName) {
|
||||||
|
case "DATETIME":
|
||||||
|
case "TIMESTAMP":
|
||||||
|
case "DATE":
|
||||||
|
row.put(columnName, rs.getTimestamp(i).getTime()); break;
|
||||||
|
default:
|
||||||
|
row.put(columnName, rs.getObject(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
list.add(Map.class == type ? row : Kv.toBean(row, type));
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
} finally {
|
||||||
|
release(connection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> T findfirst(String sql, Class<T> type) {
|
||||||
|
List<T> list = findList(sql, type);
|
||||||
|
return list.size() > 0 ? list.get(0) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> T queryColumn(String sql, Class<T> type) {
|
||||||
|
Connection connection = connection();
|
||||||
|
try (
|
||||||
|
PreparedStatement ps = connection.prepareStatement(sql);
|
||||||
|
ResultSet rs = ps.executeQuery()
|
||||||
|
) {
|
||||||
|
Object v = null;
|
||||||
|
while (rs.next()) {
|
||||||
|
ResultSetMetaData metaData = rs.getMetaData();
|
||||||
|
int count = metaData.getColumnCount();
|
||||||
|
|
||||||
|
for (int i = 1; i <= count; i++) {
|
||||||
|
String columnTypeName = metaData.getColumnTypeName(i);
|
||||||
|
if (rs.getObject(i) != null) {
|
||||||
|
switch (columnTypeName) {
|
||||||
|
case "DATETIME":
|
||||||
|
case "TIMESTAMP":
|
||||||
|
case "DATE":
|
||||||
|
v = rs.getTimestamp(i).getTime(); break;
|
||||||
|
default:
|
||||||
|
v = rs.getObject(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Kv.toAs(v, type);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
} finally {
|
||||||
|
release(connection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Connection connection() {
|
||||||
|
return connection(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Connection connection(int n) {
|
||||||
|
AtomicReferenceArray<Connection> arr = conns.getOrDefault(accountKey, new AtomicReferenceArray<>(15));
|
||||||
|
Connection connection = null;
|
||||||
|
AtomicInteger num = counter.getOrDefault(accountKey, new AtomicInteger(0));
|
||||||
|
for (int i = 0; num.get() > 0 && i < arr.length() && connection == null; i++) {
|
||||||
|
try {
|
||||||
|
connection = arr.getAndUpdate(i, null);
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println("getAndUpdate exception");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (connection == null) {
|
||||||
|
try {
|
||||||
|
if (num.get() < 15) {
|
||||||
|
connection = DriverManager.getConnection(dbAccount.getUrl(), dbAccount.getUser(), dbAccount.getPwd());
|
||||||
|
num.getAndIncrement();
|
||||||
|
} else {
|
||||||
|
//连接被全部使用中,等待1s后再次获取连接,直到得到连接 !!!
|
||||||
|
Thread.sleep(1000);
|
||||||
|
if (++n > 3)
|
||||||
|
connection(n);
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
throw new IllegalArgumentException("获取数据库连接失败");
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return connection;
|
||||||
|
}
|
||||||
|
private void release(Connection connection) {
|
||||||
|
AtomicReferenceArray<Connection> arr = conns.getOrDefault(accountKey, new AtomicReferenceArray<>(15));
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
boolean bool = false;
|
||||||
|
while (i < arr.length() && !bool){
|
||||||
|
bool = arr.compareAndSet(i++, null, connection);
|
||||||
|
}
|
||||||
|
|
||||||
|
//如果没成功释放,关系连接
|
||||||
|
if (!bool && connection != null) {
|
||||||
|
try {
|
||||||
|
connection.close();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package net.tccn.dbq.jdbc;
|
package net.tccn.dbq.table;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 数据库表的列
|
* 数据库表的列
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package net.tccn.dbq.jdbc;
|
package net.tccn.dbq.table;
|
||||||
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
16
src/main/java/net/tccn/meta/MetaExecutor.java
Normal file
16
src/main/java/net/tccn/meta/MetaExecutor.java
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package net.tccn.meta;
|
||||||
|
|
||||||
|
import net.tccn.base.JBean;
|
||||||
|
import net.tccn.qtask.QTask;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by liangxianyou at 2019/3/7 16:13.
|
||||||
|
*/
|
||||||
|
public class MetaExecutor {
|
||||||
|
|
||||||
|
public JBean execute(Task task) {
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package net.tccn.meta;
|
package net.tccn.meta;
|
||||||
|
|
||||||
import net.tccn.base.Kv;
|
import net.tccn.base.Kv;
|
||||||
import net.tccn.dbq.DbPlat;
|
import net.tccn.dbq.jdbc.api.DbAccount;
|
||||||
import net.tccn.dbq.Field;
|
import net.tccn.dbq.Field;
|
||||||
import net.tccn.dbq.fbean.FilterType;
|
import net.tccn.dbq.fbean.FilterType;
|
||||||
|
|
||||||
@@ -13,6 +13,7 @@ import java.util.Map;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Predicate;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -25,14 +26,14 @@ public class MetaKit {
|
|||||||
private static List<MetaLink> metaLinks;
|
private static List<MetaLink> metaLinks;
|
||||||
private static List<MetaService> metaServices;
|
private static List<MetaService> metaServices;
|
||||||
|
|
||||||
private static List<DbPlat> dbPlats;
|
private static List<DbAccount> dbPlats;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
metaTables = MetaTable.dao.find();
|
metaTables = MetaTable.dao.find();
|
||||||
metaLinks = MetaLink.dao.find();
|
metaLinks = MetaLink.dao.find();
|
||||||
metaServices = MetaService.dao.find();
|
metaServices = MetaService.dao.find();
|
||||||
|
|
||||||
dbPlats = DbPlat.dao.find();
|
dbPlats = DbAccount.dao.find();
|
||||||
}
|
}
|
||||||
|
|
||||||
//----- get/set ----
|
//----- get/set ----
|
||||||
@@ -56,11 +57,11 @@ public class MetaKit {
|
|||||||
return metaServices;
|
return metaServices;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<DbPlat> getDbPlats() {
|
public static List<DbAccount> getDbPlats() {
|
||||||
return dbPlats;
|
return dbPlats;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setDbPlats(List<DbPlat> dbPlats) {
|
public static void setDbPlats(List<DbAccount> dbPlats) {
|
||||||
MetaKit.dbPlats = dbPlats;
|
MetaKit.dbPlats = dbPlats;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,7 +75,7 @@ public class MetaKit {
|
|||||||
* @param alias
|
* @param alias
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private static MetaTable metaTableByAlias(String alias) {
|
public static MetaTable getMetaTableByAlias(String alias) {
|
||||||
Optional<MetaTable> table = metaTables.stream().filter(x -> x.getAlias().equals(alias)).findAny();
|
Optional<MetaTable> table = metaTables.stream().filter(x -> x.getAlias().equals(alias)).findAny();
|
||||||
return table.orElse(null);
|
return table.orElse(null);
|
||||||
}
|
}
|
||||||
@@ -114,9 +115,9 @@ public class MetaKit {
|
|||||||
Optional<MetaService> service = metaServices.stream().filter(x -> x.getName().equals(name)).findAny();
|
Optional<MetaService> service = metaServices.stream().filter(x -> x.getName().equals(name)).findAny();
|
||||||
//处理业务逻辑
|
//处理业务逻辑
|
||||||
service.ifPresent(x -> {
|
service.ifPresent(x -> {
|
||||||
x.setMetaTable(metaTableByAlias(x.getTable()));
|
//x.setMetaTable(metaTableByAlias(x.getTable()));
|
||||||
x.setMetaLinks(metaLinks(x.getLinks()));
|
//x.setMetaLinks(metaLinks(x.getLinks()));
|
||||||
x.setTables(metaTables(x.getMetaLinks()));
|
//x.setTables(metaTables(x.getMetaLinks()));
|
||||||
});
|
});
|
||||||
return service.orElse(null);
|
return service.orElse(null);
|
||||||
}
|
}
|
||||||
@@ -149,7 +150,7 @@ public class MetaKit {
|
|||||||
|
|
||||||
public static Function<String, Field> getField = (n) -> {
|
public static Function<String, Field> getField = (n) -> {
|
||||||
String[] arr = n.split("[.]");
|
String[] arr = n.split("[.]");
|
||||||
MetaTable metaTable = metaTableByAlias(arr[0]);
|
MetaTable metaTable = getMetaTableByAlias(arr[0]);
|
||||||
return metaTable.getItems().stream().filter(x -> x.getName().equals(arr[1])).findAny().orElse(null);
|
return metaTable.getItems().stream().filter(x -> x.getName().equals(arr[1])).findAny().orElse(null);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -229,8 +230,51 @@ public class MetaKit {
|
|||||||
return t;
|
return t;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//showUpdate
|
||||||
|
public static BiFunction<String, List<String>, MetaService> showUpdate = (serviceKey, shows) -> {
|
||||||
|
|
||||||
|
MetaService metaService = metaService(serviceKey);
|
||||||
|
|
||||||
|
MetaService _metaService = MetaService.dao.findByKey(metaService.getKey());
|
||||||
|
_metaService.setShows(shows);
|
||||||
|
_metaService.update();
|
||||||
|
|
||||||
|
metaService.setShows(shows);//更新缓存
|
||||||
|
return metaService;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
public static MetaTable getMetaTableByKey(String key) {
|
public static MetaTable getMetaTableByKey(String key) {
|
||||||
return metaTables.stream().filter(x -> x.getKey().equals(key)).findAny().orElse(null);
|
return metaTables.stream().filter(x -> x.getKey().equals(key)).findAny().orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<MetaLink> getMetaLinks(String t, List<String> shows, List<String> filters) {
|
||||||
|
|
||||||
|
|
||||||
|
Predicate<String> contain = s -> {
|
||||||
|
for (String item : shows) {
|
||||||
|
if (s.equals(item.split("[.]")[0])) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (String item : filters) {
|
||||||
|
if (s.equals(item.split("[.]")[0])) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//得到直接关联
|
||||||
|
//1、直接关联 表: t.equals(x.getTables()[0]) || t.equals(x.getTables()[1]
|
||||||
|
//2、关联且有过滤:
|
||||||
|
//3、关联有展示:
|
||||||
|
List<MetaLink> links = metaLinks.stream()
|
||||||
|
.filter(x -> {
|
||||||
|
return (t.equals(x.getTables()[0]) || t.equals(x.getTables()[1]))
|
||||||
|
&& (contain.test(x.getTables()[0]) || contain.test(x.getTables()[1]));
|
||||||
|
})
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
return links;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
7
src/main/java/net/tccn/meta/MetaParser.java
Normal file
7
src/main/java/net/tccn/meta/MetaParser.java
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
package net.tccn.meta;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by liangxianyou at 2019/3/7 16:13.
|
||||||
|
*/
|
||||||
|
public class MetaParser {
|
||||||
|
}
|
||||||
@@ -16,7 +16,8 @@ public class MetaService extends Doc<MetaService> {
|
|||||||
|
|
||||||
private String name; //业务标识
|
private String name; //业务标识
|
||||||
private String table; //主体表别名
|
private String table; //主体表别名
|
||||||
private List<String> links; //["link._key1","link._key2"]
|
private String comment; //业务中文名
|
||||||
|
//private List<String> links; //["link._key1","link._key2"]
|
||||||
|
|
||||||
|
|
||||||
private List<String> shows = new ArrayList<>();
|
private List<String> shows = new ArrayList<>();
|
||||||
@@ -24,9 +25,9 @@ public class MetaService extends Doc<MetaService> {
|
|||||||
private List<Map> filters = new ArrayList<>();
|
private List<Map> filters = new ArrayList<>();
|
||||||
|
|
||||||
//待组装数据
|
//待组装数据
|
||||||
private MetaTable metaTable;
|
//private MetaTable metaTable;
|
||||||
private List<MetaLink> metaLinks;//[{alias:"b", table:"dept", link:[mk,lk]}, xxxx]
|
//private List<MetaLink> metaLinks;//[{alias:"b", table:"dept", link:[mk,lk]}, xxxx]
|
||||||
private Map<String, MetaTable> tables;
|
//private Map<String, MetaTable> tables;
|
||||||
//-------------------------------------------
|
//-------------------------------------------
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
@@ -45,13 +46,21 @@ public class MetaService extends Doc<MetaService> {
|
|||||||
this.table = table;
|
this.table = table;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> getLinks() {
|
public String getComment() {
|
||||||
|
return comment;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setComment(String comment) {
|
||||||
|
this.comment = comment;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*public List<String> getLinks() {
|
||||||
return links;
|
return links;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setLinks(List<String> links) {
|
public void setLinks(List<String> links) {
|
||||||
this.links = links;
|
this.links = links;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
public List<String> getShows() {
|
public List<String> getShows() {
|
||||||
return shows;
|
return shows;
|
||||||
@@ -77,27 +86,27 @@ public class MetaService extends Doc<MetaService> {
|
|||||||
this.filters = filters;
|
this.filters = filters;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MetaTable getMetaTable() {
|
/*public MetaTable getMetaTable() {
|
||||||
return metaTable;
|
return metaTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMetaTable(MetaTable metaTable) {
|
public void setMetaTable(MetaTable metaTable) {
|
||||||
this.metaTable = metaTable;
|
this.metaTable = metaTable;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
public List<MetaLink> getMetaLinks() {
|
/*public List<MetaLink> getMetaLinks() {
|
||||||
return metaLinks;
|
return metaLinks;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMetaLinks(List<MetaLink> metaLinks) {
|
public void setMetaLinks(List<MetaLink> metaLinks) {
|
||||||
this.metaLinks = metaLinks;
|
this.metaLinks = metaLinks;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
public Map<String, MetaTable> getTables() {
|
/*public Map<String, MetaTable> getTables() {
|
||||||
return tables;
|
return tables;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTables(Map<String, MetaTable> tables) {
|
public void setTables(Map<String, MetaTable> tables) {
|
||||||
this.tables = tables;
|
this.tables = tables;
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|||||||
7
src/main/java/net/tccn/meta/Task.java
Normal file
7
src/main/java/net/tccn/meta/Task.java
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
package net.tccn.meta;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by liangxianyou at 2019/3/7 16:24.
|
||||||
|
*/
|
||||||
|
public class Task {
|
||||||
|
}
|
||||||
@@ -7,7 +7,7 @@ import net.tccn.qtask.impl.QTaskMysql;
|
|||||||
|
|
||||||
public class QRuner {
|
public class QRuner {
|
||||||
|
|
||||||
public static Object query(E e) {
|
public static Object query(Task e) {
|
||||||
switch (e.cate.toLowerCase()) {
|
switch (e.cate.toLowerCase()) {
|
||||||
case "mysql":
|
case "mysql":
|
||||||
return new QTaskMysql(e).execute();
|
return new QTaskMysql(e).execute();
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package net.tccn.qtask;
|
package net.tccn.qtask;
|
||||||
|
|
||||||
public interface QTask {
|
public interface QTask {
|
||||||
E getE();
|
Task getE();
|
||||||
|
|
||||||
Object execute();
|
Object execute();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ import net.tccn.base.Kv;
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class E {
|
public class Task {
|
||||||
|
|
||||||
public String cate;//MYSQL,ES,METHOD,HTTP
|
public String cate;//MYSQL,ES,METHOD,HTTP
|
||||||
public String queryId;
|
public String queryId;
|
||||||
@@ -32,12 +32,21 @@ public class E {
|
|||||||
|
|
||||||
public String restType;//List, Map
|
public String restType;//List, Map
|
||||||
|
|
||||||
public E(String cate, String queryId, String comment, Kv para) {
|
public Task() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task(String cate, String queryId, String comment, Kv para) {
|
||||||
this.cate = cate;
|
this.cate = cate;
|
||||||
this.queryId = queryId;
|
this.queryId = queryId;
|
||||||
this.comment = comment;
|
this.comment = comment;
|
||||||
this.para = para;
|
this.para = para;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void t() {
|
||||||
|
Task task = new Task();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,18 +1,18 @@
|
|||||||
package net.tccn.qtask.impl;
|
package net.tccn.qtask.impl;
|
||||||
|
|
||||||
import net.tccn.qtask.E;
|
import net.tccn.qtask.Task;
|
||||||
import net.tccn.qtask.QTask;
|
import net.tccn.qtask.QTask;
|
||||||
|
|
||||||
public abstract class QTaskAbs implements QTask {
|
public abstract class QTaskAbs implements QTask {
|
||||||
|
|
||||||
private E e;
|
private Task e;
|
||||||
|
|
||||||
public QTaskAbs(E e) {
|
public QTaskAbs(Task e) {
|
||||||
this.e = e;
|
this.e = e;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public E getE() {
|
public Task getE() {
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
package net.tccn.qtask.impl;
|
package net.tccn.qtask.impl;
|
||||||
|
|
||||||
import net.tccn.qtask.E;
|
import net.tccn.qtask.Task;
|
||||||
import net.tccn.qtask.QRuner;
|
import net.tccn.qtask.QRuner;
|
||||||
import net.tccn.base.Kv;
|
import net.tccn.base.Kv;
|
||||||
|
|
||||||
public class QTaskEs extends QTaskAbs {
|
public class QTaskEs extends QTaskAbs {
|
||||||
|
|
||||||
public QTaskEs(E e) {
|
public QTaskEs(Task e) {
|
||||||
super(e);
|
super(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -19,6 +19,6 @@ public class QTaskEs extends QTaskAbs {
|
|||||||
});
|
});
|
||||||
|
|
||||||
String _url = url.toString().replaceAll(" ", "%20");
|
String _url = url.toString().replaceAll(" ", "%20");
|
||||||
return QRuner.query(new E("http", _url, "", Kv.of()));
|
return QRuner.query(new Task("http", _url, "", Kv.of()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package net.tccn.qtask.impl;
|
package net.tccn.qtask.impl;
|
||||||
|
|
||||||
import net.tccn.qtask.E;
|
import net.tccn.qtask.Task;
|
||||||
import net.tccn.qtask.QTask;
|
import net.tccn.qtask.QTask;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
@@ -13,7 +13,7 @@ import java.util.Map;
|
|||||||
*/
|
*/
|
||||||
public class QTaskHttp extends QTaskAbs implements QTask {
|
public class QTaskHttp extends QTaskAbs implements QTask {
|
||||||
|
|
||||||
public QTaskHttp(E e) {
|
public QTaskHttp(Task e) {
|
||||||
super(e);
|
super(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package net.tccn.qtask.impl;
|
package net.tccn.qtask.impl;
|
||||||
|
|
||||||
import net.tccn.qtask.E;
|
import net.tccn.qtask.Task;
|
||||||
import net.tccn.base.Kv;
|
import net.tccn.base.Kv;
|
||||||
import net.tccn.qtask.QTask;
|
import net.tccn.qtask.QTask;
|
||||||
|
|
||||||
@@ -9,7 +9,7 @@ import java.lang.reflect.Method;
|
|||||||
|
|
||||||
public class QTaskMethod extends QTaskAbs implements QTask {
|
public class QTaskMethod extends QTaskAbs implements QTask {
|
||||||
|
|
||||||
public QTaskMethod(E e) {
|
public QTaskMethod(Task e) {
|
||||||
super(e);
|
super(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
package net.tccn.qtask.impl;
|
package net.tccn.qtask.impl;
|
||||||
|
|
||||||
import net.tccn.qtask.E;
|
import net.tccn.qtask.Task;
|
||||||
import net.tccn.qtask.QTask;
|
import net.tccn.qtask.QTask;
|
||||||
|
|
||||||
public class QTaskMysql extends QTaskAbs implements QTask {
|
public class QTaskMysql extends QTaskAbs implements QTask {
|
||||||
|
|
||||||
private Object mapper;
|
private Object mapper;
|
||||||
|
|
||||||
public QTaskMysql(E e) {
|
public QTaskMysql(Task e) {
|
||||||
super(e);
|
super(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package net.tccn.service;
|
|||||||
|
|
||||||
import net.tccn.base.JBean;
|
import net.tccn.base.JBean;
|
||||||
import net.tccn.base.Kv;
|
import net.tccn.base.Kv;
|
||||||
import net.tccn.dbq.DbPlat;
|
import net.tccn.dbq.jdbc.api.DbAccount;
|
||||||
import net.tccn.dbq.Field;
|
import net.tccn.dbq.Field;
|
||||||
import net.tccn.dbq.qtask.SysPlat;
|
import net.tccn.dbq.qtask.SysPlat;
|
||||||
import net.tccn.meta.MetaKit;
|
import net.tccn.meta.MetaKit;
|
||||||
@@ -58,7 +58,7 @@ public class MetadataService extends BaseService { //arango
|
|||||||
|
|
||||||
//----------- 数据平台 ---------------
|
//----------- 数据平台 ---------------
|
||||||
@RestMapping(name = "db_plat_list", comment = "数据平台")
|
@RestMapping(name = "db_plat_list", comment = "数据平台")
|
||||||
public List<DbPlat> dbPlatList() {
|
public List<DbAccount> dbPlatList() {
|
||||||
return MetaKit.getDbPlats();
|
return MetaKit.getDbPlats();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,6 +98,17 @@ public class MetadataService extends BaseService { //arango
|
|||||||
return jBean.setBody(list);
|
return jBean.setBody(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@RestMapping(name = "service_list", comment = "业务列表")
|
||||||
|
public JBean serviceList(@RestParam(name = "platToken") String token) {
|
||||||
|
JBean jBean = new JBean();
|
||||||
|
|
||||||
|
List<MetaService> list = MetaKit.getMetaServices();
|
||||||
|
jBean.setBody(list);
|
||||||
|
|
||||||
|
return jBean;
|
||||||
|
}
|
||||||
|
|
||||||
@RestMapping(name = "tableinfo", comment = "table详情")
|
@RestMapping(name = "tableinfo", comment = "table详情")
|
||||||
public JBean tableInfo(@RestParam(name = "platToken") String token, String name) {
|
public JBean tableInfo(@RestParam(name = "platToken") String token, String name) {
|
||||||
return JBean.by(0, "", findMetaTable(name, token));
|
return JBean.by(0, "", findMetaTable(name, token));
|
||||||
@@ -126,9 +137,8 @@ public class MetadataService extends BaseService { //arango
|
|||||||
public List<String> showSort(String serviceKey , List<String> items, @RestParam(name = "platToken") String token) {
|
public List<String> showSort(String serviceKey , List<String> items, @RestParam(name = "platToken") String token) {
|
||||||
if (items == null || items.size() == 0) return null;
|
if (items == null || items.size() == 0) return null;
|
||||||
|
|
||||||
MetaTable metaTable = findMetaTable(serviceKey, token);
|
MetaKit.showUpdate.apply(serviceKey, items);
|
||||||
//fixme: metaTable.setShows(items);
|
|
||||||
metaTable.update();
|
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,15 +2,13 @@ package net.tccn.service;
|
|||||||
|
|
||||||
import net.tccn.base.JBean;
|
import net.tccn.base.JBean;
|
||||||
import net.tccn.base.Kv;
|
import net.tccn.base.Kv;
|
||||||
import net.tccn.base.arango.ArangoSource;
|
import net.tccn.dbq.jdbc.api.DbAccount;
|
||||||
import net.tccn.dbq.DbPlat;
|
|
||||||
import net.tccn.dbq.qtask.Qtask;
|
import net.tccn.dbq.qtask.Qtask;
|
||||||
import net.tccn.dbq.qtask.SysPlat;
|
import net.tccn.dbq.qtask.SysPlat;
|
||||||
import org.redkale.net.http.RestMapping;
|
import org.redkale.net.http.RestMapping;
|
||||||
import org.redkale.net.http.RestParam;
|
import org.redkale.net.http.RestParam;
|
||||||
import org.redkale.net.http.RestService;
|
import org.redkale.net.http.RestService;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
@@ -71,7 +69,7 @@ public class QtaskService extends BaseService {
|
|||||||
jBean.set(-1, "查询失败,请设置正确的【数据平台】"); break;
|
jBean.set(-1, "查询失败,请设置正确的【数据平台】"); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
DbPlat dbPlat = DbPlat.dao.findByKey(qtask.getPlatId());//arangoSource.findById("db_plat/" + qTask.getPlatId(), DbPlat.class);
|
DbAccount dbPlat = DbAccount.dao.findByKey(qtask.getPlatId());//arangoSource.findById("db_plat/" + qTask.getPlatId(), DbAccount.class);
|
||||||
if (dbPlat == null) {
|
if (dbPlat == null) {
|
||||||
jBean.set(-1, "查询失败,请设置正确的【数据平台】"); break;
|
jBean.set(-1, "查询失败,请设置正确的【数据平台】"); break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +1,28 @@
|
|||||||
import net.tccn.qtask.E;
|
import com.google.gson.Gson;
|
||||||
import net.tccn.qtask.QRuner;
|
|
||||||
import net.tccn.base.Kv;
|
import net.tccn.base.Kv;
|
||||||
|
import net.tccn.base.RealType;
|
||||||
|
import net.tccn.dbq.fbean.FBean;
|
||||||
|
import net.tccn.dbq.fbean.ParseMysql;
|
||||||
|
import net.tccn.dbq.jdbc.api.DbAccount;
|
||||||
|
import net.tccn.dbq.jdbc.api.DbKit;
|
||||||
|
import net.tccn.qtask.QRuner;
|
||||||
|
import net.tccn.qtask.Task;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author: liangxianyou at 2019/1/20 12:43.
|
* @author: liangxianyou at 2019/1/20 12:43.
|
||||||
*/
|
*/
|
||||||
public class RunTest<T> {
|
public class RunTest<T> {
|
||||||
|
|
||||||
public static E A = new E("mysql", "select * from user where userid=#(userid)", "查询用户列表", Kv.of("userid", 1));
|
public static Task A = new Task("mysql", "select * from user where userid=#(userid)", "查询用户列表", Kv.of("userid", 1));
|
||||||
public static E B = new E("method", "User.say", "user调用", Kv.of("name", "张三").set("age", 13));
|
public static Task B = new Task("method", "User.say", "user调用", Kv.of("name", "张三").set("age", 13));
|
||||||
public static E C = new E("http", "http://127.0.0.1/meta/db_plat_list?platToken=3421432", "查询数据平台列表", Kv.of("abx", "abx111"));
|
public static Task C = new Task("http", "http://127.0.0.1/meta/db_plat_list?platToken=3421432", "查询数据平台列表", Kv.of("abx", "abx111"));
|
||||||
public static E d = new E("es", "http://192.168.91.5:9200/_sql?", "查询数据平台列表", Kv.of("sql", "select * from basic_iotdevice_all limit 10"));
|
public static Task d = new Task("es", "http://192.168.91.5:9200/_sql?", "查询数据平台列表", Kv.of("sql", "select * from basic_iotdevice_all limit 10"));
|
||||||
public static E e = new E("http", "http://192.168.91.5:9200/_sql?sql=select%20*%20from%20basic_iotdevice_all%20limit%2010", "查询数据平台列表", Kv.of());
|
public static Task e = new Task("http", "http://192.168.91.5:9200/_sql?sql=select%20*%20from%20basic_iotdevice_all%20limit%2010", "查询数据平台列表", Kv.of());
|
||||||
|
|
||||||
//@Test
|
//@Test
|
||||||
public void t() {
|
public void t() {
|
||||||
@@ -26,4 +36,66 @@ public class RunTest<T> {
|
|||||||
|
|
||||||
//System.out.println(query.getClass());
|
//System.out.println(query.getClass());
|
||||||
}
|
}
|
||||||
|
ParseMysql parser = new ParseMysql();
|
||||||
|
@Test
|
||||||
|
public void t2() {
|
||||||
|
FBean fBean = new Gson().fromJson("{name:'user_service', filters:[{col:'a.username',type:'like',value:'lxy'}], orders:[{col:a.`id`,desc: -1},{col:a.`deptName`,desc: 1}], limit:{ps:2,pn:10}}", FBean.class);
|
||||||
|
|
||||||
|
String[] parse = parser.parse(fBean);
|
||||||
|
|
||||||
|
System.out.println("count:" + parse[0]);
|
||||||
|
System.out.println("list:" + parse[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void jdbcTest() {
|
||||||
|
//DbAccount jdbcAccount = new DbAccount("jdbc:mysql://192.168.202.11:3306/gxbii_dev", "root", "eversec123098");
|
||||||
|
DbAccount dbAccount = new DbAccount();
|
||||||
|
dbAccount.setCate("mysql");
|
||||||
|
dbAccount.setUrl("jdbc:mysql://192.168.202.11:3306/gxbii_dev");
|
||||||
|
dbAccount.setUser("root");
|
||||||
|
dbAccount.setPwd("eversec123098");
|
||||||
|
|
||||||
|
DbKit dbKit = new DbKit(dbAccount);
|
||||||
|
|
||||||
|
// find list
|
||||||
|
List<Map> list = dbKit.findList("select * from basic_concat limit 1", Map.class);
|
||||||
|
System.out.println(list.get(0));
|
||||||
|
|
||||||
|
|
||||||
|
//find count
|
||||||
|
/*long total = dbKit.queryColumn("select count(1) from basic_device", long.class);
|
||||||
|
System.out.println(total);
|
||||||
|
System.out.println(int.class);*/
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void toAsTest() {
|
||||||
|
Date date = Kv.toAs("2019-03-17 12:11:12", Date.class);
|
||||||
|
System.out.println(date);
|
||||||
|
System.out.println("--------------");
|
||||||
|
Long aLong = Kv.toAs("34132213", Long.class);
|
||||||
|
System.out.println(aLong);
|
||||||
|
|
||||||
|
System.out.println("--------------");
|
||||||
|
Integer integer = Kv.toAs("34132213", Integer.class);
|
||||||
|
System.out.println(integer);
|
||||||
|
|
||||||
|
System.out.println("--------------");
|
||||||
|
Short aShort = Kv.toAs("121", short.class);
|
||||||
|
System.out.println(aShort);
|
||||||
|
|
||||||
|
System.out.println("--------------");
|
||||||
|
Double aDouble = Kv.toAs("4658132213", double.class);
|
||||||
|
System.out.println(aDouble);
|
||||||
|
|
||||||
|
System.out.println("--------------");
|
||||||
|
String s = Kv.toAs("4658132213", String.class);
|
||||||
|
System.out.println(s);
|
||||||
|
|
||||||
|
System.out.println("--------------");
|
||||||
|
Date date1 = Kv.toAs("Sun Mar 17 12:11:12 CST 2019", Date.class);
|
||||||
|
System.out.println(date1);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import net.tccn.base.Kv;
|
|||||||
public class User {
|
public class User {
|
||||||
private int id;
|
private int id;
|
||||||
private String IP;
|
private String IP;
|
||||||
|
private String platContact;
|
||||||
|
private String idType;
|
||||||
|
|
||||||
public int getId() {
|
public int getId() {
|
||||||
return id;
|
return id;
|
||||||
@@ -23,10 +25,36 @@ public class User {
|
|||||||
this.IP = IP;
|
this.IP = IP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getPlatContact() {
|
||||||
|
return platContact;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPlatContact(String platContact) {
|
||||||
|
this.platContact = platContact;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getIdType() {
|
||||||
|
return idType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIdType(String idType) {
|
||||||
|
this.idType = idType;
|
||||||
|
}
|
||||||
|
|
||||||
public String say(Kv kv) {
|
public String say(Kv kv) {
|
||||||
String s = String.format("我叫:%s, 今年:%s岁", kv.get("name"), kv.get("age"));
|
String s = String.format("我叫:%s, 今年:%s岁", kv.get("name"), kv.get("age"));
|
||||||
System.out.println(s);
|
System.out.println(s);
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "User{" +
|
||||||
|
"id=" + id +
|
||||||
|
", IP='" + IP + '\'' +
|
||||||
|
", platContact='" + platContact + '\'' +
|
||||||
|
", idType='" + idType + '\'' +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user