Search in sources :

Example 11 with EntityName

use of com.qlangtech.tis.sql.parser.tuple.creator.EntityName in project plugins by qlangtech.

the class TestHiveRemoveHistoryDataTask method testDropHistoryHiveTable.

public void testDropHistoryHiveTable() throws Exception {
    String dbName = "testdb";
    String tabName = "order";
    ITISFileSystem fileSystem = EasyMock.createMock("fileSystem", ITISFileSystem.class);
    Connection hiveConn = EasyMock.createMock("hiveConn", Connection.class);
    Statement showDBStatment = EasyMock.createMock("showDBStatment", Statement.class);
    ResultSet resultSet = EasyMock.createMock("resultSet", ResultSet.class);
    EasyMock.expect(showDBStatment.executeQuery("show databases")).andReturn(resultSet);
    EasyMock.expect(resultSet.next()).andReturn(true);
    EasyMock.expect(resultSet.getString(1)).andReturn(dbName);
    EasyMock.expect(resultSet.next()).andReturn(false);
    EasyMock.expect(hiveConn.createStatement()).andReturn(showDBStatment);
    showDBStatment.close();
    resultSet.close();
    // 查询表
    Statement showTabsStatement = EasyMock.createMock("showTabsStatement", Statement.class);
    EasyMock.expect(hiveConn.createStatement()).andReturn(showTabsStatement);
    ResultSet tabsResult = EasyMock.createMock("tabsResult", ResultSet.class);
    EasyMock.expect(tabsResult.next()).andReturn(true);
    EasyMock.expect(tabsResult.getString(1)).andReturn(tabName);
    EasyMock.expect(tabsResult.next()).andReturn(false);
    tabsResult.close();
    EasyMock.expect(showTabsStatement.executeQuery("show tables in testdb")).andReturn(tabsResult);
    showTabsStatement.close();
    String minPt1 = "20210529142016";
    String minPt2 = "20210529152016";
    String retainPt1 = "20210529162016";
    String retainPt2 = "20210529172016";
    Set<String> removePts = Sets.newHashSet(minPt1, minPt2);
    Statement showPartitionsStatement = EasyMock.createMock("showPartitionsStatement", Statement.class);
    ResultSet showPartitionsResult = EasyMock.createMock("showPartitionsResultSet", ResultSet.class);
    EasyMock.expect(hiveConn.createStatement()).andReturn(showPartitionsStatement);
    EasyMock.expect(showPartitionsStatement.executeQuery("show partitions testdb.order")).andReturn(showPartitionsResult);
    EasyMock.expect(showPartitionsResult.next()).andReturn(true);
    EasyMock.expect(showPartitionsResult.getString(1)).andReturn("pt=" + minPt1);
    EasyMock.expect(showPartitionsResult.next()).andReturn(true);
    EasyMock.expect(showPartitionsResult.getString(1)).andReturn("pt=" + minPt2);
    EasyMock.expect(showPartitionsResult.next()).andReturn(true);
    EasyMock.expect(showPartitionsResult.getString(1)).andReturn("pt=" + retainPt1);
    EasyMock.expect(showPartitionsResult.next()).andReturn(true);
    EasyMock.expect(showPartitionsResult.getString(1)).andReturn("pt=" + retainPt2);
    EasyMock.expect(showPartitionsResult.next()).andReturn(false);
    showPartitionsResult.close();
    showPartitionsStatement.close();
    // ====================================
    Statement dropPtStatement2 = EasyMock.createMock("dropStatement_" + minPt2, Statement.class);
    EasyMock.expect(dropPtStatement2.execute("alter table testdb.order drop partition (  pt = '" + minPt2 + "' )")).andReturn(true);
    EasyMock.expect(hiveConn.createStatement()).andReturn(dropPtStatement2);
    dropPtStatement2.close();
    Statement dropPtStatement1 = EasyMock.createMock("dropStatement_" + minPt1, Statement.class);
    EasyMock.expect(dropPtStatement1.execute("alter table testdb.order drop partition (  pt = '" + minPt1 + "' )")).andReturn(true);
    EasyMock.expect(hiveConn.createStatement()).andReturn(dropPtStatement1);
    dropPtStatement1.close();
    int partitionRetainNum = 2;
    EntityName tabOrder = EntityName.create(dbName, tabName);
    // hiveConn.close();
    EasyMock.replay(fileSystem, hiveConn, showDBStatment, resultSet, showTabsStatement, tabsResult, showPartitionsStatement, showPartitionsResult, dropPtStatement1, dropPtStatement2);
    List<FSHistoryFileUtils.PathInfo> deletePts = (new HiveRemoveHistoryDataTask(fileSystem, MREngine.HIVE)).dropHistoryHiveTable(tabOrder, hiveConn, partitionRetainNum);
    assertEquals(2, deletePts.size());
    deletePts.forEach((pt) -> {
        assertTrue("removed partition shall exist:" + pt.getPathName(), removePts.contains(pt.getPathName()));
    });
    EasyMock.verify(fileSystem, hiveConn, showDBStatment, resultSet, showTabsStatement, tabsResult, showPartitionsStatement, showPartitionsResult, dropPtStatement1, dropPtStatement2);
}
Also used : EntityName(com.qlangtech.tis.sql.parser.tuple.creator.EntityName) ITISFileSystem(com.qlangtech.tis.fs.ITISFileSystem) Statement(java.sql.Statement) Connection(java.sql.Connection) ResultSet(java.sql.ResultSet)

