use of com.qlangtech.tis.sql.parser.stream.generate.FlatTableRelation in project tis by qlangtech.
the class TableRelation method createSelectParentByChild.
/**
* 通过子记录查询父记录
*
* @param context
*/
public String createSelectParentByChild(MergeData context, FlatTableRelation currentTableRelation, FlatTableRelation nextRelation, PrimaryTableMeta primary) {
String methodToken = nextRelation.getJoinerKeysQueryMethodToken();
context.addGlobalScript(methodToken, nextRelation.buildQueryHeaderByTailerInfo(currentTableRelation.getTailerKeys().stream().map((rr) -> rr.getHeadLinkKey()).collect(Collectors.toSet())));
FuncFormat f = nextRelation.buildInvokeQueryHeaderByTailerInfo();
// 执行处理结果
FuncFormat p = nextRelation.buildInvokeQueryHeaderByTailerInfoResultProcess(primary, currentTableRelation);
f.appendLine(p);
return f.toString();
}
use of com.qlangtech.tis.sql.parser.stream.generate.FlatTableRelation in project tis by qlangtech.
the class PrimaryTableMeta method createCompositePK.
public String createCompositePK(String colTransferToken, String valToken, boolean force, FlatTableRelation... tabRels) {
if (tabRels.length > 1) {
EntityName first = tabRels[0].getHeaderEntity();
if (!StringUtils.equals(first.getTabName(), this.getTabName())) {
throw new IllegalArgumentException("first table name shall be '" + this.getTabName() + "' but now is '" + first + "'");
}
for (int i = 0; (i + 1) < tabRels.length; i++) {
if (!tabRels[i].isLinkable(tabRels[i + 1])) {
throw new IllegalStateException("pre:" + tabRels[i] + "\nnext:" + tabRels[i + 1] + " is not linkable");
}
}
}
PrimaryLinkKey pk = this.getDBPrimayKeyName();
TableRelation.FinalLinkKey finalLinkKey = FlatTableRelation.getFinalLinkKey(pk.getName(), tabRels);
if (force || finalLinkKey.success) {
String pkGetterLiteria = EntityName.createColValLiteria(colTransferToken, finalLinkKey.linkKeyName, valToken);
return " new CompositePK(" + pkGetterLiteria + " " + this.createPKPlayloadParams(valToken, tabRels).toString() + ")";
} else {
// return finalLinkKey.interruptedTableRelation.createSelectParentByChild(context, , , this);
throw new IllegalStateException("header:" + finalLinkKey.interruptedTableRelation.getHeaderEntity() + ",tailer:" + finalLinkKey.interruptedTableRelation.getTailerEntity() + " can not find key:" + pk.getName() + ",cols:" + finalLinkKey.interruptedTableRelation.getHeaderKeys().stream().map((r) -> "[" + r.getHeadLinkKey() + "->" + r.getTailerLinkKey() + "]").collect(Collectors.joining(",")));
}
}
use of com.qlangtech.tis.sql.parser.stream.generate.FlatTableRelation in project tis by qlangtech.
the class PrimaryTableMeta method createPKPlayloadParams.
/**
* 创建 CompsitePK,中pload 路由参数
*
* @param tabRels
* @return
*/
public StringBuffer createPKPlayloadParams(String valToken, FlatTableRelation... tabRels) {
List<PrimaryLinkKey> payloadRouterKeys = this.getPayloadRouterKeys();
StringBuffer buffer = new StringBuffer();
for (PrimaryLinkKey routerKey : payloadRouterKeys) {
TableRelation.FinalLinkKey finalLinkKey = FlatTableRelation.getFinalLinkKey(routerKey.getName(), tabRels);
buffer.append(",\"").append(routerKey.getName()).append("\"," + valToken + ".getColumn(\"").append(finalLinkKey.linkKeyName).append("\")");
}
return buffer;
}
use of com.qlangtech.tis.sql.parser.stream.generate.FlatTableRelation in project tis by qlangtech.
the class TableRelation method createChildPKLiteria.
/**
* 当子表为主表的时候
*
* @param context
* @return
*/
public String createChildPKLiteria(MergeData context) {
try {
DependencyNode child = this.getChild();
EntityName parentEntity = this.getParent().parseEntityName();
EntityName childEntity = child.parseEntityName();
PrimaryTableMeta primary = getPrimaryTableMeta(context, childEntity);
// 主索引连接键
// JoinerKey joinerKey = getPrimaryJoinerKey(primary, false);
// primary.getPrimaryKeyName();
// joinerKey.getParentKey();
// 先查数据库,将子表的记录都查出来
// child.getName();
FuncFormat r = new FuncFormat();
r.startLine("// create by TableRelation.createChildPKLiteria()");
r.startLine("val primaryColMeta = tabColumnMetaMap.get(\"" + primary.getTabName() + "\")");
r.startLine("if (primaryColMeta == null) {");
r.startLine(" throw new IllegalStateException(\"tableName: " + primary.getTabName() + " is not exist in tabColumnMetaMap\")");
r.startLine("}");
r.startLine("val pcol = primaryColMeta.getColMeta(\"" + primary.getDBPrimayKeyName().getName() + "\")");
FlatTableRelation currentTableRelation = this.getCurrentTableRelation(false);
final String methodToken = currentTableRelation.getJoinerKeysQueryMethodToken();
context.addGlobalScript(methodToken, currentTableRelation.buildQueryHeaderByTailerInfo(Collections.emptySet()));
// // 定义结果集对象
// r.startLine(childEntity.buildDefineRowMapListLiteria());
// // 创建查询对象
// r.startLine(childEntity.buildDefineCriteriaEqualLiteria());
//
// //<< 设置查询条件
Stack<FlatTableRelation> unprocessedTableRelationStack = context.getUnprocessedTableRelations();
String paramsList = null;
if (!unprocessedTableRelationStack.empty()) {
FlatTableRelation unprocessedTableRelation = unprocessedTableRelationStack.pop();
// paramsList = unprocessedTableRelation.getTailerKeys().stream().map((m) -> {
// TisGroupBy.TisColumn col = new TisGroupBy.TisColumn(m.getHeadLinkKey());
// r.appendLine(col.buildDefineParam());
// return col.getJavaVarName();
// }).collect(Collectors.joining(","));
paramsList = unprocessedTableRelation.getRel().getJoinerKeys().stream().map((m) -> {
TisGroupBy.TisColumn col = new TisGroupBy.TisColumn(m.getParentKey());
r.appendLine(col.buildDefineParam());
return col.getJavaVarName();
}).collect(Collectors.joining(","));
} else {
paramsList = this.getJoinerKeys().stream().map((m) -> {
TisGroupBy.TisColumn col = new TisGroupBy.TisColumn(m.getParentKey());
r.appendLine(col.buildDefineParam());
return col.getJavaVarName();
}).collect(Collectors.joining(","));
}
boolean isMulti = (this.cardinality == TabCardinality.ONE_N);
// 执行调用方法
r.startLine("val " + (isMulti ? childEntity.entities() + ": List[RowMap] " : childEntity.getJavaEntityName() + ": RowMap ") + " = this.query" + childEntity.javaPropTableName() + "By" + parentEntity.javaPropTableName() + "(" + paramsList + ") ");
if (isMulti) {
// 遍历结果集
r.buildRowMapTraverseLiteria(childEntity, (mm) -> {
mm.startLine("pushPojo2Queue(" + primary.createCompositePK("primaryColMeta", "r") + ", row)");
});
} else {
r.methodBody("if(" + childEntity.getJavaEntityName() + " != null)", (mm) -> {
// mm.startLine("return new CompositePK(" + childEntity.getJavaEntityName() + ", pcol /**子表列*/, sharedId)");
mm.startLine("return " + primary.createCompositePK("primaryColMeta", childEntity.getJavaEntityName()));
});
}
r.startLine(" null /*gencode20200730*/");
return r.toString();
} finally {
context.getUnprocessedTableRelations().clear();
}
}
use of com.qlangtech.tis.sql.parser.stream.generate.FlatTableRelation in project tis by qlangtech.
the class TableRelation method createParentPKLiteria.
/**
* 生成主表的PK键 scala代码
*
* @param context
* @return
*/
public String createParentPKLiteria(MergeData context) {
Stack<FlatTableRelation> unprocessed = context.getUnprocessedTableRelations();
FlatTableRelation un = null;
try {
FlatTableRelation currentTableRelation = getCurrentTableRelation(true);
PrimaryTableMeta primary = getPrimaryTableMeta(context, currentTableRelation.getHeaderEntity());
LinkKeys pkJoinerKey = null;
for (LinkKeys lk : currentTableRelation.getHeaderKeys()) {
if (StringUtils.equals(lk.getHeadLinkKey(), primary.getDBPrimayKeyName().getName())) {
pkJoinerKey = lk;
}
}
if (!unprocessed.empty()) {
// 连接栈不为空
un = unprocessed.pop();
if (!unprocessed.empty()) {
// FIXME: 或许将来支持更加复杂的增量流式处理,可以支持外表连接
throw new IllegalStateException("un process rel can not exceed 2,but now size:" + unprocessed.size() + "pre:" + un.toString() + ",others:" + unprocessed.stream().map((r) -> r.toString()).collect(Collectors.joining(",")));
}
if (currentTableRelation.isLinkable(un)) {
return primary.createCompositePK(currentTableRelation, un) + "/*gencode1*/";
} else {
// SqlTaskNodeMeta.DependencyNode headerNode = un.getHeader();
return createSelectParentByChild(context, currentTableRelation, un, primary);
}
} else {
TableRelation.FinalLinkKey finalLinkKey = FlatTableRelation.getFinalLinkKey(primary.getDBPrimayKeyName().getName(), currentTableRelation);
if (finalLinkKey.success) {
// 连接栈为空
return "return " + primary.createCompositePK(currentTableRelation) + "/*gencode2*/";
} else {
// 例如:orderDetail是主表,以orderid作为pk,外表totalpayinfo 为外表(连接键为: totalpay_id -> totalpay_id,所以连接过程会中断
return createSelectParentByChild(context, currentTableRelation, currentTableRelation, primary);
}
}
} catch (Exception e) {
throw new RuntimeException("parent:" + this.getParent().parseEntityName() + ",child:" + this.getChild().parseEntityName(), e);
} finally {
context.getUnprocessedTableRelations().clear();
}
}
Aggregations