[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