Search in sources :

Example 6 with FuncFormat

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);
        });
    }
}
Also used : PrintStream(java.io.PrintStream) FuncFormat(com.qlangtech.tis.sql.parser.visitor.FuncFormat) File(java.io.File)

Example 7 with FuncFormat

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"));
}
Also used : FuncFormat(com.qlangtech.tis.sql.parser.visitor.FuncFormat) File(java.io.File)

Example 8 with FuncFormat

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();
    }
}
Also used : FuncFormat(com.qlangtech.tis.sql.parser.visitor.FuncFormat) FlatTableRelation(com.qlangtech.tis.sql.parser.stream.generate.FlatTableRelation) EntityName(com.qlangtech.tis.sql.parser.tuple.creator.EntityName) DependencyNode(com.qlangtech.tis.sql.parser.meta.DependencyNode) TisGroupBy(com.qlangtech.tis.sql.parser.TisGroupBy)

Aggregations

FuncFormat (com.qlangtech.tis.sql.parser.visitor.FuncFormat)8 TisGroupBy (com.qlangtech.tis.sql.parser.TisGroupBy)5 EntityName (com.qlangtech.tis.sql.parser.tuple.creator.EntityName)5 DependencyNode (com.qlangtech.tis.sql.parser.meta.DependencyNode)4 Collectors (java.util.stream.Collectors)3 StringUtils (org.apache.commons.lang.StringUtils)3 LinkKeys (com.qlangtech.tis.sql.parser.er.LinkKeys)2 PrimaryTableMeta (com.qlangtech.tis.sql.parser.er.PrimaryTableMeta)2 TabCardinality (com.qlangtech.tis.sql.parser.er.TabCardinality)2 TableRelation (com.qlangtech.tis.sql.parser.er.TableRelation)2 FlatTableRelation (com.qlangtech.tis.sql.parser.stream.generate.FlatTableRelation)2 File (java.io.File)2 List (java.util.List)2 Optional (java.util.Optional)2 Set (java.util.Set)2 CollectionUtils (org.apache.commons.collections.CollectionUtils)2 Lists (com.google.common.collect.Lists)1 PrimaryLinkKey (com.qlangtech.tis.sql.parser.meta.PrimaryLinkKey)1 MergeData (com.qlangtech.tis.sql.parser.stream.generate.MergeData)1 PrintStream (java.io.PrintStream)1