teiid SVN: r2816 - branches/7.1.x/console/src/main/java/org/teiid/rhq/admin.
by teiid-commits@lists.jboss.org
Author: tejones
Date: 2011-01-04 17:14:35 -0500 (Tue, 04 Jan 2011)
New Revision: 2816
Modified:
branches/7.1.x/console/src/main/java/org/teiid/rhq/admin/DQPManagementView.java
Log:
TEIID-1416: Changed the report generation of get session for VDB to use the Session object returned instead of the CompositeMetaValue.
Modified: branches/7.1.x/console/src/main/java/org/teiid/rhq/admin/DQPManagementView.java
===================================================================
--- branches/7.1.x/console/src/main/java/org/teiid/rhq/admin/DQPManagementView.java 2011-01-04 21:24:33 UTC (rev 2815)
+++ branches/7.1.x/console/src/main/java/org/teiid/rhq/admin/DQPManagementView.java 2011-01-04 22:14:35 UTC (rev 2816)
@@ -250,7 +250,7 @@
final Map<String, Object> valueMap) throws Exception {
Collection<ArrayList<String>> sqlResultsObject = new ArrayList<ArrayList<String>>();
Collection<Request> resultObject = new ArrayList<Request>();
- Collection<MetaValue> activeSessionsCollection = new ArrayList<MetaValue>();
+ Collection<Session> activeSessionsCollection = new ArrayList<Session>();
String vdbName = (String) valueMap.get(PluginConstants.ComponentType.VDB.NAME);
vdbName = formatVdbName(vdbName);
String vdbVersion = (String) valueMap.get(PluginConstants.ComponentType.VDB.VERSION);
@@ -308,7 +308,7 @@
private String formatVdbName(String vdbName) {
- return vdbName.substring(0, vdbName.indexOf(".")); //$NON-NLS-1$
+ return vdbName.substring(0, vdbName.lastIndexOf(".")); //$NON-NLS-1$
}
public MetaValue getProperties(ProfileServiceConnection connection, final String component) {
@@ -754,13 +754,15 @@
}
}
- public static <T> void getSessionCollectionValueForVDB(MetaValue pValue,Collection<MetaValue> list, String vdbName) throws Exception {
+ public static <T> void getSessionCollectionValueForVDB(MetaValue pValue,Collection<Session> list, String vdbName) throws Exception {
MetaType metaType = pValue.getMetaType();
if (metaType.isCollection()) {
for (MetaValue value : ((CollectionValueSupport) pValue).getElements()) {
if (value.getMetaType().isComposite()) {
if (ProfileServiceUtil.stringValue(((CompositeValueSupport)value).get("VDBName")).equals(vdbName)) { //$NON-NLS-1$
- list.add(value);
+ SessionMetadataMapper rmm = new SessionMetadataMapper();
+ Session session = rmm.unwrapMetaValue(value);
+ list.add(session);
}
} else {
throw new IllegalStateException(pValue+ " is not a Composite type"); //$NON-NLS-1$
13 years, 4 months
teiid SVN: r2815 - in trunk/engine/src: main/java/org/teiid/query/sql/lang and 1 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-01-04 16:24:33 -0500 (Tue, 04 Jan 2011)
New Revision: 2815
Modified:
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleAssignOutputElements.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleChooseJoinStrategy.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCollapseSource.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCopyCriteria.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleRaiseAccess.java
trunk/engine/src/main/java/org/teiid/query/sql/lang/CompareCriteria.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
Log:
TEIID-1338 adding additional support for inferring predicates through copy criteria. the copying will now consider inner join criteria where applicable, but it still does not perform full transitive closure analysis.
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleAssignOutputElements.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleAssignOutputElements.java 2011-01-04 19:40:39 UTC (rev 2814)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleAssignOutputElements.java 2011-01-04 21:24:33 UTC (rev 2815)
@@ -433,11 +433,9 @@
AggregateSymbolCollectorVisitor.getAggregates(selectCriteria, requiredSymbols, requiredSymbols);
break;
case NodeConstants.Types.JOIN:
- List crits = (List) node.getProperty(NodeConstants.Info.JOIN_CRITERIA);
+ List<Criteria> crits = (List) node.getProperty(NodeConstants.Info.JOIN_CRITERIA);
if(crits != null) {
- Iterator critIter = crits.iterator();
- while(critIter.hasNext()) {
- Criteria joinCriteria = (Criteria) critIter.next();
+ for (Criteria joinCriteria : crits) {
AggregateSymbolCollectorVisitor.getAggregates(joinCriteria, requiredSymbols, requiredSymbols);
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleChooseJoinStrategy.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleChooseJoinStrategy.java 2011-01-04 19:40:39 UTC (rev 2814)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleChooseJoinStrategy.java 2011-01-04 21:24:33 UTC (rev 2815)
@@ -25,6 +25,7 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
@@ -100,6 +101,13 @@
// no more than one group on each side
List<Criteria> crits = (List<Criteria>) joinNode.getProperty(NodeConstants.Info.JOIN_CRITERIA);
+ filterOptionalCriteria(crits);
+
+ if (crits.isEmpty() && jtype == JoinType.JOIN_INNER) {
+ joinNode.setProperty(NodeConstants.Info.JOIN_TYPE, JoinType.JOIN_CROSS);
+ return;
+ }
+
List<Criteria> nonEquiJoinCriteria = new ArrayList<Criteria>();
separateCriteria(leftGroups, rightGroups, leftExpressions, rightExpressions, crits, nonEquiJoinCriteria);
@@ -142,10 +150,6 @@
continue;
}
- if (crit.isOptional()) {
- continue;
- }
-
Expression leftExpr = crit.getLeftExpression();
Expression rightExpr = crit.getRightExpression();
@@ -186,6 +190,18 @@
}
return result;
}
+
+ static void filterOptionalCriteria(List<Criteria> crits) {
+ for (Iterator<Criteria> iter = crits.iterator(); iter.hasNext();) {
+ Criteria crit = iter.next();
+ if (crit instanceof CompareCriteria) {
+ CompareCriteria cc = (CompareCriteria) crit;
+ if (cc.isOptional()) {
+ iter.remove();
+ }
+ }
+ }
+ }
public String toString() {
return "ChooseJoinStrategy"; //$NON-NLS-1$
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCollapseSource.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCollapseSource.java 2011-01-04 19:40:39 UTC (rev 2814)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCollapseSource.java 2011-01-04 21:24:33 UTC (rev 2815)
@@ -249,6 +249,11 @@
if (crits == null || crits.isEmpty()) {
crits = new ArrayList<Criteria>();
+ } else {
+ RuleChooseJoinStrategy.filterOptionalCriteria(crits);
+ if (crits.isEmpty() && joinType == JoinType.JOIN_INNER) {
+ joinType = JoinType.JOIN_CROSS;
+ }
}
PlanNode left = node.getFirstChild();
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCopyCriteria.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCopyCriteria.java 2011-01-04 19:40:39 UTC (rev 2814)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCopyCriteria.java 2011-01-04 21:24:33 UTC (rev 2815)
@@ -50,6 +50,7 @@
import org.teiid.query.sql.lang.JoinType;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.ElementSymbol;
+import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.visitor.GroupsUsedByElementsVisitor;
import org.teiid.query.util.CommandContext;
@@ -80,8 +81,7 @@
public PlanNode execute(PlanNode plan, QueryMetadataInterface metadata, CapabilitiesFinder capFinder, RuleStack rules, AnalysisRecord analysisRecord, CommandContext context)
throws QueryPlannerException, TeiidComponentException {
- //do an initial check to see if an execution will be necessary
- List<PlanNode> critNodes = NodeEditor.findAllNodes(plan, NodeConstants.Types.SELECT);
+ List<PlanNode> critNodes = NodeEditor.findAllNodes(plan, NodeConstants.Types.SELECT | NodeConstants.Types.JOIN);
boolean shouldRun = false;
for (PlanNode critNode : critNodes) {
if (!critNode.hasBooleanProperty(NodeConstants.Info.IS_COPIED)) {
@@ -121,9 +121,9 @@
* @return true if the copy was successful
*/
private boolean copyCriteria(Criteria crit,
- Map tgtMap,
- List joinCriteria,
- Set combinedCriteria,
+ Map<Expression, Expression> tgtMap,
+ List<Criteria> joinCriteria,
+ Set<Criteria> combinedCriteria,
boolean checkForGroupReduction,
QueryMetadataInterface metadata) {
int startGroups = GroupsUsedByElementsVisitor.getGroups(crit).size();
@@ -166,7 +166,7 @@
* @param node
* @return true if criteria has been created
*/
- private boolean tryToCopy(PlanNode node, Set[] criteriaInfo, QueryMetadataInterface metadata) {
+ private boolean tryToCopy(PlanNode node, Set<Criteria>[] criteriaInfo, QueryMetadataInterface metadata) {
boolean changedTree = false;
if (node == null) {
@@ -181,16 +181,16 @@
return visitChildern(node, criteriaInfo, changedTree, metadata);
}
- Set[] leftChildCriteria = new Set[2];
- Set[] rightChildCriteria = new Set[2];
+ Set<Criteria>[] leftChildCriteria = new Set[2];
+ Set<Criteria>[] rightChildCriteria = new Set[2];
changedTree |= tryToCopy(node.getFirstChild(), leftChildCriteria, metadata);
changedTree |= tryToCopy(node.getLastChild(), rightChildCriteria, metadata);
- List joinCrits = (List) node.getProperty(NodeConstants.Info.JOIN_CRITERIA);
- Set combinedCriteria = null;
+ List<Criteria> joinCrits = (List<Criteria>) node.getProperty(NodeConstants.Info.JOIN_CRITERIA);
+ Set<Criteria> combinedCriteria = null;
if (joinCrits != null) {
- combinedCriteria = new HashSet(joinCrits);
+ combinedCriteria = new HashSet<Criteria>(joinCrits);
combinedCriteria.addAll(leftChildCriteria[1]);
combinedCriteria.addAll(rightChildCriteria[1]);
}
@@ -208,19 +208,19 @@
return changedTree;
}
- Set toCopy = criteriaInfo[0];
- Set allCriteria = criteriaInfo[1];
+ Set<Criteria> toCopy = criteriaInfo[0];
+ Set<Criteria> allCriteria = criteriaInfo[1];
if (!toCopy.isEmpty()) {
- Map srcToTgt = buildElementMap(joinCrits);
+ Map<Expression, Expression> srcToTgt = buildElementMap(joinCrits);
- List newJoinCrits = new LinkedList();
+ List<Criteria> newJoinCrits = new LinkedList<Criteria>();
- changedTree = createCriteriaFromSelectCriteria(changedTree, combinedCriteria, toCopy, srcToTgt, newJoinCrits, metadata);
+ changedTree |= createCriteria(false, toCopy, combinedCriteria, srcToTgt, newJoinCrits, metadata);
srcToTgt = buildElementMap(allCriteria);
- changedTree = createCriteriaFromJoinCriteria(changedTree, joinCrits, combinedCriteria, srcToTgt, newJoinCrits, metadata);
+ changedTree |= createCriteria(true, joinCrits, combinedCriteria, srcToTgt, newJoinCrits, metadata);
joinCrits.addAll(newJoinCrits);
}
@@ -232,6 +232,11 @@
} else if (jt == JoinType.JOIN_LEFT_OUTER) {
criteriaInfo[0].removeAll(rightChildCriteria[0]);
criteriaInfo[1].removeAll(rightChildCriteria[1]);
+ } else if (node.getSubqueryContainers().isEmpty()) {
+ if (!node.hasBooleanProperty(NodeConstants.Info.IS_COPIED)) {
+ toCopy.addAll(joinCrits);
+ }
+ allCriteria.addAll(joinCrits);
}
return changedTree;
@@ -257,8 +262,8 @@
case NodeConstants.Types.PROJECT:
{
if (criteriaInfo[0] == null) {
- criteriaInfo[0] = new HashSet();
- criteriaInfo[1] = new HashSet();
+ criteriaInfo[0] = new HashSet<Criteria>();
+ criteriaInfo[1] = new HashSet<Criteria>();
} else {
criteriaInfo[0].clear();
criteriaInfo[1].clear();
@@ -271,76 +276,44 @@
return changedTree;
}
- /**
- * @param changedTree
- * @param joinCrits
- * @param combinedCriteria
- * @param srcToTgt
- * @param newJoinCrits
- * @return
- */
- private boolean createCriteriaFromJoinCriteria(boolean changedTree,
- List joinCrits,
- Set combinedCriteria,
- Map srcToTgt,
- List newJoinCrits,
+ private boolean createCriteria(boolean copyingJoinCriteria, Collection<Criteria> toCopy,
+ Set<Criteria> combinedCriteria,
+ Map<Expression, Expression> srcToTgt,
+ List<Criteria> newJoinCrits,
QueryMetadataInterface metadata) {
- if (srcToTgt.size() == 0) {
+ boolean changedTree = false;
+ if (srcToTgt.size() == 0) {
return changedTree;
}
- Iterator i = joinCrits.iterator();
+ Iterator<Criteria> i = toCopy.iterator();
while (i.hasNext()) {
- Criteria crit = (Criteria)i.next();
+ Criteria crit = i.next();
- if (copyCriteria(crit, srcToTgt, newJoinCrits, combinedCriteria, true, metadata)) {
+ if (copyCriteria(crit, srcToTgt, newJoinCrits, combinedCriteria, copyingJoinCriteria, metadata)) {
changedTree = true;
+ if (!copyingJoinCriteria) {
+ crit = newJoinCrits.get(newJoinCrits.size() - 1);
+ }
+ //TODO more criteria can be "optional"
if (crit instanceof CompareCriteria) {
CompareCriteria cc = (CompareCriteria)crit;
- if (cc.getLeftExpression() instanceof ElementSymbol && cc.getRightExpression() instanceof ElementSymbol) {
+ //if (cc.getLeftExpression() instanceof ElementSymbol && cc.getRightExpression() instanceof ElementSymbol) {
//don't remove theta criteria, just mark it as optional
- cc.setOptional(true);
+ cc.setOptional(copyingJoinCriteria?null:true);
continue;
- }
+ //}
}
- i.remove();
+ if (copyingJoinCriteria) {
+ i.remove();
+ }
}
}
return changedTree;
}
- /**
- * @param changedTree
- * @param combinedCriteria
- * @param toCopy
- * @param srcToTgt
- * @param newJoinCrits
- * @return
- */
- private boolean createCriteriaFromSelectCriteria(boolean changedTree,
- Set combinedCriteria,
- Set toCopy,
- Map srcToTgt,
- List newJoinCrits,
- QueryMetadataInterface metadata) {
- if (srcToTgt.size() == 0) {
- return changedTree;
- }
- Iterator i = toCopy.iterator();
- while (i.hasNext()) {
- Criteria crit = (Criteria)i.next();
- changedTree |= copyCriteria(crit, srcToTgt, newJoinCrits, combinedCriteria, false, metadata);
- }
- return changedTree;
- }
-
- /**
- * @param node
- * @param toCopy
- * @param allCriteria
- */
private void visitSelectNode(PlanNode node,
- Set toCopy,
- Set allCriteria) {
+ Set<Criteria> toCopy,
+ Set<Criteria> allCriteria) {
//First examine criteria in critNode for suitability
Criteria crit = (Criteria) node.getProperty(NodeConstants.Info.SELECT_CRITERIA);
if(node.getGroups().size() == 1) {
@@ -355,13 +328,13 @@
}
private boolean visitChildern(PlanNode node,
- Set[] criteriaInfo,
+ Set<Criteria>[] criteriaInfo,
boolean changedTree,
QueryMetadataInterface metadata) {
if (node.getChildCount() > 0) {
- List children = node.getChildren();
+ List<PlanNode> children = node.getChildren();
for (int i = 0; i < children.size(); i++) {
- PlanNode childNode = (PlanNode)children.get(i);
+ PlanNode childNode = children.get(i);
changedTree |= tryToCopy(childNode, i==0?criteriaInfo:new Set[2], metadata);
}
}
@@ -374,16 +347,14 @@
* @param crits
* @return
*/
- Map buildElementMap(Collection crits) {
- Map srcToTgt = null;
- Iterator critIter = crits.iterator();
- while(critIter.hasNext()) {
- Criteria theCrit = (Criteria) critIter.next();
+ Map<Expression, Expression> buildElementMap(Collection<Criteria> crits) {
+ Map<Expression, Expression> srcToTgt = null;
+ for (Criteria theCrit : crits) {
if (theCrit instanceof IsNullCriteria) {
IsNullCriteria isNull = (IsNullCriteria)theCrit;
if (!isNull.isNegated() && isNull.getExpression() instanceof ElementSymbol) {
if (srcToTgt == null) {
- srcToTgt = new HashMap();
+ srcToTgt = new HashMap<Expression, Expression>();
}
srcToTgt.put(isNull.getExpression(), new Constant(null, isNull.getExpression().getType()));
}
@@ -395,14 +366,14 @@
CompareCriteria crit = (CompareCriteria) theCrit;
if (crit.getOperator() == CompareCriteria.EQ) {
if (srcToTgt == null) {
- srcToTgt = new HashMap();
+ srcToTgt = new HashMap<Expression, Expression>();
}
srcToTgt.put(crit.getLeftExpression(), crit.getRightExpression());
srcToTgt.put(crit.getRightExpression(), crit.getLeftExpression());
}
}
if (srcToTgt == null) {
- return Collections.EMPTY_MAP;
+ return Collections.emptyMap();
}
return srcToTgt;
}
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleRaiseAccess.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleRaiseAccess.java 2011-01-04 19:40:39 UTC (rev 2814)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleRaiseAccess.java 2011-01-04 21:24:33 UTC (rev 2815)
@@ -569,7 +569,9 @@
Object modelID = null;
Set<Object> groupIDs = new HashSet<Object>();
int groupCount = 0;
-
+ LinkedList<CompareCriteria> thetaCriteria = new LinkedList<CompareCriteria>();
+ SupportedJoinCriteria sjc = null;
+
for (PlanNode childNode : children) {
if(childNode.getType() != NodeConstants.Types.ACCESS
|| childNode.hasCollectionProperty(NodeConstants.Info.ACCESS_PATTERNS)) {
@@ -604,7 +606,7 @@
if (!CapabilitiesUtil.supportsJoin(accessModelID, type, metadata, capFinder)) {
return null;
}
- SupportedJoinCriteria sjc = CapabilitiesUtil.getSupportedJoinCriteria(accessModelID, metadata, capFinder);
+ sjc = CapabilitiesUtil.getSupportedJoinCriteria(accessModelID, metadata, capFinder);
/*
* Key joins must be left linear
@@ -616,7 +618,16 @@
if(crits != null && !crits.isEmpty()) {
for (Criteria crit : crits) {
if (!isSupportedJoinCriteria(sjc, crit, accessModelID, metadata, capFinder, record)) {
+ if (crit instanceof CompareCriteria) {
+ CompareCriteria cc = (CompareCriteria) crit;
+ if (cc.isOptional()) {
+ cc.setOptional(true);
+ continue;
+ }
+ }
return null;
+ } else if (crit instanceof CompareCriteria) {
+ thetaCriteria.add((CompareCriteria)crit);
}
}
if (sjc == SupportedJoinCriteria.KEY) {
@@ -649,7 +660,7 @@
&& !matchesForeignKey(metadata, rightIds, leftIds, rightGroup, true)) {
return null;
}
- }
+ }
} else if (sjc != SupportedJoinCriteria.ANY) {
return null; //cross join not supported
}
@@ -667,6 +678,21 @@
return null;
}
+ if (sjc == SupportedJoinCriteria.KEY) {
+ for (CompareCriteria criteria : thetaCriteria) {
+ criteria.setOptional(false);
+ }
+ } else {
+ //TODO: this should be done in a less arbitrary way, and what about composite keys?
+ boolean hasCriteria = false;
+ for (CompareCriteria criteria : thetaCriteria) {
+ if (criteria.getIsOptional() == null || (!hasCriteria && criteria.getIsOptional())) {
+ criteria.setOptional(false);
+ }
+ hasCriteria = true;
+ }
+ }
+
return modelID;
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/CompareCriteria.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/CompareCriteria.java 2011-01-04 19:40:39 UTC (rev 2814)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/CompareCriteria.java 2011-01-04 21:24:33 UTC (rev 2815)
@@ -46,7 +46,7 @@
/** The right-hand expression. */
private Expression rightExpression;
- private boolean isOptional;
+ private Boolean isOptional = Boolean.FALSE;
/**
* Constructs a default instance of this class.
@@ -103,7 +103,7 @@
* to correctly process a join
* @param isOptional
*/
- public void setOptional(boolean isOptional) {
+ public void setOptional(Boolean isOptional) {
this.isOptional = isOptional;
}
@@ -113,6 +113,10 @@
* @return
*/
public boolean isOptional() {
+ return isOptional == null || isOptional;
+ }
+
+ public Boolean getIsOptional() {
return isOptional;
}
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java 2011-01-04 19:40:39 UTC (rev 2814)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java 2011-01-04 21:24:33 UTC (rev 2815)
@@ -51,7 +51,7 @@
import org.teiid.query.unittest.FakeMetadataStore;
import org.teiid.translator.SourceSystemFunctions;
-
+@SuppressWarnings("nls")
public class TestJoinOptimization {
/**
@@ -260,13 +260,13 @@
}
/**
- * The intkey criteria should not be copied above to bqt1.smalla since the criteria is comming from the inner side in the join below
+ * The intkey criteria should not be copied above to bqt1.smalla since the criteria is coming from the inner side in the join below
*/
@Test public void testInvalidCopyCriteria() {
String sql = "select bqt1.smalla.intkey from bqt1.smalla inner join (select bqt3.smalla.intkey from bqt2.smalla left outer join bqt3.smalla on bqt2.smalla.intkey = bqt3.smalla.intkey and bqt3.smalla.intkey = 1) foo on bqt1.smalla.intkey = foo.intkey"; //$NON-NLS-1$
// Plan query
- ProcessorPlan plan = TestOptimizer.helpPlan(sql, FakeMetadataFactory.exampleBQTCached(), new String[] {"SELECT g_0.intkey FROM bqt3.smalla AS g_0 WHERE g_0.intkey = 1", "SELECT g_0.intkey FROM bqt2.smalla AS g_0", "SELECT g_0.intkey AS c_0 FROM bqt1.smalla AS g_0 ORDER BY c_0"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ ProcessorPlan plan = TestOptimizer.helpPlan(sql, FakeMetadataFactory.exampleBQTCached(), new String[] {"SELECT g_0.intkey FROM bqt3.smalla AS g_0 WHERE g_0.intkey = 1", "SELECT g_0.IntKey FROM bqt2.smalla AS g_0", "SELECT g_0.intkey AS c_0 FROM bqt1.smalla AS g_0 ORDER BY c_0"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
TestOptimizer.checkNodeTypes(plan, new int[] {
3, // Access
@@ -293,7 +293,7 @@
String sql = "select bqt1.smalla.intkey from bqt1.smalla left outer join (select bqt3.smalla.intkey from bqt3.smalla where bqt3.smalla.intkey = 1) foo on bqt1.smalla.intkey = foo.intkey"; //$NON-NLS-1$
// Plan query
- ProcessorPlan plan = TestOptimizer.helpPlan(sql, FakeMetadataFactory.exampleBQTCached(), new String[] {"SELECT g_0.intkey FROM bqt3.smalla AS g_0 WHERE g_0.intkey = 1", "SELECT g_0.intkey FROM bqt1.smalla AS g_0"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$ //$NON-NLS-2$
+ ProcessorPlan plan = TestOptimizer.helpPlan(sql, FakeMetadataFactory.exampleBQTCached(), new String[] {"SELECT g_0.IntKey FROM bqt3.smalla AS g_0 WHERE g_0.intkey = 1", "SELECT g_0.intkey FROM bqt1.smalla AS g_0"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$ //$NON-NLS-2$
TestOptimizer.checkNodeTypes(plan, new int[] {
2, // Access
@@ -550,7 +550,7 @@
}
/**
- * non-depenent criteria on each side of a full outer creates an inner join
+ * non-dependent criteria on each side of a full outer creates an inner join
*/
@Test public void testOuterToInnerJoinConversion4() {
QueryMetadataInterface metadata = FakeMetadataFactory.exampleBQTCached();
@@ -1001,5 +1001,31 @@
0 // UnionAll
});
}
+
+ @Test public void testTransitiveJoinCondition() {
+ String sql = "select b.intkey from bqt1.smalla a, bqt2.smallb b, bqt2.smalla b1 where a.intkey = b.intkey and a.intkey = b1.intkey"; //$NON-NLS-1$
+ // Plan query
+ ProcessorPlan plan = TestOptimizer.helpPlan(sql, FakeMetadataFactory.exampleBQTCached(), new String[] {
+ "SELECT g_1.intkey AS c_0, g_0.intkey AS c_1 FROM bqt2.smallb AS g_0, bqt2.smalla AS g_1 WHERE g_1.intkey = g_0.intkey ORDER BY c_0, c_1",
+ "SELECT g_0.intkey AS c_0 FROM bqt1.smalla AS g_0 ORDER BY c_0"});
+
+ TestOptimizer.checkNodeTypes(plan, new int[] {
+ 2, // Access
+ 0, // DependentAccess
+ 0, // DependentSelect
+ 0, // DependentProject
+ 0, // DupRemove
+ 0, // Grouping
+ 0, // Join
+ 1, // MergeJoin
+ 0, // Null
+ 0, // PlanExecution
+ 1, // Project
+ 0, // Select
+ 0, // Sort
+ 0 // UnionAll
+ });
+ }
+
}
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java 2011-01-04 19:40:39 UTC (rev 2814)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java 2011-01-04 21:24:33 UTC (rev 2815)
@@ -5803,8 +5803,8 @@
ProcessorPlan plan = helpPlan(sql, FakeMetadataFactory.exampleBQTCached(),
new String[] {
- "SELECT g_0.IntKey FROM BQT1.SmallA AS g_0 WHERE g_0.IntKey <> 1", //$NON-NLS-1$
- "SELECT g_0.IntKey FROM BQT1.SmallA AS g_0 WHERE g_0.IntKey = 1" }, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
+ "SELECT g_0.intkey FROM BQT1.SmallA AS g_0 WHERE g_0.IntKey <> 1", //$NON-NLS-1$
+ "SELECT g_0.intkey FROM BQT1.SmallA AS g_0 WHERE g_0.IntKey = 1" }, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
checkNodeTypes(plan, new int[] {
2, // Access
13 years, 4 months
teiid SVN: r2814 - in branches/7.1.x: metadata/src/main/java/org/teiid/metadata/index and 2 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-01-04 14:40:39 -0500 (Tue, 04 Jan 2011)
New Revision: 2814
Added:
branches/7.1.x/metadata/src/test/resources/Test.vdb
Modified:
branches/7.1.x/api/src/main/java/org/teiid/metadata/Schema.java
branches/7.1.x/metadata/src/main/java/org/teiid/metadata/index/IndexMetadataFactory.java
branches/7.1.x/metadata/src/test/java/org/teiid/metadata/index/TestMultipleModelIndexes.java
Log:
TEIID-1418 updated the metadata search filter to load tables correctly
Modified: branches/7.1.x/api/src/main/java/org/teiid/metadata/Schema.java
===================================================================
--- branches/7.1.x/api/src/main/java/org/teiid/metadata/Schema.java 2011-01-03 22:46:11 UTC (rev 2813)
+++ branches/7.1.x/api/src/main/java/org/teiid/metadata/Schema.java 2011-01-04 19:40:39 UTC (rev 2814)
@@ -38,7 +38,9 @@
public void addTable(Table table) {
table.setParent(this);
- this.tables.put(table.getName().toLowerCase(), table);
+ if (this.tables.put(table.getName().toLowerCase(), table) != null) {
+ throw new AssertionError("Duplicate Table " + table.getName()); //$NON-NLS-1$
+ }
}
public void addProcedure(Procedure procedure) {
Modified: branches/7.1.x/metadata/src/main/java/org/teiid/metadata/index/IndexMetadataFactory.java
===================================================================
--- branches/7.1.x/metadata/src/main/java/org/teiid/metadata/index/IndexMetadataFactory.java 2011-01-03 22:46:11 UTC (rev 2813)
+++ branches/7.1.x/metadata/src/main/java/org/teiid/metadata/index/IndexMetadataFactory.java 2011-01-04 19:40:39 UTC (rev 2814)
@@ -603,7 +603,7 @@
* recordType|pathInModel|UUID|nameInSource|parentObjectID|
* @param name The partially/fully qualified name for which
* the pattern match string is to be constructed.
- * @return The pattern match string of the form: recordType|*name|*
+ * @return The pattern match string of the form: recordType|name|*
*/
private String getMatchPattern(final char recordType, final String name) {
ArgCheck.isNotNull(name);
@@ -611,8 +611,7 @@
// construct the pattern string
String patternStr = "" //$NON-NLS-1$
+ recordType
- + IndexConstants.RECORD_STRING.RECORD_DELIMITER
- + IndexConstants.RECORD_STRING.MATCH_CHAR;
+ + IndexConstants.RECORD_STRING.RECORD_DELIMITER;
if(name != null) {
patternStr = patternStr + name.trim().toUpperCase()
+ IndexConstants.RECORD_STRING.RECORD_DELIMITER
Modified: branches/7.1.x/metadata/src/test/java/org/teiid/metadata/index/TestMultipleModelIndexes.java
===================================================================
--- branches/7.1.x/metadata/src/test/java/org/teiid/metadata/index/TestMultipleModelIndexes.java 2011-01-03 22:46:11 UTC (rev 2813)
+++ branches/7.1.x/metadata/src/test/java/org/teiid/metadata/index/TestMultipleModelIndexes.java 2011-01-04 19:40:39 UTC (rev 2814)
@@ -42,8 +42,16 @@
assertEquals(1, names.size());
//ensure that datatypes are set
- Table t = (Table)tm.getGroupID(names.iterator().next());
+ Table t = tm.getGroupID(names.iterator().next());
assertNotNull(t.getColumns().get(0).getDatatype());
}
+ @Test public void testSchemaLoad() throws Exception {
+ TransformationMetadata tm = VDBMetadataFactory.getVDBMetadata(UnitTestUtil.getTestDataPath() + "/Test.vdb");
+
+ //ensure that datatypes are set
+ Table t = tm.getGroupID("Northwind.Northwind.dbo.Employees");
+ assertFalse(t.isVirtual());
+ }
+
}
Added: branches/7.1.x/metadata/src/test/resources/Test.vdb
===================================================================
(Binary files differ)
Property changes on: branches/7.1.x/metadata/src/test/resources/Test.vdb
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
13 years, 4 months
teiid SVN: r2813 - in branches/7.1.x/engine/src: test/java/org/teiid/dqp/internal/process and 1 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-01-03 17:46:11 -0500 (Mon, 03 Jan 2011)
New Revision: 2813
Modified:
branches/7.1.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
branches/7.1.x/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java
branches/7.1.x/engine/src/test/java/org/teiid/query/processor/HardcodedDataManager.java
Log:
TEIID-1414 fix for prepared statement reference values in subqueries
Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2011-01-03 16:29:09 UTC (rev 2812)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2011-01-03 22:46:11 UTC (rev 2813)
@@ -414,7 +414,7 @@
* @throws QueryValidatorException
*/
private void rewriteSubqueryContainer(SubqueryContainer container, boolean removeOrderBy) throws TeiidComponentException, TeiidProcessingException{
- if (rewriteSubcommands && container.getCommand() != null && container.getCommand().getProcessorPlan() == null) {
+ if (rewriteSubcommands && container.getCommand() != null && (container.getCommand().getProcessorPlan() == null || processing)) {
container.setCommand(rewriteCommand(container.getCommand(), removeOrderBy));
}
}
Modified: branches/7.1.x/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java
===================================================================
--- branches/7.1.x/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java 2011-01-03 16:29:09 UTC (rev 2812)
+++ branches/7.1.x/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java 2011-01-03 22:46:11 UTC (rev 2813)
@@ -49,12 +49,13 @@
import org.teiid.query.optimizer.capabilities.FakeCapabilitiesFinder;
import org.teiid.query.optimizer.capabilities.SourceCapabilities.Capability;
import org.teiid.query.processor.FakeDataManager;
+import org.teiid.query.processor.HardcodedDataManager;
import org.teiid.query.processor.ProcessorDataManager;
import org.teiid.query.processor.TestProcessor;
import org.teiid.query.unittest.FakeMetadataFacade;
import org.teiid.query.unittest.FakeMetadataFactory;
-
+@SuppressWarnings("nls")
public class TestPreparedStatement {
private static final int SESSION_ID = 6;
@@ -418,4 +419,23 @@
helpTestProcessing(preparedSql, values, expected, dataManager, FakeMetadataFactory.example1Cached(), false, false,FakeMetadataFactory.example1VDB());
}
+ @Test public void testWithSubqueryPushdown() throws Exception {
+ String preparedSql = "SELECT pm1.g1.e1 FROM pm1.g1 WHERE pm1.g1.e2 IN (SELECT pm1.g2.e2 FROM pm1.g2 WHERE pm1.g2.e1 = ?)"; //$NON-NLS-1$
+
+ List[] expected = new List[] {
+ Arrays.asList("a"),
+ };
+
+ List values = Arrays.asList("a"); //$NON-NLS-1$
+
+ QueryMetadataInterface metadata = FakeMetadataFactory.example1Cached();
+ HardcodedDataManager dataManager = new HardcodedDataManager(metadata);
+ dataManager.addData("SELECT g_0.e1 FROM g1 AS g_0 WHERE g_0.e2 IN (SELECT g_1.e2 FROM g2 AS g_1 WHERE g_1.e1 = 'a')", new List[] {Arrays.asList("a")});
+ BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
+ caps.setCapabilitySupport(Capability.QUERY_SUBQUERIES_CORRELATED, true);
+ caps.setCapabilitySupport(Capability.CRITERIA_IN_SUBQUERY, true);
+
+ helpTestProcessing(preparedSql, values, expected, dataManager, new DefaultCapabilitiesFinder(caps), metadata, null, false, false, false, FakeMetadataFactory.example1VDB());
+ }
+
}
Modified: branches/7.1.x/engine/src/test/java/org/teiid/query/processor/HardcodedDataManager.java
===================================================================
--- branches/7.1.x/engine/src/test/java/org/teiid/query/processor/HardcodedDataManager.java 2011-01-03 16:29:09 UTC (rev 2812)
+++ branches/7.1.x/engine/src/test/java/org/teiid/query/processor/HardcodedDataManager.java 2011-01-03 22:46:11 UTC (rev 2813)
@@ -31,6 +31,8 @@
import org.teiid.common.buffer.BlockedException;
import org.teiid.common.buffer.TupleSource;
import org.teiid.core.TeiidComponentException;
+import org.teiid.dqp.internal.datamgr.LanguageBridgeFactory;
+import org.teiid.query.metadata.QueryMetadataInterface;
import org.teiid.query.sql.lang.Command;
import org.teiid.query.util.CommandContext;
@@ -43,7 +45,7 @@
ProcessorDataManager {
// sql string to data
- private Map data = new HashMap();
+ private Map<String, List[]> data = new HashMap<String, List[]>();
// valid models - if null, any is assumed valid
private Set validModels;
@@ -53,12 +55,19 @@
private boolean blockOnce;
// Collect all commands run against this class
- private List commandHistory = new ArrayList(); // Commands
+ private List<Command> commandHistory = new ArrayList<Command>(); // Commands
+ private LanguageBridgeFactory lbf;
+
public HardcodedDataManager() {
this(true);
}
+ public HardcodedDataManager(QueryMetadataInterface metadata) {
+ this(true);
+ this.lbf = new LanguageBridgeFactory(metadata);
+ }
+
public HardcodedDataManager(boolean mustRegisterCommands) {
this.mustRegisterCommands = mustRegisterCommands;
}
@@ -123,10 +132,17 @@
List projectedSymbols = command.getProjectedSymbols();
- List[] rows = (List[]) data.get(command.toString());
+ String commandString = null;
+ if (lbf == null) {
+ commandString = command.toString();
+ } else {
+ commandString = lbf.translate(command).toString();
+ }
+
+ List[] rows = data.get(commandString);
if(rows == null) {
if (mustRegisterCommands) {
- throw new TeiidComponentException("Unknown command: " + command.toString()); //$NON-NLS-1$
+ throw new TeiidComponentException("Unknown command: " + commandString); //$NON-NLS-1$
}
// Create one row of nulls
rows = new List[1];
13 years, 4 months
teiid SVN: r2812 - trunk/documentation/caching-guide/src/main/docbook/en-US/content.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-01-03 11:29:09 -0500 (Mon, 03 Jan 2011)
New Revision: 2812
Modified:
trunk/documentation/caching-guide/src/main/docbook/en-US/content/results.xml
Log:
TEIID-1227 removing the note on the limitation of lob caching
Modified: trunk/documentation/caching-guide/src/main/docbook/en-US/content/results.xml
===================================================================
--- trunk/documentation/caching-guide/src/main/docbook/en-US/content/results.xml 2011-01-03 15:37:22 UTC (rev 2811)
+++ trunk/documentation/caching-guide/src/main/docbook/en-US/content/results.xml 2011-01-03 16:29:09 UTC (rev 2812)
@@ -116,9 +116,6 @@
<title>Limitations</title>
<itemizedlist>
<listitem>
- <para>Non-XML document model results, BLOBs, CLOBs, and OBJECT typed values cannot be cached.</para>
- </listitem>
- <listitem>
<para>XML, BLOB, CLOB, and OBJECT type cannot be used as part of the cache key for prepared statement of procedure cache keys.</para>
</listitem>
<listitem>
13 years, 4 months
teiid SVN: r2811 - in trunk/engine/src: test/java/org/teiid/query/optimizer and 1 other directory.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-01-03 10:37:22 -0500 (Mon, 03 Jan 2011)
New Revision: 2811
Modified:
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java
Log:
TEIID-211 additional handling for subquery optimization
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java 2011-01-01 01:41:28 UTC (rev 2810)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java 2011-01-03 15:37:22 UTC (rev 2811)
@@ -67,6 +67,7 @@
import org.teiid.query.sql.lang.SubquerySetCriteria;
import org.teiid.query.sql.navigator.DeepPostOrderNavigator;
import org.teiid.query.sql.symbol.AggregateSymbol;
+import org.teiid.query.sql.symbol.AliasSymbol;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
@@ -472,13 +473,22 @@
plannedResult.rightExpressions = RuleChooseJoinStrategy.createExpressionSymbols(plannedResult.rightExpressions);
if (requireDistinct && !addGroupBy && !isDistinct(plannedResult.query, plannedResult.rightExpressions, metadata)) {
- return false;
+ if (!requiredExpressions.isEmpty()) {
+ return false;
+ }
+ plannedResult.query.getSelect().setDistinct(true);
}
if (addGroupBy) {
plannedResult.query.setGroupBy(new GroupBy(plannedResult.rightExpressions));
}
- HashSet<SingleElementSymbol> projectedSymbols = new HashSet<SingleElementSymbol>(plannedResult.query.getProjectedSymbols());
+ HashSet<SingleElementSymbol> projectedSymbols = new HashSet<SingleElementSymbol>();
+ for (SingleElementSymbol ses : plannedResult.query.getProjectedSymbols()) {
+ if (ses instanceof AliasSymbol) {
+ ses = ((AliasSymbol)ses).getSymbol();
+ }
+ projectedSymbols.add(ses);
+ }
for (SingleElementSymbol ses : requiredExpressions) {
if (projectedSymbols.add(ses)) {
plannedResult.query.getSelect().addSymbol(ses);
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java 2011-01-01 01:41:28 UTC (rev 2810)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java 2011-01-03 15:37:22 UTC (rev 2811)
@@ -755,9 +755,20 @@
}
@Test public void testSubqueryRewriteToJoin1() throws Exception {
- TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where pm3.g1.e1 in (select pm1.g1.e1 FROM pm1.g1)", "SELECT e1 FROM pm3.g1, (SELECT pm1.g1.e1 FROM pm1.g1) AS X__1 WHERE pm3.g1.e1 = X__1.e1", FakeMetadataFactory.example4());
+ TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where pm3.g1.e1 in (select pm1.g1.e1 as x FROM pm1.g1)", "SELECT e1 FROM pm3.g1, (SELECT pm1.g1.e1 AS x FROM pm1.g1) AS X__1 WHERE pm3.g1.e1 = X__1.x", FakeMetadataFactory.example4());
}
+ @Test public void testSubqueryRewriteToJoin2() throws Exception {
+ TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where pm3.g1.e1 in (select pm1.g1.e1 || 1 FROM pm1.g1)", "SELECT e1 FROM pm3.g1, (SELECT DISTINCT concat(pm1.g1.e1, '1') AS EXPR FROM pm1.g1) AS X__1 WHERE pm3.g1.e1 = X__1.EXPR", FakeMetadataFactory.example4());
+ }
+
+ /**
+ * Even though this situation is essentially the same as above, we don't yet handle it
+ */
+ @Test public void testSubqueryRewriteToJoin3() throws Exception {
+ TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where exists (select pm1.g1.e2 FROM pm1.g1 WHERE pm3.g1.e1 = pm1.g1.e1 || 1)", "SELECT e1 FROM pm3.g1 WHERE EXISTS (SELECT pm1.g1.e2 FROM pm1.g1 WHERE concat(pm1.g1.e1, '1') = pm3.g1.e1)", FakeMetadataFactory.example4());
+ }
+
@Test public void testSubqueryRewriteToJoinWithOtherCriteria() throws Exception {
TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where pm3.g1.e1 in (select pm1.g1.e1 FROM pm1.g1 where e2 < pm3.g1.e2)", "SELECT e1 FROM pm3.g1, (SELECT pm1.g1.e1, e2 FROM pm1.g1) AS X__1 WHERE (X__1.e2 < pm3.g1.e2) AND (pm3.g1.e1 = X__1.e1)", FakeMetadataFactory.example4());
}
13 years, 4 months
teiid SVN: r2810 - in branches/7.1.x/connectors/translator-salesforce/src: test/java/org/teiid/translator/salesforce/execution/visitors and 1 other directory.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2010-12-31 20:41:28 -0500 (Fri, 31 Dec 2010)
New Revision: 2810
Modified:
branches/7.1.x/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/JoinQueryVisitor.java
branches/7.1.x/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/SelectVisitor.java
branches/7.1.x/connectors/translator-salesforce/src/test/java/org/teiid/translator/salesforce/execution/visitors/TestVisitors.java
Log:
TEIID-1410 fix for malformed query with no outer colums
Modified: branches/7.1.x/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/JoinQueryVisitor.java
===================================================================
--- branches/7.1.x/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/JoinQueryVisitor.java 2010-12-24 21:23:50 UTC (rev 2809)
+++ branches/7.1.x/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/JoinQueryVisitor.java 2011-01-01 01:41:28 UTC (rev 2810)
@@ -110,12 +110,12 @@
}
StringBuffer select = new StringBuffer();
select.append(SELECT).append(SPACE);
- addSelectSymbols(leftTableInJoin.getNameInSource(), select);
- select.append(COMMA).append(SPACE).append(OPEN);
+ addSelect(leftTableInJoin.getNameInSource(), select, true);
+ select.append(OPEN);
StringBuffer subselect = new StringBuffer();
subselect.append(SELECT).append(SPACE);
- addSelectSymbols(rightTableInJoin.getNameInSource(), subselect);
+ addSelect(rightTableInJoin.getNameInSource(), subselect, false);
subselect.append(SPACE);
subselect.append(FROM).append(SPACE);
subselect.append(rightTableInJoin.getNameInSource()).append('s');
@@ -133,7 +133,7 @@
return childTable.equals(leftTableInJoin);
}
- protected void addSelectSymbols(String tableNameInSource, StringBuffer result) throws TranslatorException {
+ void addSelect(String tableNameInSource, StringBuffer result, boolean addComma) {
boolean firstTime = true;
for (DerivedColumn symbol : selectSymbols) {
Expression expression = symbol.getExpression();
@@ -143,23 +143,30 @@
if(!isParentToChildJoin() && tableNameInSource.equals(tableName) ||
isParentToChildJoin()) {
if (!firstTime) {
- result.append(", ");
+ result.append(", "); //$NON-NLS-1$
} else {
firstTime = false;
}
result.append(tableName);
result.append('.');
result.append(element.getNameInSource());
+ } else {
+ continue;
}
} else if (expression instanceof AggregateFunction) {
if (!firstTime) {
- result.append(", ");
+ result.append(", "); //$NON-NLS-1$
} else {
firstTime = false;
}
result.append("count()"); //$NON-NLS-1$
+ } else {
+ throw new AssertionError("Unknown select symbol type" + symbol); //$NON-NLS-1$
}
}
+ if (!firstTime && addComma) {
+ result.append(", "); //$NON-NLS-1$
+ }
}
}
Modified: branches/7.1.x/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/SelectVisitor.java
===================================================================
--- branches/7.1.x/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/SelectVisitor.java 2010-12-24 21:23:50 UTC (rev 2809)
+++ branches/7.1.x/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/SelectVisitor.java 2011-01-01 01:41:28 UTC (rev 2810)
@@ -122,7 +122,7 @@
}
StringBuffer result = new StringBuffer();
result.append(SELECT).append(SPACE);
- addSelectSymbols(table.getNameInSource(), result);
+ addSelectSymbols(result);
result.append(SPACE);
result.append(FROM).append(SPACE);
result.append(table.getNameInSource()).append(SPACE);
@@ -133,7 +133,7 @@
return result.toString();
}
- protected void addSelectSymbols(String tableNameInSource, StringBuffer result) throws TranslatorException {
+ private void addSelectSymbols(StringBuffer result) throws TranslatorException {
boolean firstTime = true;
for (DerivedColumn symbol : selectSymbols) {
if (!firstTime) {
@@ -204,7 +204,7 @@
public String getRetrieveFieldList() throws TranslatorException {
assertRetrieveValidated();
StringBuffer result = new StringBuffer();
- addSelectSymbols(table.getNameInSource(), result);
+ addSelectSymbols(result);
return result.toString();
}
Modified: branches/7.1.x/connectors/translator-salesforce/src/test/java/org/teiid/translator/salesforce/execution/visitors/TestVisitors.java
===================================================================
--- branches/7.1.x/connectors/translator-salesforce/src/test/java/org/teiid/translator/salesforce/execution/visitors/TestVisitors.java 2010-12-24 21:23:50 UTC (rev 2809)
+++ branches/7.1.x/connectors/translator-salesforce/src/test/java/org/teiid/translator/salesforce/execution/visitors/TestVisitors.java 2011-01-01 01:41:28 UTC (rev 2810)
@@ -169,6 +169,13 @@
assertEquals("SELECT Account.AccountName, (SELECT Contact.ContactName FROM Contacts) FROM Account", visitor.getQuery().toString().trim()); //$NON-NLS-1$
}
+ @Test public void testJoin3() throws Exception {
+ Select command = (Select)translationUtility.parseCommand("SELECT Contacts.Name FROM Account LEFT OUTER JOIN Contacts ON Account.Id = Contacts.AccountId"); //$NON-NLS-1$
+ SelectVisitor visitor = new JoinQueryVisitor(translationUtility.createRuntimeMetadata());
+ visitor.visit(command);
+ assertEquals("SELECT (SELECT Contact.ContactName FROM Contacts) FROM Account", visitor.getQuery().toString().trim()); //$NON-NLS-1$
+ }
+
@Test public void testInWithNameInSourceDifferent() throws Exception {
Select command = (Select)translationUtility.parseCommand("SELECT Contacts.Name FROM Contacts WHERE Contacts.Name in ('x', 'y')"); //$NON-NLS-1$
SelectVisitor visitor = new SelectVisitor(translationUtility.createRuntimeMetadata());
13 years, 4 months