[teiid-commits] teiid SVN: r3586 - in trunk: console/src/main/java/org/teiid/rhq/admin and 7 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Wed Oct 26 14:08:37 EDT 2011


Author: shawkins
Date: 2011-10-26 14:08:36 -0400 (Wed, 26 Oct 2011)
New Revision: 3586

Modified:
   trunk/build/kits/jboss-container/teiid-releasenotes.html
   trunk/console/src/main/java/org/teiid/rhq/admin/DQPManagementView.java
   trunk/console/src/main/resources/META-INF/rhq-plugin.xml
   trunk/engine/src/main/java/org/teiid/dqp/internal/process/AuthorizationValidationVisitor.java
   trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPConfiguration.java
   trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPCore.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/JoinRegion.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentCriteriaProcessor.java
   trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestAuthorizationValidationVisitor.java
   trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCore.java
   trunk/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java
   trunk/engine/src/test/java/org/teiid/query/processor/TestDependentJoins.java
Log:
forward merge from 7.4.1

Modified: trunk/build/kits/jboss-container/teiid-releasenotes.html
===================================================================
--- trunk/build/kits/jboss-container/teiid-releasenotes.html	2011-10-26 17:38:18 UTC (rev 3585)
+++ trunk/build/kits/jboss-container/teiid-releasenotes.html	2011-10-26 18:08:36 UTC (rev 3586)
@@ -31,7 +31,7 @@
   <LI><B>TEXTTABLE Enhancements</B> - TEXTTABLE can now parse fixed width files that do not use a row delimiter and can optionally produce fixed values that haven't been trimmed.
   <LI><B>Temp table transactions</B> - Internal materialized views and temp table usage from a session and within procedures can take advantage of greater transaction support.
   <LI><B>Buffering Improvements</B> - Added the ability to inline memory based or small lobs and added tracking of the memory held by soft references.  Also switched to a concurrent LFRU algorithm that significantly reduces writes and read misses with temporary tables.  Added a memory buffer to better handle file storage.  
-  The memory buffer may be optional configured as off-heap for better large memory performance.
+  The memory buffer may be optional be configured as off-heap for better large memory performance - see the Admin Guide for more.  Overhead is now tracked to help prevent memory errors when dealing with 10s of millions or more of batches/pages.  Serialization and disk utilization were also improved.
   <LI><B>GSSAPI</B> - both the Teiid JDBC client/server and the ODBC pg backend can now support GSSAPI for single sign-on. 
   <LI><B>Server-side Query Timeouts</B> - default query timeouts can be configured at both the VDB (via the query-timeout VDB property) and entire server (via the teiid-jboss-beans.xml queryTimeout property).
 </UL>

