Skip to content

Commit

Permalink
TEIID-2940 fixing the alias generator when dealing with nested inline
Browse files Browse the repository at this point in the history
views
  • Loading branch information
shawkins authored and johnathonlee committed May 2, 2014
1 parent 73c1fe6 commit 527211d
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@

package org.teiid.query.optimizer.relational;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
Expand Down Expand Up @@ -66,7 +68,7 @@ private class SQLNamingContext {

Map<String, Map<String, String>> elementMap = new HashMap<String, Map<String, String>>();
Map<String, String> groupNames = new HashMap<String, String>();
Map<Expression, String> currentSymbols;
LinkedHashMap<Expression, String> currentSymbols;

boolean aliasColumns = false;

Expand Down Expand Up @@ -209,7 +211,7 @@ public void visit(SetQuery obj) {

public void visit(Select obj) {
List<Expression> selectSymbols = obj.getSymbols();
HashMap<Expression, String> symbols = new HashMap<Expression, String>(selectSymbols.size());
LinkedHashMap<Expression, String> symbols = new LinkedHashMap<Expression, String>(selectSymbols.size());
for (int i = 0; i < selectSymbols.size(); i++) {
Expression symbol = selectSymbols.get(i);
visitNode(symbol);
Expand Down Expand Up @@ -268,10 +270,18 @@ public void visit(Query obj) {

public void visit(SubqueryFromClause obj) {
visitor.createChildNamingContext(true);
//first determine the original names
List<Expression> exprs = obj.getCommand().getProjectedSymbols();
List<String> names = new ArrayList<String>(exprs.size());
for (int i = 0; i < exprs.size(); i++) {
names.add(Symbol.getShortName(exprs.get(i)));
}
obj.getCommand().acceptVisitor(this);
Map<String, String> viewGroup = new HashMap<String, String>();
int i = 0;
//now map to the new names
for (Entry<Expression, String> entry : visitor.namingContext.currentSymbols.entrySet()) {
viewGroup.put(Symbol.getShortName(entry.getKey()), entry.getValue());
viewGroup.put(names.get(i++), entry.getValue());
}
visitor.namingContext.parent.elementMap.put(obj.getName(), viewGroup);
visitor.removeChildNamingContext();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import org.teiid.dqp.internal.datamgr.LanguageBridgeFactory;
import org.teiid.query.metadata.QueryMetadataInterface;
import org.teiid.query.parser.QueryParser;
import org.teiid.query.resolver.QueryResolver;
import org.teiid.query.resolver.TestResolver;
import org.teiid.query.rewriter.QueryRewriter;
import org.teiid.query.sql.lang.Command;
Expand Down Expand Up @@ -76,6 +77,15 @@ private Command helpTest(String sql, String expected,
assertEquals("SELECT v_0.c_0 FROM (SELECT g_0.e1 AS c_0 FROM pm1.g1 AS g_0) AS v_0", command.toString()); //$NON-NLS-1$
}

@Test public void testNestedViewAliasing() throws Exception {
String sql = "select e1, e2 from (select y.e1, y.e2 from (select pm1.g1.e1, 1 as e2 from pm1.g1) y) z"; //$NON-NLS-1$
Query command = (Query)QueryParser.getQueryParser().parseCommand(sql);
QueryResolver.resolveCommand(command, RealMetadataFactory.example1Cached());
command = (Query) command.clone();
command.acceptVisitor(new AliasGenerator(true));
assertEquals("SELECT v_1.c_0, v_1.c_1 FROM (SELECT v_0.c_0, v_0.c_1 FROM (SELECT g_0.e1 AS c_0, 1 AS c_1 FROM pm1.g1 AS g_0) AS v_0) AS v_1", command.toString()); //$NON-NLS-1$
}

@Test public void testLongOrderByAlias() throws Exception {
String sql = "select pm1.g1.e1 || pm1.g1.e2 as asfasdfadfasdfasdfadfasdfadsfasdfasdfasdfasdfasdfadfa, pm1.g1.e2 from pm1.g1 order by asfasdfadfasdfasdfadfasdfadsfasdfasdfasdfasdfasdfadfa"; //$NON-NLS-1$
String expected = "SELECT concat(g_0.e1, convert(g_0.e2, string)) AS c_0, g_0.e2 AS c_1 FROM pm1.g1 AS g_0 ORDER BY c_0"; //$NON-NLS-1$
Expand Down

0 comments on commit 527211d

Please sign in to comment.