Example 12 with EntityName

use of com.qlangtech.tis.sql.parser.tuple.creator.EntityName in project tis by qlangtech.

the class FlatTableRelation method isLinkable.

/**
 * 是否能通过主外键相连
 *
 * @param next
 * @return
 */
public boolean isLinkable(FlatTableRelation next) {
    DependencyNode currForeig = this.getTailer();
    DependencyNode nextPrimary = next.getHeader();
    EntityName currEntityName = currForeig.parseEntityName();
    EntityName nextEntityName = nextPrimary.parseEntityName();
    if (!currEntityName.equals(nextEntityName)) {
        // return false;
        throw new IllegalStateException("curr foreign:" + currEntityName + " next primary:" + nextEntityName + "  must be equal");
    }
    return CollectionUtils.isEqualCollection(this.getTailerKeys().stream().map((r) -> r.getHeadLinkKey()).collect(Collectors.toList()), next.getHeaderKeys().stream().map((r) -> r.getHeadLinkKey()).collect(Collectors.toList()));
}
Also used : EntityName(com.qlangtech.tis.sql.parser.tuple.creator.EntityName) DependencyNode(com.qlangtech.tis.sql.parser.meta.DependencyNode)

Example 13 with EntityName

use of com.qlangtech.tis.sql.parser.tuple.creator.EntityName 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(",")));
    }
}
Also used : StringUtils(org.apache.commons.lang.StringUtils) List(java.util.List) TabExtraMeta(com.qlangtech.tis.sql.parser.meta.TabExtraMeta) EntityName(com.qlangtech.tis.sql.parser.tuple.creator.EntityName) PrimaryLinkKey(com.qlangtech.tis.sql.parser.meta.PrimaryLinkKey) FlatTableRelation(com.qlangtech.tis.sql.parser.stream.generate.FlatTableRelation) Collectors(java.util.stream.Collectors) EntityName(com.qlangtech.tis.sql.parser.tuple.creator.EntityName) PrimaryLinkKey(com.qlangtech.tis.sql.parser.meta.PrimaryLinkKey) FlatTableRelation(com.qlangtech.tis.sql.parser.stream.generate.FlatTableRelation)

Example 14 with EntityName

use of com.qlangtech.tis.sql.parser.tuple.creator.EntityName 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)

Example 15 with EntityName

use of com.qlangtech.tis.sql.parser.tuple.creator.EntityName in project tis by qlangtech.

the class SqlTaskNode method addRequired.

public void addRequired(String node) {
    if (StringUtils.isBlank(node)) {
        throw new IllegalArgumentException("param node can not be null");
    }
    EntityName ename = EntityName.parse(node);
    this.dumpNodesContext.accurateMatch(ename.getTabName());
    // List<TableTupleCreator> tabs = dumpNodes.get(ename.getTabName());
    // if (tabs != null && tabs.size() > 1) {
    // throw new IllegalStateException("table:" + ename.getTabName()
    // + " has more than 1 match dumptable,shall special full tablename[dbanme.tablename]");
    // }
    this.required.put(ename, null);
}
Also used : EntityName(com.qlangtech.tis.sql.parser.tuple.creator.EntityName)

Aggregations

EntityName (com.qlangtech.tis.sql.parser.tuple.creator.EntityName)17 DependencyNode (com.qlangtech.tis.sql.parser.meta.DependencyNode)6 Collectors (java.util.stream.Collectors)5 StringUtils (org.apache.commons.lang.StringUtils)5 Connection (java.sql.Connection)4 ITISFileSystem (com.qlangtech.tis.fs.ITISFileSystem)3 TisGroupBy (com.qlangtech.tis.sql.parser.TisGroupBy)3 FuncFormat (com.qlangtech.tis.sql.parser.visitor.FuncFormat)3 Lists (com.google.common.collect.Lists)2 IDumpTable (com.qlangtech.tis.fullbuild.indexbuild.IDumpTable)2 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 java.util (java.util)2 List (java.util.List)2 Optional (java.util.Optional)2 Set (java.util.Set)2 Pattern (java.util.regex.Pattern)2