Modified: trunk/console/src/main/java/org/teiid/rhq/admin/DQPManagementView.java
===================================================================
--- trunk/console/src/main/java/org/teiid/rhq/admin/DQPManagementView.java	2011-10-26 17:38:18 UTC (rev 3585)
+++ trunk/console/src/main/java/org/teiid/rhq/admin/DQPManagementView.java	2011-10-26 18:08:36 UTC (rev 3586)
@@ -211,8 +211,8 @@
 			getTransactionCollectionValue(transactionMetaValue,transactionsCollection);
 			operationResult.setContent(createReportResultList(fieldNameList,	resultObject.iterator()));
 		} else if (operationName.equals(Platform.Operations.KILL_TRANSACTION)) {
-			String sessionID = (String) valueMap.get(Operation.Value.TRANSACTION_ID);
-			MetaValue[] args = new MetaValue[] { SimpleValueSupport.wrap(sessionID) };
+			String transactionID = (String) valueMap.get(Operation.Value.TRANSACTION_ID);
+			MetaValue[] args = new MetaValue[] { SimpleValueSupport.wrap(transactionID) };
 			try {
 				executeManagedOperation(connection, getRuntimeEngineDeployer(connection, mc), Platform.Operations.KILL_TRANSACTION, args);
 			} catch (Exception e) {
@@ -232,8 +232,8 @@
 			Long requestID = (Long) valueMap.get(Operation.Value.REQUEST_ID);
 			String sessionID = (String) valueMap.get(Operation.Value.SESSION_ID);
 			MetaValue[] args = new MetaValue[] {
-					SimpleValueSupport.wrap(requestID),
-					SimpleValueSupport.wrap(sessionID) };
+					SimpleValueSupport.wrap(sessionID),
+					SimpleValueSupport.wrap(requestID) };
 			try {
 				executeManagedOperation(connection, getRuntimeEngineDeployer(connection, mc), Platform.Operations.KILL_REQUEST, args);
 			} catch (Exception e) {
@@ -876,7 +876,7 @@
 			request.setSourceRequest((Boolean) ProfileServiceUtil.booleanValue(compositeValue.get(SOURCE_REQUEST)));
 			request.setNodeId((Integer) ProfileServiceUtil.integerValue(compositeValue.get(NODE_ID)));
 			request.setTransactionId((String) ProfileServiceUtil.stringValue(compositeValue.get(TRANSACTION_ID)));
-			request.setState((ProcessingState) ProfileServiceUtil.getSimpleValue(compositeValue.get(STATE), ProcessingState.class));
+			request.setState((ProcessingState.valueOf(ProfileServiceUtil.getSimpleValue(compositeValue.get(STATE), String.class))));
 			return request;
 		}
 		throw new IllegalStateException("Unable to unwrap RequestMetadata " + metaValue); //$NON-NLS-1$

Modified: trunk/console/src/main/resources/META-INF/rhq-plugin.xml
===================================================================
--- trunk/console/src/main/resources/META-INF/rhq-plugin.xml	2011-10-26 17:38:18 UTC (rev 3585)
+++ trunk/console/src/main/resources/META-INF/rhq-plugin.xml	2011-10-26 18:08:36 UTC (rev 3586)
@@ -73,7 +73,7 @@
 
 
 <plugin name="TeiidPlugin" displayName="Teiid Plugin" package="org.teiid.rhq.plugin"
-	version="2.0.0" description="Supports management and monitoring of JBoss Teiid"
+	version="2.0.1" description="Supports management and monitoring of JBoss Teiid"
 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:xmlns:rhq-plugin"
 	xmlns:c="urn:xmlns:rhq-configuration">
 
@@ -93,23 +93,18 @@
 			<results>
 				<c:list-property name="list">
 					<c:map-property name="map">
+						<c:simple-property displayName="Request ID"
+							name="getExecutionId" type="string" description="The id for the request" />
 						<c:simple-property displayName="Session ID"
 							name="getSessionId" type="string"
-							description="The name of the resource whose availability is being reported" />
-						<c:simple-property displayName="Request ID"
-							name="getRequestId" type="string" description="The id for the request" />
+							description="The session id the request is using" />
 						<c:simple-property displayName="SQL String"
 							name="getCommand" type="string" description="The SQL string for this query" />
 						<c:simple-property displayName="Source Request"
 							name="sourceRequest" type="string"
 							description="If false,this is the top level query. If true, this a physical source query." />
-						<c:simple-property displayName="Execution ID"
-							name="getExecutionId" type="string"
-							description="The execution id for this request (if this is a physical source query)" />
 						<c:simple-property displayName="Start Time"
-							name="getCreatedTime" type="string" description="The time this query began" />
-						<c:simple-property displayName="Start Time"
-							name="getProcessingTime" type="string" description="Processing time for this request" />
+							name="getStartTime" type="string" description="The time this query began" />
 						<c:simple-property displayName="Transaction ID"
 							name="getTransactionId" type="string"
 							description="The transaction XID if there is a transaction involved" />
@@ -187,15 +182,11 @@
 					required="false">
 					<c:map-property name="map">
 						<c:simple-property displayName="Request ID"
-							name="getRequestId" type="string" description="The request identifier" />
+							name="getExecutionId" type="string" description="The request identifier" />
 						<c:simple-property displayName="Session ID"
 							name="getSessionId" type="string" description="Session identifier" />
-						<c:simple-property displayName="Execution ID"
-							name="getExecutionId" type="string" description="Unique Identifier for Request" />
-						<c:simple-property displayName="Created Time"
-							name="getCreatedTime" type="string" description="Time when request submitted" />
-						<c:simple-property displayName="Processing Time"
-							name="getProcessingTime" type="string" description="Processing time for the request" />
+						<c:simple-property displayName="Start Time"
+							name="getStartTime" type="string" description="Time when request submitted" />
 						<c:simple-property displayName="Last ping time"
 							name="getCommand" type="string" description="SQL Command" />
 						<c:simple-property displayName="Connector level request?"
@@ -203,7 +194,7 @@
 							description="True if this is a connector level request" />
 						<c:simple-property displayName="Node ID" name="getNodeId"
 							type="string" description="The node identifier" />
-						<c:simple-property displayName="Tansaction identifier"
+						<c:simple-property displayName="Transaction identifier"
 							name="getTransactionId" type="string"
 							description="Transaction XID if a transaction is involved" />
 					</c:map-property>
@@ -484,8 +475,8 @@
 								name="getSessionId" type="string" description="Session identifier" />
 							<c:simple-property displayName="Execution ID"
 								name="getExecutionId" type="string" description="Unique Identifier for Request" />
-							<c:simple-property displayName="Created Time"
-								name="getCreatedTime" type="string" description="Time when request submitted" />
+							<c:simple-property displayName="Start Time"
+								name="getStartTime" type="string" description="Time when request submitted" />
 							<c:simple-property displayName="Processing Time"
 								name="getProcessingTime" type="string" description="Processing time for the request" />
 							<c:simple-property displayName="Last ping time"
@@ -495,7 +486,7 @@
 								description="True if this is a connector level request" />
 							<c:simple-property displayName="Node ID" name="getNodeId"
 								type="string" description="The node identifier" />
-							<c:simple-property displayName="Tansaction identifier"
+							<c:simple-property displayName="Transaction identifier"
 								name="getTransactionId" type="string"
 								description="Transaction XID if a transaction is involved" />
 						</c:map-property>

Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/AuthorizationValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/AuthorizationValidationVisitor.java	2011-10-26 17:38:18 UTC (rev 3585)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/AuthorizationValidationVisitor.java	2011-10-26 18:08:36 UTC (rev 3586)
@@ -284,7 +284,6 @@
         Map<String, LanguageObject> nameToSymbolMap = new LinkedHashMap<String, LanguageObject>();
         for (LanguageObject symbol : symbols) {
             try {
-                String fullName = null;
                 Object metadataID = null;
                 if(symbol instanceof ElementSymbol) {                    
                     metadataID = ((ElementSymbol)symbol).getMetadataID();
@@ -294,20 +293,18 @@
                 } else if(symbol instanceof GroupSymbol) {
                     GroupSymbol group = (GroupSymbol)symbol;
                     metadataID = group.getMetadataID();
-                    if (metadataID instanceof TempMetadataID && !group.isProcedure()) {
-                    	if (group.isTempTable()) {
+                    if (metadataID instanceof TempMetadataID) {
+                    	if (group.isProcedure()) {
+                    		Map<String, LanguageObject> procMap = new LinkedHashMap<String, LanguageObject>();
+                    		addToNameMap(((TempMetadataID)metadataID).getOriginalMetadataID(), symbol, procMap);
+                    		validateEntitlements(PermissionType.EXECUTE, auditContext, procMap);
+                    	} else if (group.isTempTable()) {
                     		validateTemp(actionCode, group, auditContext);
                     	}
                         continue;
                     }
                 }
-                fullName = getMetadata().getFullName(metadataID);
-                Object modelId = getMetadata().getModelID(metadataID);
-                String modelName = getMetadata().getFullName(modelId);
-                if (isSystemSchema(modelName)) {
-                	continue;
-                }
-                nameToSymbolMap.put(fullName, symbol);
+                addToNameMap(metadataID, symbol, nameToSymbolMap);
             } catch(QueryMetadataException e) {
                 handleException(e);
             } catch(TeiidComponentException e) {
@@ -317,6 +314,15 @@
 
         validateEntitlements(actionCode, auditContext, nameToSymbolMap);
 	}
+    
+    private void addToNameMap(Object metadataID, LanguageObject symbol, Map<String, LanguageObject> nameToSymbolMap) throws QueryMetadataException, TeiidComponentException {
+    	String fullName = getMetadata().getFullName(metadataID);
+        Object modelId = getMetadata().getModelID(metadataID);
+        String modelName = getMetadata().getFullName(modelId);
+        if (!isSystemSchema(modelName)) {
+        	nameToSymbolMap.put(fullName, symbol);
+        }
+    }
 
 	private boolean isSystemSchema(String modelName) {
 		return CoreConstants.SYSTEM_MODEL.equalsIgnoreCase(modelName) || CoreConstants.ODBC_MODEL.equalsIgnoreCase(modelName);

Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPConfiguration.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPConfiguration.java	2011-10-26 17:38:18 UTC (rev 3585)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPConfiguration.java	2011-10-26 18:08:36 UTC (rev 3586)
@@ -33,7 +33,7 @@
     static final int DEFAULT_FETCH_SIZE = RequestMessage.DEFAULT_FETCH_SIZE * 10;
     static final int DEFAULT_PROCESSOR_TIMESLICE = 2000;
     static final int DEFAULT_MAX_RESULTSET_CACHE_ENTRIES = 1024;
-    static final int DEFAULT_QUERY_THRESHOLD = 600;
+    static final int DEFAULT_QUERY_THRESHOLD = 600000;
     static final String PROCESS_PLAN_QUEUE_NAME = "QueryProcessorQueue"; //$NON-NLS-1$
     public static final int DEFAULT_MAX_PROCESS_WORKERS = 64;
 	public static final int DEFAULT_MAX_SOURCE_ROWS = -1;
@@ -44,7 +44,7 @@
 	private int timeSliceInMilli = DEFAULT_PROCESSOR_TIMESLICE;
 	private int maxRowsFetchSize = DEFAULT_FETCH_SIZE;
 	private int lobChunkSizeInKB = 100;
-	private int queryThresholdInSecs = DEFAULT_QUERY_THRESHOLD;
+	private long queryThresholdInMilli = DEFAULT_QUERY_THRESHOLD;
 	private boolean exceptionOnMaxSourceRows = true;
 	private int maxSourceRows = -1;
 	private int maxActivePlans = DEFAULT_MAX_ACTIVE_PLANS;
@@ -144,11 +144,19 @@
 
 	@ManagementProperty(description="Long running query threshold, after which a alert can be generated by tooling if configured")
 	public int getQueryThresholdInSecs() {
-		return queryThresholdInSecs;
+		return (int)queryThresholdInMilli/1000;
 	}
+	
+	public long getQueryThresholdInMilli() {
+		return queryThresholdInMilli;
+	}
+	
+	public void setQueryThresholdInMilli(long queryThreshold) {
+		this.queryThresholdInMilli = queryThreshold;
+	}
 
 	public void setQueryThresholdInSecs(int queryThresholdInSecs) {
-		this.queryThresholdInSecs = queryThresholdInSecs;
+		this.queryThresholdInMilli = queryThresholdInSecs * 1000;
 	}
 	
 	@ManagementProperty(description="Teiid runtime version", readOnly=true)

Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPCore.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPCore.java	2011-10-26 17:38:18 UTC (rev 3585)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPCore.java	2011-10-26 18:08:36 UTC (rev 3586)
@@ -259,16 +259,16 @@
     } 
     
     public List<RequestMetadata> getLongRunningRequests(){
-    	return buildRequestInfos(requests.keySet(), this.config.getQueryThresholdInSecs());
+    	return buildRequestInfos(requests.keySet(), System.currentTimeMillis() - this.config.getQueryThresholdInMilli() );
     }
 
-    private List<RequestMetadata> buildRequestInfos(Collection<RequestID> ids, int longRunningQueryThreshold) {
+    private List<RequestMetadata> buildRequestInfos(Collection<RequestID> ids, long longRunningQueryThreshold) {
 		List<RequestMetadata> results = new ArrayList<RequestMetadata>();
     	
 		for (RequestID requestID : ids) {
             RequestWorkItem holder = requests.get(requestID);
             
-            if(holder != null && !holder.isCanceled()) {
+            if(holder != null && !holder.isCanceled() && (longRunningQueryThreshold == -1 || holder.getProcessingTimestamp() < longRunningQueryThreshold)) {
             	RequestMetadata req = new RequestMetadata();
             	
             	req.setExecutionId(holder.requestID.getExecutionID());
@@ -319,11 +319,7 @@
         			results.add(info);
                 }
                 
-                // check if only need long running queries.
-                long elapsedTime = System.currentTimeMillis() - req.getStartTime();
-                if (longRunningQueryThreshold == -1 || elapsedTime > longRunningQueryThreshold) {
-                	results.add(req);
-                }
+            	results.add(req);
             }
         }
     	return results;

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/JoinRegion.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/JoinRegion.java	2011-10-26 17:38:18 UTC (rev 3585)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/JoinRegion.java	2011-10-26 18:08:36 UTC (rev 3586)
@@ -250,7 +250,7 @@
         
         HashSet<PlanNode> criteria = new HashSet<PlanNode>(this.criteriaNodes);
         HashSet<GroupSymbol> groups = new HashSet<GroupSymbol>(this.joinSourceNodes.size());
-        
+        boolean hasUnknown = false;
         for (int i = 0; i < joinOrder.length; i++) {
             Integer source = (Integer)joinOrder[i];
             
@@ -286,6 +286,7 @@
             
         	if (sourceCost == NewCalculateCostUtil.UNKNOWN_VALUE) {
         		sourceCost = UNKNOWN_TUPLE_EST;
+        		hasUnknown = true;
                 if (applicableCriteria != null && !applicableCriteria.isEmpty()) {
                 	CompoundCriteria cc = new CompoundCriteria();
                 	for (PlanNode planNode : applicableCriteria) {
@@ -322,6 +323,10 @@
                 	sourceCost = depJoinCost;
                 }
             }
+        	
+        	if (i > 0 && (applicableCriteria == null || applicableCriteria.isEmpty()) && hasUnknown) {
+        		sourceCost *= 10; //cross join penalty
+        	}
         
             cost *= sourceCost;
             

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentCriteriaProcessor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentCriteriaProcessor.java	2011-10-26 17:38:18 UTC (rev 3585)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentCriteriaProcessor.java	2011-10-26 18:08:36 UTC (rev 3586)
@@ -299,8 +299,8 @@
 
 	            List<SetState> source = sources.get(i);
 
-	        	if (i == currentIndex++) {
-		
+	        	if (i == currentIndex) {
+	        		currentIndex++;
 		            int doneCount = 0;
 		
 		            while (doneCount < source.size()) {

Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestAuthorizationValidationVisitor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestAuthorizationValidationVisitor.java	2011-10-26 17:38:18 UTC (rev 3585)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestAuthorizationValidationVisitor.java	2011-10-26 18:08:36 UTC (rev 3586)
@@ -116,7 +116,8 @@
         svc.addPermission(addResource(DataPolicy.PermissionType.UPDATE, "pm1.g1.e3")); //$NON-NLS-1$
         svc.addPermission(addResource(DataPolicy.PermissionType.UPDATE, "pm1.g1.e4")); //$NON-NLS-1$
         
-
+        svc.addPermission(addResource(PermissionType.EXECUTE, "pm1.sp1"));
+        
         // pm1.g2
         svc.addPermission(addResource(DataPolicy.PermissionType.CREATE, "pm1.g2")); //$NON-NLS-1$
         svc.addPermission(addResource(DataPolicy.PermissionType.CREATE, false, "pm1.g2.e1")); //$NON-NLS-1$
@@ -206,6 +207,12 @@
         }
     }
     
+    @Test public void testProcRelational() throws Exception {
+    	helpTest("select * from sp1", RealMetadataFactory.example1Cached(), new String[] {}, RealMetadataFactory.example1VDB(), exampleAuthSvc1()); //$NON-NLS-1$
+    	helpTest("select * from pm1.sp1", RealMetadataFactory.example1Cached(), new String[] {}, RealMetadataFactory.example1VDB(), exampleAuthSvc1()); //$NON-NLS-1$
+    	helpTest("select * from sp1", RealMetadataFactory.example1Cached(), new String[] {"sp1"}, RealMetadataFactory.example1VDB(), exampleAuthSvc2()); //$NON-NLS-1$
+    }
+    
     @Test public void testTemp() throws Exception {
     	//allowed by default
     	helpTest("create local temporary table x (y string)", RealMetadataFactory.example1Cached(), new String[] {}, RealMetadataFactory.example1VDB(), exampleAuthSvc1()); //$NON-NLS-1$

Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCore.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCore.java	2011-10-26 17:38:18 UTC (rev 3585)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCore.java	2011-10-26 18:08:36 UTC (rev 3586)
@@ -576,6 +576,17 @@
         assertNotNull(rm.getException());
     }
     
+    @Test public void testLongRunningQuery() throws Exception {
+    	RequestMessage reqMsg = exampleRequestMessage("select * FROM BQT1.SmallA"); 
+        execute("A", 1, reqMsg);
+        this.config.setQueryThresholdInMilli(5000);
+        assertEquals(1, this.core.getRequests().size());
+    	assertEquals(0, this.core.getLongRunningRequests().size());
+    	this.config.setQueryThresholdInMilli(10);
+    	Thread.sleep(20);
+    	assertEquals(1, this.core.getLongRunningRequests().size());
+    }
+    
 	public void helpTestVisibilityFails(String sql) throws Exception {
         RequestMessage reqMsg = exampleRequestMessage(sql); 
         reqMsg.setTxnAutoWrapMode(RequestMessage.TXN_WRAP_OFF);

Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java	2011-10-26 17:38:18 UTC (rev 3585)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java	2011-10-26 18:08:36 UTC (rev 3586)
@@ -39,6 +39,7 @@
 import org.teiid.query.metadata.TransformationMetadata;
 import org.teiid.query.optimizer.TestOptimizer.ComparisonMode;
 import org.teiid.query.optimizer.capabilities.BasicSourceCapabilities;
+import org.teiid.query.optimizer.capabilities.CapabilitiesFinder;
 import org.teiid.query.optimizer.capabilities.FakeCapabilitiesFinder;
 import org.teiid.query.optimizer.capabilities.SourceCapabilities.Capability;
 import org.teiid.query.optimizer.relational.rules.JoinUtil;
@@ -1026,5 +1027,25 @@
             0       // UnionAll
         });
     }
+    
+    @Test public void testCrossJoinAvoidance() throws Exception {
+
+        CapabilitiesFinder capFinder = TestOptimizer.getGenericFinder();
+
+        QueryMetadataInterface metadata = RealMetadataFactory.exampleBQT();
+        RealMetadataFactory.setCardinality("bqt1.smallb", 1800, metadata); //$NON-NLS-1$
+        RealMetadataFactory.setCardinality("bqt1.smalla", 0, metadata); //$NON-NLS-1$
+        RealMetadataFactory.setCardinality("bqt2.smallb", 15662, metadata); //$NON-NLS-1$
+         
+        TestOptimizer.helpPlan(
+            "SELECT BQT1.SmallA.IntKey FROM BQT1.SmallB, BQT1.Smalla, bqt2.smallb where bqt2.smallb.intkey = bqt1.smallb.intkey and bqt2.smallb.intkey = bqt1.smalla.intkey",  //$NON-NLS-1$
+            metadata,
+            null, capFinder,
+            new String[] {"SELECT g_0.intkey AS c_0 FROM BQT1.Smalla AS g_0 ORDER BY c_0", 
+            		"SELECT g_0.intkey AS c_0 FROM BQT1.SmallB AS g_0 ORDER BY c_0", 
+            		"SELECT g_0.intkey AS c_0 FROM bqt2.smallb AS g_0 ORDER BY c_0"}, //$NON-NLS-1$ //$NON-NLS-2$
+            ComparisonMode.EXACT_COMMAND_STRING );
+
+    }
         
 }


Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java
___________________________________________________________________
Modified: svn:mergeinfo
   - /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java:3149-3217,3535-3555
   + /branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java:3149-3217,3535-3555,3558-3585

Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestDependentJoins.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestDependentJoins.java	2011-10-26 17:38:18 UTC (rev 3585)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestDependentJoins.java	2011-10-26 18:08:36 UTC (rev 3586)
@@ -638,6 +638,44 @@
     	helpTestLargeSetInDepAccessMultiJoinCriteria(1, 10, 2, 2);
     }
     
+    @Test public void testLargeSetMultipleDependentSources() throws Exception {
+    	String sql = "SELECT pm1.g1.e1 FROM pm1.g1, pm2.g1 makedep, /*+ makeind */ pm1.g2 where pm1.g1.e1=pm2.g1.e1 AND pm1.g2.e2=pm2.g1.e2 order by e1"; //$NON-NLS-1$
+    	
+        // Plan query
+        FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
+        BasicSourceCapabilities depcaps = new BasicSourceCapabilities();
+        depcaps.setCapabilitySupport(Capability.CRITERIA_IN, true);
+        depcaps.setSourceProperty(Capability.MAX_IN_CRITERIA_SIZE, 1);
+        depcaps.setSourceProperty(Capability.MAX_DEPENDENT_PREDICATES, 3);
+
+        BasicSourceCapabilities caps = new BasicSourceCapabilities();
+        caps.setCapabilitySupport(Capability.CRITERIA_IN, true);
+
+        capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
+        capFinder.addCapabilities("pm2", depcaps); //$NON-NLS-1$
+
+        List[] expected = new List[] {
+            Arrays.asList("a"), //$NON-NLS-1$
+            Arrays.asList("a"), //$NON-NLS-1$
+        	}; 
+
+        Command command = TestProcessor.helpParse(sql);
+        ProcessorPlan plan = TestProcessor.helpGetPlan(command, RealMetadataFactory.example1Cached(), capFinder);
+        TestOptimizer.checkAtomicQueries(new String[] {
+        		"SELECT pm1.g2.e2 FROM pm1.g2", 
+        		"SELECT pm2.g1.e1, pm2.g1.e2 FROM pm2.g1 WHERE (pm2.g1.e1 IN (<dependent values>)) AND (pm2.g1.e2 IN (<dependent values>))", 
+        		"SELECT pm1.g1.e1 FROM pm1.g1"
+        }, plan);
+        
+        HardcodedDataManager dataManager = new HardcodedDataManager();
+        dataManager.addData("SELECT pm1.g1.e1 FROM pm1.g1", new List<?>[] {Arrays.asList("a")});
+        dataManager.addData("SELECT pm1.g2.e2 FROM pm1.g2", new List<?>[] {Arrays.asList(1), Arrays.asList(2), Arrays.asList(3)});
+        dataManager.addData("SELECT pm2.g1.e1, pm2.g1.e2 FROM pm2.g1 WHERE (pm2.g1.e1 = 'a') AND ((pm2.g1.e2 = 1) OR (pm2.g1.e2 = 2))", new List<?>[] {Arrays.asList("a", 1)});
+        dataManager.addData("SELECT pm2.g1.e1, pm2.g1.e2 FROM pm2.g1 WHERE (pm2.g1.e1 = 'a') AND (pm2.g1.e2 = 3)", new List<?>[] {Arrays.asList("a", 3)});
+        CommandContext cc = TestProcessor.createCommandContext();
+        TestProcessor.helpProcess(plan, cc, dataManager, expected);
+    }
+    
     /**
      * concurrentOpen will be minimum of 2 to gather the pm1 results.
      */
@@ -648,10 +686,6 @@
         FakeDataManager dataManager = new FakeDataManager();
         TestProcessor.sampleData1(dataManager);
 
-        // Slightly modify metadata to set max set size to just a few rows - this
-        // will allow us to test the dependent overflow case
-        QueryMetadataInterface fakeMetadata = RealMetadataFactory.example1Cached();
-
         // Plan query
         FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
         BasicSourceCapabilities depcaps = new BasicSourceCapabilities();
@@ -679,7 +713,7 @@
         	}; 
 
         Command command = TestProcessor.helpParse(sql);
-        ProcessorPlan plan = TestProcessor.helpGetPlan(command, fakeMetadata, capFinder);
+        ProcessorPlan plan = TestProcessor.helpGetPlan(command, RealMetadataFactory.example1Cached(), capFinder);
         TestOptimizer.checkAtomicQueries(new String[] {
         		"SELECT pm1.g2.e4 FROM pm1.g2", 
         		"SELECT pm2.g1.e1, pm2.g1.e2, pm2.g1.e4 FROM pm2.g1 WHERE (pm2.g1.e1 IN (<dependent values>)) AND (pm2.g1.e2 IN (<dependent values>)) AND (pm2.g1.e4 IN (<dependent values>))", 


Property changes on: trunk/engine/src/test/java/org/teiid/query/processor/TestDependentJoins.java
___________________________________________________________________
Modified: svn:mergeinfo
   - /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestDependentJoins.java:3149-3217,3535-3555
   + /branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestDependentJoins.java:3149-3217,3535-3555,3558-3585



More information about the teiid-commits mailing list