[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