[teiid-commits] teiid SVN: r2826 - in trunk: client/src/main/java/org/teiid/adminapi and 16 other directories.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Mon Jan 10 21:17:55 EST 2011
Author: shawkins
Date: 2011-01-10 21:17:53 -0500 (Mon, 10 Jan 2011)
New Revision: 2826
Added:
trunk/metadata/src/test/resources/Test.vdb
Modified:
trunk/api/src/main/java/org/teiid/metadata/Schema.java
trunk/client/src/main/java/org/teiid/adminapi/Transaction.java
trunk/client/src/main/java/org/teiid/adminapi/impl/TransactionMetadata.java
trunk/client/src/main/java/org/teiid/adminapi/impl/TransactionMetadataMapper.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/SalesForceExecutionFactory.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/QueryExecutionImpl.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/JoinQueryVisitor.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/SelectVisitor.java
trunk/connectors/translator-salesforce/src/test/java/org/teiid/translator/salesforce/execution/visitors/TestVisitors.java
trunk/console/src/main/java/org/teiid/rhq/admin/DQPManagementView.java
trunk/documentation/reference/src/main/docbook/en-US/content/federated_planning.xml
trunk/engine/src/main/java/org/teiid/dqp/internal/process/TransactionServerImpl.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushLimit.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleRemoveOptionalJoins.java
trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestTransactionServer.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestLimit.java
trunk/engine/src/test/java/org/teiid/query/processor/HardcodedDataManager.java
trunk/metadata/src/main/java/org/teiid/metadata/index/IndexMetadataFactory.java
trunk/metadata/src/test/java/org/teiid/metadata/index/TestMultipleModelIndexes.java
Log:
forward merge of 7.1.1
Modified: trunk/api/src/main/java/org/teiid/metadata/Schema.java
===================================================================
--- trunk/api/src/main/java/org/teiid/metadata/Schema.java 2011-01-10 22:09:53 UTC (rev 2825)
+++ trunk/api/src/main/java/org/teiid/metadata/Schema.java 2011-01-11 02:17:53 UTC (rev 2826)
@@ -39,7 +39,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: trunk/client/src/main/java/org/teiid/adminapi/Transaction.java
===================================================================
--- trunk/client/src/main/java/org/teiid/adminapi/Transaction.java 2011-01-10 22:09:53 UTC (rev 2825)
+++ trunk/client/src/main/java/org/teiid/adminapi/Transaction.java 2011-01-11 02:17:53 UTC (rev 2826)
@@ -30,7 +30,7 @@
* May be null for an unassociated Global transaction.
* @return
*/
- long getAssociatedSession();
+ String getAssociatedSession();
/**
* Get the scope for the transaction. Will be one of GLOBAL, LOCAL, or REQUEST
Modified: trunk/client/src/main/java/org/teiid/adminapi/impl/TransactionMetadata.java
===================================================================
--- trunk/client/src/main/java/org/teiid/adminapi/impl/TransactionMetadata.java 2011-01-10 22:09:53 UTC (rev 2825)
+++ trunk/client/src/main/java/org/teiid/adminapi/impl/TransactionMetadata.java 2011-01-11 02:17:53 UTC (rev 2826)
@@ -33,18 +33,18 @@
public class TransactionMetadata extends AdminObjectImpl implements Transaction {
private static final long serialVersionUID = -8588785315218789068L;
- private long associatedSession;
+ private String associatedSession;
private String scope;
private String id;
private long createdTime;
@Override
@ManagementProperty(description="Session ID", readOnly=true)
- public long getAssociatedSession() {
+ public String getAssociatedSession() {
return associatedSession;
}
- public void setAssociatedSession(long associatedSession) {
+ public void setAssociatedSession(String associatedSession) {
this.associatedSession = associatedSession;
}
Modified: trunk/client/src/main/java/org/teiid/adminapi/impl/TransactionMetadataMapper.java
===================================================================
--- trunk/client/src/main/java/org/teiid/adminapi/impl/TransactionMetadataMapper.java 2011-01-10 22:09:53 UTC (rev 2825)
+++ trunk/client/src/main/java/org/teiid/adminapi/impl/TransactionMetadataMapper.java 2011-01-11 02:17:53 UTC (rev 2826)
@@ -45,7 +45,7 @@
static {
metaType = new MutableCompositeMetaType(TransactionMetadata.class.getName(), "The Transaction domain meta data"); //$NON-NLS-1$
- metaType.addItem(ASSOCIATED_SESSION, ASSOCIATED_SESSION, SimpleMetaType.LONG_PRIMITIVE);
+ metaType.addItem(ASSOCIATED_SESSION, ASSOCIATED_SESSION, SimpleMetaType.STRING);
metaType.addItem(CREATED_TIME, CREATED_TIME, SimpleMetaType.LONG_PRIMITIVE);
metaType.addItem(SCOPE, SCOPE, SimpleMetaType.STRING);
metaType.addItem(XID, XID, SimpleMetaType.STRING);
@@ -89,7 +89,7 @@
CompositeValue compositeValue = (CompositeValue) metaValue;
TransactionMetadata transaction = new TransactionMetadata();
- transaction.setAssociatedSession((Long) metaValueFactory.unwrap(compositeValue.get(ASSOCIATED_SESSION)));
+ transaction.setAssociatedSession((String) metaValueFactory.unwrap(compositeValue.get(ASSOCIATED_SESSION)));
transaction.setCreatedTime((Long) metaValueFactory.unwrap(compositeValue.get(CREATED_TIME)));
transaction.setScope((String) metaValueFactory.unwrap(compositeValue.get(SCOPE)));
transaction.setId((String) metaValueFactory.unwrap(compositeValue.get("id"))); //$NON-NLS-1$
Modified: trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/SalesForceExecutionFactory.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/SalesForceExecutionFactory.java 2011-01-10 22:09:53 UTC (rev 2825)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/SalesForceExecutionFactory.java 2011-01-11 02:17:53 UTC (rev 2826)
@@ -59,7 +59,8 @@
private static final String EXCLUDES = "excludes";//$NON-NLS-1$
private static final String INCLUDES = "includes";//$NON-NLS-1$
private String connectorStateClass;
- private boolean auditModelFields = false;
+ private boolean auditModelFields = false;
+ private int maxInSize = 300;
public SalesForceExecutionFactory() {
// http://jira.jboss.org/jira/browse/JBEDSP-306
@@ -124,9 +125,14 @@
}
@Override
+ @TranslatorProperty(display="Max number of IN predicate entries", advanced=true)
public int getMaxInCriteriaSize() {
- return 700;
+ return maxInSize;
}
+
+ public void setMaxInCriteriaSize(int maxInSize) {
+ this.maxInSize = maxInSize;
+ }
@Override
public List getSupportedFunctions() {
Modified: trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/QueryExecutionImpl.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/QueryExecutionImpl.java 2011-01-10 22:09:53 UTC (rev 2825)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/QueryExecutionImpl.java 2011-01-11 02:17:53 UTC (rev 2826)
@@ -63,14 +63,16 @@
public class QueryExecutionImpl implements ResultSetExecution {
- private static final String SF_ID = "sf:Id";
+ private static final String SF_ID = "sf:Id"; //$NON-NLS-1$
- private static final String SF_TYPE = "sf:type";
+ private static final String SF_TYPE = "sf:type"; //$NON-NLS-1$
- private static final String SF_S_OBJECT = "sf:sObject";
+ private static final String SF_S_OBJECT = "sf:sObject"; //$NON-NLS-1$
- private static final String XSI_TYPE = "xsi:type";
-
+ private static final String XSI_TYPE = "xsi:type"; //$NON-NLS-1$
+
+ private static final String XSI_NIL = "xsi:nil"; //$NON-NLS-1$
+
private SalesforceConnection connection;
private RuntimeMetadata metadata;
@@ -272,7 +274,7 @@
}
} else {
Object cell;
- cell = sObject.getElementsByTagName("sf:" + element.getNameInSource()).item(0);
+ cell = sObject.getElementsByTagName("sf:" + element.getNameInSource()).item(0); //$NON-NLS-1$
setElementValueInColumn(j, cell, row);
}
}
@@ -320,7 +322,14 @@
private void setElementValueInColumn(int columnIndex, Object value, Object[] row) {
if(value instanceof Element) {
- row[columnIndex] = ((Element)value).getFirstChild().getNodeValue();
+ Element element = (Element)value;
+ if (!Boolean.parseBoolean(element.getAttribute(XSI_NIL))) {
+ if (element.getFirstChild() != null) {
+ row[columnIndex] = element.getFirstChild().getNodeValue();
+ } else {
+ row[columnIndex] = ""; //$NON-NLS-1$
+ }
+ }
} else {
row[columnIndex] = value;
}
Modified: trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/JoinQueryVisitor.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/JoinQueryVisitor.java 2011-01-10 22:09:53 UTC (rev 2825)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/JoinQueryVisitor.java 2011-01-11 02:17:53 UTC (rev 2826)
@@ -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: trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/SelectVisitor.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/SelectVisitor.java 2011-01-10 22:09:53 UTC (rev 2825)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/SelectVisitor.java 2011-01-11 02:17:53 UTC (rev 2826)
@@ -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: trunk/connectors/translator-salesforce/src/test/java/org/teiid/translator/salesforce/execution/visitors/TestVisitors.java
===================================================================
--- trunk/connectors/translator-salesforce/src/test/java/org/teiid/translator/salesforce/execution/visitors/TestVisitors.java 2011-01-10 22:09:53 UTC (rev 2825)
+++ trunk/connectors/translator-salesforce/src/test/java/org/teiid/translator/salesforce/execution/visitors/TestVisitors.java 2011-01-11 02:17:53 UTC (rev 2826)
@@ -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());
Modified: trunk/console/src/main/java/org/teiid/rhq/admin/DQPManagementView.java
===================================================================
--- trunk/console/src/main/java/org/teiid/rhq/admin/DQPManagementView.java 2011-01-10 22:09:53 UTC (rev 2825)
+++ trunk/console/src/main/java/org/teiid/rhq/admin/DQPManagementView.java 2011-01-11 02:17:53 UTC (rev 2826)
@@ -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$
Modified: trunk/documentation/reference/src/main/docbook/en-US/content/federated_planning.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/federated_planning.xml 2011-01-10 22:09:53 UTC (rev 2825)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/federated_planning.xml 2011-01-11 02:17:53 UTC (rev 2826)
@@ -793,12 +793,12 @@
be true regardless of which version of Teiid is used.</para>
</listitem>
<listitem>
- <para>RulePushNonJoinCriteria – this rule will push criteria out of
+ <para>RulePushNonJoinCriteria - this rule will push criteria out of
an on clause if it is not necessary for the correctness of the join.
</para>
</listitem>
<listitem>
- <para>RuleRaiseNull – this rule will raise null nodes to their
+ <para>RuleRaiseNull - this rule will raise null nodes to their
highest possible point. Raising a null node removes the need to
consider any part of the old plan that was below the null node.
</para>
@@ -814,12 +814,12 @@
together.</para>
</listitem>
<listitem>
- <para>RuleRemoveOptionalJoins – removes optional join nodes form
+ <para>RuleRemoveOptionalJoins - removes optional join nodes form
the plan tree as soon as possible so that planning will be more
optimal.</para>
</listitem>
<listitem>
- <para>RulePlanJoins – this rule attempts to find an optimal
+ <para>RulePlanJoins - this rule attempts to find an optimal
ordering of the joins performed in the plan, while ensuring that
<xref linkend='access_patterns'/> dependencies are met. This rule has three main
steps. First it must determine an ordering of joins that satisfy
@@ -916,7 +916,7 @@
retrieved from B, thus greatly speeding the overall query.</para>
</listitem>
<listitem>
- <para>RuleChooseJoinStrategy – Determines the base join strategy.
+ <para>RuleChooseJoinStrategy - Determines the base join strategy.
Currently this is a decision as to whether to use a merge join rather
than the default strategy, which is a nested loop join. Ideally the
choice of a hash join would also be evaluated here. Also costing
@@ -945,9 +945,12 @@
model option.</para>
</listitem>
<listitem>
- <para>RuleAccessPatternValidation – validates that all access
+ <para>RuleAccessPatternValidation - validates that all access
patterns have been satisfied.</para>
</listitem>
+ <listitem>
+ <para>RulePushLimit - pushes limit and offset information as far as possible in the plan.</para>
+ </listitem>
</itemizedlist>
</section>
<section>
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/TransactionServerImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/TransactionServerImpl.java 2011-01-10 22:09:53 UTC (rev 2825)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/TransactionServerImpl.java 2011-01-11 02:17:53 UTC (rev 2826)
@@ -517,7 +517,7 @@
continue;
}
TransactionMetadata txnImpl = new TransactionMetadata();
- txnImpl.setAssociatedSession(Long.parseLong(transactionContext.getThreadId()));
+ txnImpl.setAssociatedSession(transactionContext.getThreadId());
txnImpl.setCreatedTime(transactionContext.getCreationTime());
txnImpl.setScope(transactionContext.getTransactionType().toString());
txnImpl.setId(transactionContext.getTransactionId());
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushLimit.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushLimit.java 2011-01-10 22:09:53 UTC (rev 2825)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushLimit.java 2011-01-11 02:17:53 UTC (rev 2826)
@@ -142,7 +142,8 @@
}
case NodeConstants.Types.SET_OP:
{
- if (!SetQuery.Operation.UNION.equals(child.getProperty(NodeConstants.Info.SET_OPERATION))) {
+ if (!SetQuery.Operation.UNION.equals(child.getProperty(NodeConstants.Info.SET_OPERATION))
+ || !child.hasBooleanProperty(NodeConstants.Info.USE_ALL)) {
return false;
}
//distribute the limit
@@ -166,8 +167,6 @@
return child.getProperty(NodeConstants.Info.INTO_GROUP) == null;
}
case NodeConstants.Types.SOURCE:
- case NodeConstants.Types.SELECT:
- case NodeConstants.Types.DUP_REMOVE:
{
return true;
}
@@ -211,12 +210,6 @@
return null;
}
- List<PlanNode> setops = NodeEditor.findAllNodes(accessNode, NodeConstants.Types.SET_OP, NodeConstants.Types.SOURCE);
-
- if (!setops.isEmpty()) {
- return null;
- }
-
Expression limit = (Expression)parentNode.getProperty(NodeConstants.Info.MAX_TUPLE_LIMIT);
if (limit != null && !CapabilitiesUtil.supportsRowLimit(modelID, metadata, capFinder)) {
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleRemoveOptionalJoins.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleRemoveOptionalJoins.java 2011-01-10 22:09:53 UTC (rev 2825)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleRemoveOptionalJoins.java 2011-01-11 02:17:53 UTC (rev 2826)
@@ -263,9 +263,7 @@
return areAggregatesCardinalityDependent(aggs);
}
case NodeConstants.Types.TUPLE_LIMIT: {
- if (FrameUtil.isOrderedLimit(parent)) {
- return true;
- }
+ return true;
}
//we assmue that projects of non-deterministic expressions do not matter
}
Modified: trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2011-01-10 22:09:53 UTC (rev 2825)
+++ trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2011-01-11 02:17:53 UTC (rev 2826)
@@ -433,7 +433,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: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java 2011-01-10 22:09:53 UTC (rev 2825)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java 2011-01-11 02:17:53 UTC (rev 2826)
@@ -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;
-
+ at 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: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestTransactionServer.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestTransactionServer.java 2011-01-10 22:09:53 UTC (rev 2825)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestTransactionServer.java 2011-01-11 02:17:53 UTC (rev 2826)
@@ -45,8 +45,8 @@
private TransactionManager tm;
private javax.transaction.Transaction txn;
- private static final String THREAD1 = "1"; //$NON-NLS-1$
- private static final String THREAD2 = "2"; //$NON-NLS-1$
+ private static final String THREAD1 = "abc1"; //$NON-NLS-1$
+ private static final String THREAD2 = "abc2"; //$NON-NLS-1$
private static final XidImpl XID1 = new XidImpl(0, new byte[] {
1
@@ -167,7 +167,7 @@
try {
server.commit(THREAD1);
} catch (XATransactionException e) {
- assertEquals("No transaction found for client 1.", e.getMessage()); //$NON-NLS-1$
+ assertEquals("No transaction found for client abc1.", e.getMessage()); //$NON-NLS-1$
}
}
@@ -187,7 +187,7 @@
try {
server.rollback(THREAD1);
} catch (XATransactionException e) {
- assertEquals("No transaction found for client 1.", e.getMessage()); //$NON-NLS-1$
+ assertEquals("No transaction found for client abc1.", e.getMessage()); //$NON-NLS-1$
}
}
@@ -225,7 +225,7 @@
server.start(THREAD2, XID1, XAResource.TMRESUME, 100,false);
fail("exception expected"); //$NON-NLS-1$
} catch (XATransactionException ex) {
- assertEquals("Cannot resume, transaction Teiid-Xid global:1 branch:null format:0 was not suspended by client 2.", ex.getMessage()); //$NON-NLS-1$
+ assertEquals("Cannot resume, transaction Teiid-Xid global:1 branch:null format:0 was not suspended by client abc2.", ex.getMessage()); //$NON-NLS-1$
}
}
@@ -273,7 +273,7 @@
assertEquals(1, server.getTransactions().size());
Transaction t = server.getTransactions().iterator().next();
- assertEquals(Long.parseLong(THREAD1), t.getAssociatedSession());
+ assertEquals(THREAD1, t.getAssociatedSession());
assertNotNull(t.getId());
}
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestLimit.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestLimit.java 2011-01-10 22:09:53 UTC (rev 2825)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestLimit.java 2011-01-11 02:17:53 UTC (rev 2826)
@@ -56,11 +56,7 @@
import junit.framework.TestCase;
-
-
-/**
- * @since 4.3
- */
+ at SuppressWarnings("nls")
public class TestLimit extends TestCase {
private static final int[] FULL_PUSHDOWN = new int[] {
@@ -460,24 +456,56 @@
public void testLimitNotPushedWithUnion() {
FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
BasicSourceCapabilities caps = new BasicSourceCapabilities();
- caps.setCapabilitySupport(Capability.QUERY_UNION, true);
caps.setCapabilitySupport(Capability.ROW_LIMIT, true);
// pm1 model supports order by
capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
String sql = "SELECT * FROM pm1.g1 UNION SELECT * FROM PM1.g2 LIMIT 100";//$NON-NLS-1$
String[] expectedSql = new String[] {
- "SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1 UNION SELECT pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4 FROM PM1.g2" //$NON-NLS-1$
+ "SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1", "SELECT pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4 FROM PM1.g2" //$NON-NLS-1$
};
ProcessorPlan plan = TestOptimizer.helpPlan(sql, FakeMetadataFactory.example1Cached(),
null, capFinder, expectedSql, true);
TestOptimizer.checkNodeTypes(plan, new int[] {
+ 2, // Access
+ 0, // DependentAccess
+ 0, // DependentSelect
+ 0, // DependentProject
+ 1, // DupRemove
+ 0, // Grouping
+ 1, // Limit
+ 0, // NestedLoopJoinStrategy
+ 0, // MergeJoinStrategy
+ 0, // Null
+ 0, // PlanExecution
+ 0, // Project
+ 0, // Select
+ 0, // Sort
+ 1 // UnionAll
+ }, NODE_TYPES);
+ }
+
+ public void testLimitNotPushedWithDupRemove() {
+ FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
+ BasicSourceCapabilities caps = new BasicSourceCapabilities();
+ caps.setCapabilitySupport(Capability.ROW_LIMIT, true);
+ // pm1 model supports order by
+ capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
+
+ String sql = "SELECT distinct * FROM pm1.g1 LIMIT 100";//$NON-NLS-1$
+ String[] expectedSql = new String[] {
+ "SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1" //$NON-NLS-1$
+ };
+ ProcessorPlan plan = TestOptimizer.helpPlan(sql, FakeMetadataFactory.example1Cached(),
+ null, capFinder, expectedSql, true);
+
+ TestOptimizer.checkNodeTypes(plan, new int[] {
1, // Access
0, // DependentAccess
0, // DependentSelect
0, // DependentProject
- 0, // DupRemove
+ 1, // DupRemove
0, // Grouping
1, // Limit
0, // NestedLoopJoinStrategy
@@ -491,14 +519,14 @@
}, NODE_TYPES);
}
- public void testLimitPushedWithUnion() {
+ public void testLimitPushedWithUnionAll() {
FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
BasicSourceCapabilities caps = new BasicSourceCapabilities();
caps.setCapabilitySupport(Capability.ROW_LIMIT, true);
// pm1 model supports order by
capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
- String sql = "SELECT * FROM pm1.g1 UNION SELECT * FROM PM1.g2 LIMIT 100";//$NON-NLS-1$
+ String sql = "SELECT * FROM pm1.g1 UNION ALL SELECT * FROM PM1.g2 LIMIT 100";//$NON-NLS-1$
String[] expectedSql = new String[] {
"SELECT pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4 FROM PM1.g2 LIMIT 100", "SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1 LIMIT 100" //$NON-NLS-1$ //$NON-NLS-2$
};
@@ -510,7 +538,7 @@
0, // DependentAccess
0, // DependentSelect
0, // DependentProject
- 1, // DupRemove
+ 0, // DupRemove
0, // Grouping
1, // Limit
0, // NestedLoopJoinStrategy
@@ -533,7 +561,7 @@
// pm1 model supports order by
capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
- String sql = "SELECT * FROM pm1.g1 UNION SELECT * FROM PM1.g2 LIMIT 50, 100";//$NON-NLS-1$
+ String sql = "SELECT * FROM pm1.g1 UNION ALL SELECT * FROM PM1.g2 LIMIT 50, 100";//$NON-NLS-1$
String[] expectedSql = new String[] {
"SELECT PM1.g2.e1 AS c_0, PM1.g2.e2 AS c_1, PM1.g2.e3 AS c_2, PM1.g2.e4 AS c_3 FROM PM1.g2 LIMIT 150", "SELECT pm1.g1.e1 AS c_0, pm1.g1.e2 AS c_1, pm1.g1.e3 AS c_2, pm1.g1.e4 AS c_3 FROM pm1.g1 LIMIT 150" //$NON-NLS-1$ //$NON-NLS-2$
};
@@ -545,7 +573,7 @@
0, // DependentAccess
0, // DependentSelect
0, // DependentProject
- 1, // DupRemove
+ 0, // DupRemove
0, // Grouping
1, // Limit
0, // NestedLoopJoinStrategy
Modified: trunk/engine/src/test/java/org/teiid/query/processor/HardcodedDataManager.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/HardcodedDataManager.java 2011-01-10 22:09:53 UTC (rev 2825)
+++ trunk/engine/src/test/java/org/teiid/query/processor/HardcodedDataManager.java 2011-01-11 02:17:53 UTC (rev 2826)
@@ -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;
@@ -55,10 +57,17 @@
// Collect all commands run against this class
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 = 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];
Modified: trunk/metadata/src/main/java/org/teiid/metadata/index/IndexMetadataFactory.java
===================================================================
--- trunk/metadata/src/main/java/org/teiid/metadata/index/IndexMetadataFactory.java 2011-01-10 22:09:53 UTC (rev 2825)
+++ trunk/metadata/src/main/java/org/teiid/metadata/index/IndexMetadataFactory.java 2011-01-11 02:17:53 UTC (rev 2826)
@@ -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: trunk/metadata/src/test/java/org/teiid/metadata/index/TestMultipleModelIndexes.java
===================================================================
--- trunk/metadata/src/test/java/org/teiid/metadata/index/TestMultipleModelIndexes.java 2011-01-10 22:09:53 UTC (rev 2825)
+++ trunk/metadata/src/test/java/org/teiid/metadata/index/TestMultipleModelIndexes.java 2011-01-11 02:17:53 UTC (rev 2826)
@@ -46,4 +46,12 @@
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());
+ }
+
}
Copied: trunk/metadata/src/test/resources/Test.vdb (from rev 2825, branches/7.1.x/metadata/src/test/resources/Test.vdb)
===================================================================
(Binary files differ)
More information about the teiid-commits
mailing list