use of com.qlangtech.tis.sql.parser.visitor.FuncFormat in project tis by qlangtech.
the class StreamComponentCodeGeneratorFlink method build.
/**
* 开始生成增量执行脚本(scala版本)
*
* @throws Exception
*/
public void build() throws Exception {
final PrintStream traversesAllNodeOut = new PrintStream(new File("./traversesAllNode.txt"));
try {
// Map<IEntityNameGetter, List<IValChain>> tabTriggers = this.streamIncrGenerateStrategy.getTabTriggerLinker();
// IERRules erR = streamIncrGenerateStrategy.getERRule();
// PropGetter last = null;
// PropGetter first = null;
// Optional<TableRelation> firstParent = null;
// Map<IEntityNameGetter, List<IValChain>> tabTriggers = getTabTriggerLinker();
FuncFormat aliasListBuffer = new FuncFormat();
// for (Map.Entry<IEntityNameGetter, List<IValChain>> e : tabTriggers.entrySet()) {
// final EntityName entityName = e.getKey().getEntityName();
// final Set<String> relevantCols = e.getValue().stream()
// .map((rr) -> rr.last().getOutputColName().getName()).collect(Collectors.toSet());
//
// //>>>>>>>>>>>>>
// // 包括主表的和子表的
// final Set<String> linkCols = Sets.newHashSet();
// final List<TableRelation> allParent = erR.getAllParent(entityName);
// for (TableRelation r : allParent) {
// linkCols.addAll(r.getJoinerKeys().stream().map((j) -> j.getChildKey()).collect(Collectors.toList()));
// }
//
// final List<TableRelation> allChild = erR.getChildTabReference(entityName);
// for (TableRelation r : allChild) {
// linkCols.addAll(r.getJoinerKeys().stream().map((j) -> j.getParentKey()).collect(Collectors.toList()));
// }
// //<<<<<<<<<<<<<<
//
// traversesAllNodeOut.println("<<<<<<<%%%%%%%%export:" + entityName);
//
// aliasListBuffer.append("val ").append(entityName.getJavaEntityName())
// .append("Builder:AliasList.Builder = builder.add(\"").append(entityName.getTabName())
// .append("\")");
// final boolean isTriggerIgnore = erR.isTriggerIgnore(entityName);
// if (isTriggerIgnore) {
// aliasListBuffer.append(".setIgnoreIncrTrigger()");
// }
//
// // 设置是否是主键
// boolean isPrimaryTable = false;
// Optional<TableMeta> primaryFind = erR.getPrimaryTab(entityName);
// PrimaryTableMeta ptab = null;
// if (primaryFind.isPresent()) {
// isPrimaryTable = true;
// ptab = (PrimaryTableMeta) primaryFind.get();
// aliasListBuffer.append(".setPrimaryTableOfIndex()");
// }
//
// aliasListBuffer.returnLine();
//
// if (!isPrimaryTable) {
// // 设置主键
// aliasListBuffer
// .methodBody(entityName.javaPropTableName() + "ColEnum.getPKs().forEach((r) =>", (r) -> {
// r.startLine(entityName.getJavaEntityName()).append("Builder.add(r.getName().PK())");
// }).append(")");
// }
//
//
// aliasListBuffer.startLine(entityName.getJavaEntityName()).append("Builder.add(").append(" // ").returnLine();
//
// boolean timestampVerColumnProcessed = false;
// // 判断out的列是否已经输出
// Set<String> outCol = Sets.newHashSet();
// boolean firstAdd = true;
// boolean hasSetTimestampVerColumn;
// if (!(hasSetTimestampVerColumn = erR.hasSetTimestampVerColumn(entityName))) {
// if (erR.getTimeCharacteristic() != TimeCharacteristic.ProcessTime) {
// throw new IllegalStateException("table:" + entityName.getTabName()
// + "either have not set timestampVer col name or global timeCharacteristic is not 'ProcessTime'");
// }
// firstAdd = false;
// aliasListBuffer.append("(\"processTime\").processTimeVer()").returnLine();
// }
//
// for (IValChain tupleLink : e.getValue()) {
// first = tupleLink.first();
// last = tupleLink.last();
// traversesAllNodeOut.println("last:" + (last == null ? "null" : last.getIdentityName()));
// traversesAllNodeOut.println("first:" + (first == null ? "null" : first.getIdentityName()));
// traversesAllNodeOut.println(Joiner.on("\n-->").join(tupleLink.mapChainValve((r/* PropGetter */) -> {
// return r.getIdentityName();
// }).iterator()));
//
// traversesAllNodeOut.println("-------------------------------");
//
// boolean haveAdd = outCol.add(first.getOutputColName().getAliasName());
//
// if (!firstAdd) {
// aliasListBuffer.startLine(",");
// } else {
// firstAdd = false;
// }
//
//
// if (tupleLink.useAliasOutputName()) {
// aliasListBuffer.append("(\"").append(last.getOutputColName().getName()).append("\", \"")
// .append(first.getOutputColName().getAliasName()).append("\")");
// } else {
// aliasListBuffer.append("(\"").append(last.getOutputColName().getName()).append("\")");
// }
//
// // 如果是主表就在通过单独的列meta配置中的信息来设置主键,在实际例子中发现表中使用了联合主键,在运行的时候会出错
// if (isPrimaryTable && ptab.isPK(last.getOutputColName().getName())) {
// aliasListBuffer.append(".PK()");
// }
//
// if (hasSetTimestampVerColumn && erR.isTimestampVerColumn(entityName, last.getOutputColName().getName())) {
// // 时间戳字段
// aliasListBuffer.append(".timestampVer()");
// timestampVerColumnProcessed = true;
// }
//
// if (!haveAdd) {
// aliasListBuffer.append(".notCopy()");
//
// } else if (tupleLink.hasFuncTuple()) {
//
// AtomicBoolean shallCallableProcess = new AtomicBoolean(false);
//
// final FunctionVisitor.IToString shallCallableProcessToken = new FunctionVisitor.IToString() {
// @Override
// public String toString() {
// return shallCallableProcess.get() ? "c" : "t";
// }
// };
//
// final FunctionVisitor.IToString fieldValue = new FunctionVisitor.IToString() {
// @Override
// public String toString() {
// return shallCallableProcess.get() ? StringUtils.EMPTY : ", fieldValue";
// }
// };
//
// aliasListBuffer.append(".").append(shallCallableProcessToken).append("(")//
// .append("(" + FunctionVisitor.ROW_KEY).append(fieldValue).append(")")
// .methodBody(false, " => ", (rr) -> {
// final AtomicInteger index = new AtomicInteger();
// final AtomicReference<String> preGroupAggrgationName = new AtomicReference<>();
// tupleLink.chainStream()
// .filter((r) -> r.getTupleCreator() != null
// && r.getTupleCreator() instanceof FunctionDataTupleCreator)
// .forEach((r) -> {
// final FunctionDataTupleCreator tuple = (FunctionDataTupleCreator) r
// .getTupleCreator();
// final PropGetter propGetter = r;
// MapDataMethodCreator mapDataMethodCreator = null;
// Optional<TisGroupBy> group = tuple.getGroupBy();
// if (propGetter.shallCallableProcess()) {
// shallCallableProcess.set(true);
// }
// if (index.getAndIncrement() < 1) {
//
// if (r.isGroupByFunction()) {
// TisGroupBy groups = group.get();
// mapDataMethodCreator = addMapDataMethodCreator(entityName, groups, relevantCols);
//
// rr.startLine("val ").append(groups.getGroupAggrgationName())
// .append(":Map[GroupKey /*")
// .append(groups.getGroupsLiteria())
// .append("*/, GroupValues] = ")
// .append(mapDataMethodCreator.getMapDataMethodName())
// .append("(").append(FunctionVisitor.ROW_KEY).append(")")
// .returnLine().returnLine();
//
// preGroupAggrgationName.set(groups.getGroupAggrgationName());
//
// generateCreateGroupResultScript(rr, propGetter, groups);
//
// } else {
// // 不需要反查维表执行函数
// // 测试
// generateFunctionCallScript(rr, propGetter);
// }
//
// } else {
// if (r.isGroupByFunction()) {
// TisGroupBy groups = group.get();
//
// rr.append("val ").append(groups.getGroupAggrgationName())
// .append(": Map[GroupKey /* ")
// .append(groups.getGroupsLiteria())
// .append(" */, GroupValues] ").append(" = reduceData(")
// .append(preGroupAggrgationName.get()).append(", " + groups.getGroupKeyAsParamsLiteria() + ")\n");
//
// generateCreateGroupResultScript(rr, propGetter, groups);
//
// preGroupAggrgationName.set(groups.getGroupsLiteria());
// } else {
//
// generateFunctionCallScript(rr, propGetter);
// }
//
// }
//
// });
//
// }).append(")/*end .t()*/");
//
// }
// }
//
// for (String linkKey : linkCols) {
// if (!relevantCols.contains(linkKey)) {
// if (!firstAdd) {
// aliasListBuffer.appendLine(",");
// } else {
// firstAdd = false;
// aliasListBuffer.returnLine();
// }
// aliasListBuffer.append("(\"")
// .append(linkKey).append("\").notCopy() ");
//
// if (erR.isTimestampVerColumn(entityName, linkKey)) {
// aliasListBuffer.append(".timestampVer()");
// timestampVerColumnProcessed = true;
// }
//
// aliasListBuffer.append("// FK or primay key");
// }
// }
//
//
// // timestampVer标记没有添加,且本表不要监听增量消息
// if (hasSetTimestampVerColumn && !timestampVerColumnProcessed && !erR.isTriggerIgnore(entityName)) {
// if (!firstAdd) {
// aliasListBuffer.appendLine(",");
// } else {
// firstAdd = false;
// aliasListBuffer.returnLine();
// }
// aliasListBuffer.append("(\"")
// .append(erR.getTimestampVerColumn(entityName)).append("\").notCopy().timestampVer() //gencode9 ");
// }
//
// //>>>>>>>>>>>>>
// aliasListBuffer.appendLine(");\n");
// traversesAllNodeOut.println("======================================>>>>>>>>>");
//
// //>>>>>>>>>>>>>
// for (TableRelation r : allParent) {
//
// aliasListBuffer.append(entityName.getJavaEntityName())
// .append("Builder.addParentTabRef(").append(r.getParent().parseEntityName().createNewLiteriaToken())
// .append(",").append(JoinerKey.createListNewLiteria(r.getJoinerKeys())).append(")").returnLine();
// }
//
// for (TableRelation r : allChild) {
// aliasListBuffer.append(entityName.getJavaEntityName())
// .append("Builder.addChildTabRef(").append(r.getChild().parseEntityName().createNewLiteriaToken())
// .append(",").append(JoinerKey.createListNewLiteria(r.getJoinerKeys())).append(")").returnLine();
// }
// //<<<<<<<<<<<<<<
//
// if (!this.excludeFacadeDAOSupport) {
//
// aliasListBuffer.append(entityName.getJavaEntityName())
// .append("Builder.setGetterRowsFromOuterPersistence(/*gencode5*/")
// .methodBody(" (rowTabName, rvals, pk ) =>", (f) -> {
// Set<String> selectCols = Sets.union(relevantCols, linkCols);
// if (primaryFind.isPresent()) {
// // 主索引表
// PrimaryTableMeta ptabMeta = (PrimaryTableMeta) primaryFind.get();
//
// f.appendLine(entityName.buildDefineRowMapListLiteria());
// f.appendLine(entityName.buildDefineCriteriaEqualLiteria());
//
// List<PrimaryLinkKey> primaryKeyNames = ptabMeta.getPrimaryKeyNames();
// for (PrimaryLinkKey linkKey : primaryKeyNames) {
// if (!linkKey.isPk()) {
// TisGroupBy.TisColumn routerKey = new TisGroupBy.TisColumn(linkKey.getName());
// f.appendLine(routerKey.buildDefineGetPkRouterVar());
// }
// }
// f.appendLine(entityName.buildCreateCriteriaLiteria());
// for (PrimaryLinkKey linkKey : primaryKeyNames) {
// if (linkKey.isPk()) {
// TisGroupBy.TisColumn pk = new TisGroupBy.TisColumn(linkKey.getName());
// f.append(pk.buildPropCriteriaEqualLiteria("pk.getValue()"));
// } else {
// TisGroupBy.TisColumn pk = new TisGroupBy.TisColumn(linkKey.getName());
// f.append(pk.buildPropCriteriaEqualLiteria());
// }
// }
// f.appendLine(entityName.buildAddSelectorColsLiteria(selectCols));
// f.appendLine(entityName.buildExecuteQueryDAOLiteria());
// f.appendLine(entityName.entities());
// } else {
// if (allChild.size() > 0) {
// f.appendLine(entityName.buildDefineRowMapListLiteria());
// f.appendLine(entityName.buildDefineCriteriaEqualLiteria()).returnLine();
// f.appendLine(entityName.buildAddSelectorColsLiteria(selectCols));
// f.methodBody("rowTabName match ", (ff) -> {
// for (TableRelation rel : allChild) {
// EntityName childEntity = rel.getChild().parseEntityName();
//
// ff.methodBody("case \"" + childEntity.getTabName() + "\" =>", (fff) -> {
// fff.appendLine(entityName.buildCreateCriteriaLiteria());
// for (JoinerKey jk : rel.getJoinerKeys()) {
// TisGroupBy.TisColumn k = new TisGroupBy.TisColumn(jk.getParentKey());
// fff.append(k.buildPropCriteriaEqualLiteria("rvals.getColumn(\"" + jk.getChildKey() + "\")"));
// }
// fff.returnLine();
//
// fff.appendLine(entityName.buildExecuteQueryDAOLiteria());
// fff.appendLine(entityName.entities());
// });
// }
// ff.appendLine("case unexpected => null");
// });
// } else {
// f.appendLine(" null");
// }
// }
// }).appendLine(") // end setGetterRowsFromOuterPersistence").returnLine().returnLine();
// }
// }
MergeData mergeData = new MergeData(this.collectionName, mapDataMethodCreatorMap, aliasListBuffer, getTabTriggerLinker(), getERRule(), this.daoFacadeList, this.streamIncrGenerateStrategy);
mergeGenerate(streamIncrGenerateStrategy.decorateMergeData(mergeData));
} finally {
IOUtils.closeQuietly(traversesAllNodeOut, (ex) -> {
logger.error(ex.getMessage(), ex);
});
}
}
use of com.qlangtech.tis.sql.parser.visitor.FuncFormat in project tis by qlangtech.
the class StreamComponentCodeGeneratorFlink method generateConfigFiles.
/**
* 生成spring等增量应用启动需要的配置文件
*/
public void generateConfigFiles() throws Exception {
MergeData mergeData = new MergeData(this.collectionName, mapDataMethodCreatorMap, new FuncFormat(), Collections.emptyMap(), getERRule(), this.daoFacadeList, this.streamIncrGenerateStrategy);
File parentDir = new File(getSpringConfigFilesDir(), "com/qlangtech/tis/realtime/transfer/" + this.collectionName);
FileUtils.forceMkdir(parentDir);
this.mergeGenerate(mergeData, "/com/qlangtech/tis/classtpl/app-context.xml.vm", new File(parentDir, "app-context.xml"));
this.mergeGenerate(mergeData, "/com/qlangtech/tis/classtpl/field-transfer.xml.vm", new File(parentDir, "field-transfer.xml"));
}
use of com.qlangtech.tis.sql.parser.visitor.FuncFormat 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();
}
}
Aggregations