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()); } } }