String getQBFromString(CandidateFact fact, Map<Dimension, CandidateDim> dimsToQuery) throws LensException { String fromString; if (getJoinAST() == null) { if (cube != null) { if (dimensions.size() > 0) { throw new LensException(LensCubeErrorCode.NO_JOIN_CONDITION_AVAILABLE.getLensErrorInfo()); } fromString = fact.getStorageString(getAliasForTableName(cube.getName())); } else { if (dimensions.size() != 1) { throw new LensException(LensCubeErrorCode.NO_JOIN_CONDITION_AVAILABLE.getLensErrorInfo()); } Dimension dim = dimensions.iterator().next(); fromString = dimsToQuery.get(dim).getStorageString(getAliasForTableName(dim.getName())); } } else { StringBuilder builder = new StringBuilder(); getQLString(qb.getQbJoinTree(), builder, fact, dimsToQuery); fromString = builder.toString(); } return fromString; }
private void getQLString( QBJoinTree joinTree, StringBuilder builder, CandidateFact fact, Map<Dimension, CandidateDim> dimsToQuery) throws LensException { List<String> joiningTables = new ArrayList<>(); if (joinTree.getBaseSrc()[0] == null) { if (joinTree.getJoinSrc() != null) { getQLString(joinTree.getJoinSrc(), builder, fact, dimsToQuery); } } else { // (joinTree.getBaseSrc()[0] != null){ String alias = joinTree.getBaseSrc()[0].toLowerCase(); builder.append(getStorageStringWithAlias(fact, dimsToQuery, alias)); joiningTables.add(alias); } if (joinTree.getJoinCond() != null) { builder.append(JoinUtils.getJoinTypeStr(joinTree.getJoinCond()[0].getJoinType())); builder.append(" JOIN "); } if (joinTree.getBaseSrc()[1] == null) { if (joinTree.getJoinSrc() != null) { getQLString(joinTree.getJoinSrc(), builder, fact, dimsToQuery); } } else { // (joinTree.getBaseSrc()[1] != null){ String alias = joinTree.getBaseSrc()[1].toLowerCase(); builder.append(getStorageStringWithAlias(fact, dimsToQuery, alias)); joiningTables.add(alias); } String joinCond = joinConds.get(joinTree); if (joinCond != null) { builder.append(" ON "); builder.append(joinCond); // joining tables will contain all tables involved in joins. // we need to push storage filters for Dimensions into join conditions, thus the following // code // takes care of the same. for (String joiningTable : joiningTables) { if (cubeTbls.get(joiningTable) instanceof Dimension) { DimOnlyHQLContext.appendWhereClause( builder, getWhereClauseWithAlias(dimsToQuery, joiningTable), true); dimsToQuery.get(cubeTbls.get(joiningTable)).setWhereClauseAdded(joiningTable); } } } else { throw new LensException(LensCubeErrorCode.NO_JOIN_CONDITION_AVAILABLE.getLensErrorInfo()); } }
void printJoinTree(QBJoinTree joinTree, StringBuilder builder) { builder.append("leftAlias:" + joinTree.getLeftAlias()); if (joinTree.getLeftAliases() != null) { builder.append("\n leftAliases:"); for (String alias : joinTree.getLeftAliases()) { builder.append("\n\t " + alias); } } if (joinTree.getRightAliases() != null) { builder.append("\n rightAliases:"); for (String alias : joinTree.getRightAliases()) { builder.append("\n\t " + alias); } } if (joinTree.getJoinSrc() != null) { builder.append("\n JoinSrc: {"); printJoinTree(joinTree.getJoinSrc(), builder); builder.append("\n }"); } if (joinTree.getBaseSrc() != null) { builder.append("\n baseSrcs:"); for (String src : joinTree.getBaseSrc()) { builder.append("\n\t " + src); } } builder.append("\n noOuterJoin: " + joinTree.getNoOuterJoin()); builder.append("\n noSemiJoin: " + joinTree.getNoSemiJoin()); builder.append("\n mapSideJoin: " + joinTree.isMapSideJoin()); if (joinTree.getJoinCond() != null) { builder.append("\n joinConds:"); for (JoinCond cond : joinTree.getJoinCond()) { builder.append( "\n\t left: " + cond.getLeft() + " right: " + cond.getRight() + " type:" + cond.getJoinType() + " preserved:" + cond.getPreserved()); } } }
public void print() { if (!log.isDebugEnabled()) { return; } StringBuilder builder = new StringBuilder(); builder.append("ASTNode:" + ast.dump() + "\n"); builder.append("QB:"); builder.append("\n numJoins:" + qb.getNumJoins()); builder.append("\n numGbys:" + qb.getNumGbys()); builder.append("\n numSels:" + qb.getNumSels()); builder.append("\n numSelDis:" + qb.getNumSelDi()); builder.append("\n aliasToTabs:"); Set<String> tabAliases = qb.getTabAliases(); for (String alias : tabAliases) { builder.append("\n\t" + alias + ":" + qb.getTabNameForAlias(alias)); } builder.append("\n aliases:"); for (String alias : qb.getAliases()) { builder.append(alias); builder.append(", "); } builder.append("id:" + qb.getId()); builder.append("isQuery:" + qb.getIsQuery()); builder.append("\n QBParseInfo"); QBParseInfo parseInfo = qb.getParseInfo(); builder.append("\n isSubQ: " + parseInfo.getIsSubQ()); builder.append("\n alias: " + parseInfo.getAlias()); if (parseInfo.getJoinExpr() != null) { builder.append("\n joinExpr: " + parseInfo.getJoinExpr().dump()); } builder.append("\n hints: " + parseInfo.getHints()); builder.append("\n aliasToSrc: "); for (String alias : tabAliases) { builder.append("\n\t" + alias + ": " + parseInfo.getSrcForAlias(alias).dump()); } TreeSet<String> clauses = new TreeSet<String>(parseInfo.getClauseNames()); for (String clause : clauses) { builder.append("\n\t" + clause + ": " + parseInfo.getClauseNamesForDest()); } String clause = clauses.first(); if (parseInfo.getWhrForClause(clause) != null) { builder.append("\n whereexpr: " + parseInfo.getWhrForClause(clause).dump()); } if (parseInfo.getGroupByForClause(clause) != null) { builder.append("\n groupby expr: " + parseInfo.getGroupByForClause(clause).dump()); } if (parseInfo.getSelForClause(clause) != null) { builder.append("\n sel expr: " + parseInfo.getSelForClause(clause).dump()); } if (parseInfo.getHavingForClause(clause) != null) { builder.append("\n having expr: " + parseInfo.getHavingForClause(clause).dump()); } if (parseInfo.getDestLimit(clause) != null) { builder.append("\n limit: " + parseInfo.getDestLimit(clause)); } if (parseInfo.getAllExprToColumnAlias() != null && !parseInfo.getAllExprToColumnAlias().isEmpty()) { builder.append("\n exprToColumnAlias:"); for (Map.Entry<ASTNode, String> entry : parseInfo.getAllExprToColumnAlias().entrySet()) { builder.append("\n\t expr: " + entry.getKey().dump() + " ColumnAlias: " + entry.getValue()); } } if (parseInfo.getAggregationExprsForClause(clause) != null) { builder.append("\n aggregateexprs:"); for (Map.Entry<String, ASTNode> entry : parseInfo.getAggregationExprsForClause(clause).entrySet()) { builder.append("\n\t key: " + entry.getKey() + " expr: " + entry.getValue().dump()); } } if (parseInfo.getDistinctFuncExprsForClause(clause) != null) { builder.append("\n distinctFuncExprs:"); for (ASTNode entry : parseInfo.getDistinctFuncExprsForClause(clause)) { builder.append("\n\t expr: " + entry.dump()); } } if (qb.getQbJoinTree() != null) { builder.append("\n\n JoinTree"); QBJoinTree joinTree = qb.getQbJoinTree(); printJoinTree(joinTree, builder); } if (qb.getParseInfo().getDestForClause(clause) != null) { builder.append("\n Destination:"); builder.append("\n\t dest expr:" + qb.getParseInfo().getDestForClause(clause).dump()); } log.debug(builder.toString()); }