.
This commit is contained in:
236
src/main/java/net/tccn/meta/MetaKit.java
Normal file
236
src/main/java/net/tccn/meta/MetaKit.java
Normal file
@@ -0,0 +1,236 @@
|
||||
package net.tccn.meta;
|
||||
|
||||
import net.tccn.base.Kv;
|
||||
import net.tccn.dbq.DbPlat;
|
||||
import net.tccn.dbq.Field;
|
||||
import net.tccn.dbq.fbean.FilterType;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
*
|
||||
* Created by liangxianyou at 2019/1/7 13:31.
|
||||
*/
|
||||
public class MetaKit {
|
||||
//基础数据缓存
|
||||
private static List<MetaTable> metaTables;
|
||||
private static List<MetaLink> metaLinks;
|
||||
private static List<MetaService> metaServices;
|
||||
|
||||
private static List<DbPlat> dbPlats;
|
||||
|
||||
static {
|
||||
metaTables = MetaTable.dao.find();
|
||||
metaLinks = MetaLink.dao.find();
|
||||
metaServices = MetaService.dao.find();
|
||||
|
||||
dbPlats = DbPlat.dao.find();
|
||||
}
|
||||
|
||||
//----- get/set ----
|
||||
public static List<MetaTable> getMetaTables() {
|
||||
return metaTables;
|
||||
}
|
||||
|
||||
public static void setMetaTables(List<MetaTable> metaTables) {
|
||||
MetaKit.metaTables = metaTables;
|
||||
}
|
||||
|
||||
public static List<MetaLink> getMetaLinks() {
|
||||
return metaLinks;
|
||||
}
|
||||
|
||||
public static void setMetaLinks(List<MetaLink> metaLinks) {
|
||||
MetaKit.metaLinks = metaLinks;
|
||||
}
|
||||
|
||||
public static List<MetaService> getMetaServices() {
|
||||
return metaServices;
|
||||
}
|
||||
|
||||
public static List<DbPlat> getDbPlats() {
|
||||
return dbPlats;
|
||||
}
|
||||
|
||||
public static void setDbPlats(List<DbPlat> dbPlats) {
|
||||
MetaKit.dbPlats = dbPlats;
|
||||
}
|
||||
|
||||
//-----------------------------------
|
||||
public static void setMetaServices(List<MetaService> metaServices) {
|
||||
MetaKit.metaServices = metaServices;
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过 别名 查询 MetaTable
|
||||
* @param alias
|
||||
* @return
|
||||
*/
|
||||
private static MetaTable metaTableByAlias(String alias) {
|
||||
Optional<MetaTable> table = metaTables.stream().filter(x -> x.getAlias().equals(alias)).findAny();
|
||||
return table.orElse(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过 MetaLink[] 得到 MetaTable{}
|
||||
* @param links
|
||||
* @return {alias:table}
|
||||
*/
|
||||
private static Map<String, MetaTable> metaTables(List<MetaLink> links) {
|
||||
Map map = new HashMap();
|
||||
List<String> tables = links.stream().map(MetaLink::getTables).flatMap(Arrays::stream).distinct().collect(Collectors.toList());//tables
|
||||
metaTables.stream().filter(x -> tables.contains(x.getAlias())).forEach(x -> {
|
||||
map.put(x.getAlias(), x);
|
||||
});
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过 link._key 得到 MetaLink[]
|
||||
* @param links
|
||||
* @return
|
||||
*/
|
||||
private static List<MetaLink> metaLinks(List<String> links) {
|
||||
if (links == null) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
return metaLinks.stream().filter(x -> links.contains(x.getKey())).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建完整的 MetaService
|
||||
* @param name
|
||||
* @return
|
||||
*/
|
||||
public static MetaService metaService(String name) {
|
||||
Optional<MetaService> service = metaServices.stream().filter(x -> x.getName().equals(name)).findAny();
|
||||
//处理业务逻辑
|
||||
service.ifPresent(x -> {
|
||||
x.setMetaTable(metaTableByAlias(x.getTable()));
|
||||
x.setMetaLinks(metaLinks(x.getLinks()));
|
||||
x.setTables(metaTables(x.getMetaLinks()));
|
||||
});
|
||||
return service.orElse(null);
|
||||
}
|
||||
|
||||
//字段特征排序
|
||||
public static BiFunction<MetaTable, String[], MetaTable> sortItem = (t, arr) -> {
|
||||
List<Field> items = t.getItems();
|
||||
|
||||
//x 是跨越值
|
||||
a:for (int i = 0, x = 0; i < arr.length; i++) {
|
||||
int inx = i - x;
|
||||
|
||||
if (!items.get(inx).equals(arr[i])) {
|
||||
Field tmp = items.get(inx);
|
||||
for (int j = inx + 1; j < items.size(); j++) {
|
||||
if (items.get(j).equals(arr[i])) {
|
||||
items.set(inx, items.get(j));
|
||||
items.set(j, tmp);
|
||||
continue a;
|
||||
}
|
||||
}
|
||||
|
||||
//运行到这里,说明在 list 中找不到排序标识对应的数据, 让排序角标差值+1
|
||||
x ++;
|
||||
}
|
||||
}
|
||||
t.setItems(items);
|
||||
return t;
|
||||
};
|
||||
|
||||
public static Function<String, Field> getField = (n) -> {
|
||||
String[] arr = n.split("[.]");
|
||||
MetaTable metaTable = metaTableByAlias(arr[0]);
|
||||
return metaTable.getItems().stream().filter(x -> x.getName().equals(arr[1])).findAny().orElse(null);
|
||||
};
|
||||
|
||||
//listcfg
|
||||
public static Function<MetaService, Kv> builderCfg = (m) -> {
|
||||
List<String> shows = m.getShows();
|
||||
List<Map> filters = m.getFilters();
|
||||
|
||||
List<Map> _filters = new ArrayList<>();
|
||||
List<Map> _cols = new ArrayList<>();
|
||||
|
||||
//todo: 优化,批量操作
|
||||
//build shows
|
||||
shows.forEach(x -> {
|
||||
Field field = getField.apply(x);
|
||||
if (field != null) {
|
||||
Kv col = Kv.of();
|
||||
col.set("col", x.split("[.]]")[0] + field.showField());//a.createtime=dt
|
||||
col.set("label", field.getLabel());
|
||||
col.set("order", 1);//dev 是否支持排序
|
||||
_cols.add(col);
|
||||
}
|
||||
});
|
||||
|
||||
//build filters
|
||||
filters.forEach(x -> {
|
||||
Kv filter = Kv.of();
|
||||
Field filed = getField.apply(x.get("name") + "");
|
||||
|
||||
if (filed != null) {
|
||||
filter.set("name", x.get("name"));
|
||||
filter.set("label", filed.getLabel());
|
||||
}
|
||||
|
||||
filter.set("inType", filed.getInType());
|
||||
filter.set("inExt", filed.getInExt());
|
||||
|
||||
List<Kv> types = new ArrayList<>();
|
||||
List<String> list = (List) x.get("filterType");
|
||||
list.forEach(t -> {
|
||||
FilterType type = FilterType.getFilterType(t);
|
||||
if (type != null) {
|
||||
types.add(Kv.of("name", t).set("remark", type.getRemark()));
|
||||
}
|
||||
});
|
||||
|
||||
filter.set("filterType", types);
|
||||
Object checked = x.getOrDefault("checked", false);
|
||||
filter.set("checked", checked instanceof Boolean ? checked : false);
|
||||
_filters.add(filter);
|
||||
});
|
||||
|
||||
/*shows.forEach(x -> {
|
||||
_shows.add(Kv.of("name", x).set("label", getFieldLabel(x)));
|
||||
});*/
|
||||
|
||||
Kv cfg = Kv.of();
|
||||
cfg.set("title", m.getName())//业务名称
|
||||
//.set("url", getUrl())
|
||||
.set("cols", _cols)//展示的数据列
|
||||
//.set("conditionLabel", "")
|
||||
.set("filters", _filters);//查询过滤条件
|
||||
|
||||
return cfg;
|
||||
};
|
||||
|
||||
//itemUpdate
|
||||
public static BiFunction<MetaTable, List<Field>, MetaTable> itemUpdate = (t, fields) -> {
|
||||
List<Field> items = t.getItems();
|
||||
for (int i = 0; i < fields.size(); i++) {
|
||||
for (int j = 0; j < items.size(); j++) {
|
||||
if (items.get(j).equals(fields.get(i).getName())) {
|
||||
items.set(j, fields.get(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
return t;
|
||||
};
|
||||
|
||||
|
||||
public static MetaTable getMetaTableByKey(String key) {
|
||||
return metaTables.stream().filter(x -> x.getKey().equals(key)).findAny().orElse(null);
|
||||
};
|
||||
}
|
||||
35
src/main/java/net/tccn/meta/MetaLink.java
Normal file
35
src/main/java/net/tccn/meta/MetaLink.java
Normal file
@@ -0,0 +1,35 @@
|
||||
package net.tccn.meta;
|
||||
|
||||
import net.tccn.base.arango.Doc;
|
||||
|
||||
import javax.persistence.Table;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Created by liangxianyou at 2018/12/25 16:22.
|
||||
*/
|
||||
@Table(name = "MetaLink", catalog = "db_demo")
|
||||
public class MetaLink extends Doc<MetaLink> {
|
||||
public static MetaLink dao = Doc.dao(MetaLink.class);
|
||||
|
||||
private String[] tables;
|
||||
private Map link;
|
||||
|
||||
//-------------------------------------------
|
||||
|
||||
public String[] getTables() {
|
||||
return tables;
|
||||
}
|
||||
|
||||
public void setTables(String[] tables) {
|
||||
this.tables = tables;
|
||||
}
|
||||
|
||||
public Map getLink() {
|
||||
return link;
|
||||
}
|
||||
|
||||
public void setLink(Map link) {
|
||||
this.link = link;
|
||||
}
|
||||
}
|
||||
103
src/main/java/net/tccn/meta/MetaService.java
Normal file
103
src/main/java/net/tccn/meta/MetaService.java
Normal file
@@ -0,0 +1,103 @@
|
||||
package net.tccn.meta;
|
||||
|
||||
import net.tccn.base.arango.Doc;
|
||||
|
||||
import javax.persistence.Table;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Created by liangxianyou at 2018/12/24 16:15.
|
||||
*/
|
||||
@Table(name = "MetaService", catalog = "db_demo")
|
||||
public class MetaService extends Doc<MetaService> {
|
||||
public static MetaService dao = Doc.dao(MetaService.class);
|
||||
|
||||
private String name; //业务标识
|
||||
private String table; //主体表别名
|
||||
private List<String> links; //["link._key1","link._key2"]
|
||||
|
||||
|
||||
private List<String> shows = new ArrayList<>();
|
||||
private List<String> edits = new ArrayList<>();
|
||||
private List<Map> filters = new ArrayList<>();
|
||||
|
||||
//待组装数据
|
||||
private MetaTable metaTable;
|
||||
private List<MetaLink> metaLinks;//[{alias:"b", table:"dept", link:[mk,lk]}, xxxx]
|
||||
private Map<String, MetaTable> tables;
|
||||
//-------------------------------------------
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getTable() {
|
||||
return table;
|
||||
}
|
||||
|
||||
public void setTable(String table) {
|
||||
this.table = table;
|
||||
}
|
||||
|
||||
public List<String> getLinks() {
|
||||
return links;
|
||||
}
|
||||
|
||||
public void setLinks(List<String> links) {
|
||||
this.links = links;
|
||||
}
|
||||
|
||||
public List<String> getShows() {
|
||||
return shows;
|
||||
}
|
||||
|
||||
public void setShows(List<String> shows) {
|
||||
this.shows = shows;
|
||||
}
|
||||
|
||||
public List<String> getEdits() {
|
||||
return edits;
|
||||
}
|
||||
|
||||
public void setEdits(List<String> edits) {
|
||||
this.edits = edits;
|
||||
}
|
||||
|
||||
public List<Map> getFilters() {
|
||||
return filters;
|
||||
}
|
||||
|
||||
public void setFilters(List<Map> filters) {
|
||||
this.filters = filters;
|
||||
}
|
||||
|
||||
public MetaTable getMetaTable() {
|
||||
return metaTable;
|
||||
}
|
||||
|
||||
public void setMetaTable(MetaTable metaTable) {
|
||||
this.metaTable = metaTable;
|
||||
}
|
||||
|
||||
public List<MetaLink> getMetaLinks() {
|
||||
return metaLinks;
|
||||
}
|
||||
|
||||
public void setMetaLinks(List<MetaLink> metaLinks) {
|
||||
this.metaLinks = metaLinks;
|
||||
}
|
||||
|
||||
public Map<String, MetaTable> getTables() {
|
||||
return tables;
|
||||
}
|
||||
|
||||
public void setTables(Map<String, MetaTable> tables) {
|
||||
this.tables = tables;
|
||||
}
|
||||
}
|
||||
75
src/main/java/net/tccn/meta/MetaTable.java
Normal file
75
src/main/java/net/tccn/meta/MetaTable.java
Normal file
@@ -0,0 +1,75 @@
|
||||
package net.tccn.meta;
|
||||
|
||||
import net.tccn.base.arango.Doc;
|
||||
import net.tccn.dbq.Field;
|
||||
|
||||
import javax.persistence.Table;
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 元数据
|
||||
*
|
||||
* @author: liangxianyou at 2018/10/17 12:58.
|
||||
*/
|
||||
@Table(name = "MetaTable", catalog = "db_demo")
|
||||
public class MetaTable extends Doc<MetaTable> implements Serializable {
|
||||
public static final MetaTable dao = MetaTable.dao(MetaTable.class);
|
||||
|
||||
private String name;
|
||||
private String alias; //表别名:全库唯一,程序自动生成
|
||||
private String comment;
|
||||
private List<Field> items;
|
||||
private String dbPlatId; //所属数据平台
|
||||
private String catalog; //所在database
|
||||
|
||||
//=============== getter/setter ============
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getAlias() {
|
||||
return alias;
|
||||
}
|
||||
|
||||
public void setAlias(String alias) {
|
||||
this.alias = alias;
|
||||
}
|
||||
|
||||
public String getComment() {
|
||||
return comment;
|
||||
}
|
||||
|
||||
public void setComment(String comment) {
|
||||
this.comment = comment;
|
||||
}
|
||||
|
||||
public List<Field> getItems() {
|
||||
return items;
|
||||
}
|
||||
|
||||
public void setItems(List<Field> items) {
|
||||
this.items = items;
|
||||
}
|
||||
|
||||
public String getDbPlatId() {
|
||||
return dbPlatId;
|
||||
}
|
||||
|
||||
public void setDbPlatId(String dbPlatId) {
|
||||
this.dbPlatId = dbPlatId;
|
||||
}
|
||||
|
||||
public String getCatalog() {
|
||||
return catalog;
|
||||
}
|
||||
|
||||
public void setCatalog(String catalog) {
|
||||
this.catalog = catalog;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user