teiid SVN: r4233 - in trunk: api/src/main/java/org/teiid/translator and 16 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2012-07-12 13:45:57 -0400 (Thu, 12 Jul 2012)
New Revision: 4233
Added:
trunk/engine/src/main/java/org/teiid/dqp/internal/process/TupleSourceCache.java
Modified:
trunk/api/src/main/java/org/teiid/CommandContext.java
trunk/api/src/main/java/org/teiid/translator/BaseDelegatingExecutionFactory.java
trunk/api/src/main/java/org/teiid/translator/CacheDirective.java
trunk/api/src/main/java/org/teiid/translator/ExecutionContext.java
trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java
trunk/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorWork.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorWorkItem.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ExecutionContextImpl.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierManagerImpl.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/SessionAwareCache.java
trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
trunk/engine/src/main/java/org/teiid/query/parser/ParseInfo.java
trunk/engine/src/main/java/org/teiid/query/processor/BatchCollector.java
trunk/engine/src/main/java/org/teiid/query/processor/ProcessorPlan.java
trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java
trunk/engine/src/main/java/org/teiid/query/processor/RegisterRequestParameter.java
trunk/engine/src/main/java/org/teiid/query/processor/proc/ForEachRowPlan.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/ArrayTableNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/BatchedUpdateNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentAccessNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureAccessNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureExecutionNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentValueSource.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/GroupingNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/InsertPlanExecutionNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/JoinNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/LimitNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/NullNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/PlanExecutionNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectIntoNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/SelectNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/SortNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/UnionAllNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/WindowFunctionProjectNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java
trunk/engine/src/main/java/org/teiid/query/processor/xml/RelationalPlanExecutor.java
trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java
trunk/engine/src/main/java/org/teiid/query/util/CommandContext.java
trunk/engine/src/test/java/org/teiid/common/buffer/TestTupleBuffer.java
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCore.java
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java
trunk/engine/src/test/java/org/teiid/dqp/service/AutoGenDataService.java
Log:
TEIID-2098 TEIID-1598 fixing several issues with maxRows and further refining connector caching logic
Modified: trunk/api/src/main/java/org/teiid/CommandContext.java
===================================================================
--- trunk/api/src/main/java/org/teiid/CommandContext.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/api/src/main/java/org/teiid/CommandContext.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -149,6 +149,7 @@
/**
* Get the number of times this command has been reused. Useful
* in continuous executions.
+ * @see #isContinuous()
* @return
*/
long getReuseCount();
@@ -166,4 +167,10 @@
*/
void addWarning(Exception ex);
+ /**
+ *
+ * @return true if this is a continuous query
+ */
+ boolean isContinuous();
+
}
Modified: trunk/api/src/main/java/org/teiid/translator/BaseDelegatingExecutionFactory.java
===================================================================
--- trunk/api/src/main/java/org/teiid/translator/BaseDelegatingExecutionFactory.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/api/src/main/java/org/teiid/translator/BaseDelegatingExecutionFactory.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -433,4 +433,10 @@
public boolean supportsOnlyLiteralComparison() {
return delegate.supportsOnlyLiteralComparison();
}
+ @Override
+ public CacheDirective getCacheDirective(Command command,
+ ExecutionContext executionContext, RuntimeMetadata metadata)
+ throws TranslatorException {
+ return delegate.getCacheDirective(command, executionContext, metadata);
+ }
}
Modified: trunk/api/src/main/java/org/teiid/translator/CacheDirective.java
===================================================================
--- trunk/api/src/main/java/org/teiid/translator/CacheDirective.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/api/src/main/java/org/teiid/translator/CacheDirective.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -30,8 +30,9 @@
public class CacheDirective implements Serializable {
public enum Scope {
+ NONE,
+ SESSION,
USER,
- SESSION,
VDB
}
@@ -58,10 +59,18 @@
this.prefersMemory = prefersMemory;
}
+ /**
+ * Get the time to live in milliseconds
+ * @return
+ */
public Long getTtl() {
return ttl;
}
+ /**
+ * Set the time to live in milliseconds
+ * @param ttl
+ */
public void setTtl(Long ttl) {
this.ttl = ttl;
}
Modified: trunk/api/src/main/java/org/teiid/translator/ExecutionContext.java
===================================================================
--- trunk/api/src/main/java/org/teiid/translator/ExecutionContext.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/api/src/main/java/org/teiid/translator/ExecutionContext.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -201,4 +201,10 @@
* @return
*/
CommandContext getCommandContext();
+
+ /**
+ * Get the {@link CacheDirective}
+ * @return
+ */
+ CacheDirective getCacheDirective();
}
Modified: trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java
===================================================================
--- trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -46,6 +46,7 @@
import org.teiid.metadata.FunctionParameter;
import org.teiid.metadata.MetadataFactory;
import org.teiid.metadata.RuntimeMetadata;
+import org.teiid.translator.CacheDirective.Scope;
import org.teiid.translator.TypeFacility.RUNTIME_CODES;
import org.teiid.translator.TypeFacility.RUNTIME_NAMES;
@@ -986,4 +987,18 @@
return true;
}
+ /**
+ * Get the {@link CacheDirective} to control command caching.
+ * <p>Use {@link Scope#NONE} to indicate to the engine that no caching should be performed by the engine.</p>
+ * <p>If cache parameters on the {@link CacheDirective} will be changed by the {@link Execution}, then
+ * a new instance of a {@link CacheDirective} should be set each time.</p>
+ * @param command
+ * @param executionContext
+ * @param metadata
+ * @throws TranslatorException
+ */
+ public CacheDirective getCacheDirective(Command command, ExecutionContext executionContext, RuntimeMetadata metadata) throws TranslatorException {
+ return null;
+ }
+
}
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -22,6 +22,7 @@
package org.teiid.common.buffer;
+import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
@@ -156,6 +157,9 @@
for (Long batch : this.batches.values()) {
this.manager.remove(batch);
}
+ if (this.lobManager != null) {
+ this.lobManager.remove();
+ }
this.batches.clear();
}
@@ -236,9 +240,6 @@
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.DETAIL)) {
LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, "Removing TupleBuffer:", this.tupleSourceID); //$NON-NLS-1$
}
- if (this.lobManager != null) {
- this.lobManager.remove();
- }
this.batchBuffer = null;
purge();
this.manager.remove();
@@ -368,5 +369,40 @@
}
return this.lobManager.getLobCount();
}
+
+ public void truncateTo(int rowLimit) throws TeiidComponentException {
+ if (rowCount <= rowLimit) {
+ return;
+ }
+ //TODO this could be more efficient with handling the last batch
+ TupleBatch last = this.getBatch(rowLimit);
+ TupleBatch tb = last;
+ if (this.batchBuffer != null) {
+ this.batchBuffer.clear();
+ }
+ int begin = tb.getBeginRow();
+ do {
+ if (tb == null) {
+ tb = this.getBatch(begin);
+ }
+ Long id = this.batches.remove(begin);
+ if (id != null) {
+ this.manager.remove(id);
+ }
+ if (this.lobManager != null) {
+ for (List<?> tuple : tb.getTuples()) {
+ this.lobManager.updateReferences(tuple, ReferenceMode.REMOVE);
+ }
+ }
+ begin = tb.getEndRow() + 1;
+ tb = null;
+ } while (begin <= rowCount);
+ rowCount = last.getBeginRow() - 1;
+ Iterator<List<?>> iter = last.getTuples().iterator();
+ while (rowCount < rowLimit) {
+ addTuple(iter.next());
+ }
+ saveBatch(false);
+ }
}
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorWork.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorWork.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorWork.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -25,6 +25,7 @@
import org.teiid.common.buffer.BlockedException;
import org.teiid.dqp.internal.process.RequestWorkItem;
import org.teiid.dqp.message.AtomicResultsMessage;
+import org.teiid.translator.CacheDirective;
import org.teiid.translator.TranslatorException;
@@ -46,5 +47,7 @@
boolean isDataAvailable();
boolean copyLobs();
+
+ CacheDirective getCacheDirective() throws TranslatorException;
}
\ No newline at end of file
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorWorkItem.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorWorkItem.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorWorkItem.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -40,7 +40,6 @@
import org.teiid.logging.LogConstants;
import org.teiid.logging.LogManager;
import org.teiid.logging.CommandLogMessage.Event;
-import org.teiid.metadata.RuntimeMetadata;
import org.teiid.query.QueryPlugin;
import org.teiid.query.metadata.QueryMetadataInterface;
import org.teiid.query.metadata.TempMetadataAdapter;
@@ -49,6 +48,7 @@
import org.teiid.query.sql.lang.QueryCommand;
import org.teiid.query.sql.lang.StoredProcedure;
import org.teiid.resource.spi.WrappedConnection;
+import org.teiid.translator.CacheDirective;
import org.teiid.translator.DataNotAvailableException;
import org.teiid.translator.Execution;
import org.teiid.translator.ExecutionFactory;
@@ -65,7 +65,7 @@
private ConnectorManager manager;
private AtomicRequestMessage requestMsg;
private ExecutionFactory<Object, Object> connector;
- private QueryMetadataInterface queryMetadata;
+ private RuntimeMetadataImpl queryMetadata;
/* Created on new request */
private Object connection;
@@ -81,6 +81,7 @@
private boolean error;
private AtomicBoolean isCancelled = new AtomicBoolean();
+ private org.teiid.language.Command translatedCommand;
ConnectorWorkItem(AtomicRequestMessage message, ConnectorManager manager) {
this.id = message.getAtomicRequestID();
@@ -99,9 +100,13 @@
this.connector = manager.getExecutionFactory();
VDBMetaData vdb = requestMsg.getWorkContext().getVDB();
- this.queryMetadata = vdb.getAttachment(QueryMetadataInterface.class);
- this.queryMetadata = new TempMetadataAdapter(this.queryMetadata, new TempMetadataStore());
+ QueryMetadataInterface qmi = vdb.getAttachment(QueryMetadataInterface.class);
+ qmi = new TempMetadataAdapter(qmi, new TempMetadataStore());
+ this.queryMetadata = new RuntimeMetadataImpl(qmi);
this.securityContext.setTransactional(requestMsg.isTransactional());
+ LanguageBridgeFactory factory = new LanguageBridgeFactory(this.queryMetadata);
+ factory.setConvertIn(!this.connector.supportsInCriteria());
+ translatedCommand = factory.translate(message.getCommand());
}
@Override
@@ -154,12 +159,14 @@
} catch (Throwable e) {
LogManager.logError(LogConstants.CTX_CONNECTOR, e, e.getMessage());
} finally {
- try {
- this.connector.closeConnection(connection, connectionFactory);
- } catch (Throwable e) {
- LogManager.logError(LogConstants.CTX_CONNECTOR, e, e.getMessage());
+ if (this.connector.isSourceRequired() && this.connection != null) {
+ try {
+ this.connector.closeConnection(connection, connectionFactory);
+ } catch (Throwable e) {
+ LogManager.logError(LogConstants.CTX_CONNECTOR, e, e.getMessage());
+ }
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, new Object[] {this.id, "Closed connection"}); //$NON-NLS-1$
}
- LogManager.logDetail(LogConstants.CTX_CONNECTOR, new Object[] {this.id, "Closed connection"}); //$NON-NLS-1$
}
}
@@ -217,16 +224,12 @@
if (command instanceof StoredProcedure) {
this.expectedColumns = ((StoredProcedure)command).getResultSetColumns().size();
}
- LanguageBridgeFactory factory = new LanguageBridgeFactory(queryMetadata);
- factory.setConvertIn(!this.connector.supportsInCriteria());
- org.teiid.language.Command translatedCommand = factory.translate(command);
Execution exec = this.requestMsg.getCommandContext().getReusableExecution(this.securityContext.getPartIdentifier());
if (exec != null) {
((ReusableExecution)exec).reset(translatedCommand, this.securityContext, connection);
} else {
- RuntimeMetadata rmd = new RuntimeMetadataImpl(queryMetadata);
- exec = connector.createExecution(translatedCommand, this.securityContext, rmd, (unwrapped == null) ? this.connection:unwrapped);
+ exec = connector.createExecution(translatedCommand, this.securityContext, queryMetadata, (unwrapped == null) ? this.connection:unwrapped);
if (exec instanceof ReusableExecution<?>) {
this.requestMsg.getCommandContext().putReusableExecution(this.securityContext.getPartIdentifier(), (ReusableExecution<?>) exec);
}
@@ -388,5 +391,12 @@
public boolean copyLobs() {
return this.connector.isCopyLobs();
}
+
+ @Override
+ public CacheDirective getCacheDirective() throws TranslatorException {
+ CacheDirective cd = connector.getCacheDirective(this.translatedCommand, this.securityContext, this.queryMetadata);
+ this.securityContext.setCacheDirective(cd);
+ return cd;
+ }
}
\ No newline at end of file
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ExecutionContextImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ExecutionContextImpl.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ExecutionContextImpl.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -38,6 +38,7 @@
import org.teiid.dqp.internal.process.RequestWorkItem;
import org.teiid.dqp.message.RequestID;
import org.teiid.query.util.CommandContext;
+import org.teiid.translator.CacheDirective;
import org.teiid.translator.ExecutionContext;
@@ -63,6 +64,7 @@
private String generalHint;
private String hint;
private CommandContext commandContext;
+ private CacheDirective cacheDirective;
public ExecutionContextImpl(String vdbName, int vdbVersion, Serializable executionPayload,
String originalConnectionID, String connectorName, long requestId, String partId, String execCount) {
@@ -269,4 +271,13 @@
public int getVirtualDatabaseVersion() {
return getVdbVersion();
}
+
+ @Override
+ public CacheDirective getCacheDirective() {
+ return cacheDirective;
+ }
+
+ public void setCacheDirective(CacheDirective directive) {
+ this.cacheDirective = directive;
+ }
}
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -139,6 +139,10 @@
}
}
+ public LanguageBridgeFactory(RuntimeMetadataImpl metadata) {
+ this.metadataFactory = metadata;
+ }
+
public void setConvertIn(boolean convertIn) {
this.convertIn = convertIn;
}
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierManagerImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierManagerImpl.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierManagerImpl.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -56,9 +56,12 @@
import org.teiid.dqp.internal.datamgr.ConnectorManager;
import org.teiid.dqp.internal.datamgr.ConnectorManagerRepository;
import org.teiid.dqp.internal.datamgr.ConnectorWork;
+import org.teiid.dqp.internal.process.SessionAwareCache.CacheID;
+import org.teiid.dqp.internal.process.TupleSourceCache.CachableVisitor;
import org.teiid.dqp.message.AtomicRequestMessage;
import org.teiid.dqp.message.RequestID;
import org.teiid.events.EventDistributor;
+import org.teiid.logging.LogConstants;
import org.teiid.logging.LogManager;
import org.teiid.logging.MessageLevel;
import org.teiid.metadata.*;
@@ -67,6 +70,7 @@
import org.teiid.query.metadata.TempMetadataID;
import org.teiid.query.metadata.TransformationMetadata;
import org.teiid.query.optimizer.relational.RelationalPlanner;
+import org.teiid.query.parser.ParseInfo;
import org.teiid.query.processor.CollectionTupleSource;
import org.teiid.query.processor.ProcessorDataManager;
import org.teiid.query.processor.RegisterRequestParameter;
@@ -75,12 +79,16 @@
import org.teiid.query.sql.lang.SourceHint;
import org.teiid.query.sql.lang.StoredProcedure;
import org.teiid.query.sql.lang.UnaryFromClause;
+import org.teiid.query.sql.navigator.PreOrPostOrderNavigator;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.GroupSymbol;
import org.teiid.query.sql.visitor.GroupCollectorVisitor;
import org.teiid.query.tempdata.GlobalTableStore;
import org.teiid.query.tempdata.GlobalTableStoreImpl.MatTableInfo;
import org.teiid.query.util.CommandContext;
+import org.teiid.translator.CacheDirective;
+import org.teiid.translator.TranslatorException;
+import org.teiid.translator.CacheDirective.Scope;
/**
* Full {@link ProcessorDataManager} implementation that
@@ -181,13 +189,51 @@
if (parameterObject.limit > 0) {
aqr.setFetchSize(Math.min(parameterObject.limit, aqr.getFetchSize()));
}
+ Collection<GroupSymbol> accessedGroups = null;
if (context.getDataObjects() != null) {
- for (GroupSymbol gs : GroupCollectorVisitor.getGroupsIgnoreInlineViews(command, false)) {
+ accessedGroups = GroupCollectorVisitor.getGroupsIgnoreInlineViews(command, false);
+ for (GroupSymbol gs : accessedGroups) {
context.accessedDataObject(gs.getMetadataID());
}
}
ConnectorManagerRepository cmr = workItem.getDqpWorkContext().getVDB().getAttachment(ConnectorManagerRepository.class);
- ConnectorWork work = cmr.getConnectorManager(aqr.getConnectorName()).registerRequest(aqr);
+ ConnectorManager connectorManager = cmr.getConnectorManager(aqr.getConnectorName());
+ ConnectorWork work = connectorManager.registerRequest(aqr);
+ CacheID cid = null;
+ CacheDirective cd = null;
+ if (workItem.getRsCache() != null && command.areResultsCachable()) {
+ CachableVisitor cv = new CachableVisitor();
+ PreOrPostOrderNavigator.doVisit(command, cv, PreOrPostOrderNavigator.PRE_ORDER, true);
+ if (cv.cacheable) {
+ try {
+ cd = work.getCacheDirective();
+ } catch (TranslatorException e) {
+ throw new TeiidProcessingException(QueryPlugin.Event.TEIID30504, e, aqr.getConnectorName() + ": " + e.getMessage()); //$NON-NLS-1$
+ }
+ if (cd != null) {
+ if (cd.getScope() == Scope.NONE) {
+ parameterObject.doNotCache = true;
+ } else {
+ String cmdString = command.toString();
+ if (cmdString.length() < 200000) { //TODO: this check won't be needed if keys aren't exclusively held in memory
+ cid = new CacheID(workItem.getDqpWorkContext(), ParseInfo.DEFAULT_INSTANCE, cmdString);
+ cid.setParameters(cv.parameters);
+ CachedResults cr = workItem.getRsCache().get(cid);
+ if (cr != null) {
+ parameterObject.doNotCache = true;
+ LogManager.logDetail(LogConstants.CTX_DQP, "Using cache entry for", cid); //$NON-NLS-1$
+ work.close();
+ return cr.getResults().createIndexedTupleSource();
+ }
+ }
+ }
+ } else {
+ LogManager.logTrace(LogConstants.CTX_DQP, aqr.getAtomicRequestID(), "no cache directive"); //$NON-NLS-1$
+ }
+ } else {
+ LogManager.logTrace(LogConstants.CTX_DQP, aqr.getAtomicRequestID(), "command not cachable"); //$NON-NLS-1$
+ }
+ }
work.setRequestWorkItem(workItem);
return new DataTierTupleSource(aqr, workItem, work, this, parameterObject.limit);
}
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -128,7 +128,8 @@
* @throws TeiidProcessingException
* @see org.teiid.dqp.internal.process.Request#generatePlan()
*/
- protected void generatePlan() throws TeiidComponentException, TeiidProcessingException {
+ @Override
+ protected void generatePlan(boolean addLimit) throws TeiidComponentException, TeiidProcessingException {
String sqlQuery = requestMsg.getCommands()[0];
CacheID id = new CacheID(this.workContext, Request.createParseInfo(this.requestMsg), sqlQuery);
prepPlan = prepPlanCache.get(id);
@@ -151,21 +152,19 @@
//if prepared plan does not exist, create one
prepPlan = new PreparedPlan();
LogManager.logTrace(LogConstants.CTX_DQP, new Object[] { "Query does not exist in cache: ", sqlQuery}); //$NON-NLS-1$
- super.generatePlan();
- if (!this.addedLimit) { //TODO: this is a little problematic
- prepPlan.setCommand(this.userCommand);
- // Defect 13751: Clone the plan in its current state (i.e. before processing) so that it can be used for later queries
- prepPlan.setPlan(processPlan.clone(), this.context);
- prepPlan.setAnalysisRecord(analysisRecord);
-
- Determinism determinismLevel = this.context.getDeterminismLevel();
- if (userCommand.getCacheHint() != null && userCommand.getCacheHint().getDeterminism() != null) {
- LogManager.logTrace(LogConstants.CTX_DQP, new Object[] { "Cache hint modified the query determinism from ",this.context.getDeterminismLevel(), " to ", determinismLevel }); //$NON-NLS-1$ //$NON-NLS-2$
- determinismLevel = userCommand.getCacheHint().getDeterminism();
- }
-
- this.prepPlanCache.put(id, determinismLevel, prepPlan, userCommand.getCacheHint() != null?userCommand.getCacheHint().getTtl():null);
- }
+ super.generatePlan(false);
+ prepPlan.setCommand(this.userCommand);
+ // Defect 13751: Clone the plan in its current state (i.e. before processing) so that it can be used for later queries
+ prepPlan.setPlan(processPlan.clone(), this.context);
+ prepPlan.setAnalysisRecord(analysisRecord);
+
+ Determinism determinismLevel = this.context.getDeterminismLevel();
+ if (userCommand.getCacheHint() != null && userCommand.getCacheHint().getDeterminism() != null) {
+ LogManager.logTrace(LogConstants.CTX_DQP, new Object[] { "Cache hint modified the query determinism from ",this.context.getDeterminismLevel(), " to ", determinismLevel }); //$NON-NLS-1$ //$NON-NLS-2$
+ determinismLevel = userCommand.getCacheHint().getDeterminism();
+ }
+
+ this.prepPlanCache.put(id, determinismLevel, prepPlan, userCommand.getCacheHint() != null?userCommand.getCacheHint().getTtl():null);
}
if (requestMsg.isBatchedUpdate()) {
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -373,7 +373,7 @@
* @throws TeiidComponentException
* @throws TeiidProcessingException
*/
- protected void generatePlan() throws TeiidComponentException, TeiidProcessingException {
+ protected void generatePlan(boolean addLimit) throws TeiidComponentException, TeiidProcessingException {
Command command = parseCommand();
List<Reference> references = ReferenceCollectorVisitor.getReferences(command);
@@ -404,7 +404,7 @@
* Adds a row limit to a query if Statement.setMaxRows has been called and the command
* doesn't already have a limit clause.
*/
- if (requestMsg.getRowLimit() > 0 && command instanceof QueryCommand) {
+ if (addLimit && requestMsg.getRowLimit() > 0 && command instanceof QueryCommand) {
QueryCommand query = (QueryCommand)command;
if (query.getLimit() == null) {
query.setLimit(new Limit(null, new Constant(new Integer(requestMsg.getRowLimit()), DataTypeManager.DefaultDataClasses.INTEGER)));
@@ -447,7 +447,7 @@
initMetadata();
- generatePlan();
+ generatePlan(true);
postProcessXML();
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -581,6 +581,9 @@
}
}
};
+ if (!request.addedLimit && this.requestMsg.getRowLimit() > 0) {
+ this.collector.setRowLimit(this.requestMsg.getRowLimit());
+ }
this.resultsBuffer = collector.getTupleBuffer();
if (this.resultsBuffer == null) {
//This is just a dummy result it will get replaced by collector source
@@ -632,6 +635,10 @@
}
dqpCore.getRsCache().put(cid, determinismLevel, cr, originalCommand.getCacheHint() != null?originalCommand.getCacheHint().getTtl():null);
}
+
+ public SessionAwareCache<CachedResults> getRsCache() {
+ return dqpCore.getRsCache();
+ }
/**
* Send results if they have been requested. This should only be called from the processing thread.
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/SessionAwareCache.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/SessionAwareCache.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/SessionAwareCache.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -38,7 +38,6 @@
import org.teiid.cache.DefaultCacheFactory;
import org.teiid.cache.CacheConfiguration.Policy;
import org.teiid.common.buffer.TupleBufferCache;
-import org.teiid.core.types.DataTypeManager;
import org.teiid.core.util.Assertion;
import org.teiid.core.util.EquivalenceUtil;
import org.teiid.core.util.HashCodeUtil;
@@ -261,7 +260,7 @@
*/
public boolean setParameters(List<?> parameters) {
if (parameters != null && !parameters.isEmpty()) {
- this.parameters = new ArrayList<Serializable>();
+ this.parameters = new ArrayList<Serializable>(parameters.size());
for (Object obj:parameters) {
if (obj == null) {
this.parameters.add(null);
@@ -270,11 +269,6 @@
if (!(obj instanceof Serializable)) {
return false;
}
-
- Class<?> type = DataTypeManager.determineDataTypeClass(obj);
- if (type == DataTypeManager.DefaultDataClasses.OBJECT) {
- return false;
- }
this.parameters.add((Serializable)obj);
}
}
Added: trunk/engine/src/main/java/org/teiid/dqp/internal/process/TupleSourceCache.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/TupleSourceCache.java (rev 0)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/TupleSourceCache.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -0,0 +1,167 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.dqp.internal.process;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.teiid.common.buffer.BufferManager;
+import org.teiid.common.buffer.TupleBuffer;
+import org.teiid.common.buffer.TupleSource;
+import org.teiid.common.buffer.BufferManager.TupleSourceType;
+import org.teiid.core.TeiidComponentException;
+import org.teiid.core.TeiidProcessingException;
+import org.teiid.core.types.DataTypeManager;
+import org.teiid.query.processor.ProcessorDataManager;
+import org.teiid.query.processor.RegisterRequestParameter;
+import org.teiid.query.sql.LanguageVisitor;
+import org.teiid.query.sql.lang.Command;
+import org.teiid.query.sql.lang.DependentSetCriteria;
+import org.teiid.query.sql.symbol.Constant;
+import org.teiid.query.util.CommandContext;
+
+public class TupleSourceCache {
+
+ final static class CachableVisitor extends LanguageVisitor {
+ boolean cacheable = true;
+ List<Object> parameters;
+
+ @Override
+ public void visit(Constant c) {
+ if (c.isMultiValued()) {
+ notCachable();
+ } else if (DataTypeManager.isLOB(c.getType())) {
+ if (parameters == null) {
+ parameters = new ArrayList<Object>();
+ }
+ parameters.add(c.getValue());
+ }
+ }
+
+ private void notCachable() {
+ cacheable = false;
+ setAbort(true);
+ }
+
+ @Override
+ public void visit(DependentSetCriteria obj) {
+ notCachable();
+ }
+ }
+
+ private static class SharedState {
+ TupleBuffer tb;
+ TupleSource ts;
+ int id;
+ int expectedReaders;
+
+ private void remove() {
+ ts.closeSource();
+ tb.remove();
+ tb = null;
+ ts = null;
+ }
+ }
+
+ public abstract static class BufferedTupleSource implements TupleSource {
+ private int rowNumber = 1;
+ private TupleBuffer tb;
+ private TupleSource ts;
+
+ protected BufferedTupleSource(TupleBuffer tb, TupleSource ts) {
+ this.tb = tb;
+ this.ts = ts;
+ }
+
+ @Override
+ public List<?> nextTuple() throws TeiidComponentException,
+ TeiidProcessingException {
+ if (rowNumber <= tb.getRowCount()) {
+ return tb.getBatch(rowNumber).getTuple(rowNumber++);
+ }
+ if (tb.isFinal()) {
+ return null;
+ }
+ List<?> row = ts.nextTuple();
+ if (row == null) {
+ tb.setFinal(true);
+ } else {
+ tb.addTuple(row);
+ rowNumber++;
+ }
+ return row;
+ }
+
+ }
+
+ private class SharedTupleSource extends BufferedTupleSource {
+ private SharedState state;
+
+ public SharedTupleSource(SharedState state) {
+ super(state.tb, state.ts);
+ this.state = state;
+ }
+
+ @Override
+ public void closeSource() {
+ if (--state.expectedReaders == 0 && sharedStates != null && sharedStates.containsKey(state.id)) {
+ state.remove();
+ sharedStates.remove(state.id);
+ }
+ }
+ }
+
+ private Map<Integer, SharedState> sharedStates;
+
+ public void close() {
+ if (sharedStates != null) {
+ for (SharedState ss : sharedStates.values()) {
+ ss.remove();
+ }
+ sharedStates = null;
+ }
+ }
+
+ public TupleSource getSharedTupleSource(CommandContext context, Command command, String modelName, RegisterRequestParameter parameterObject, BufferManager bufferMgr, ProcessorDataManager pdm) throws TeiidComponentException, TeiidProcessingException {
+ if (sharedStates == null) {
+ sharedStates = new HashMap<Integer, SharedState>();
+ }
+ SharedState state = sharedStates.get(parameterObject.info.id);
+ if (state == null) {
+ state = new SharedState();
+ state.expectedReaders = parameterObject.info.sharingCount;
+ RegisterRequestParameter param = new RegisterRequestParameter(parameterObject.connectorBindingId, 0, -1);
+ state.ts = pdm.registerRequest(context, command, modelName, param);
+ if (param.doNotCache) {
+ return state.ts;
+ }
+ state.tb = bufferMgr.createTupleBuffer(command.getProjectedSymbols(), context.getConnectionId(), TupleSourceType.PROCESSOR);
+ state.id = parameterObject.info.id;
+ sharedStates.put(parameterObject.info.id, state);
+ }
+ return new SharedTupleSource(state);
+ }
+
+}
Property changes on: trunk/engine/src/main/java/org/teiid/dqp/internal/process/TupleSourceCache.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -229,13 +229,13 @@
public Boolean evaluate(CompoundCriteria criteria, List<?> tuple)
throws ExpressionEvaluationException, BlockedException, TeiidComponentException {
- List subCrits = criteria.getCriteria();
- Iterator subCritIter = subCrits.iterator();
+ List<Criteria> subCrits = criteria.getCriteria();
+ Iterator<Criteria> subCritIter = subCrits.iterator();
boolean and = criteria.getOperator() == CompoundCriteria.AND;
Boolean result = and?Boolean.TRUE:Boolean.FALSE;
while(subCritIter.hasNext()) {
- Criteria subCrit = (Criteria) subCritIter.next();
+ Criteria subCrit = subCritIter.next();
Boolean value = evaluateTVL(subCrit, tuple);
if (value == null) {
result = null;
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -28,6 +28,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
import org.teiid.api.exception.query.QueryMetadataException;
import org.teiid.api.exception.query.QueryPlannerException;
@@ -80,7 +81,7 @@
//state for detecting and reusing source queries
private Map<Command, AccessNode> sharedCommands = new HashMap<Command, AccessNode>();
- private int sharedId;
+ private static AtomicInteger sharedId = new AtomicInteger();
public static class SharedStateKey {
int id;
@@ -114,7 +115,6 @@
return processPlan;
} finally {
sharedCommands.clear();
- sharedId = 0;
}
}
@@ -538,7 +538,7 @@
} else {
if (other.info == null) {
other.info = new RegisterRequestParameter.SharedAccessInfo();
- other.info.id = sharedId++;
+ other.info.id = sharedId.getAndIncrement();
}
other.info.sharingCount++;
aNode.info = other.info;
Modified: trunk/engine/src/main/java/org/teiid/query/parser/ParseInfo.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/parser/ParseInfo.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/parser/ParseInfo.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -33,6 +33,11 @@
private static final boolean ANSI_QUOTED_DEFAULT = PropertiesUtils.getBooleanProperty(System.getProperties(), "org.teiid.ansiQuotedIdentifiers", true); //$NON-NLS-1$
public int referenceCount = 0;
+
+ public static final ParseInfo DEFAULT_INSTANCE = new ParseInfo();
+ static {
+ DEFAULT_INSTANCE.ansiQuotedIdentifiers = true;
+ }
// treat a double quoted variable as variable instead of string
public boolean ansiQuotedIdentifiers=ANSI_QUOTED_DEFAULT;
Modified: trunk/engine/src/main/java/org/teiid/query/processor/BatchCollector.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/BatchCollector.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/BatchCollector.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -58,14 +58,17 @@
/**
* return the final tuple buffer or null if not available
+ * @param maxRows
* @return
* @throws TeiidProcessingException
* @throws TeiidComponentException
* @throws BlockedException
*/
- TupleBuffer getFinalBuffer() throws BlockedException, TeiidComponentException, TeiidProcessingException;
+ TupleBuffer getFinalBuffer(int maxRows) throws BlockedException, TeiidComponentException, TeiidProcessingException;
boolean hasFinalBuffer();
+
+ void close() throws TeiidComponentException;
}
public static class BatchProducerTupleSource implements TupleSource {
@@ -119,11 +122,14 @@
private boolean done = false;
private TupleBuffer buffer;
private boolean forwardOnly;
+ private int rowLimit = -1; //-1 means no_limit
+ private boolean hasFinalBuffer;
public BatchCollector(BatchProducer sourceNode, BufferManager bm, CommandContext context, boolean forwardOnly) throws TeiidComponentException {
this.sourceNode = sourceNode;
this.forwardOnly = forwardOnly;
- if (!this.sourceNode.hasFinalBuffer()) {
+ this.hasFinalBuffer = this.sourceNode.hasFinalBuffer();
+ if (!this.hasFinalBuffer) {
this.buffer = bm.createTupleBuffer(sourceNode.getOutputElements(), context.getConnectionId(), TupleSourceType.PROCESSOR);
this.buffer.setForwardOnly(forwardOnly);
}
@@ -132,9 +138,9 @@
public TupleBuffer collectTuples() throws TeiidComponentException, TeiidProcessingException {
TupleBatch batch = null;
while(!done) {
- if (this.sourceNode.hasFinalBuffer()) {
+ if (this.hasFinalBuffer) {
if (this.buffer == null) {
- TupleBuffer finalBuffer = this.sourceNode.getFinalBuffer();
+ TupleBuffer finalBuffer = this.sourceNode.getFinalBuffer(rowLimit);
Assertion.isNotNull(finalBuffer);
this.buffer = finalBuffer;
}
@@ -145,6 +151,17 @@
}
}
batch = sourceNode.nextBatch();
+
+ if (rowLimit > 0 && rowLimit <= batch.getEndRow()) {
+ if (!done) {
+ this.sourceNode.close();
+ }
+ if (rowLimit < batch.getEndRow()) {
+ List<List<?>> tuples = batch.getTuples().subList(0, rowLimit - batch.getBeginRow() + 1);
+ batch = new TupleBatch(batch.getBeginRow(), tuples);
+ }
+ batch.setTerminationFlag(true);
+ }
flushBatch(batch);
@@ -176,7 +193,7 @@
@SuppressWarnings("unused")
protected void flushBatchDirect(TupleBatch batch, boolean add) throws TeiidComponentException, TeiidProcessingException {
- if (!this.sourceNode.hasFinalBuffer()) {
+ if (!this.hasFinalBuffer) {
buffer.addTupleBatch(batch, add);
}
}
@@ -188,4 +205,8 @@
return buffer.getRowCount();
}
+ public void setRowLimit(int rowLimit) {
+ this.rowLimit = rowLimit;
+ }
+
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/ProcessorPlan.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/ProcessorPlan.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/ProcessorPlan.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -149,7 +149,7 @@
* @throws TeiidComponentException
* @throws BlockedException
*/
- public TupleBuffer getFinalBuffer() throws BlockedException, TeiidComponentException, TeiidProcessingException {
+ public TupleBuffer getFinalBuffer(int maxRows) throws BlockedException, TeiidComponentException, TeiidProcessingException {
return null;
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -22,35 +22,30 @@
package org.teiid.query.processor;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import org.teiid.common.buffer.BlockedException;
import org.teiid.common.buffer.BufferManager;
import org.teiid.common.buffer.TupleBatch;
import org.teiid.common.buffer.TupleBuffer;
-import org.teiid.common.buffer.TupleSource;
import org.teiid.common.buffer.BufferManager.BufferReserveMode;
-import org.teiid.common.buffer.BufferManager.TupleSourceType;
import org.teiid.core.TeiidComponentException;
import org.teiid.core.TeiidException;
import org.teiid.core.TeiidProcessingException;
import org.teiid.core.TeiidRuntimeException;
import org.teiid.core.util.Assertion;
-import org.teiid.events.EventDistributor;
+import org.teiid.dqp.internal.process.TupleSourceCache;
import org.teiid.logging.LogConstants;
import org.teiid.logging.LogManager;
import org.teiid.logging.MessageLevel;
import org.teiid.query.QueryPlugin;
import org.teiid.query.processor.BatchCollector.BatchProducer;
-import org.teiid.query.sql.lang.Command;
import org.teiid.query.util.CommandContext;
/**
* Driver for plan processing.
*/
-public class QueryProcessor implements BatchProducer, ProcessorDataManager {
+public class QueryProcessor implements BatchProducer {
public static class ExpiredTimeSliceException extends TeiidRuntimeException {
private static final long serialVersionUID = 4585044674826578060L;
@@ -62,56 +57,6 @@
QueryProcessor createQueryProcessor(String query, String recursionGroup, CommandContext commandContext, Object... params) throws TeiidProcessingException, TeiidComponentException;
}
- private class SharedState {
- TupleBuffer tb;
- TupleSource ts;
- int id;
- int expectedReaders;
-
- private void remove() {
- ts.closeSource();
- tb.remove();
- tb = null;
- ts = null;
- }
- }
-
- private final class BufferedTupleSource implements TupleSource {
- private int rowNumber = 1;
- private SharedState state;
-
- private BufferedTupleSource(SharedState state) {
- this.state = state;
- }
-
- @Override
- public List<?> nextTuple() throws TeiidComponentException,
- TeiidProcessingException {
- if (rowNumber <= state.tb.getRowCount()) {
- return state.tb.getBatch(rowNumber).getTuple(rowNumber++);
- }
- if (state.tb.isFinal()) {
- return null;
- }
- List<?> row = state.ts.nextTuple();
- if (row == null) {
- state.tb.setFinal(true);
- } else {
- this.state.tb.addTuple(row);
- rowNumber++;
- }
- return row;
- }
-
- @Override
- public void closeSource() {
- if (--state.expectedReaders == 0 && sharedStates != null && sharedStates.containsKey(state.id)) {
- state.remove();
- sharedStates.remove(state.id);
- }
- }
- }
-
private CommandContext context;
private ProcessorDataManager dataMgr;
private BufferManager bufferMgr;
@@ -123,11 +68,10 @@
private volatile boolean requestCanceled;
private static final int DEFAULT_WAIT = 50;
private boolean processorClosed;
+
private boolean continuous;
private int rowOffset = 1;
- Map<Integer, SharedState> sharedStates;
-
/**
* Construct a processor with all necessary information to process.
* @param plan The plan to process
@@ -138,6 +82,7 @@
*/
public QueryProcessor(ProcessorPlan plan, CommandContext context, BufferManager bufferMgr, final ProcessorDataManager dataMgr) {
this.context = context;
+ this.context.setTupleSourceCache(new TupleSourceCache());
this.dataMgr = dataMgr;
this.processPlan = plan;
this.bufferMgr = bufferMgr;
@@ -203,6 +148,7 @@
if (result.getTerminationFlag()) {
result.setTerminationFlag(false);
+ this.context.getTupleSourceCache().close();
this.processPlan.close();
this.processPlan.reset();
this.context.incrementReuseCount();
@@ -245,7 +191,7 @@
// initialize if necessary
if(!initialized) {
reserved = this.bufferMgr.reserveBuffers(this.bufferMgr.getSchemaSize(this.getOutputElements()), BufferReserveMode.FORCE);
- this.processPlan.initialize(context, this, bufferMgr);
+ this.processPlan.initialize(context, dataMgr, bufferMgr);
initialized = true;
}
@@ -266,12 +212,7 @@
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
LogManager.logDetail(LogConstants.CTX_DQP, "QueryProcessor: closing processor"); //$NON-NLS-1$
}
- if (sharedStates != null) {
- for (SharedState ss : sharedStates.values()) {
- ss.remove();
- }
- sharedStates = null;
- }
+ this.context.getTupleSourceCache().close();
this.bufferMgr.releaseBuffers(reserved);
reserved = 0;
processorClosed = true;
@@ -309,12 +250,12 @@
}
@Override
- public TupleBuffer getFinalBuffer() throws BlockedException, TeiidComponentException, TeiidProcessingException {
+ public TupleBuffer getFinalBuffer(int maxRows) throws BlockedException, TeiidComponentException, TeiidProcessingException {
while (true) {
long wait = DEFAULT_WAIT;
try {
init();
- return this.processPlan.getFinalBuffer();
+ return this.processPlan.getFinalBuffer(maxRows);
} catch (BlockedException e) {
if (!this.context.isNonBlocking()) {
throw e;
@@ -345,41 +286,14 @@
public void setContinuous(boolean continuous) {
this.continuous = continuous;
+ if (this.continuous) {
+ this.context.setContinuous();
+ }
}
-
- @Override
- public Object lookupCodeValue(CommandContext ctx, String codeTableName,
- String returnElementName, String keyElementName, Object keyValue)
- throws BlockedException, TeiidComponentException,
- TeiidProcessingException {
- return dataMgr.lookupCodeValue(ctx, codeTableName, returnElementName, keyElementName, keyValue);
- }
@Override
- public EventDistributor getEventDistributor() {
- return dataMgr.getEventDistributor();
+ public void close() throws TeiidComponentException {
+ closeProcessing();
}
- @Override
- public TupleSource registerRequest(CommandContext ctx, Command command,
- String modelName, RegisterRequestParameter parameterObject)
- throws TeiidComponentException, TeiidProcessingException {
- if (parameterObject.info == null) {
- return dataMgr.registerRequest(ctx, command, modelName, parameterObject);
- }
- //begin handling of shared commands
- if (sharedStates == null) {
- sharedStates = new HashMap<Integer, SharedState>();
- }
- SharedState state = sharedStates.get(parameterObject.info.id);
- if (state == null) {
- state = new SharedState();
- state.expectedReaders = parameterObject.info.sharingCount;
- state.tb = QueryProcessor.this.bufferMgr.createTupleBuffer(command.getProjectedSymbols(), ctx.getConnectionId(), TupleSourceType.PROCESSOR);
- state.ts = dataMgr.registerRequest(ctx, command, modelName, new RegisterRequestParameter(parameterObject.connectorBindingId, 0, -1));
- state.id = parameterObject.info.id;
- sharedStates.put(parameterObject.info.id, state);
- }
- return new BufferedTupleSource(state);
- }
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/RegisterRequestParameter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/RegisterRequestParameter.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/RegisterRequestParameter.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -33,6 +33,7 @@
public int nodeID = 0;
public int limit = -1;
public SharedAccessInfo info;
+ public boolean doNotCache;
public RegisterRequestParameter(String connectorBindingId, int nodeID,
int limit) {
Modified: trunk/engine/src/main/java/org/teiid/query/processor/proc/ForEachRowPlan.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/proc/ForEachRowPlan.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/proc/ForEachRowPlan.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -104,7 +104,8 @@
}
if (this.rowProcessor == null) {
rowProcedure.reset();
- this.rowProcessor = new QueryProcessor(rowProcedure, getContext(), this.bufferMgr, this.dataMgr);
+ CommandContext context = getContext().clone();
+ this.rowProcessor = new QueryProcessor(rowProcedure, context, this.bufferMgr, this.dataMgr);
for (Map.Entry<ElementSymbol, Expression> entry : this.params.entrySet()) {
Integer index = (Integer)this.lookupMap.get(entry.getValue());
if (index != null) {
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -411,22 +411,22 @@
public Object clone(){
AccessNode clonedNode = new AccessNode();
- this.copy(this, clonedNode);
+ this.copyTo(clonedNode);
return clonedNode;
}
- protected void copy(AccessNode source, AccessNode target){
- super.copy(source, target);
- target.modelName = source.modelName;
- target.modelId = source.modelId;
- target.connectorBindingId = source.connectorBindingId;
- target.shouldEvaluate = source.shouldEvaluate;
- if (!source.shouldEvaluate) {
- target.projection = source.projection;
- target.originalSelect = source.originalSelect;
+ protected void copyTo(AccessNode target){
+ super.copyTo(target);
+ target.modelName = modelName;
+ target.modelId = modelId;
+ target.connectorBindingId = connectorBindingId;
+ target.shouldEvaluate = shouldEvaluate;
+ if (!shouldEvaluate) {
+ target.projection = projection;
+ target.originalSelect = originalSelect;
}
- target.command = source.command;
- target.info = source.info;
+ target.command = command;
+ target.info = info;
}
public PlanNode getDescriptionProperties() {
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/ArrayTableNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/ArrayTableNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/ArrayTableNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -82,7 +82,7 @@
@Override
public ArrayTableNode clone() {
ArrayTableNode clone = new ArrayTableNode(getID());
- this.copy(this, clone);
+ this.copyTo(clone);
clone.setTable(table);
return clone;
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/BatchedUpdateNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/BatchedUpdateNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/BatchedUpdateNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -176,7 +176,7 @@
*/
public Object clone() {
BatchedUpdateNode clonedNode = new BatchedUpdateNode(getID(), updateCommands, contexts, shouldEvaluate, modelName);
- super.copy(this, clonedNode);
+ super.copyTo(clonedNode);
return clonedNode;
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentAccessNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentAccessNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentAccessNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -105,7 +105,7 @@
clonedNode.maxSetSize = this.maxSetSize;
clonedNode.maxPredicates = this.maxPredicates;
clonedNode.pushdown = this.pushdown;
- super.copy(this, clonedNode);
+ super.copyTo(clonedNode);
return clonedNode;
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureAccessNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureAccessNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureAccessNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -59,7 +59,7 @@
DependentProcedureAccessNode copy = new DependentProcedureAccessNode(getID(), inputCriteria,
inputReferences,
inputDefaults);
- copy(this, copy);
+ copyTo(copy);
return copy;
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureExecutionNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureExecutionNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureExecutionNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -58,7 +58,7 @@
DependentProcedureExecutionNode copy = new DependentProcedureExecutionNode(getID(), (Criteria)inputCriteria.clone(),
inputReferences,
inputDefaults);
- copy(this, copy);
+ copyTo(copy);
return copy;
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentValueSource.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentValueSource.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentValueSource.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -24,6 +24,7 @@
import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
@@ -47,12 +48,18 @@
ValueIteratorSource {
private TupleBuffer buffer;
+ private List<? extends Expression> schema;
private Map<Expression, Set<Object>> cachedSets;
private boolean unused; //TODO: use this value instead of the context
private boolean distinct;
+
+ public DependentValueSource(TupleBuffer tb) {
+ this(tb, tb.getSchema());
+ }
- public DependentValueSource(TupleBuffer tupleSourceID) {
- this.buffer = tupleSourceID;
+ public DependentValueSource(TupleBuffer tb, List<? extends Expression> schema) {
+ this.buffer = tb;
+ this.schema = schema;
}
public TupleBuffer getTupleBuffer() {
@@ -67,7 +74,7 @@
IndexedTupleSource its = buffer.createIndexedTupleSource();
int index = 0;
if (valueExpression != null) {
- index = buffer.getSchema().indexOf(valueExpression);
+ index = schema.indexOf(valueExpression);
Assertion.assertTrue(index != -1);
}
return new TupleSourceValueIterator(its, index);
@@ -85,10 +92,10 @@
IndexedTupleSource its = buffer.createIndexedTupleSource();
int index = 0;
if (valueExpression != null) {
- index = buffer.getSchema().indexOf(valueExpression);
+ index = schema.indexOf(valueExpression);
}
Assertion.assertTrue(index != -1);
- Class<?> type = ((Expression)buffer.getSchema().get(index)).getType();
+ Class<?> type = ((Expression)schema.get(index)).getType();
if (!DataTypeManager.isHashable(type)) {
result = new TreeSet<Object>(Constant.COMPARATOR);
} else {
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/GroupingNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/GroupingNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/GroupingNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -449,7 +449,7 @@
public Object clone(){
GroupingNode clonedNode = new GroupingNode(super.getID());
- super.copy(this, clonedNode);
+ super.copyTo(clonedNode);
clonedNode.removeDuplicates = removeDuplicates;
clonedNode.outputMapping = outputMapping;
clonedNode.orderBy = orderBy;
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/InsertPlanExecutionNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/InsertPlanExecutionNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/InsertPlanExecutionNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -92,13 +92,13 @@
public Object clone(){
InsertPlanExecutionNode clonedNode = new InsertPlanExecutionNode(super.getID(), this.metadata);
- copy(this, clonedNode);
+ copyTo(clonedNode);
return clonedNode;
}
- protected void copy(InsertPlanExecutionNode source, InsertPlanExecutionNode target) {
- target.references = source.references;
- super.copy(source, target);
+ protected void copyTo(InsertPlanExecutionNode target) {
+ target.references = references;
+ super.copyTo(target);
}
@Override
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/JoinNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/JoinNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/JoinNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -154,7 +154,7 @@
*/
public Object clone() {
JoinNode clonedNode = new JoinNode(super.getID());
- super.copy(this, clonedNode);
+ super.copyTo(clonedNode);
clonedNode.joinType = this.joinType;
clonedNode.joinStrategy = this.joinStrategy.clone();
@@ -186,7 +186,8 @@
this.joinStrategy.loadLeft();
if (isDependent()) {
TupleBuffer buffer = this.joinStrategy.leftSource.getTupleBuffer();
- dvs = new DependentValueSource(buffer);
+ //the tuplebuffer may be from a lower node, so pass in the schema
+ dvs = new DependentValueSource(buffer, this.joinStrategy.leftSource.getSource().getElements());
dvs.setDistinct(this.joinStrategy.leftSource.isDistinct());
this.getContext().getVariableContext().setGlobalValue(this.dependentValueSource, dvs);
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/LimitNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/LimitNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/LimitNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -30,6 +30,7 @@
import org.teiid.client.plan.PlanNode;
import org.teiid.common.buffer.BlockedException;
import org.teiid.common.buffer.TupleBatch;
+import org.teiid.common.buffer.TupleBuffer;
import org.teiid.core.TeiidComponentException;
import org.teiid.core.TeiidProcessingException;
import org.teiid.query.eval.Evaluator;
@@ -168,7 +169,7 @@
public Object clone() {
LimitNode node = new LimitNode(getID(), limitExpr, offsetExpr);
node.implicit = this.implicit;
- copy(this, node);
+ copyTo(node);
node.rowCounter = this.rowCounter;
return node;
}
@@ -188,5 +189,24 @@
public int getOffset() {
return offset;
}
+
+ @Override
+ public boolean hasFinalBuffer() {
+ //TODO: support offset
+ return offsetExpr == null && this.getChildren()[0].hasFinalBuffer();
+ }
+
+ @Override
+ public TupleBuffer getFinalBuffer(int maxRows) throws BlockedException,
+ TeiidComponentException, TeiidProcessingException {
+ if (maxRows >= 0) {
+ if (limit >= 0) {
+ maxRows = Math.min(maxRows, limit);
+ }
+ } else {
+ maxRows = limit;
+ }
+ return this.getChildren()[0].getFinalBuffer(maxRows);
+ }
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/NullNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/NullNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/NullNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -49,7 +49,7 @@
public Object clone(){
NullNode clonedNode = new NullNode(super.getID());
- super.copy(this, clonedNode);
+ super.copyTo(clonedNode);
return clonedNode;
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/PlanExecutionNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/PlanExecutionNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/PlanExecutionNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -164,14 +164,13 @@
public Object clone(){
PlanExecutionNode clonedNode = new PlanExecutionNode();
- copy(this, clonedNode);
+ copyTo(clonedNode);
return clonedNode;
}
- protected void copy(PlanExecutionNode source,
- PlanExecutionNode target) {
- target.setProcessorPlan(source.plan.clone());
- super.copy(source, target);
+ protected void copyTo(PlanExecutionNode target) {
+ target.setProcessorPlan(plan.clone());
+ super.copyTo(target);
}
public PlanNode getDescriptionProperties() {
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectIntoNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectIntoNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectIntoNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -231,7 +231,7 @@
public Object clone(){
ProjectIntoNode clonedNode = new ProjectIntoNode();
- super.copy(this, clonedNode);
+ super.copyTo(clonedNode);
clonedNode.intoGroup = intoGroup;
clonedNode.intoElements = intoElements;
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -27,24 +27,22 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
-import java.util.HashMap;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.teiid.api.exception.query.ExpressionEvaluationException;
import org.teiid.client.plan.PlanNode;
import org.teiid.common.buffer.BlockedException;
-import org.teiid.common.buffer.BufferManager;
import org.teiid.common.buffer.TupleBatch;
+import org.teiid.common.buffer.TupleBuffer;
import org.teiid.core.TeiidComponentException;
import org.teiid.core.TeiidProcessingException;
import org.teiid.query.analysis.AnalysisRecord;
-import org.teiid.query.processor.ProcessorDataManager;
import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.symbol.AliasSymbol;
import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.util.SymbolMap;
-import org.teiid.query.util.CommandContext;
public class ProjectNode extends SubqueryAwareRelationalNode {
@@ -52,7 +50,7 @@
private List<? extends Expression> selectSymbols;
// Derived element lookup map
- private Map elementMap;
+ private Map<Expression, Integer> elementMap;
private boolean needsProject = true;
private List<Expression> expressions;
private int[] projectionIndexes;
@@ -86,45 +84,37 @@
public void setSelectSymbols(List<? extends Expression> symbols) {
this.selectSymbols = symbols;
- }
-
- @Override
- public void initialize(CommandContext context, BufferManager bufferManager,
- ProcessorDataManager dataMgr) {
- super.initialize(context, bufferManager, dataMgr);
-
- // Do this lazily as the node may be reset and re-used and this info doesn't change
- if(elementMap != null) {
- return;
- }
- this.projectionIndexes = new int[this.selectSymbols.size()];
+ elementMap = Collections.emptyMap();
+ this.projectionIndexes = new int[this.selectSymbols.size()];
Arrays.fill(this.projectionIndexes, -1);
this.expressions = new ArrayList<Expression>(this.selectSymbols.size());
for (Expression ses : this.selectSymbols) {
this.expressions.add(SymbolMap.getExpression(ses));
}
- //in the case of select with no from, there is no child node
- //simply return at this point
- if(this.getChildren()[0] == null){
- elementMap = new HashMap();
- return;
- }
-
+ }
+
+ @Override
+ public void addChild(RelationalNode child) {
+ super.addChild(child);
+ init();
+ }
+
+ void init() {
+ List<? extends Expression> childElements = getChildren()[0].getElements();
// Create element lookup map for evaluating project expressions
- List childElements = this.getChildren()[0].getElements();
this.elementMap = createLookupMap(childElements);
// Check whether project needed at all - this occurs if:
// 1. outputMap == null (see previous block)
// 2. project elements are either elements or aggregate symbols (no processing required)
// 3. order of input values == order of output values
- needsProject = childElements.size() != getElements().size();
+ needsProject = childElements.size() != selectSymbols.size();
for(int i=0; i<selectSymbols.size(); i++) {
Expression symbol = selectSymbols.get(i);
if(symbol instanceof AliasSymbol) {
- Integer index = (Integer) elementMap.get(symbol);
+ Integer index = elementMap.get(symbol);
if(index != null && index.intValue() == i) {
projectionIndexes[i] = index;
continue;
@@ -132,7 +122,7 @@
symbol = ((AliasSymbol)symbol).getSymbol();
}
- Integer index = (Integer) elementMap.get(symbol);
+ Integer index = elementMap.get(symbol);
if(index == null || index.intValue() != i) {
// input / output element order is not the same
needsProject = true;
@@ -140,7 +130,7 @@
projectionIndexes[i] = index;
}
}
- }
+ }
public TupleBatch nextBatchDirect()
throws BlockedException, TeiidComponentException, TeiidProcessingException {
@@ -208,13 +198,17 @@
public Object clone(){
ProjectNode clonedNode = new ProjectNode();
- this.copy(this, clonedNode);
+ this.copyTo(clonedNode);
return clonedNode;
}
- protected void copy(ProjectNode source, ProjectNode target){
- super.copy(source, target);
+ protected void copyTo(ProjectNode target){
+ super.copyTo(target);
target.selectSymbols = this.selectSymbols;
+ target.needsProject = needsProject;
+ target.elementMap = elementMap;
+ target.expressions = expressions;
+ target.projectionIndexes = projectionIndexes;
}
public PlanNode getDescriptionProperties() {
@@ -228,4 +222,15 @@
return this.selectSymbols;
}
+ @Override
+ public boolean hasFinalBuffer() {
+ return !needsProject && this.getChildren()[0].hasFinalBuffer();
+ }
+
+ @Override
+ public TupleBuffer getFinalBuffer(int maxRows) throws BlockedException,
+ TeiidComponentException, TeiidProcessingException {
+ return this.getChildren()[0].getFinalBuffer(maxRows);
+ }
+
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -509,13 +509,13 @@
*/
public abstract Object clone();
- protected void copy(RelationalNode source, RelationalNode target){
- target.data = source.data;
+ protected void copyTo(RelationalNode target){
+ target.data = this.data;
- target.children = new RelationalNode[source.children.length];
- for(int i=0; i<source.children.length; i++) {
- if(source.children[i] != null) {
- target.children[i] = (RelationalNode)source.children[i].clone();
+ target.children = new RelationalNode[this.children.length];
+ for(int i=0; i<this.children.length; i++) {
+ if(this.children[i] != null) {
+ target.children[i] = (RelationalNode)this.children[i].clone();
target.children[i].setParent(target);
} else {
break;
@@ -619,7 +619,7 @@
* @throws TeiidComponentException
* @throws BlockedException
*/
- public TupleBuffer getFinalBuffer() throws BlockedException, TeiidComponentException, TeiidProcessingException {
+ public TupleBuffer getFinalBuffer(int maxRows) throws BlockedException, TeiidComponentException, TeiidProcessingException {
return null;
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -266,8 +266,8 @@
}
@Override
- public TupleBuffer getFinalBuffer() throws BlockedException, TeiidComponentException, TeiidProcessingException {
- return root.getFinalBuffer();
+ public TupleBuffer getFinalBuffer(int maxRows) throws BlockedException, TeiidComponentException, TeiidProcessingException {
+ return root.getFinalBuffer(maxRows);
}
@Override
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/SelectNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/SelectNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/SelectNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -130,16 +130,16 @@
public Object clone(){
SelectNode clonedNode = new SelectNode();
- this.copy(this, clonedNode);
+ this.copyTo(clonedNode);
return clonedNode;
}
- protected void copy(SelectNode source, SelectNode target){
- super.copy(source, target);
+ protected void copyTo(SelectNode target){
+ super.copyTo(target);
target.criteria = criteria;
- target.elementMap = source.elementMap;
- target.projectionIndexes = source.projectionIndexes;
- target.projectedExpressions = source.projectedExpressions;
+ target.elementMap = elementMap;
+ target.projectionIndexes = projectionIndexes;
+ target.projectedExpressions = projectedExpressions;
}
public PlanNode getDescriptionProperties() {
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/SortNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/SortNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/SortNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -49,6 +49,8 @@
private TupleBuffer output;
private TupleSource outputTs;
private boolean usingOutput;
+
+ private int rowLimit = -1;
private static final int SORT = 2;
private static final int OUTPUT = 3;
@@ -64,6 +66,7 @@
output = null;
outputTs = null;
usingOutput = false;
+ rowLimit = -1;
}
public void setSortElements(List<OrderByItem> items) {
@@ -100,6 +103,12 @@
if (this.outputTs == null) {
this.outputTs = this.output.createIndexedTupleSource();
}
+ if (rowLimit >= 0) {
+ this.output.truncateTo(rowLimit);
+ if (!this.output.isFinal() && this.output.getRowCount() == rowLimit) {
+ this.output.close();
+ }
+ }
this.phase = OUTPUT;
}
@@ -149,15 +158,15 @@
}
}
- protected void copy(SortNode source, SortNode target){
- super.copy(source, target);
- target.items = source.items;
- target.mode = source.mode;
+ protected void copyTo(SortNode target){
+ super.copyTo(target);
+ target.items = items;
+ target.mode = mode;
}
public Object clone(){
SortNode clonedNode = new SortNode(super.getID());
- this.copy(this, clonedNode);
+ this.copyTo(clonedNode);
return clonedNode;
}
@@ -175,14 +184,16 @@
}
@Override
- public TupleBuffer getFinalBuffer() throws BlockedException, TeiidComponentException, TeiidProcessingException {
+ public TupleBuffer getFinalBuffer(int maxRows) throws BlockedException, TeiidComponentException, TeiidProcessingException {
+ this.rowLimit = maxRows;
+ //TODO: push limiting into the sort logic
if (this.output == null) {
sortPhase();
}
usingOutput = true;
TupleBuffer result = this.output;
if (this.output.isFinal()) {
- this.output = null;
+ this.output = null;
close();
}
return result;
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -162,7 +162,7 @@
@Override
public TextTableNode clone() {
TextTableNode clone = new TextTableNode(getID());
- this.copy(this, clone);
+ this.copyTo(clone);
clone.setTable(table);
return clone;
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/UnionAllNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/UnionAllNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/UnionAllNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -147,7 +147,7 @@
public Object clone(){
UnionAllNode clonedNode = new UnionAllNode(super.getID());
- super.copy(this, clonedNode);
+ super.copyTo(clonedNode);
return clonedNode;
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/WindowFunctionProjectNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/WindowFunctionProjectNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/WindowFunctionProjectNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -145,7 +145,7 @@
public Object clone(){
WindowFunctionProjectNode clonedNode = new WindowFunctionProjectNode();
- this.copy(this, clonedNode);
+ this.copyTo(clonedNode);
clonedNode.windows = windows;
clonedNode.expressionIndexes = expressionIndexes;
clonedNode.passThrough = passThrough;
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -80,7 +80,7 @@
typeMapping.put(DataTypeManager.DefaultDataClasses.DOUBLE, BuiltInAtomicType.DOUBLE);
}
- private static RuntimeException EARLY_TERMINATION = new RuntimeException();
+ private static TeiidRuntimeException EARLY_TERMINATION = new TeiidRuntimeException();
private XMLTable table;
private List<XMLColumn> projectedColumns;
@@ -102,6 +102,8 @@
private int outputRow = 1;
private boolean usingOutput;
+ private int rowLimit = -1;
+
public XMLTableNode(int nodeID) {
super(nodeID);
}
@@ -132,6 +134,7 @@
this.buffer = null;
this.state = State.BUILDING;
this.asynchException = null;
+ this.rowLimit = -1;
}
public void setTable(XMLTable table) {
@@ -145,7 +148,7 @@
@Override
public XMLTableNode clone() {
XMLTableNode clone = new XMLTableNode(getID());
- this.copy(this, clone);
+ this.copyTo(clone);
clone.setTable(table);
clone.setProjectedColumns(projectedColumns);
return clone;
@@ -215,21 +218,23 @@
public void run() {
try {
XQueryEvaluator.evaluateXQuery(table.getXQueryExpression(), contextItem, parameters, XMLTableNode.this, getContext());
- synchronized (XMLTableNode.this) {
- if (buffer != null) {
- buffer.close();
- }
- }
} catch (TeiidException e) {
asynchException = new TeiidRuntimeException(e);
} catch (TeiidRuntimeException e) {
- asynchException = e;
- } catch (RuntimeException e) {
if (e != EARLY_TERMINATION) {
- asynchException = new TeiidRuntimeException(e);
+ asynchException = e;
}
+ } catch (RuntimeException e) {
+ asynchException = new TeiidRuntimeException(e);
} finally {
synchronized (XMLTableNode.this) {
+ if (buffer != null) {
+ try {
+ buffer.close();
+ } catch (TeiidComponentException e) {
+ asynchException = new TeiidRuntimeException(e);
+ }
+ }
state = State.DONE;
XMLTableNode.this.notifyAll();
}
@@ -308,13 +313,14 @@
}
@Override
- public TupleBuffer getFinalBuffer() throws BlockedException,
+ public synchronized TupleBuffer getFinalBuffer(int maxRows) throws BlockedException,
TeiidComponentException, TeiidProcessingException {
+ this.rowLimit = maxRows;
evaluate(true);
usingOutput = true;
TupleBuffer finalBuffer = this.buffer;
if (!this.table.getXQueryExpression().isStreaming()) {
- close();
+ close();
}
return finalBuffer;
}
@@ -329,6 +335,9 @@
rowCount++;
try {
this.buffer.addTuple(processRow());
+ if (this.buffer.getRowCount() == rowLimit) {
+ throw EARLY_TERMINATION;
+ }
if (state == State.BUILDING && hasNextBatch()) {
this.state = State.AVAILABLE;
this.notifyAll();
Modified: trunk/engine/src/main/java/org/teiid/query/processor/xml/RelationalPlanExecutor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/xml/RelationalPlanExecutor.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/xml/RelationalPlanExecutor.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -90,9 +90,7 @@
private boolean executed;
private boolean doneLoading;
- public RelationalPlanExecutor (ResultSetInfo resultInfo, CommandContext context, ProcessorDataManager dataMgr, BufferManager bufferMgr)
- throws TeiidComponentException{
-
+ public RelationalPlanExecutor (ResultSetInfo resultInfo, CommandContext context, ProcessorDataManager dataMgr, BufferManager bufferMgr) {
this.resultInfo = resultInfo;
this.bufferMgr = bufferMgr;
this.dataManager = dataMgr;
Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -1161,9 +1161,13 @@
constantParts = new String[] {"X'", obj.getValue().toString(), "'"}; //$NON-NLS-1$ //$NON-NLS-2$
}
if (constantParts == null) {
- String strValue = obj.getValue().toString();
- strValue = escapeStringValue(strValue, "'"); //$NON-NLS-1$
- constantParts = new String[] {"'", strValue, "'"}; //$NON-NLS-1$ //$NON-NLS-2$
+ if (DataTypeManager.isLOB(type)) {
+ constantParts = new String[] {"?"}; //$NON-NLS-1$
+ } else {
+ String strValue = obj.getValue().toString();
+ strValue = escapeStringValue(strValue, "'"); //$NON-NLS-1$
+ constantParts = new String[] {"'", strValue, "'"}; //$NON-NLS-1$ //$NON-NLS-2$
+ }
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -49,6 +49,7 @@
import org.teiid.dqp.internal.process.CachedResults;
import org.teiid.dqp.internal.process.DQPWorkContext;
import org.teiid.dqp.internal.process.SessionAwareCache;
+import org.teiid.dqp.internal.process.TupleSourceCache;
import org.teiid.dqp.internal.process.SessionAwareCache.CacheID;
import org.teiid.events.EventDistributor;
import org.teiid.language.SQLConstants;
@@ -124,6 +125,13 @@
RegisterRequestParameter parameterObject)
throws TeiidComponentException, TeiidProcessingException {
+ if (parameterObject.info != null) {
+ TupleSourceCache tsc = context.getTupleSourceCache();
+ if (tsc != null) {
+ return tsc.getSharedTupleSource(context, command, modelName, parameterObject, bufferManager, this);
+ }
+ }
+
TempTableStore tempTableStore = context.getTempTableStore();
if(tempTableStore != null) {
TupleSource result = registerRequest(context, modelName, command);
Modified: trunk/engine/src/main/java/org/teiid/query/util/CommandContext.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/util/CommandContext.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/util/CommandContext.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -45,6 +45,7 @@
import org.teiid.dqp.internal.process.DQPWorkContext;
import org.teiid.dqp.internal.process.PreparedPlan;
import org.teiid.dqp.internal.process.SessionAwareCache;
+import org.teiid.dqp.internal.process.TupleSourceCache;
import org.teiid.dqp.internal.process.SessionAwareCache.CacheID;
import org.teiid.dqp.message.RequestID;
import org.teiid.dqp.service.TransactionContext;
@@ -141,7 +142,7 @@
Set<CommandListener> commandListeners = null;
private LRUCache<String, DecimalFormat> decimalFormatCache;
private LRUCache<String, SimpleDateFormat> dateFormatCache;
- private AtomicLong reuseCount = new AtomicLong();
+ private AtomicLong reuseCount = null;
private ClassLoader classLoader;
private List<Exception> warnings = null;
@@ -155,6 +156,7 @@
private boolean nonBlocking;
private HashSet<Object> planningObjects;
private HashSet<Object> dataObjects = this.globalState.dataObjects;
+ private TupleSourceCache tupleSourceCache;
/**
* Construct a new context.
@@ -228,6 +230,7 @@
clone.recursionStack = new LinkedList<String>(this.recursionStack);
}
clone.setNonBlocking(this.nonBlocking);
+ clone.tupleSourceCache = this.tupleSourceCache;
return clone;
}
@@ -749,8 +752,20 @@
@Override
public long getReuseCount() {
+ if (globalState.reuseCount == null) {
+ return 0;
+ }
return globalState.reuseCount.get();
}
+
+ @Override
+ public boolean isContinuous() {
+ return globalState.reuseCount == null;
+ }
+
+ public void setContinuous() {
+ this.globalState.reuseCount = new AtomicLong();
+ }
@Override
public ClassLoader getVDBClassLoader() {
@@ -791,5 +806,13 @@
}
LogManager.logInfo(LogConstants.CTX_DQP, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31105, warning.getMessage()));
}
+
+ public TupleSourceCache getTupleSourceCache() {
+ return tupleSourceCache;
+ }
+
+ public void setTupleSourceCache(TupleSourceCache tupleSourceCache) {
+ this.tupleSourceCache = tupleSourceCache;
+ }
}
Modified: trunk/engine/src/test/java/org/teiid/common/buffer/TestTupleBuffer.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/common/buffer/TestTupleBuffer.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/test/java/org/teiid/common/buffer/TestTupleBuffer.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -60,6 +60,32 @@
assertEquals(2, batch.getBeginRow());
}
+ @Test public void testTruncate() throws Exception {
+ ElementSymbol x = new ElementSymbol("x"); //$NON-NLS-1$
+ x.setType(DataTypeManager.DefaultDataClasses.INTEGER);
+ List<ElementSymbol> schema = Arrays.asList(x);
+ TupleBuffer tb = BufferManagerFactory.getStandaloneBufferManager().createTupleBuffer(schema, "x", TupleSourceType.PROCESSOR); //$NON-NLS-1$
+ tb.setBatchSize(2);
+ for (int i = 0; i < 5; i++) {
+ tb.addTuple(Arrays.asList(1));
+ }
+ TupleBatch batch = tb.getBatch(1);
+ assertTrue(!batch.getTerminationFlag());
+ assertEquals(2, batch.getEndRow());
+ tb.close();
+ assertEquals(5, tb.getManagedRowCount());
+ tb.truncateTo(3);
+ assertEquals(3, tb.getManagedRowCount());
+ assertEquals(3, tb.getRowCount());
+ batch = tb.getBatch(3);
+ assertTrue(batch.getTerminationFlag());
+ tb.truncateTo(2);
+ assertEquals(2, tb.getManagedRowCount());
+ assertEquals(2, tb.getRowCount());
+ batch = tb.getBatch(2);
+ assertTrue(batch.getTerminationFlag());
+ }
+
@Test public void testLobHandling() throws Exception {
ElementSymbol x = new ElementSymbol("x"); //$NON-NLS-1$
x.setType(DataTypeManager.DefaultDataClasses.CLOB);
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 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCore.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -374,6 +374,7 @@
agds.sleep = 500;
agds.setUseIntCounter(true);
RequestMessage reqMsg = exampleRequestMessage(sql);
+ reqMsg.setRowLimit(11);
reqMsg.setCursorType(ResultSet.TYPE_FORWARD_ONLY);
DQPWorkContext.getWorkContext().getSession().setSessionId(sessionid);
DQPWorkContext.getWorkContext().getSession().setUserName(userName);
@@ -393,6 +394,8 @@
rm = message.get(500000, TimeUnit.MILLISECONDS);
assertNull(rm.getException());
assertEquals(5, rm.getResultsList().size());
+ assertEquals(7, rm.getFirstRow());
+ assertEquals(11, rm.getFinalRow());
}
@Test public void testSourceConcurrency() throws Exception {
@@ -603,6 +606,14 @@
}
}
+ @Test public void testXmlTableStreamingWithLimit() throws Exception {
+ String sql = "select * from xmltable('/a/b' passing xmlparse(document '<a x=''1''><b>foo</b><b>bar</b><b>zed</b></a>') columns y string path '.') as x limit 2"; //$NON-NLS-1$
+
+ ResultsMessage rm = execute("A", 1, exampleRequestMessage(sql));
+ assertNull(rm.getException());
+ assertEquals(2, rm.getResultsList().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/dqp/internal/process/TestPreparedStatement.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -345,10 +345,7 @@
helpGetProcessorPlan(preparedSql, values, new SessionAwareCache<PreparedPlan>());
}
- /**
- * TODO: there may be other ways of handling this situation in the future
- */
- @Test public void testLimitNoCache() throws Exception {
+ @Test public void testLimit() throws Exception {
// Create query
String preparedSql = "SELECT pm1.g1.e1, e2, pm1.g1.e3 as a, e4 as b FROM pm1.g1 WHERE pm1.g1.e2=?"; //$NON-NLS-1$
@@ -360,7 +357,7 @@
helpGetProcessorPlan(preparedSql, values, new DefaultCapabilitiesFinder(), RealMetadataFactory.example1Cached(), planCache, SESSION_ID, false, true, RealMetadataFactory.example1VDB());
//make sure the plan wasn't reused
- assertEquals(0, planCache.getCacheHitCount());
+ assertEquals(1, planCache.getCacheHitCount());
}
@Test public void testUpdateProcedureCriteria() throws Exception {
Modified: trunk/engine/src/test/java/org/teiid/dqp/service/AutoGenDataService.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/service/AutoGenDataService.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/test/java/org/teiid/dqp/service/AutoGenDataService.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -49,6 +49,7 @@
import org.teiid.query.optimizer.capabilities.SourceCapabilities;
import org.teiid.query.processor.relational.RelationalNodeUtil;
import org.teiid.query.sql.symbol.Expression;
+import org.teiid.translator.CacheDirective;
import org.teiid.translator.DataNotAvailableException;
import org.teiid.translator.TranslatorException;
@@ -179,6 +180,11 @@
public boolean copyLobs() {
return copyLobs;
}
+
+ @Override
+ public CacheDirective getCacheDirective() {
+ return null;
+ }
};
}
13 years, 9 months
teiid SVN: r4232 - trunk/admin/src/main/java/org/teiid/adminapi.
by teiid-commits@lists.jboss.org
Author: rareddy
Date: 2012-07-12 10:02:50 -0400 (Thu, 12 Jul 2012)
New Revision: 4232
Modified:
trunk/admin/src/main/java/org/teiid/adminapi/AdminFactory.java
Log:
TEIID-2062
Modified: trunk/admin/src/main/java/org/teiid/adminapi/AdminFactory.java
===================================================================
--- trunk/admin/src/main/java/org/teiid/adminapi/AdminFactory.java 2012-07-12 00:48:08 UTC (rev 4231)
+++ trunk/admin/src/main/java/org/teiid/adminapi/AdminFactory.java 2012-07-12 14:02:50 UTC (rev 4232)
@@ -60,7 +60,7 @@
@SuppressWarnings("nls")
public class AdminFactory {
private static final Logger LOGGER = Logger.getLogger(AdminFactory.class.getName());
- private static Set<String> optionalProps = new HashSet<String>(Arrays.asList("password", "check-valid-connection-sql", "pool-prefill", "max-pool-size", "min-pool-size"));
+ private static Set<String> optionalProps = new HashSet<String>(Arrays.asList("user-name", "password", "check-valid-connection-sql", "pool-prefill", "max-pool-size", "min-pool-size"));
private static AdminFactory INSTANCE = new AdminFactory();
public static AdminFactory getInstance() {
13 years, 9 months
teiid SVN: r4231 - in trunk: test-integration/common/src/test/java/org/teiid/dqp/internal/process and 1 other directory.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2012-07-11 20:48:08 -0400 (Wed, 11 Jul 2012)
New Revision: 4231
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java
trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestExecutionReuse.java
Log:
TEIID-2097 fixing the QueryProcessor hasFinalBuffer method
Modified: trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java 2012-07-11 17:26:02 UTC (rev 4230)
+++ trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java 2012-07-12 00:48:08 UTC (rev 4231)
@@ -336,7 +336,7 @@
@Override
public boolean hasFinalBuffer() {
- return this.processPlan.hasFinalBuffer();
+ return !continuous && this.processPlan.hasFinalBuffer();
}
public BufferManager getBufferManager() {
Modified: trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestExecutionReuse.java
===================================================================
--- trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestExecutionReuse.java 2012-07-11 17:26:02 UTC (rev 4230)
+++ trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestExecutionReuse.java 2012-07-12 00:48:08 UTC (rev 4231)
@@ -161,7 +161,7 @@
Statement s = c.createStatement();
TeiidStatement ts = s.unwrap(TeiidStatement.class);
final ResultsFuture<Integer> result = new ResultsFuture<Integer>();
- ts.submitExecute("select part_id from parts", new StatementCallback() {
+ ts.submitExecute("select part_id from parts order by part_id", new StatementCallback() {
int rowCount;
@Override
public void onRow(Statement stmt, ResultSet rs) throws SQLException {
13 years, 9 months
teiid SVN: r4230 - in trunk: runtime/src/main/java/org/teiid/deployers and 2 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2012-07-11 13:26:02 -0400 (Wed, 11 Jul 2012)
New Revision: 4230
Added:
trunk/test-integration/common/src/test/resources/chained-vdb.xml
trunk/test-integration/common/src/test/resources/fake.jar
Modified:
trunk/jboss-integration/src/main/java/org/teiid/jboss/TranslatorDeployer.java
trunk/jboss-integration/src/main/java/org/teiid/jboss/VDBDeployer.java
trunk/runtime/src/main/java/org/teiid/deployers/TranslatorUtil.java
trunk/test-integration/common/src/test/java/org/teiid/arquillian/IntegrationTestDeployment.java
Log:
adding a test of chained delegates and translator jar deployment
Modified: trunk/jboss-integration/src/main/java/org/teiid/jboss/TranslatorDeployer.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/jboss/TranslatorDeployer.java 2012-07-09 20:48:44 UTC (rev 4229)
+++ trunk/jboss-integration/src/main/java/org/teiid/jboss/TranslatorDeployer.java 2012-07-11 17:26:02 UTC (rev 4230)
@@ -46,8 +46,6 @@
*/
public final class TranslatorDeployer implements DeploymentUnitProcessor {
- private static final String DEPLOYMENT_NAME = "deployment-name"; //$NON-NLS-1$
-
@Override
public void deploy(final DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException {
final DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();
@@ -68,7 +66,7 @@
if (metadata == null) {
throw new DeploymentUnitProcessingException(IntegrationPlugin.Util.gs(IntegrationPlugin.Event.TEIID50070, moduleName));
}
- metadata.addProperty(DEPLOYMENT_NAME, deploymentUnit.getName());
+ metadata.addProperty(TranslatorUtil.DEPLOYMENT_NAME, deploymentUnit.getName());
metadata.addAttchment(ClassLoader.class, translatorLoader);
LogManager.logInfo(LogConstants.CTX_RUNTIME, IntegrationPlugin.Util.gs(IntegrationPlugin.Event.TEIID50006, metadata.getName()));
Modified: trunk/jboss-integration/src/main/java/org/teiid/jboss/VDBDeployer.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/jboss/VDBDeployer.java 2012-07-09 20:48:44 UTC (rev 4229)
+++ trunk/jboss-integration/src/main/java/org/teiid/jboss/VDBDeployer.java 2012-07-11 17:26:02 UTC (rev 4230)
@@ -28,9 +28,21 @@
import java.util.concurrent.TimeUnit;
import org.jboss.as.naming.deployment.ContextNames;
-import org.jboss.as.server.deployment.*;
+import org.jboss.as.server.deployment.Attachments;
+import org.jboss.as.server.deployment.DeploymentPhaseContext;
+import org.jboss.as.server.deployment.DeploymentUnit;
+import org.jboss.as.server.deployment.DeploymentUnitProcessingException;
+import org.jboss.as.server.deployment.DeploymentUnitProcessor;
import org.jboss.modules.Module;
-import org.jboss.msc.service.*;
+import org.jboss.msc.service.AbstractServiceListener;
+import org.jboss.msc.service.Service;
+import org.jboss.msc.service.ServiceBuilder;
+import org.jboss.msc.service.ServiceController;
+import org.jboss.msc.service.ServiceName;
+import org.jboss.msc.service.ServiceTarget;
+import org.jboss.msc.service.StartContext;
+import org.jboss.msc.service.StartException;
+import org.jboss.msc.service.StopContext;
import org.jboss.msc.service.ServiceBuilder.DependencyType;
import org.jboss.msc.service.ServiceController.Mode;
import org.jboss.msc.service.ServiceController.State;
@@ -43,6 +55,7 @@
import org.teiid.adminapi.impl.VDBTranslatorMetaData;
import org.teiid.common.buffer.BufferManager;
import org.teiid.deployers.RuntimeVDB;
+import org.teiid.deployers.TranslatorUtil;
import org.teiid.deployers.UDFMetaData;
import org.teiid.deployers.VDBRepository;
import org.teiid.deployers.VDBStatusChecker;
@@ -56,7 +69,6 @@
class VDBDeployer implements DeploymentUnitProcessor {
- private static final String DEPLOYMENT_NAME = "deployment-name"; //$NON-NLS-1$
private static final String JAVA_CONTEXT = "java:/"; //$NON-NLS-1$
private TranslatorRepository translatorRepository;
private String asyncThreadPoolName;
@@ -76,7 +88,7 @@
return;
}
final VDBMetaData deployment = deploymentUnit.getAttachment(TeiidAttachments.VDB_METADATA);
- deployment.addProperty(DEPLOYMENT_NAME, deploymentUnit.getName());
+ deployment.addProperty(TranslatorUtil.DEPLOYMENT_NAME, deploymentUnit.getName());
// check to see if there is old vdb already deployed.
final ServiceController<?> controller = context.getServiceRegistry().getService(TeiidServiceNames.vdbServiceName(deployment.getName(), deployment.getVersion()));
if (controller != null) {
Modified: trunk/runtime/src/main/java/org/teiid/deployers/TranslatorUtil.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/deployers/TranslatorUtil.java 2012-07-09 20:48:44 UTC (rev 4229)
+++ trunk/runtime/src/main/java/org/teiid/deployers/TranslatorUtil.java 2012-07-11 17:26:02 UTC (rev 4230)
@@ -43,6 +43,8 @@
public class TranslatorUtil {
+ public static final String DEPLOYMENT_NAME = "deployment-name"; //$NON-NLS-1$
+
public static Map<Method, TranslatorProperty> getTranslatorProperties(Class<?> attachmentClass) {
Map<Method, TranslatorProperty> props = new HashMap<Method, TranslatorProperty>();
buildTranslatorProperties(attachmentClass, props);
@@ -109,12 +111,13 @@
private static void injectProperties(ExecutionFactory ef, final Translator data) throws InvocationTargetException, IllegalAccessException, TeiidException{
Map<Method, TranslatorProperty> props = TranslatorUtil.getTranslatorProperties(ef.getClass());
Map p = data.getProperties();
- TreeMap<String, String> caseInsensitivProps = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
- caseInsensitivProps.putAll(p);
+ TreeMap<String, String> caseInsensitiveProps = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
+ caseInsensitiveProps.putAll(p);
+ caseInsensitiveProps.remove(DEPLOYMENT_NAME);
for (Method method:props.keySet()) {
TranslatorProperty tp = props.get(method);
String propertyName = getPropertyName(method);
- String value = caseInsensitivProps.remove(propertyName);
+ String value = caseInsensitiveProps.remove(propertyName);
if (value != null) {
Method setterMethod = getSetter(ef.getClass(), method);
@@ -123,9 +126,9 @@
throw new TeiidException(RuntimePlugin.Event.TEIID40027, RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40027, tp.display()));
}
}
- caseInsensitivProps.remove(Translator.EXECUTION_FACTORY_CLASS);
- if (!caseInsensitivProps.isEmpty()) {
- LogManager.logWarning(LogConstants.CTX_RUNTIME, RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40001, caseInsensitivProps.keySet(), data.getName()));
+ caseInsensitiveProps.remove(Translator.EXECUTION_FACTORY_CLASS);
+ if (!caseInsensitiveProps.isEmpty()) {
+ LogManager.logWarning(LogConstants.CTX_RUNTIME, RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40001, caseInsensitiveProps.keySet(), data.getName()));
}
}
Modified: trunk/test-integration/common/src/test/java/org/teiid/arquillian/IntegrationTestDeployment.java
===================================================================
--- trunk/test-integration/common/src/test/java/org/teiid/arquillian/IntegrationTestDeployment.java 2012-07-09 20:48:44 UTC (rev 4229)
+++ trunk/test-integration/common/src/test/java/org/teiid/arquillian/IntegrationTestDeployment.java 2012-07-11 17:26:02 UTC (rev 4230)
@@ -31,7 +31,11 @@
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
-import java.util.*;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ArchivePaths;
@@ -67,6 +71,17 @@
admin.close();
}
+ @Test public void testChainedDelegates() throws Exception {
+ Properties props = new Properties();
+ props.setProperty("connection-url","jdbc:h2:mem:test;DB_CLOSE_DELAY=-1");
+ props.setProperty("user-name", "sa");
+ props.setProperty("password", "sa");
+
+ AdminUtil.createDataSource(admin, "Oracle11_PushDS", "h2", props);
+ admin.deploy("fake.jar",new FileInputStream(UnitTestUtil.getTestDataFile("fake.jar")));
+ admin.deploy("chained-vdb.xml",new FileInputStream(UnitTestUtil.getTestDataFile("chained-vdb.xml")));
+ }
+
@Test
public void testVDBDeployment() throws Exception {
Collection<?> vdbs = admin.getVDBs();
Added: trunk/test-integration/common/src/test/resources/chained-vdb.xml
===================================================================
--- trunk/test-integration/common/src/test/resources/chained-vdb.xml (rev 0)
+++ trunk/test-integration/common/src/test/resources/chained-vdb.xml 2012-07-11 17:26:02 UTC (rev 4230)
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<vdb version="1" name="Chorus">
+ <property name="UseConnectorMetadata" value="true"/>
+
+ <model type="PHYSICAL" visible="true" name="timeseries">
+ <property name="importer.useFullSchemaName" value="false"/>
+ <source name="timeseries" connection-jndi-name="java:Oracle11_PushDS" translator-name="timeseries.delegated-translator"/>
+ </model>
+
+ <translator name="timeseries.delegating-delegated-translator" type="fake">
+ <property name="DelegateName" value="timeseries.delegating-translator"/>
+ </translator>
+ <translator name="timeseries.delegating-translator" type="h2"/>
+ <translator name="timeseries.delegated-translator" type="fake">
+ <property name="DelegateName" value="timeseries.delegating-delegated-translator"/>
+ </translator>
+
+</vdb>
\ No newline at end of file
Property changes on: trunk/test-integration/common/src/test/resources/chained-vdb.xml
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: trunk/test-integration/common/src/test/resources/fake.jar
===================================================================
(Binary files differ)
Property changes on: trunk/test-integration/common/src/test/resources/fake.jar
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
13 years, 9 months
teiid SVN: r4229 - in branches/7.4.x: engine/src/main/java/org/teiid/query/processor/relational and 1 other directories.
by teiid-commits@lists.jboss.org
Author: jolee
Date: 2012-07-09 16:48:44 -0400 (Mon, 09 Jul 2012)
New Revision: 4229
Modified:
branches/7.4.x/client/src/main/java/org/teiid/net/socket/Message.java
branches/7.4.x/client/src/main/java/org/teiid/net/socket/ServiceInvocationStruct.java
branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/SortUtility.java
branches/7.4.x/runtime/src/main/java/org/teiid/transport/SocketClientInstance.java
Log:
TEIID-2089 Issue with enhanced merge join and additional logging enhancements (slimmed for backport)
Modified: branches/7.4.x/client/src/main/java/org/teiid/net/socket/Message.java
===================================================================
--- branches/7.4.x/client/src/main/java/org/teiid/net/socket/Message.java 2012-07-09 19:19:58 UTC (rev 4228)
+++ branches/7.4.x/client/src/main/java/org/teiid/net/socket/Message.java 2012-07-09 20:48:44 UTC (rev 4229)
@@ -35,7 +35,7 @@
private Serializable messageKey;
public String toString() {
- return "MessageHolder: contents=" + contents; //$NON-NLS-1$
+ return "MessageHolder: key=" + messageKey + " contents=" + contents; //$NON-NLS-1$ //$NON-NLS-2$
}
public void setContents(Object contents) {
Modified: branches/7.4.x/client/src/main/java/org/teiid/net/socket/ServiceInvocationStruct.java
===================================================================
--- branches/7.4.x/client/src/main/java/org/teiid/net/socket/ServiceInvocationStruct.java 2012-07-09 19:19:58 UTC (rev 4228)
+++ branches/7.4.x/client/src/main/java/org/teiid/net/socket/ServiceInvocationStruct.java 2012-07-09 20:48:44 UTC (rev 4229)
@@ -65,4 +65,9 @@
out.writeObject(methodName);
ExternalizeUtil.writeArray(out, args);
}
+
+ @Override
+ public String toString() {
+ return "Invoke " + targetClass + "." + methodName; //$NON-NLS-1$ //$NON-NLS-2$
+ }
}
\ No newline at end of file
Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/SortUtility.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/SortUtility.java 2012-07-09 19:19:58 UTC (rev 4228)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/SortUtility.java 2012-07-09 20:48:44 UTC (rev 4229)
@@ -40,6 +40,7 @@
import org.teiid.core.TeiidProcessingException;
import org.teiid.core.util.Assertion;
import org.teiid.language.SortSpecification.NullOrdering;
+import org.teiid.logging.LogConstants;
import org.teiid.logging.LogManager;
import org.teiid.logging.MessageLevel;
import org.teiid.query.sql.lang.OrderBy;
@@ -173,10 +174,6 @@
this(ts, new OrderBy(expressions, types).getOrderByItems(), mode, bufferManager, connectionID, schema);
}
- public boolean isDone() {
- return this.doneReading && this.phase == DONE;
- }
-
public TupleBuffer sort()
throws TeiidComponentException, TeiidProcessingException {
@@ -200,11 +197,18 @@
initialSort();
}
+ for (TupleBuffer tb : activeTupleBuffers) {
+ tb.close();
+ }
+
return activeTupleBuffers;
}
private TupleBuffer createTupleBuffer() throws TeiidComponentException {
TupleBuffer tb = bufferManager.createTupleBuffer(this.schema, this.groupName, TupleSourceType.PROCESSOR);
+ if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
+ LogManager.logDetail(LogConstants.CTX_DQP, "Created intermediate sort buffer ", tb.getId()); //$NON-NLS-1$
+ }
tb.setForwardOnly(true);
return tb;
}
Modified: branches/7.4.x/runtime/src/main/java/org/teiid/transport/SocketClientInstance.java
===================================================================
--- branches/7.4.x/runtime/src/main/java/org/teiid/transport/SocketClientInstance.java 2012-07-09 19:19:58 UTC (rev 4228)
+++ branches/7.4.x/runtime/src/main/java/org/teiid/transport/SocketClientInstance.java 2012-07-09 20:48:44 UTC (rev 4229)
@@ -75,10 +75,10 @@
}
public void send(Message message, Serializable messageKey) {
+ message.setMessageKey(messageKey);
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_TRANSPORT, MessageLevel.DETAIL)) {
- LogManager.logDetail(LogConstants.CTX_TRANSPORT, " message: " + message + " for message:" + messageKey); //$NON-NLS-1$ //$NON-NLS-2$
+ LogManager.logDetail(LogConstants.CTX_TRANSPORT, "send message: " + message); //$NON-NLS-1$
}
- message.setMessageKey(messageKey);
objectSocket.write(message);
}
13 years, 9 months
teiid SVN: r4227 - in trunk: build/kits/jboss-as7/docs/teiid and 19 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2012-07-09 14:59:20 -0400 (Mon, 09 Jul 2012)
New Revision: 4227
Added:
trunk/api/src/main/java/org/teiid/translator/CacheDirective.java
Modified:
trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html
trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java
trunk/engine/src/main/java/org/teiid/query/function/source/XMLSystemFunctions.java
trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/AliasGenerator.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
trunk/engine/src/main/java/org/teiid/query/optimizer/xml/XMLPlannerEnvironment.java
trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java
trunk/engine/src/main/java/org/teiid/query/sql/lang/CacheHint.java
trunk/engine/src/main/java/org/teiid/query/sql/lang/Query.java
trunk/engine/src/main/java/org/teiid/query/sql/lang/StoredProcedure.java
trunk/engine/src/main/java/org/teiid/query/sql/lang/UnaryFromClause.java
trunk/engine/src/main/java/org/teiid/query/sql/proc/CreateProcedureCommand.java
trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
trunk/engine/src/main/java/org/teiid/query/tempdata/GlobalTableStoreImpl.java
trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java
trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableStore.java
trunk/engine/src/test/java/org/teiid/cdk/CommandBuilder.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestAggregatePushdown.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestDependentJoins.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestInlineView.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestLimit.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleMergeVirtual.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleRaiseNull.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestUnionPlanning.java
trunk/engine/src/test/java/org/teiid/query/optimizer/relational/TestAliasGenerator.java
trunk/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java
trunk/engine/src/test/java/org/teiid/query/processor/TestArrayTable.java
trunk/engine/src/test/java/org/teiid/query/processor/TestCommonTableOptimizations.java
trunk/engine/src/test/java/org/teiid/query/processor/TestDependentJoins.java
trunk/engine/src/test/java/org/teiid/query/processor/TestMaterialization.java
trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
trunk/engine/src/test/java/org/teiid/query/unittest/RealMetadataFactory.java
trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestTPCR.java
trunk/test-integration/common/src/test/java/org/teiid/jdbc/TestLocalConnections.java
Log:
TEIID-2077 refining the shared state logic and pushing the common table creation into the temptable and allowing updatable to apply to resultset caching
Added: trunk/api/src/main/java/org/teiid/translator/CacheDirective.java
===================================================================
--- trunk/api/src/main/java/org/teiid/translator/CacheDirective.java (rev 0)
+++ trunk/api/src/main/java/org/teiid/translator/CacheDirective.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -0,0 +1,105 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.translator;
+
+import java.io.Serializable;
+
+import org.teiid.core.util.EquivalenceUtil;
+import org.teiid.core.util.HashCodeUtil;
+
+public class CacheDirective implements Serializable {
+
+ public enum Scope {
+ USER,
+ SESSION,
+ VDB
+ }
+
+ private static final long serialVersionUID = -4119606289701982511L;
+
+ private Boolean prefersMemory;
+ private Boolean updatable;
+ private Long ttl;
+ private Scope scope;
+
+ public CacheDirective() {
+ }
+
+ public CacheDirective(Boolean prefersMemory, Long ttl) {
+ this.prefersMemory = prefersMemory;
+ this.ttl = ttl;
+ }
+
+ public Boolean getPrefersMemory() {
+ return prefersMemory;
+ }
+
+ public void setPrefersMemory(Boolean prefersMemory) {
+ this.prefersMemory = prefersMemory;
+ }
+
+ public Long getTtl() {
+ return ttl;
+ }
+
+ public void setTtl(Long ttl) {
+ this.ttl = ttl;
+ }
+
+ public Boolean getUpdatable() {
+ return updatable;
+ }
+
+ public void setUpdatable(Boolean updatable) {
+ this.updatable = updatable;
+ }
+
+ public Scope getScope() {
+ return this.scope;
+ }
+
+ public void setScope(Scope scope) {
+ this.scope = scope;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof CacheDirective)) {
+ return false;
+ }
+ CacheDirective other = (CacheDirective)obj;
+ return EquivalenceUtil.areEqual(this.prefersMemory, other.prefersMemory)
+ && EquivalenceUtil.areEqual(this.ttl, other.ttl)
+ && EquivalenceUtil.areEqual(this.updatable, other.updatable)
+ && EquivalenceUtil.areEqual(this.scope, other.scope);
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeUtil.hashCode(1, scope, ttl, updatable);
+ }
+
+}
Property changes on: trunk/api/src/main/java/org/teiid/translator/CacheDirective.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html
===================================================================
--- trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html 2012-07-09 18:59:20 UTC (rev 4227)
@@ -50,6 +50,7 @@
<li>The standalone and cli configuration files specify a setting for the teiid subsystem policy-decider-module. If a module is not specified, then data roles will not be checked.
<li>local connections specifying a VDB version will wait for their VDB to finish loading before allowing a connection.
<li>jsonToXml document elements will contain xsi:type attribute values of decimal and boolean respectively for number and boolean json values to allow for differentiation from string values.
+ <li>Result set cache entries can now have updatable set to false to indicate that updates should not purge the entry.
<ul>
<h4>from 7.x</h4>
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -615,11 +615,16 @@
cr.setResults(resultsBuffer, processor.getProcessorPlan());
if (originalCommand.getCacheHint() != null) {
LogManager.logDetail(LogConstants.CTX_DQP, requestID, "Using cache hint", originalCommand.getCacheHint()); //$NON-NLS-1$
- resultsBuffer.setPrefersMemory(originalCommand.getCacheHint().getPrefersMemory());
+ resultsBuffer.setPrefersMemory(originalCommand.getCacheHint().isPrefersMemory());
if (originalCommand.getCacheHint().getDeterminism() != null) {
determinismLevel = originalCommand.getCacheHint().getDeterminism();
LogManager.logTrace(LogConstants.CTX_DQP, new Object[] { "Cache hint modified the query determinism from ",processor.getContext().getDeterminismLevel(), " to ", determinismLevel }); //$NON-NLS-1$ //$NON-NLS-2$
- }
+ }
+ //if not updatable, then remove the access info
+ if (!originalCommand.getCacheHint().isUpdatable(true)) {
+ cr.getAccessInfo().setSensitiveToMetadataChanges(false);
+ cr.getAccessInfo().getObjectsAccessed().clear();
+ }
}
if (determinismLevel.compareTo(Determinism.SESSION_DETERMINISTIC) <= 0) {
Modified: trunk/engine/src/main/java/org/teiid/query/function/source/XMLSystemFunctions.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/function/source/XMLSystemFunctions.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/main/java/org/teiid/query/function/source/XMLSystemFunctions.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -113,6 +113,33 @@
private static final Charset UTF_16LE = Charset.forName("UTF-16LE"); //$NON-NLS-1$
private static final Charset UTF_8 = Charset.forName("UTF-8"); //$NON-NLS-1$
+ private static final Location dummyLocation = new Location() {
+ @Override
+ public String getSystemId() {
+ return null;
+ }
+
+ @Override
+ public String getPublicId() {
+ return null;
+ }
+
+ @Override
+ public int getLineNumber() {
+ return -1;
+ }
+
+ @Override
+ public int getColumnNumber() {
+ return -1;
+ }
+
+ @Override
+ public int getCharacterOffset() {
+ return -1;
+ }
+ };
+
private static final class JsonToXmlContentHandler implements
ContentHandler, XMLEventReader {
private Reader reader;
@@ -834,33 +861,7 @@
if (stream) {
//jre 1.7 event logic does not set a dummy location and throws an NPE in StAXSource, so we explicitly set a location
- reader.eventFactory.setLocation(new Location() {
-
- @Override
- public String getSystemId() {
- return null;
- }
-
- @Override
- public String getPublicId() {
- return null;
- }
-
- @Override
- public int getLineNumber() {
- return -1;
- }
-
- @Override
- public int getColumnNumber() {
- return -1;
- }
-
- @Override
- public int getCharacterOffset() {
- return -1;
- }
- });
+ reader.eventFactory.setLocation(dummyLocation);
return new SQLXMLImpl() {
@SuppressWarnings("unchecked")
public <T extends Source> T getSource(Class<T> sourceClass) throws SQLException {
Modified: trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -58,8 +58,8 @@
public static final TempMetadataID TEMP_MODEL = new TempMetadataID("__TEMP__", Collections.EMPTY_LIST); //$NON-NLS-1$
private TempMetadataStore tempStore;
- private Map materializationTables;
- private Map queryNodes;
+ private Map<Object, Object> materializationTables;
+ private Map<Object, QueryNode> queryNodes;
private boolean session;
public TempMetadataAdapter(QueryMetadataInterface metadata, TempMetadataStore tempStore) {
@@ -67,7 +67,7 @@
this.tempStore = tempStore;
}
- public TempMetadataAdapter(QueryMetadataInterface metadata, TempMetadataStore tempStore, Map materializationTables, Map queryNodes) {
+ public TempMetadataAdapter(QueryMetadataInterface metadata, TempMetadataStore tempStore, Map<Object, Object> materializationTables, Map<Object, QueryNode> queryNodes) {
super(metadata);
this.tempStore = tempStore;
this.materializationTables = materializationTables;
@@ -290,7 +290,7 @@
throws TeiidComponentException, QueryMetadataException {
if (this.queryNodes != null && this.queryNodes.containsKey(groupID)) {
- return (QueryNode)this.queryNodes.get(groupID);
+ return this.queryNodes.get(groupID);
}
if(groupID instanceof TempMetadataID && !(actualMetadata instanceof TempMetadataAdapter)) {
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/AliasGenerator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/AliasGenerator.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/AliasGenerator.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -38,6 +38,7 @@
import org.teiid.query.sql.symbol.Reference;
import org.teiid.query.sql.symbol.ScalarSubquery;
import org.teiid.query.sql.symbol.Symbol;
+import org.teiid.query.sql.symbol.ElementSymbol.DisplayMode;
import org.teiid.query.sql.util.SymbolMap;
@@ -66,55 +67,51 @@
this.parent = parent;
}
- public String getElementName(Expression symbol, boolean renameGroup) {
- String name = null;
- if (currentSymbols != null) {
- name = currentSymbols.get(symbol);
- if (name != null) {
- if (renameGroup && symbol instanceof ElementSymbol) {
- renameGroup(((ElementSymbol)symbol).getGroupSymbol());
- }
- return name;
- }
- }
+ public String getElementName(Expression symbol) {
if (!(symbol instanceof ElementSymbol)) {
return null;
}
ElementSymbol element = (ElementSymbol)symbol;
+ String newGroupName = this.groupNames.get(element.getGroupSymbol().getName());
+ if (newGroupName == null) {
+ if (parent == null) {
+ return null;
+ }
+ return parent.getElementName(symbol);
+ }
+ //check for inline view
Map<String, String> elements = this.elementMap.get(element.getGroupSymbol().getName());
if (elements != null) {
- name = elements.get(element.getShortName());
+ String name = elements.get(element.getShortName());
if (name != null) {
- if (renameGroup) {
- renameGroup(element.getGroupSymbol());
- }
+ renameGroup(element.getGroupSymbol(), newGroupName);
return name;
}
}
- if (parent != null) {
- name = parent.getElementName(symbol, renameGroup);
- if (name != null) {
- return name;
- }
- }
- if (renameGroup) {
- renameGroup(element.getGroupSymbol());
- }
+ if (parent != null) {
+ String name = parent.getElementName(symbol);
+ if (name != null) {
+ return name;
+ }
+ }
+ renameGroup(element.getGroupSymbol(), newGroupName);
return null;
}
- public void renameGroup(GroupSymbol obj) {
+ public void renameGroup(GroupSymbol obj, String newAlias) {
if (aliasGroups) {
String definition = obj.getNonCorrelationName();
- String newAlias = getGroupName(obj.getName());
if (newAlias == null) {
return;
}
- obj.setOutputName(newAlias);
- obj.setOutputDefinition(definition);
+ obj.setName(newAlias);
+ obj.setDefinition(definition);
} else if(obj.getDefinition() != null) {
- obj.setOutputName(obj.getDefinition());
- obj.setOutputDefinition(null);
+ obj.setName(obj.getDefinition());
+ obj.setDefinition(null);
+ } else {
+ obj.setOutputName(null);
+ obj.setOutputDefinition(null);
}
}
@@ -146,14 +143,12 @@
if(group == null) {
return;
}
- String newName = namingContext.getElementName(obj, true);
+ String newName = namingContext.getElementName(obj);
- if (newName == null) {
- newName = Symbol.getShortName(obj.getOutputName());
+ if (newName != null) {
+ obj.setShortName(newName);
}
-
- obj.setOutputName(group.getOutputName() + Symbol.SEPARATOR + newName);
- obj.setDisplayMode(ElementSymbol.DisplayMode.OUTPUT_NAME);
+ obj.setDisplayMode(ElementSymbol.DisplayMode.FULLY_QUALIFIED);
}
/**
@@ -161,7 +156,7 @@
*/
@Override
public void visit(GroupSymbol obj) {
- this.namingContext.renameGroup(obj);
+ this.namingContext.renameGroup(obj, this.namingContext.getGroupName(obj.getName()));
}
public void createChildNamingContext(boolean aliasColumns) {
@@ -205,12 +200,11 @@
}
public void visit(Select obj) {
- super.visit(obj);
- List<Expression> selectSymbols = obj.getSymbols();
+ List<Expression> selectSymbols = obj.getSymbols();
HashMap<Expression, String> symbols = new HashMap<Expression, String>(selectSymbols.size());
for (int i = 0; i < selectSymbols.size(); i++) {
Expression symbol = selectSymbols.get(i);
-
+ visitNode(symbol);
boolean needsAlias = visitor.namingContext.aliasColumns;
String newAlias = "c_" + i; //$NON-NLS-1$
@@ -219,7 +213,7 @@
if (newSymbol instanceof ElementSymbol) {
if (!needsAlias) {
- newAlias = ((ElementSymbol)newSymbol).getOutputName();
+ newAlias = ((ElementSymbol)newSymbol).getShortName();
} else {
needsAlias &= needsAlias(newAlias, (ElementSymbol)newSymbol);
}
@@ -228,7 +222,7 @@
symbols.put(symbol, newAlias);
if (visitor.namingContext.aliasColumns && needsAlias) {
newSymbol = new AliasSymbol(Symbol.getShortName(symbol), newSymbol);
- ((AliasSymbol)newSymbol).setOutputName(newAlias);
+ ((AliasSymbol)newSymbol).setShortName(newAlias);
}
selectSymbols.set(i, newSymbol);
}
@@ -238,7 +232,7 @@
private boolean needsAlias(String newAlias,
ElementSymbol symbol) {
- return !(symbol.getMetadataID() instanceof TempMetadataID) || !newAlias.equalsIgnoreCase(visitor.namingContext.getElementName(symbol, false));
+ return !(symbol.getMetadataID() instanceof TempMetadataID) || !newAlias.equalsIgnoreCase(symbol.getShortName());
}
/**
@@ -265,15 +259,17 @@
}
visitor.namingContext.parent.elementMap.put(obj.getName(), viewGroup);
visitor.removeChildNamingContext();
- obj.getGroupSymbol().setOutputName(recontextGroup(obj.getGroupSymbol(), true));
+ obj.getGroupSymbol().setName(recontextGroup(obj.getGroupSymbol(), true));
}
@Override
public void visit(UnaryFromClause obj) {
+ GroupSymbol symbol = obj.getGroup();
if (visitor.aliasGroups) {
- GroupSymbol symbol = obj.getGroup();
recontextGroup(symbol, false);
- }
+ } else {
+ visitor.namingContext.groupNames.put(symbol.getName(), symbol.getNonCorrelationName());
+ }
super.visit(obj);
}
@@ -328,11 +324,17 @@
for (int i = 0; i < obj.getVariableCount(); i++) {
OrderByItem item = obj.getOrderByItems().get(i);
Expression element = item.getSymbol();
+ visitNode(element);
if (item.isUnrelated()) {
- visitNode(element);
continue;
}
- String name = visitor.namingContext.getElementName(element, false);
+ String name = null;
+ if (visitor.namingContext.currentSymbols != null) {
+ name = visitor.namingContext.currentSymbols.get(element);
+ }
+ if (name == null) {
+ name = Symbol.getShortName(element);
+ }
boolean needsAlias = visitor.namingContext.aliasColumns;
if (name == null) {
continue;
@@ -347,11 +349,13 @@
element = new AliasSymbol(Symbol.getShortName(element), expr);
} else if (expr instanceof ElementSymbol) {
element = expr;
- visitNode(element);
+ if (visitor.namingContext.aliasColumns) {
+ ((ElementSymbol)expr).setDisplayMode(DisplayMode.SHORT_OUTPUT_NAME);
+ }
}
item.setSymbol(element);
if (element instanceof Symbol) {
- ((Symbol)element).setOutputName(name);
+ ((Symbol)element).setShortName(name);
}
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -39,6 +39,7 @@
import org.teiid.query.QueryPlugin;
import org.teiid.query.analysis.AnalysisRecord;
import org.teiid.query.metadata.QueryMetadataInterface;
+import org.teiid.query.metadata.TempMetadataAdapter;
import org.teiid.query.metadata.TempMetadataID;
import org.teiid.query.optimizer.capabilities.CapabilitiesFinder;
import org.teiid.query.optimizer.capabilities.SourceCapabilities;
@@ -64,12 +65,10 @@
import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.symbol.ExpressionSymbol;
import org.teiid.query.sql.symbol.GroupSymbol;
-import org.teiid.query.sql.symbol.Reference;
import org.teiid.query.sql.symbol.WindowFunction;
import org.teiid.query.sql.util.SymbolMap;
import org.teiid.query.sql.visitor.EvaluatableVisitor;
import org.teiid.query.sql.visitor.GroupCollectorVisitor;
-import org.teiid.query.sql.visitor.ReferenceCollectorVisitor;
import org.teiid.query.sql.visitor.EvaluatableVisitor.EvaluationLevel;
@@ -79,8 +78,8 @@
private AnalysisRecord analysisRecord;
private CapabilitiesFinder capFinder;
- private Map<List<Object>, AccessNode> sharedCommands = new HashMap<List<Object>, AccessNode>();
- private Map<List<Object>, Integer> topCount = new HashMap<List<Object>, Integer>();
+ //state for detecting and reusing source queries
+ private Map<Command, AccessNode> sharedCommands = new HashMap<Command, AccessNode>();
private int sharedId;
public static class SharedStateKey {
@@ -115,7 +114,6 @@
return processPlan;
} finally {
sharedCommands.clear();
- topCount.clear();
sharedId = 0;
}
}
@@ -351,43 +349,8 @@
}
setRoutingName(aNode, node);
//check if valid to share this with other nodes
- if (ev != null && ev.getDeterminismLevel().compareTo(Determinism.COMMAND_DETERMINISTIC) >= 0 && command.returnsResultSet()) {
- //create a top level key to avoid the full command toString
- String modelName = aNode.getModelName();
- Collection<GroupSymbol> groups = GroupCollectorVisitor.getGroups(command, true);
- List<Object> topKey = new ArrayList<Object>(groups.size() + 1);
- topKey.add(modelName);
- for (GroupSymbol groupSymbol : groups) {
- topKey.add(groupSymbol.toString());
- }
-
- AccessNode other = sharedCommands.get(topKey);
- if (other == null) {
- sharedCommands.put(topKey, aNode);
- topCount.put(topKey, 1);
- } else {
- int count = topCount.get(topKey);
- if (count == 1) {
- Command c = other.getCommand();
- List<Object> key = getCommandKey(c);
- sharedCommands.put(key, other);
- }
- topCount.put(topKey, ++count);
- Command c = aNode.getCommand();
- List<Object> key = getCommandKey(c);
-
- AccessNode initial = this.sharedCommands.get(key);
- if (initial != null) {
- if (initial.info == null) {
- initial.info = new RegisterRequestParameter.SharedAccessInfo();
- initial.info.id = sharedId++;
- }
- initial.info.sharingCount++;
- aNode.info = initial.info;
- } else {
- this.sharedCommands.put(key, aNode);
- }
- }
+ if (ev != null && ev.getDeterminismLevel().compareTo(Determinism.COMMAND_DETERMINISTIC) >= 0 && command.areResultsCachable()) {
+ checkForSharedSourceCommand(aNode);
}
}
break;
@@ -550,13 +513,36 @@
return processNode;
}
-
- private List<Object> getCommandKey(Command c) {
- List<Reference> refs = ReferenceCollectorVisitor.getReferences(c);
- List<Object> key = new ArrayList<Object>(2);
- key.add(c.toString());
- key.add(refs);
- return key;
+
+ private void checkForSharedSourceCommand(AccessNode aNode) {
+ //create a top level key to avoid the full command toString
+ String modelName = aNode.getModelName();
+ Command cmd = aNode.getCommand();
+
+ //don't share full scans against internal sources, it's a waste of buffering
+ if (CoreConstants.SYSTEM_MODEL.equals(modelName)
+ || CoreConstants.SYSTEM_ADMIN_MODEL.equals(modelName)
+ || TempMetadataAdapter.TEMP_MODEL.getName().equals(modelName)) {
+ if (!(cmd instanceof Query)) {
+ return;
+ }
+ Query query = (Query)cmd;
+ if (query.getOrderBy() == null && query.getCriteria() == null) {
+ return;
+ }
+ }
+
+ AccessNode other = sharedCommands.get(cmd);
+ if (other == null) {
+ sharedCommands.put(cmd, aNode);
+ } else {
+ if (other.info == null) {
+ other.info = new RegisterRequestParameter.SharedAccessInfo();
+ other.info.id = sharedId++;
+ }
+ other.info.sharingCount++;
+ aNode.info = other.info;
+ }
}
private void updateGroupName(PlanNode node, TableFunctionReference tt) {
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/xml/XMLPlannerEnvironment.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/xml/XMLPlannerEnvironment.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/xml/XMLPlannerEnvironment.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -98,18 +98,20 @@
*/
private TempMetadataStore globalTempMetadata = new TempMetadataStore();
- private Map stagingTableMap = new HashMap();
+ private Map<Object, Object> stagingTableMap = new HashMap<Object, Object>();
+ private Map<Object, QueryNode> queryNodeMap = new HashMap<Object, QueryNode>();
- private Map queryNodeMap = new HashMap();
+ private TempMetadataAdapter tma;
// ################## Output for processing -> XMLPlan ##################
public XMLPlannerEnvironment(QueryMetadataInterface qmi) {
this.metadata = qmi;
+ this.tma = new TempMetadataAdapter(metadata, this.globalTempMetadata, this.stagingTableMap, this.queryNodeMap);
}
TempMetadataAdapter getGlobalMetadata() {
- return new TempMetadataAdapter(metadata, this.globalTempMetadata, this.stagingTableMap, this.queryNodeMap);
+ return tma;
}
public ResultSetInfo getStagingTableResultsInfo(String groupName) {
Modified: trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -105,7 +105,7 @@
@Override
public void closeSource() {
- if (--state.expectedReaders == 0) {
+ if (--state.expectedReaders == 0 && sharedStates != null && sharedStates.containsKey(state.id)) {
state.remove();
sharedStates.remove(state.id);
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -22,7 +22,7 @@
package org.teiid.query.processor.relational;
-import java.util.LinkedList;
+import java.util.HashMap;
import java.util.List;
import org.teiid.client.plan.PlanNode;
@@ -34,19 +34,15 @@
import org.teiid.core.TeiidProcessingException;
import org.teiid.language.SQLConstants;
import org.teiid.query.analysis.AnalysisRecord;
-import org.teiid.query.metadata.TempMetadataAdapter;
-import org.teiid.query.processor.CollectionTupleSource;
import org.teiid.query.processor.ProcessorDataManager;
import org.teiid.query.processor.ProcessorPlan;
import org.teiid.query.processor.QueryProcessor;
-import org.teiid.query.processor.RegisterRequestParameter;
import org.teiid.query.sql.LanguageObject;
-import org.teiid.query.sql.lang.Create;
-import org.teiid.query.sql.lang.Insert;
import org.teiid.query.sql.lang.SourceHint;
import org.teiid.query.sql.lang.WithQueryCommand;
import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.tempdata.TempTableStore;
+import org.teiid.query.tempdata.TempTableStore.TableProcessor;
import org.teiid.query.tempdata.TempTableStore.TransactionMode;
import org.teiid.query.util.CommandContext;
@@ -59,8 +55,6 @@
private List<? extends Expression> outputCols;
private List<WithQueryCommand> with;
- private List<WithQueryCommand> withToProcess;
- private QueryProcessor withProcessor;
private TempTableStore tempTableStore;
private boolean multisourceUpdate;
private SourceHint sourceHint;
@@ -104,9 +98,6 @@
tempTableStore = new TempTableStore(context.getConnectionId(), TransactionMode.NONE);
tempTableStore.setParentTempTableStore(context.getTempTableStore());
context.setTempTableStore(tempTableStore);
- for (WithQueryCommand withCommand : this.with) {
- withCommand.getCommand().getProcessorPlan().initialize(context, dataMgr, bufferMgr);
- }
}
setContext(context);
connectExternal(this.root, context, dataMgr, bufferMgr);
@@ -136,34 +127,15 @@
public void open()
throws TeiidComponentException, TeiidProcessingException {
- if (this.with != null) {
- if (withToProcess == null) {
- withToProcess = new LinkedList<WithQueryCommand>(with);
- }
- while (!withToProcess.isEmpty()) {
- WithQueryCommand withCommand = withToProcess.get(0);
- if (withProcessor == null) {
- ProcessorPlan plan = withCommand.getCommand().getProcessorPlan();
- withProcessor = new QueryProcessor(plan, getContext(), this.root.getBufferManager(), this.root.getDataManager());
- Create create = new Create();
- create.setElementSymbolsAsColumns(withCommand.getColumns());
- create.setTable(withCommand.getGroupSymbol());
- this.root.getDataManager().registerRequest(getContext(), create, TempMetadataAdapter.TEMP_MODEL.getID(), new RegisterRequestParameter());
- }
- while (true) {
- TupleBatch batch = withProcessor.nextBatch();
- Insert insert = new Insert(withCommand.getGroupSymbol(), withCommand.getColumns(), null);
- insert.setTupleSource(new CollectionTupleSource(batch.getTuples().iterator()));
- this.root.getDataManager().registerRequest(getContext(), insert, TempMetadataAdapter.TEMP_MODEL.getID(), new RegisterRequestParameter());
- if (batch.getTerminationFlag()) {
- break;
- }
- }
- this.tempTableStore.setUpdatable(withCommand.getGroupSymbol().getName(), false);
- withToProcess.remove(0);
- withProcessor = null;
+ if (with != null) {
+ HashMap<String, TableProcessor> processors = new HashMap<String, TableProcessor>();
+ tempTableStore.setProcessors(processors);
+ for (WithQueryCommand withCommand : this.with) {
+ ProcessorPlan plan = withCommand.getCommand().getProcessorPlan();
+ QueryProcessor withProcessor = new QueryProcessor(plan, getContext(), root.getBufferManager(), root.getDataManager());
+ processors.put(withCommand.getGroupSymbol().getName(), new TableProcessor(withProcessor, withCommand.getColumns()));
}
- }
+ }
this.root.open();
}
@@ -178,14 +150,15 @@
public void close()
throws TeiidComponentException {
- if (this.with != null) {
- for (WithQueryCommand withCommand : this.with) {
- withCommand.getCommand().getProcessorPlan().close();
+ if (this.tempTableStore != null) {
+ this.tempTableStore.removeTempTables();
+ if (this.tempTableStore.getProcessors() != null) {
+ for (TableProcessor proc : this.tempTableStore.getProcessors().values()) {
+ proc.getQueryProcessor().closeProcessing();
+ }
+ this.tempTableStore.setProcessors(null);
}
- if (this.tempTableStore != null) {
- this.tempTableStore.removeTempTables();
- }
- }
+ }
this.root.close();
}
@@ -197,8 +170,6 @@
this.root.reset();
if (this.with != null) {
- withToProcess = null;
- withProcessor = null;
for (WithQueryCommand withCommand : this.with) {
withCommand.getCommand().getProcessorPlan().reset();
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/CacheHint.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/CacheHint.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/CacheHint.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -22,13 +22,11 @@
package org.teiid.query.sql.lang;
-import java.io.Serializable;
-
-import org.teiid.core.util.EquivalenceUtil;
import org.teiid.metadata.FunctionMethod.Determinism;
import org.teiid.query.sql.visitor.SQLStringVisitor;
+import org.teiid.translator.CacheDirective;
-public class CacheHint implements Serializable {
+public class CacheHint extends CacheDirective {
private static final long serialVersionUID = -4119606289701982511L;
@@ -38,39 +36,20 @@
public static final String CACHE = "cache"; //$NON-NLS-1$
public static final String SCOPE = "scope:"; //$NON-NLS-1$
- private static final String SESSION = "session"; //$NON-NLS-1$
- private static final String VDB = "vdb"; //$NON-NLS-1$
- private static final String USER = "user"; //$NON-NLS-1$
-
- private boolean prefersMemory;
- private boolean updatable;
- private Long ttl;
- private String scope;
-
public CacheHint() {
}
- public CacheHint(boolean prefersMemory, Long ttl) {
- this.prefersMemory = prefersMemory;
- this.ttl = ttl;
+ public CacheHint(Boolean prefersMemory, Long ttl) {
+ super(prefersMemory, ttl);
}
-
- public boolean getPrefersMemory() {
- return prefersMemory;
- }
- public void setPrefersMemory(boolean prefersMemory) {
- this.prefersMemory = prefersMemory;
+ public boolean isPrefersMemory() {
+ if (getPrefersMemory() != null) {
+ return getPrefersMemory();
+ }
+ return false;
}
-
- public Long getTtl() {
- return ttl;
- }
-
- public void setTtl(Long ttl) {
- this.ttl = ttl;
- }
-
+
@Override
public String toString() {
SQLStringVisitor ssv = new SQLStringVisitor();
@@ -78,52 +57,32 @@
return ssv.getSQLString();
}
- public boolean isUpdatable() {
- return updatable;
- }
-
- public void setUpdatable(boolean updatable) {
- this.updatable = updatable;
- }
-
public Determinism getDeterminism() {
- if (this.scope == null) {
+ if (this.getScope() == null) {
return null;
}
-
- if (scope.equals(SESSION)) {
+ switch (getScope()) {
+ case SESSION:
return Determinism.SESSION_DETERMINISTIC;
- }
- else if (this.scope.equals(VDB)) {
+ case VDB:
return Determinism.VDB_DETERMINISTIC;
}
- else if (this.scope.equals(USER)) {
- return Determinism.USER_DETERMINISTIC;
- }
- return null;
+ return Determinism.USER_DETERMINISTIC;
}
- public String getScope() {
- return this.scope;
- }
-
public void setScope(String scope) {
- this.scope = scope;
+ if (scope == null) {
+ setScope((Scope)null);
+ } else {
+ setScope(Scope.valueOf(scope.toUpperCase()));
+ }
}
- @Override
- public boolean equals(Object obj) {
- if (obj == this) {
- return true;
+ public boolean isUpdatable(boolean b) {
+ if (getUpdatable() != null) {
+ return getUpdatable();
}
- if (!(obj instanceof CacheHint)) {
- return false;
- }
- CacheHint other = (CacheHint)obj;
- return this.prefersMemory == other.prefersMemory
- && EquivalenceUtil.areEqual(this.ttl, other.ttl)
- && this.updatable == other.updatable
- && EquivalenceUtil.areEqual(this.scope, other.scope);
+ return b;
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/Query.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/Query.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/Query.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -425,16 +425,11 @@
if (isXML) {
return true;
}
- List projectedSymbols = getProjectedSymbols();
- return areResultsCachable(projectedSymbols);
+ List<Expression> projectedSymbols = getProjectedSymbols();
+ return areColumnsCachable(projectedSymbols);
}
- public static boolean areResultsCachable(Collection<? extends Expression> projectedSymbols) {
- for (Expression projectedSymbol : projectedSymbols) {
- if(projectedSymbol.getType() == DataTypeManager.DefaultDataClasses.OBJECT) {
- return false;
- }
- }
+ public static boolean areColumnsCachable(Collection<? extends Expression> projectedSymbols) {
return true;
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/StoredProcedure.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/StoredProcedure.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/StoredProcedure.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -323,7 +323,10 @@
* @see org.teiid.query.sql.lang.Command#areResultsCachable()
*/
public boolean areResultsCachable() {
- return Query.areResultsCachable(getProjectedSymbols());
+ if (getUpdateCount() > 0) {
+ return false;
+ }
+ return Query.areColumnsCachable(getProjectedSymbols());
}
/**
Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/UnaryFromClause.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/UnaryFromClause.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/UnaryFromClause.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -98,9 +98,8 @@
UnaryFromClause other = (UnaryFromClause)obj;
- if( (this.getGroup().getDefinition() == null && other.getGroup().getDefinition() == null) ||
- (this.getGroup().getDefinition() != null && other.getGroup().getDefinition() != null) ) {
- return EquivalenceUtil.areEqual(getGroup(), other.getGroup()) &&
+ if( EquivalenceUtil.areEqual(group.getDefinition(), other.getGroup().getDefinition()) ) {
+ return EquivalenceUtil.areEqual(getGroup().getNonCorrelationName(), other.getGroup().getNonCorrelationName()) &&
other.isOptional() == this.isOptional();
}
return false;
Modified: trunk/engine/src/main/java/org/teiid/query/sql/proc/CreateProcedureCommand.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/proc/CreateProcedureCommand.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/main/java/org/teiid/query/sql/proc/CreateProcedureCommand.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -239,7 +239,7 @@
* @see org.teiid.query.sql.lang.Command#areResultsCachable()
*/
public boolean areResultsCachable() {
- return Query.areResultsCachable(getProjectedSymbols());
+ return Query.areColumnsCachable(getProjectedSymbols());
}
public GroupSymbol getVirtualGroup() {
Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -971,7 +971,7 @@
append(SPACE);
append(CacheHint.CACHE);
boolean addParens = false;
- if (obj.getPrefersMemory()) {
+ if (obj.isPrefersMemory()) {
append(Tokens.LPAREN);
addParens = true;
append(CacheHint.PREF_MEM);
@@ -986,7 +986,7 @@
append(CacheHint.TTL);
append(obj.getTtl());
}
- if (obj.isUpdatable()) {
+ if (obj.getUpdatable() != null) {
if (!addParens) {
append(Tokens.LPAREN);
addParens = true;
Modified: trunk/engine/src/main/java/org/teiid/query/tempdata/GlobalTableStoreImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/tempdata/GlobalTableStoreImpl.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/main/java/org/teiid/query/tempdata/GlobalTableStoreImpl.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -334,12 +334,12 @@
table.setUpdatable(false);
CacheHint hint = table.getCacheHint();
if (hint != null) {
- table.setPreferMemory(hint.getPrefersMemory());
+ table.setPreferMemory(hint.isPrefersMemory());
if (hint.getTtl() != null) {
getMatTableInfo(tableName).setTtl(hint.getTtl());
}
if (pk != null) {
- table.setUpdatable(hint.isUpdatable());
+ table.setUpdatable(hint.isUpdatable(false));
}
}
return table;
Modified: trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -70,13 +70,11 @@
import org.teiid.query.processor.RegisterRequestParameter;
import org.teiid.query.resolver.util.ResolverUtil;
import org.teiid.query.sql.lang.*;
-import org.teiid.query.sql.navigator.PostOrderNavigator;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.symbol.GroupSymbol;
import org.teiid.query.sql.symbol.Reference;
-import org.teiid.query.sql.visitor.ExpressionMappingVisitor;
import org.teiid.query.tempdata.GlobalTableStoreImpl.MatTableInfo;
import org.teiid.query.util.CommandContext;
@@ -366,28 +364,6 @@
return null;
}
final String tableName = group.getNonCorrelationName();
- if (!tableName.equalsIgnoreCase(group.getName())) {
- group = group.clone();
- group.setName(tableName);
- group.setDefinition(null);
- query.getFrom().getClauses().clear();
- query.getFrom().addClause(new UnaryFromClause(group));
- final GroupSymbol newGroup = group;
- //convert to the actual table symbols (this is typically handled by the languagebridgefactory
- ExpressionMappingVisitor emv = new ExpressionMappingVisitor(null) {
- @Override
- public Expression replaceExpression(Expression element) {
- if (element instanceof ElementSymbol) {
- ElementSymbol es = (ElementSymbol)element;
- es = es.clone();
- es.setGroupSymbol(newGroup);
- return es;
- }
- return element;
- }
- };
- PostOrderNavigator.doVisit(query, emv);
- }
TempTable table = null;
if (group.isGlobalTable()) {
final GlobalTableStore globalStore = context.getGlobalTableStore();
@@ -485,7 +461,7 @@
}
CacheHint hint = table.getCacheHint();
if (hint != null && table.getPkLength() > 0) {
- table.setUpdatable(hint.isUpdatable());
+ table.setUpdatable(hint.isUpdatable(false));
}
} catch (TeiidComponentException e) {
LogManager.logError(LogConstants.CTX_MATVIEWS, e, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30015, tableName));
Modified: trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableStore.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableStore.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableStore.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -24,6 +24,7 @@
import java.sql.Connection;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
@@ -37,7 +38,9 @@
import javax.transaction.Synchronization;
import javax.transaction.SystemException;
+import org.teiid.api.exception.query.ExpressionEvaluationException;
import org.teiid.api.exception.query.QueryProcessingException;
+import org.teiid.common.buffer.BlockedException;
import org.teiid.common.buffer.BufferManager;
import org.teiid.core.TeiidComponentException;
import org.teiid.core.TeiidProcessingException;
@@ -48,6 +51,8 @@
import org.teiid.query.QueryPlugin;
import org.teiid.query.metadata.TempMetadataID;
import org.teiid.query.metadata.TempMetadataStore;
+import org.teiid.query.processor.BatchIterator;
+import org.teiid.query.processor.QueryProcessor;
import org.teiid.query.resolver.command.TempTableResolver;
import org.teiid.query.sql.lang.Command;
import org.teiid.query.sql.lang.Create;
@@ -80,6 +85,21 @@
NONE
}
+ public static class TableProcessor {
+ QueryProcessor queryProcessor;
+ List<ElementSymbol> columns;
+
+ public TableProcessor(QueryProcessor queryProcessor,
+ List<ElementSymbol> columns) {
+ this.queryProcessor = queryProcessor;
+ this.columns = columns;
+ }
+
+ public QueryProcessor getQueryProcessor() {
+ return queryProcessor;
+ }
+ }
+
public class TempTableSynchronization implements Synchronization {
private String id;
@@ -181,6 +201,8 @@
private String sessionID;
private TempTableStore parentTempTableStore;
+ private HashMap<String, TableProcessor> processors;
+
public TempTableStore(String sessionID, TransactionMode transactionMode) {
this.sessionID = sessionID;
this.transactionMode = transactionMode;
@@ -193,6 +215,10 @@
public boolean hasTempTable(String tempTableName) {
return tempTables.containsKey(tempTableName);
}
+
+ public void setProcessors(HashMap<String, TableProcessor> plans) {
+ this.processors = plans;
+ }
TempTable addTempTable(final String tempTableName, Create create, BufferManager buffer, boolean add, CommandContext context) throws TeiidProcessingException {
List<ElementSymbol> columns = create.getColumnSymbols();
@@ -285,9 +311,19 @@
return this.tempTables.get(tempTableID);
}
- TempTable getOrCreateTempTable(String tempTableID, Command command, BufferManager buffer, boolean delegate, boolean forUpdate, CommandContext context) throws TeiidProcessingException{
+ public HashMap<String, TableProcessor> getProcessors() {
+ return processors;
+ }
+
+ TempTable getOrCreateTempTable(String tempTableID, Command command, BufferManager buffer, boolean delegate, boolean forUpdate, CommandContext context) throws TeiidProcessingException, BlockedException, TeiidComponentException{
TempTable tempTable = getTempTable(tempTableID, command, buffer, delegate, forUpdate, context);
if (tempTable != null) {
+ if (processors != null) {
+ TableProcessor withProcessor = processors.get(tempTableID);
+ if (withProcessor != null) {
+ buildWithTable(tempTableID, withProcessor, tempTable);
+ }
+ }
return tempTable;
}
//allow implicit temp group definition
@@ -300,6 +336,18 @@
}
}
if (columns == null) {
+ if (processors != null) {
+ TableProcessor withProcessor = processors.get(tempTableID);
+ if (withProcessor != null) {
+ LogManager.logDetail(LogConstants.CTX_DQP, "Creating temporary table for with clause", tempTableID); //$NON-NLS-1$
+ Create create = new Create();
+ create.setTable(new GroupSymbol(tempTableID));
+ create.setElementSymbolsAsColumns(withProcessor.columns);
+ tempTable = addTempTable(tempTableID, create, buffer, true, context);
+ buildWithTable(tempTableID, withProcessor, tempTable);
+ return tempTable;
+ }
+ }
throw new QueryProcessingException(QueryPlugin.Event.TEIID30226, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30226, tempTableID));
}
LogManager.logDetail(LogConstants.CTX_DQP, "Creating temporary table", tempTableID); //$NON-NLS-1$
@@ -309,6 +357,15 @@
return addTempTable(tempTableID, create, buffer, true, context);
}
+ private void buildWithTable(String tempTableID,
+ TableProcessor withProcessor, TempTable tempTable)
+ throws TeiidComponentException, ExpressionEvaluationException,
+ TeiidProcessingException {
+ tempTable.insert(new BatchIterator(withProcessor.queryProcessor), withProcessor.columns, false);
+ tempTable.setUpdatable(false);
+ processors.remove(tempTableID);
+ }
+
private TempTable getTempTable(String tempTableID, Command command,
BufferManager buffer, boolean delegate, boolean forUpdate, CommandContext context)
throws TeiidProcessingException {
Modified: trunk/engine/src/test/java/org/teiid/cdk/CommandBuilder.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/cdk/CommandBuilder.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/test/java/org/teiid/cdk/CommandBuilder.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -72,6 +72,7 @@
command = QueryRewriter.rewrite(command, metadata, null);
expandAllSymbol(command);
if (generateAliases) {
+ command = (Command)command.clone();
command.acceptVisitor(new AliasGenerator(supportsGroupAlias));
}
return new LanguageBridgeFactory(metadata).translate(command);
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestAggregatePushdown.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestAggregatePushdown.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestAggregatePushdown.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -105,7 +105,7 @@
String sql = "SELECT a12.intkey, MAX(a12.stringkey), MIN(a11.intnum+a12.intnum) FROM bqt1.smalla AS a11 INNER JOIN bqt2.smalla AS a12 ON a11.stringkey = a12.stringkey GROUP BY a12.intkey"; //$NON-NLS-1$
ProcessorPlan plan = TestOptimizer.helpPlan(sql, RealMetadataFactory.exampleBQTCached(), null, capFinder,
- new String[] {"SELECT g_0.stringkey, g_0.intkey, g_0.intnum FROM BQT2.SmallA AS g_0 GROUP BY g_0.stringkey, g_0.intkey, g_0.intnum", "SELECT g_0.stringkey, g_0.intnum FROM BQT1.SmallA AS g_0"}, TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$ //$NON-NLS-2$
+ new String[] {"SELECT g_0.StringKey, g_0.IntKey, g_0.IntNum FROM BQT2.SmallA AS g_0 GROUP BY g_0.StringKey, g_0.IntKey, g_0.IntNum", "SELECT g_0.StringKey, g_0.IntNum FROM BQT1.SmallA AS g_0"}, TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$ //$NON-NLS-2$
TestOptimizer.checkNodeTypes(plan, new int[] {
2, // Access
@@ -136,7 +136,7 @@
String sql = "SELECT a12.intkey, MAX(a12.stringkey), SUM(a11.intnum+a12.intnum) FROM bqt1.smalla AS a11 INNER JOIN bqt2.smalla AS a12 ON a11.stringkey = a12.stringkey GROUP BY a12.intkey"; //$NON-NLS-1$
ProcessorPlan plan = TestOptimizer.helpPlan(sql, RealMetadataFactory.exampleBQTCached(), null, capFinder,
- new String[] {"SELECT g_0.stringkey, g_0.intkey, g_0.intnum FROM BQT2.SmallA AS g_0", "SELECT g_0.stringkey, g_0.intnum FROM BQT1.SmallA AS g_0"}, TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$ //$NON-NLS-2$
+ new String[] {"SELECT g_0.StringKey, g_0.IntKey, g_0.IntNum FROM BQT2.SmallA AS g_0", "SELECT g_0.StringKey, g_0.IntNum FROM BQT1.SmallA AS g_0"}, TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$ //$NON-NLS-2$
TestOptimizer.checkNodeTypes(plan, new int[] {
2, // Access
@@ -203,7 +203,7 @@
String sql = "select sum(a11.intnum) Profit, (sum(a11.intnum) / sum(a11.floatnum)) WJXBFS2 from bqt1.smalla a11 join bqt2.smallb a12 on a11.intkey=a12.intkey group by a12.intkey"; //$NON-NLS-1$
ProcessorPlan plan = TestOptimizer.helpPlan(sql, RealMetadataFactory.exampleBQTCached(), null, capFinder,
- new String[] {"SELECT g_0.intkey, SUM(g_0.intnum), SUM(g_0.floatnum) FROM BQT1.SmallA AS g_0 GROUP BY g_0.intkey", "SELECT g_0.intkey FROM BQT2.SmallB AS g_0"}, TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$ //$NON-NLS-2$
+ new String[] {"SELECT g_0.IntKey FROM BQT2.SmallB AS g_0", "SELECT g_0.IntKey, SUM(g_0.IntNum), SUM(g_0.FloatNum) FROM BQT1.SmallA AS g_0 GROUP BY g_0.IntKey"}, TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$ //$NON-NLS-2$
TestOptimizer.checkNodeTypes(plan, new int[] {
2, // Access
@@ -235,7 +235,7 @@
ProcessorPlan plan = TestOptimizer.helpPlan(sql,
metadata,
null, getAggregatesFinder(),
- new String[] {"SELECT g_0.p_productid AS c_0 FROM m2.product AS g_0 WHERE g_0.p_divid = 100 ORDER BY c_0", "SELECT g_0.o_productid, g_0.o_dealerid, SUM(g_0.o_amount) FROM m1.\"order\" AS g_0, m1.dealer AS g_1 WHERE (g_0.o_dealerid = g_1.d_dealerid) AND (g_1.d_state = 'CA') AND (g_0.o_productid IN (<dependent values>)) GROUP BY g_0.o_productid, g_0.o_dealerid"}, //$NON-NLS-1$ //$NON-NLS-2$
+ new String[] {"SELECT g_0.O_ProductID, g_0.O_DealerID, SUM(g_0.O_Amount) FROM m1.\"order\" AS g_0, m1.dealer AS g_1 WHERE (g_0.O_DealerID = g_1.D_DealerID) AND (g_1.D_State = 'CA') AND (g_0.O_ProductID IN (<dependent values>)) GROUP BY g_0.O_ProductID, g_0.O_DealerID", "SELECT g_0.P_ProductID AS c_0 FROM m2.product AS g_0 WHERE g_0.P_DivID = 100 ORDER BY c_0"}, //$NON-NLS-1$ //$NON-NLS-2$
TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING );
TestOptimizer.checkNodeTypes(plan, new int[] {
@@ -265,7 +265,7 @@
ProcessorPlan plan = TestOptimizer.helpPlan(sql,
metadata,
null, getAggregatesFinder(),
- new String[] {"SELECT g_0.p_productid AS c_0 FROM m2.product AS g_0 WHERE g_0.p_divid = 100 ORDER BY c_0", "SELECT g_0.o_productid, g_0.o_dealerid, MAX(g_0.o_amount), SUM(g_0.o_amount) FROM m1.\"order\" AS g_0, m1.dealer AS g_1 WHERE (g_0.o_dealerid = g_1.d_dealerid) AND (g_1.d_state = 'CA') AND (g_0.o_productid IN (<dependent values>)) GROUP BY g_0.o_productid, g_0.o_dealerid"}, //$NON-NLS-1$ //$NON-NLS-2$
+ new String[] {"SELECT g_0.P_ProductID AS c_0 FROM m2.product AS g_0 WHERE g_0.P_DivID = 100 ORDER BY c_0", "SELECT g_0.O_ProductID, g_0.O_DealerID, MAX(g_0.O_Amount), SUM(g_0.O_Amount) FROM m1.\"order\" AS g_0, m1.dealer AS g_1 WHERE (g_0.O_DealerID = g_1.D_DealerID) AND (g_1.D_State = 'CA') AND (g_0.O_ProductID IN (<dependent values>)) GROUP BY g_0.O_ProductID, g_0.O_DealerID"}, //$NON-NLS-1$ //$NON-NLS-2$
TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING );
TestOptimizer.checkNodeTypes(plan, new int[] {
@@ -520,7 +520,7 @@
String sql = "select a11.intkey ITEM_ID, sum(a11.intnum) WJXBFS1 from bqt1.smalla a11 join bqt2.smalla a12 on (a11.stringkey = a12.stringkey) join bqt2.smallb a13 on (a11.intkey = a13.intkey) where a13.intnum in (10) group by a11.intkey"; //$NON-NLS-1$
ProcessorPlan plan = TestOptimizer.helpPlan(sql, RealMetadataFactory.exampleBQTCached(), null, capFinder,
- new String[] {"SELECT g_0.stringkey, g_0.intkey, SUM(g_0.intnum) FROM BQT1.SmallA AS g_0 GROUP BY g_0.stringkey, g_0.intkey", "SELECT g_0.stringkey FROM BQT2.SmallA AS g_0", "SELECT g_0.intkey FROM BQT2.SmallB AS g_0 WHERE g_0.intnum = 10"}, TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ new String[] {"SELECT g_0.IntKey FROM BQT2.SmallB AS g_0 WHERE g_0.IntNum = 10", "SELECT g_0.StringKey FROM BQT2.SmallA AS g_0", "SELECT g_0.StringKey, g_0.IntKey, SUM(g_0.IntNum) FROM BQT1.SmallA AS g_0 GROUP BY g_0.StringKey, g_0.IntKey"}, TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
TestOptimizer.checkNodeTypes(plan, new int[] {
3, // Access
@@ -573,7 +573,7 @@
"select stringkey, max(intkey) from bqt1.smalla group by stringkey having count(intkey) = 1", //$NON-NLS-1$
metadata, null, capFinder,
new String[] {
- "SELECT COUNT(g_0.intkey), g_0.stringkey, MAX(g_0.intkey) FROM BQT1.SmallA AS g_0 GROUP BY g_0.stringkey"}, //$NON-NLS-1$
+ "SELECT COUNT(g_0.IntKey), g_0.StringKey, MAX(g_0.IntKey) FROM BQT1.SmallA AS g_0 GROUP BY g_0.StringKey"}, //$NON-NLS-1$
ComparisonMode.EXACT_COMMAND_STRING);
TestOptimizer.checkNodeTypes(plan, new int[] {
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestDependentJoins.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestDependentJoins.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestDependentJoins.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -81,7 +81,7 @@
Command depCommand = accessNode.getCommand();
Collection<GroupSymbol> groupSymbols = GroupCollectorVisitor.getGroups(depCommand, true);
for (GroupSymbol groupSymbol : groupSymbols) {
- depGroups.add(groupSymbol.getName().toUpperCase());
+ depGroups.add(groupSymbol.getNonCorrelationName().toUpperCase());
}
}
@@ -713,7 +713,7 @@
"SELECT table1comp.IntKey, table1comp.key1, BQT1.SmallA.StringKey FROM (SELECT t1.*, (STRINGKEY || STRINGNUM) AS key1 FROM BQT2.SmallA AS t1) AS table1comp, BQT1.SmallA WHERE table1comp.key1 = BQT1.SmallA.StringKey", //$NON-NLS-1$
metadata,
null, capFinder,
- new String[] {"SELECT g_0.StringKey FROM BQT1.SmallA AS g_0 WHERE g_0.StringKey IN (<dependent values>)", "SELECT g_0.STRINGKEY, g_0.STRINGNUM, g_0.IntKey FROM BQT2.SmallA AS g_0"}, //$NON-NLS-1$ //$NON-NLS-2$
+ new String[] {"SELECT g_0.StringKey, g_0.StringNum, g_0.IntKey FROM BQT2.SmallA AS g_0", "SELECT g_0.StringKey FROM BQT1.SmallA AS g_0 WHERE g_0.StringKey IN (<dependent values>)"}, //$NON-NLS-1$ //$NON-NLS-2$
TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING );
TestOptimizer.checkNodeTypes(plan, new int[] {
@@ -757,7 +757,7 @@
"SELECT table1comp.IntKey, table1comp.key1, BQT1.SmallA.StringKey FROM (SELECT t1.*, (STRINGKEY || STRINGNUM) AS key1 FROM BQT2.SmallA AS t1) AS table1comp, BQT1.SmallA WHERE table1comp.key1 = BQT1.SmallA.StringKey AND table1comp.key1 = BQT1.SmallA.StringNum", //$NON-NLS-1$
metadata,
null, capFinder,
- new String[] {"SELECT g_0.STRINGKEY, g_0.STRINGNUM, g_0.IntKey FROM BQT2.SmallA AS g_0", "SELECT g_0.StringKey, g_0.StringNum FROM BQT1.SmallA AS g_0 WHERE (g_0.StringNum = g_0.StringKey) AND (g_0.StringKey IN (<dependent values>)) AND (g_0.StringNum IN (<dependent values>))"}, //$NON-NLS-1$ //$NON-NLS-2$
+ new String[] {"SELECT g_0.StringKey, g_0.StringNum, g_0.IntKey FROM BQT2.SmallA AS g_0", "SELECT g_0.StringKey, g_0.StringNum FROM BQT1.SmallA AS g_0 WHERE (g_0.StringNum = g_0.StringKey) AND (g_0.StringKey IN (<dependent values>)) AND (g_0.StringNum IN (<dependent values>))"}, //$NON-NLS-1$ //$NON-NLS-2$
TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING );
TestOptimizer.checkNodeTypes(plan, new int[] {
@@ -802,7 +802,7 @@
"SELECT max(a.stringkey) from bqt1.smalla a, bqt2.smalla a2, bqt1.smalla a1 where a.intnum = a2.intnum and a1.stringnum = a2.stringnum and a.floatnum = a1.floatnum", //$NON-NLS-1$
metadata,
null, capFinder,
- new String[] {"SELECT g_1.stringnum AS c_0, g_0.intnum AS c_1, MAX(g_0.stringkey) AS c_2 FROM BQT1.SmallA AS g_0, BQT1.SmallA AS g_1 WHERE g_0.floatnum = g_1.floatnum GROUP BY g_1.stringnum, g_0.intnum ORDER BY c_0, c_1", "SELECT DISTINCT g_0.stringnum AS c_0, g_0.intnum AS c_1 FROM BQT2.SmallA AS g_0 WHERE (g_0.stringnum IN (<dependent values>)) AND (g_0.intnum IN (<dependent values>)) ORDER BY c_0, c_1"},
+ new String[] {"SELECT DISTINCT g_0.StringNum AS c_0, g_0.IntNum AS c_1 FROM BQT2.SmallA AS g_0 WHERE (g_0.StringNum IN (<dependent values>)) AND (g_0.IntNum IN (<dependent values>)) ORDER BY c_0, c_1", "SELECT g_1.StringNum AS c_0, g_0.IntNum AS c_1, MAX(g_0.StringKey) AS c_2 FROM BQT1.SmallA AS g_0, BQT1.SmallA AS g_1 WHERE g_0.FloatNum = g_1.FloatNum GROUP BY g_1.StringNum, g_0.IntNum ORDER BY c_0, c_1"},
TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING );
TestOptimizer.checkNodeTypes(plan, new int[] {
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestInlineView.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestInlineView.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestInlineView.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -31,6 +31,8 @@
import java.util.Set;
import org.junit.Test;
+import org.teiid.core.TeiidComponentException;
+import org.teiid.core.TeiidProcessingException;
import org.teiid.query.metadata.QueryMetadataInterface;
import org.teiid.query.optimizer.TestOptimizer.ComparisonMode;
import org.teiid.query.optimizer.capabilities.BasicSourceCapabilities;
@@ -93,7 +95,7 @@
public static InlineViewCase createANSIJoinInlineView() throws Exception {
String userQuery = "select q1.a from (select count(bqt1.smalla.intkey) as a, bqt1.smalla.intkey from bqt1.smalla group by bqt1.smalla.intkey) q1 left outer join bqt1.smallb on q1.a = bqt1.smallb.intkey where q1.intkey = 1"; //$NON-NLS-1$
- String optimizedQuery = "SELECT v_0.c_0 FROM (SELECT COUNT(g_0.intkey) AS c_0 FROM BQT1.SmallA AS g_0 WHERE g_0.intkey = 1 GROUP BY g_0.intkey) AS v_0 LEFT OUTER JOIN BQT1.SmallB AS g_1 ON v_0.c_0 = g_1.intkey"; //$NON-NLS-1$
+ String optimizedQuery = "SELECT v_0.c_0 FROM (SELECT COUNT(g_0.IntKey) AS c_0 FROM BQT1.SmallA AS g_0 WHERE g_0.IntKey = 1 GROUP BY g_0.IntKey) AS v_0 LEFT OUTER JOIN BQT1.SmallB AS g_1 ON v_0.c_0 = g_1.IntKey"; //$NON-NLS-1$
List<List<?>> expectedResults = new ArrayList<List<?>>();
expectedResults.add(Arrays.asList(1));
@@ -113,7 +115,7 @@
public static InlineViewCase createInlineView() throws Exception {
String userQuery = "select bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa from (select count(bqt1.smalla.intkey) as aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bqt1.smalla.intkey from bqt1.smalla group by bqt1.smalla.intkey) bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb, bqt1.smallb " + //$NON-NLS-1$
"where bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.intkey = 1 and bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = bqt1.smallb.intkey"; //$NON-NLS-1$
- String optimizedQuery = "SELECT v_0.c_0 FROM (SELECT COUNT(g_0.intkey) AS c_0 FROM BQT1.SmallA AS g_0 WHERE g_0.intkey = 1 GROUP BY g_0.intkey) AS v_0, BQT1.SmallB AS g_1 WHERE v_0.c_0 = g_1.intkey"; //$NON-NLS-1$
+ String optimizedQuery = "SELECT v_0.c_0 FROM (SELECT COUNT(g_0.IntKey) AS c_0 FROM BQT1.SmallA AS g_0 WHERE g_0.IntKey = 1 GROUP BY g_0.IntKey) AS v_0, BQT1.SmallB AS g_1 WHERE v_0.c_0 = g_1.IntKey"; //$NON-NLS-1$
List<List<?>> expectedResults = new ArrayList<List<?>>();
expectedResults.add(Arrays.asList(1));
@@ -131,7 +133,7 @@
public static InlineViewCase createInlineViewWithDistinctAndOrderBy() throws Exception {
String userQuery = "select Q1.a from (select distinct count(bqt1.smalla.intkey) as a, bqt1.smalla.intkey from bqt1.smalla group by bqt1.smalla.intkey order by bqt1.smalla.intkey) q1 inner join bqt1.smallb as q2 on q1.intkey = q2.intkey where q1.a = 1 and q1.a + q1.intkey = 2"; //$NON-NLS-1$
- String optimizedQuery = "SELECT v_0.c_1 FROM (SELECT g_0.intkey AS c_0, COUNT(g_0.intkey) AS c_1 FROM BQT1.SmallA AS g_0 GROUP BY g_0.intkey HAVING (COUNT(g_0.intkey) = 1) AND ((COUNT(g_0.intkey) + g_0.intkey) = 2)) AS v_0, BQT1.SmallB AS g_1 WHERE v_0.c_0 = g_1.intkey"; //$NON-NLS-1$
+ String optimizedQuery = "SELECT v_0.c_1 FROM (SELECT g_0.IntKey AS c_0, COUNT(g_0.IntKey) AS c_1 FROM BQT1.SmallA AS g_0 GROUP BY g_0.IntKey HAVING (COUNT(g_0.IntKey) = 1) AND ((COUNT(g_0.IntKey) + g_0.IntKey) = 2)) AS v_0, BQT1.SmallB AS g_1 WHERE v_0.c_0 = g_1.IntKey"; //$NON-NLS-1$
List<List<?>> expectedResults = new ArrayList<List<?>>();
expectedResults.add(Arrays.asList(1));
@@ -167,7 +169,7 @@
public static InlineViewCase createInlineViewWithOuterOrderAndGroup() throws Exception {
String userQuery = "select count(Q1.a) b from (select distinct count(bqt1.smalla.intkey) as a, bqt1.smalla.intkey from bqt1.smalla group by bqt1.smalla.intkey order by bqt1.smalla.intkey) q1 inner join bqt1.smallb as q2 on q1.intkey = q2.intkey where q1.a = 1 and q1.a + q1.intkey = 2 group by Q1.a order by b"; //$NON-NLS-1$
- String optimizedQuery = "SELECT COUNT(v_0.c_1) AS c_0 FROM (SELECT g_0.intkey AS c_0, COUNT(g_0.intkey) AS c_1 FROM BQT1.SmallA AS g_0 GROUP BY g_0.intkey HAVING (COUNT(g_0.intkey) = 1) AND ((COUNT(g_0.intkey) + g_0.intkey) = 2)) AS v_0, BQT1.SmallB AS g_1 WHERE v_0.c_0 = g_1.intkey GROUP BY v_0.c_1 ORDER BY c_0"; //$NON-NLS-1$
+ String optimizedQuery = "SELECT COUNT(v_0.c_1) AS c_0 FROM (SELECT g_0.IntKey AS c_0, COUNT(g_0.IntKey) AS c_1 FROM BQT1.SmallA AS g_0 GROUP BY g_0.IntKey HAVING (COUNT(g_0.IntKey) = 1) AND ((COUNT(g_0.IntKey) + g_0.IntKey) = 2)) AS v_0, BQT1.SmallB AS g_1 WHERE v_0.c_0 = g_1.IntKey GROUP BY v_0.c_1 ORDER BY c_0"; //$NON-NLS-1$
List<List<?>> expectedResults = new ArrayList<List<?>>();
expectedResults.add(Arrays.asList(1));
@@ -185,7 +187,7 @@
public static InlineViewCase crateInlineViewsInUnions() throws Exception {
String userQuery = "select q1.a from (select count(bqt1.smalla.intkey) as a, bqt1.smalla.intkey from bqt1.smalla group by bqt1.smalla.intkey) q1 left outer join bqt1.smallb on q1.a = bqt1.smallb.intkey where q1.intkey = 1 union all (select count(Q1.a) b from (select distinct count(bqt1.smalla.intkey) as a, bqt1.smalla.intkey from bqt1.smalla group by bqt1.smalla.intkey order by bqt1.smalla.intkey) q1 inner join bqt1.smallb as q2 on q1.intkey = q2.intkey where q1.a = 1 and q1.a + q1.intkey = 2 group by Q1.a order by b)"; //$NON-NLS-1$
- String optimizedQuery = "SELECT v_1.c_0 FROM (SELECT COUNT(g_2.intkey) AS c_0 FROM BQT1.SmallA AS g_2 WHERE g_2.intkey = 1 GROUP BY g_2.intkey) AS v_1 LEFT OUTER JOIN BQT1.SmallB AS g_3 ON v_1.c_0 = g_3.intkey UNION ALL SELECT COUNT(v_0.c_1) AS c_0 FROM (SELECT g_0.IntKey AS c_0, COUNT(g_0.IntKey) AS c_1 FROM BQT1.SmallA AS g_0 GROUP BY g_0.IntKey HAVING (COUNT(g_0.IntKey) = 1) AND ((COUNT(g_0.IntKey) + g_0.IntKey) = 2)) AS v_0, BQT1.SmallB AS g_1 WHERE v_0.c_0 = g_1.intkey GROUP BY v_0.c_1"; //$NON-NLS-1$
+ String optimizedQuery = "SELECT v_1.c_0 FROM (SELECT COUNT(g_2.IntKey) AS c_0 FROM BQT1.SmallA AS g_2 WHERE g_2.IntKey = 1 GROUP BY g_2.IntKey) AS v_1 LEFT OUTER JOIN BQT1.SmallB AS g_3 ON v_1.c_0 = g_3.IntKey UNION ALL SELECT COUNT(v_0.c_1) AS c_0 FROM (SELECT g_0.IntKey AS c_0, COUNT(g_0.IntKey) AS c_1 FROM BQT1.SmallA AS g_0 GROUP BY g_0.IntKey HAVING (COUNT(g_0.IntKey) = 1) AND ((COUNT(g_0.IntKey) + g_0.IntKey) = 2)) AS v_0, BQT1.SmallB AS g_1 WHERE v_0.c_0 = g_1.IntKey GROUP BY v_0.c_1"; //$NON-NLS-1$
List<List<?>> expectedResults = new ArrayList<List<?>>();
expectedResults.add(Arrays.asList(1));
@@ -206,7 +208,7 @@
public static InlineViewCase createUnionInInlineView() throws Exception{
String userQuery = "select t1.intkey from (select case when q1.a=1 then 2 else 1 end as a from (select count(bqt1.smalla.intkey) as a, bqt1.smalla.intkey from bqt1.smalla group by bqt1.smalla.intkey) q1 left outer join bqt1.smallb on q1.a = bqt1.smallb.intkey where q1.intkey = 1 union all (select count(Q1.a) b from (select distinct count(bqt1.smalla.intkey) as a, bqt1.smalla.intkey from bqt1.smalla group by bqt1.smalla.intkey order by bqt1.smalla.intkey) q1 inner join bqt1.smallb as q2 on q1.intkey = q2.intkey where q1.a = 1 and q1.a + q1.intkey = 2 group by Q1.a order by b)) as q3, bqt1.smallb as t1 where q3.a = t1.intkey order by t1.intkey"; //$NON-NLS-1$
- String optimizedQuery = "SELECT g_4.intkey AS c_0 FROM (SELECT CASE WHEN v_1.c_0 = 1 THEN 2 ELSE 1 END AS c_0 FROM (SELECT COUNT(g_2.intkey) AS c_0 FROM BQT1.SmallA AS g_2 WHERE g_2.intkey = 1 GROUP BY g_2.intkey) AS v_1 LEFT OUTER JOIN BQT1.SmallB AS g_3 ON v_1.c_0 = g_3.intkey UNION ALL SELECT COUNT(v_0.c_1) AS c_0 FROM (SELECT g_0.IntKey AS c_0, COUNT(g_0.IntKey) AS c_1 FROM BQT1.SmallA AS g_0 GROUP BY g_0.IntKey HAVING (COUNT(g_0.IntKey) = 1) AND ((COUNT(g_0.IntKey) + g_0.IntKey) = 2)) AS v_0, BQT1.SmallB AS g_1 WHERE v_0.c_0 = g_1.intkey GROUP BY v_0.c_1) AS v_2, BQT1.SmallB AS g_4 WHERE v_2.c_0 = g_4.intkey ORDER BY c_0"; //$NON-NLS-1$
+ String optimizedQuery = "SELECT g_4.IntKey AS c_0 FROM (SELECT CASE WHEN v_1.c_0 = 1 THEN 2 ELSE 1 END AS c_0 FROM (SELECT COUNT(g_2.IntKey) AS c_0 FROM BQT1.SmallA AS g_2 WHERE g_2.IntKey = 1 GROUP BY g_2.IntKey) AS v_1 LEFT OUTER JOIN BQT1.SmallB AS g_3 ON v_1.c_0 = g_3.IntKey UNION ALL SELECT COUNT(v_0.c_1) AS c_0 FROM (SELECT g_0.IntKey AS c_0, COUNT(g_0.IntKey) AS c_1 FROM BQT1.SmallA AS g_0 GROUP BY g_0.IntKey HAVING (COUNT(g_0.IntKey) = 1) AND ((COUNT(g_0.IntKey) + g_0.IntKey) = 2)) AS v_0, BQT1.SmallB AS g_1 WHERE v_0.c_0 = g_1.IntKey GROUP BY v_0.c_1) AS v_2, BQT1.SmallB AS g_4 WHERE v_2.c_0 = g_4.IntKey ORDER BY c_0"; //$NON-NLS-1$
List<List<?>> expectedResults = new ArrayList<List<?>>();
expectedResults.add(Arrays.asList(1));
@@ -236,22 +238,22 @@
TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN);
}
- @Test public void testAliasCreationWithInlineView() {
+ @Test public void testAliasCreationWithInlineView() throws TeiidComponentException, TeiidProcessingException {
FakeCapabilitiesFinder capFinder = getInliveViewCapabilitiesFinder();
QueryMetadataInterface metadata = RealMetadataFactory.exampleBQTCached();
ProcessorPlan plan = helpPlan("select a, b from (select distinct count(intNum) a, count(stringKey), bqt1.smalla.intkey as b from bqt1.smalla group by bqt1.smalla.intkey) q1 order by q1.a", //$NON-NLS-1$
- metadata, null, capFinder, new String[] {"SELECT COUNT(g_0.intNum) AS c_0, g_0.intkey AS c_1 FROM bqt1.smalla AS g_0 GROUP BY g_0.intkey ORDER BY c_0"}, true); //$NON-NLS-1$
+ metadata, null, capFinder, new String[] {"SELECT COUNT(g_0.IntNum) AS c_0, g_0.IntKey AS c_1 FROM BQT1.SmallA AS g_0 GROUP BY g_0.IntKey ORDER BY c_0"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
checkNodeTypes(plan, FULL_PUSHDOWN);
}
- @Test public void testAliasPreservationWithInlineView() {
+ @Test public void testAliasPreservationWithInlineView() throws TeiidComponentException, TeiidProcessingException {
FakeCapabilitiesFinder capFinder = getInliveViewCapabilitiesFinder();
QueryMetadataInterface metadata = RealMetadataFactory.exampleBQTCached();
ProcessorPlan plan = helpPlan("select q1.a + 1, q1.b from (select count(bqt1.smalla.intNum) as a, bqt1.smalla.intkey as b from bqt1.smalla group by bqt1.smalla.intNum, bqt1.smalla.intkey order by b) q1 where q1.a = 1", //$NON-NLS-1$
- metadata, null, capFinder, new String[] {"SELECT (q1.a + 1), q1.b FROM (SELECT COUNT(bqt1.smalla.intNum) AS a, bqt1.smalla.intkey AS b FROM bqt1.smalla GROUP BY bqt1.smalla.intNum, bqt1.smalla.intkey HAVING COUNT(bqt1.smalla.intNum) = 1) AS q1"}, true); //$NON-NLS-1$
+ metadata, null, capFinder, new String[] {"SELECT (v_0.c_0 + 1), v_0.c_1 FROM (SELECT COUNT(g_0.IntNum) AS c_0, g_0.IntKey AS c_1 FROM BQT1.SmallA AS g_0 GROUP BY g_0.IntNum, g_0.IntKey HAVING COUNT(g_0.IntNum) = 1) AS v_0"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
checkNodeTypes(plan, FULL_PUSHDOWN);
}
@@ -264,8 +266,8 @@
QueryMetadataInterface metadata = RealMetadataFactory.exampleBQTCached();
ProcessorPlan plan = helpPlan("select * from (select count(bqt1.smalla.intkey) as a, bqt1.smalla.intkey from bqt1.smalla group by bqt1.smalla.intkey) q1 inner join (select count(bqt2.smallb.intkey) as a, bqt2.smallb.intkey from bqt2.smallb group by bqt2.smallb.intkey) as q2 on q1.intkey = q2.intkey where q1.a = 1", //$NON-NLS-1$
- metadata, null, capFinder, new String[] {"SELECT v_0.c_0, v_0.c_1 FROM (SELECT g_0.intkey AS c_0, COUNT(g_0.intkey) AS c_1 FROM BQT1.SmallA AS g_0 GROUP BY g_0.intkey HAVING COUNT(g_0.intkey) = 1) AS v_0 ORDER BY c_0",
- "SELECT v_0.c_0, v_0.c_1 FROM (SELECT g_0.intkey AS c_0, COUNT(g_0.intkey) AS c_1 FROM BQT2.SmallB AS g_0 GROUP BY g_0.intkey) AS v_0 ORDER BY c_0"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
+ metadata, null, capFinder, new String[] {"SELECT v_0.c_0, v_0.c_1 FROM (SELECT g_0.IntKey AS c_0, COUNT(g_0.IntKey) AS c_1 FROM BQT2.SmallB AS g_0 GROUP BY g_0.IntKey) AS v_0 ORDER BY c_0",
+ "SELECT v_0.c_0, v_0.c_1 FROM (SELECT g_0.IntKey AS c_0, COUNT(g_0.IntKey) AS c_1 FROM BQT1.SmallA AS g_0 GROUP BY g_0.IntKey HAVING COUNT(g_0.IntKey) = 1) AS v_0 ORDER BY c_0"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
checkNodeTypes(plan, new int[] {
2, // Access
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestJoinOptimization.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -295,7 +295,7 @@
String sql = "select bqt1.smalla.intkey from bqt1.smalla left outer join (select bqt3.smalla.intkey from bqt3.smalla where bqt3.smalla.intkey = 1) foo on bqt1.smalla.intkey = foo.intkey"; //$NON-NLS-1$
// Plan query
- ProcessorPlan plan = TestOptimizer.helpPlan(sql, RealMetadataFactory.exampleBQTCached(), new String[] {"SELECT 1 FROM BQT3.SmallA AS g_0 WHERE g_0.intkey = 1", "SELECT g_0.intkey FROM BQT1.SmallA AS g_0"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$ //$NON-NLS-2$
+ ProcessorPlan plan = TestOptimizer.helpPlan(sql, RealMetadataFactory.exampleBQTCached(), new String[] {"SELECT g_0.IntKey FROM BQT1.SmallA AS g_0", "SELECT 1 FROM BQT3.SmallA AS g_0 WHERE g_0.IntKey = 1"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$ //$NON-NLS-2$
TestOptimizer.checkNodeTypes(plan, new int[] {
2, // Access
@@ -426,7 +426,7 @@
// Plan query
ProcessorPlan plan = TestOptimizer.helpPlan(sql, RealMetadataFactory.exampleBQTCached(), null, capFinder,
- new String[] {"SELECT g_3.intkey, g_0.intkey FROM ((BQT1.SmallB AS g_0 CROSS JOIN BQT1.MediumA AS g_1) INNER JOIN BQT1.MediumB AS g_2 ON ((g_0.intkey + g_1.intkey) + g_2.intkey) = 1) LEFT OUTER JOIN BQT1.SmallA AS g_3 ON g_3.stringkey = g_0.stringkey"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
+ new String[] {"SELECT g_3.IntKey, g_0.IntKey FROM ((BQT1.SmallB AS g_0 CROSS JOIN BQT1.MediumA AS g_1) INNER JOIN BQT1.MediumB AS g_2 ON ((g_0.IntKey + g_1.IntKey) + g_2.IntKey) = 1) LEFT OUTER JOIN BQT1.SmallA AS g_3 ON g_3.StringKey = g_0.StringKey"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN);
}
@@ -517,7 +517,7 @@
String sql = "select b.intkey from (select intkey from bqt1.smalla) a left outer join (select intkey from bqt1.smallb) b on (1 = 1)"; //$NON-NLS-1$
ProcessorPlan plan = TestOptimizer.helpPlan(sql, metadata,
- new String[]{"SELECT g_1.intkey FROM BQT1.SmallA AS g_0 LEFT OUTER JOIN BQT1.SmallB AS g_1 ON 1 = 1"}, TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
+ new String[]{"SELECT g_1.IntKey FROM BQT1.SmallA AS g_0 LEFT OUTER JOIN BQT1.SmallB AS g_1 ON 1 = 1"}, TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN);
}
@@ -1041,9 +1041,9 @@
"SELECT BQT1.SmallA.IntKey FROM BQT1.SmallB, BQT1.Smalla, bqt2.smallb where bqt2.smallb.intkey = bqt1.smallb.intkey and bqt2.smallb.stringkey = bqt1.smalla.stringkey", //$NON-NLS-1$
metadata,
null, capFinder,
- new String[] {"SELECT g_0.stringkey AS c_0, g_0.intkey AS c_1 FROM BQT2.SmallB AS g_0 ORDER BY c_0",
- "SELECT g_0.stringkey AS c_0, g_0.IntKey AS c_1 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"}, //$NON-NLS-1$ //$NON-NLS-2$
+ new String[] {"SELECT g_0.StringKey AS c_0, g_0.IntKey AS c_1 FROM BQT2.SmallB AS g_0 ORDER BY c_0",
+ "SELECT g_0.StringKey AS c_0, g_0.IntKey AS c_1 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"},
ComparisonMode.EXACT_COMMAND_STRING );
}
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestLimit.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestLimit.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestLimit.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -530,7 +530,7 @@
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$
+ "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", "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" //$NON-NLS-1$ //$NON-NLS-2$
};
ProcessorPlan plan = TestOptimizer.helpPlan(sql, RealMetadataFactory.example1Cached(),
null, capFinder, expectedSql, TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING);
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -2110,7 +2110,7 @@
"SELECT MAX(sa.datevalue) FROM bqt1.smalla AS sb " + //$NON-NLS-1$
"WHERE (sb.intkey = sa.intkey) AND (sa.stringkey = sb.stringkey) ))"; //$NON-NLS-1$
- String sqlOut = "SELECT g_0.intkey FROM BQT1.SmallA AS g_0 WHERE (g_0.intkey = 46) AND (g_0.stringkey = '46') AND (g_0.datevalue = (SELECT MAX(g_0.datevalue) FROM BQT1.SmallA AS g_1 WHERE (g_1.intkey = g_0.intkey) AND (g_1.stringkey = g_0.stringkey)))"; //$NON-NLS-1$
+ String sqlOut = "SELECT g_0.IntKey FROM BQT1.SmallA AS g_0 WHERE (g_0.IntKey = 46) AND (g_0.StringKey = '46') AND (g_0.DateValue = (SELECT MAX(g_0.DateValue) FROM BQT1.SmallA AS g_1 WHERE (g_1.IntKey = g_0.IntKey) AND (g_1.StringKey = g_0.StringKey)))"; //$NON-NLS-1$
ProcessorPlan plan = helpPlan(sqlIn,
RealMetadataFactory.exampleBQTCached(),
@@ -4272,7 +4272,7 @@
ProcessorPlan plan = helpPlan(sql,
RealMetadataFactory.exampleBQTCached(),
null, capFinder,
- new String[] {"SELECT g_1.longnum, g_2.datevalue, g_0.IntKEy, g_1.IntKEy, g_2.IntKey FROM BQT1.SmallA AS g_0, BQT1.SmallB AS g_1, BQT1.MediumA AS g_2 WHERE (g_0.StringKey = g_1.StringKey) AND (g_2.IntKey = g_0.IntKey) AND (convert(g_0.IntNum, long) > (SELECT SUM(g_3.IntNum) FROM BQT1.SmallA AS g_3))"}, //$NON-NLS-1$
+ new String[] {"SELECT g_1.LongNum, g_2.DateValue, g_0.IntKey, g_1.IntKey, g_2.IntKey FROM BQT1.SmallA AS g_0, BQT1.SmallB AS g_1, BQT1.MediumA AS g_2 WHERE (g_0.StringKey = g_1.StringKey) AND (g_2.IntKey = g_0.IntKey) AND (convert(g_0.IntNum, long) > (SELECT SUM(g_3.IntNum) FROM BQT1.SmallA AS g_3))"}, //$NON-NLS-1$
ComparisonMode.EXACT_COMMAND_STRING );
checkNodeTypes(plan, new int[] {
@@ -4496,7 +4496,7 @@
ProcessorPlan plan = helpPlan(sql,
RealMetadataFactory.exampleBQTCached(),
null, capFinder,
- new String[] {"SELECT g_2.intkey AS c_0, 'a' AS c_1 FROM BQT1.SmallA AS g_2 UNION ALL SELECT g_1.IntKey AS c_0, 'b' AS c_1 FROM BQT1.SmallA AS g_1 UNION ALL SELECT g_0.IntKey AS c_0, 'c' AS c_1 FROM BQT1.SmallA AS g_0"}, //$NON-NLS-1$
+ new String[] {"SELECT g_2.IntKey AS c_0, 'a' AS c_1 FROM BQT1.SmallA AS g_2 UNION ALL SELECT g_1.IntKey AS c_0, 'b' AS c_1 FROM BQT1.SmallA AS g_1 UNION ALL SELECT g_0.IntKey AS c_0, 'c' AS c_1 FROM BQT1.SmallA AS g_0"}, //$NON-NLS-1$
ComparisonMode.EXACT_COMMAND_STRING );
checkNodeTypes(plan, FULL_PUSHDOWN);
@@ -4542,7 +4542,7 @@
Set<String> actualQueries = getAtomicQueries(subplan);
// Compare atomic queries
- HashSet<String> expectedQueries = new HashSet<String>(Arrays.asList(new String[] { "SELECT BQT1.SmallA.datevalue FROM BQT1.SmallA WHERE (BQT1.SmallA.intkey = BQT1.SmallA.intkey) AND (BQT1.SmallA.stringkey = BQT1.SmallA.stringkey)"})); //$NON-NLS-1$
+ HashSet<String> expectedQueries = new HashSet<String>(Arrays.asList(new String[] { "SELECT BQT1.SmallA.DateValue FROM BQT1.SmallA WHERE (BQT1.SmallA.IntKey = sa.IntKey) AND (BQT1.SmallA.StringKey = sa.StringKey)"})); //$NON-NLS-1$
assertEquals("Did not get expected atomic queries for subplan: ", expectedQueries, actualQueries); //$NON-NLS-1$
checkNodeTypes(subplan, new int[] {
@@ -5280,7 +5280,7 @@
ProcessorPlan plan = helpPlan(sql,
metadata,
null, capFinder,
- new String[] {"SELECT g_0.intkey FROM BQT1.SmallA AS g_0 ORDER BY g_0.intkey"}, //$NON-NLS-1$
+ new String[] {"SELECT g_0.IntKey FROM BQT1.SmallA AS g_0 ORDER BY g_0.IntKey"}, //$NON-NLS-1$
ComparisonMode.EXACT_COMMAND_STRING );
checkNodeTypes(plan, FULL_PUSHDOWN);
@@ -5400,7 +5400,7 @@
ProcessorPlan plan = helpPlan(sql,
metadata,
null, capFinder,
- new String[] {"SELECT g_2.intkey FROM ((BQT1.SmallA AS g_0 CROSS JOIN BQT1.SmallA AS g_1) CROSS JOIN BQT1.MediumA AS g_2) LEFT OUTER JOIN BQT1.MediumB AS g_3 ON g_2.intkey = g_3.intkey"}, //$NON-NLS-1$
+ new String[] {"SELECT g_2.IntKey FROM ((BQT1.SmallA AS g_0 CROSS JOIN BQT1.SmallA AS g_1) CROSS JOIN BQT1.MediumA AS g_2) LEFT OUTER JOIN BQT1.MediumB AS g_3 ON g_2.IntKey = g_3.IntKey"}, //$NON-NLS-1$
ComparisonMode.EXACT_COMMAND_STRING );
checkNodeTypes(plan, FULL_PUSHDOWN);
@@ -5496,8 +5496,8 @@
null,
capFinder,
new String[] {
- "SELECT bqt2.smallb.intkey, bqt2.smalla.intkey FROM bqt2.smalla, bqt2.smallb WHERE bqt2.smalla.stringkey = bqt2.smallb.stringkey ORDER BY bqt2.smallb.intkey, bqt2.smalla.intkey", //$NON-NLS-1$
- "SELECT bqt1.smalla.intkey FROM bqt1.smalla ORDER BY bqt1.smalla.intkey"}, //$NON-NLS-1$
+ "SELECT BQT2.SmallB.IntKey, BQT2.SmallA.IntKey FROM BQT2.SmallA, BQT2.SmallB WHERE BQT2.SmallA.StringKey = BQT2.SmallB.StringKey ORDER BY BQT2.SmallB.IntKey, BQT2.SmallA.IntKey",
+ "SELECT BQT1.SmallA.IntKey FROM BQT1.SmallA ORDER BY BQT1.SmallA.IntKey"}, //$NON-NLS-1$
ComparisonMode.EXACT_COMMAND_STRING);
}
@@ -5542,7 +5542,7 @@
helpPlan(sql,
metadata,
null, capFinder,
- new String[] {"SELECT g_0.intkey, g_1.IntKey FROM BQT2.SmallA AS g_0, BQT2.SmallA AS g_1 WHERE g_0.intkey = g_1.IntKey"}, //$NON-NLS-1$
+ new String[] {"SELECT g_0.IntKey, g_1.IntKey FROM BQT2.SmallA AS g_0, BQT2.SmallA AS g_1 WHERE g_0.IntKey = g_1.IntKey"}, //$NON-NLS-1$
ComparisonMode.EXACT_COMMAND_STRING );
}
@@ -5594,7 +5594,7 @@
String sql = "SELECT env('soap_host') AS HOST, intkey from bqt2.smalla"; //$NON-NLS-1$
helpPlan(sql, RealMetadataFactory.exampleBQTCached(), null, new DefaultCapabilitiesFinder(),
- new String[] {"SELECT bqt2.smalla.intkey FROM bqt2.smalla"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
+ new String[] {"SELECT BQT2.SmallA.IntKey FROM BQT2.SmallA"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
}
/**
@@ -5606,8 +5606,8 @@
ProcessorPlan plan = helpPlan(sql, RealMetadataFactory.exampleBQTCached(),
new String[] {
- "SELECT g_0.intkey FROM BQT1.SmallA AS g_0 WHERE g_0.IntKey <> 1", //$NON-NLS-1$
- "SELECT g_0.intkey FROM BQT1.SmallA AS g_0 WHERE g_0.IntKey = 1" }, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
+ "SELECT g_0.IntKey FROM BQT1.SmallA AS g_0 WHERE g_0.IntKey <> 1",
+ "SELECT g_0.IntKey FROM BQT1.SmallA AS g_0 WHERE g_0.IntKey = 1" }, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
checkNodeTypes(plan, new int[] {
2, // Access
@@ -5637,7 +5637,7 @@
ProcessorPlan plan = helpPlan(sql, RealMetadataFactory.exampleBQTCached(),
new String[] {
- "SELECT g_0.intkey FROM BQT1.SmallA AS g_0 WHERE g_0.IntKey = 1" }, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
+ "SELECT g_0.IntKey FROM BQT1.SmallA AS g_0 WHERE g_0.IntKey = 1" }, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
checkNodeTypes(plan, new int[] {
2, // Access
@@ -6546,7 +6546,7 @@
ProcessorPlan plan = TestOptimizer.helpPlan("SELECT intkey from bqt1.smalla where intkey = intnum", //$NON-NLS-1$
RealMetadataFactory.exampleBQTCached(), null, new DefaultCapabilitiesFinder(caps),
new String[] {
- "SELECT bqt1.smalla.intkey, bqt1.smalla.intnum FROM bqt1.smalla"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
+ "SELECT BQT1.SmallA.IntKey, BQT1.SmallA.IntNum FROM BQT1.SmallA"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
checkNodeTypes(plan, new int[] {
1, // Access
@@ -6614,7 +6614,7 @@
ProcessorPlan plan = TestOptimizer.helpPlan("SELECT stringkey from bqt1.smalla where formattimestamp(timestampvalue, 'yyyy') = '1921' and parsebigdecimal(stringkey, '$') = 1 and formattimestamp(timestampvalue, 'yy') = '19'", //$NON-NLS-1$
RealMetadataFactory.exampleBQTCached(), null, new DefaultCapabilitiesFinder(caps),
new String[] {
- "SELECT g_0.timestampvalue, g_0.stringkey FROM BQT1.SmallA AS g_0 WHERE (formattimestamp(g_0.timestampvalue, 'yyyy') = '1921') AND (parsebigdecimal(g_0.stringkey, '$') = 1)"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
+ "SELECT g_0.TimestampValue, g_0.StringKey FROM BQT1.SmallA AS g_0 WHERE (formattimestamp(g_0.TimestampValue, 'yyyy') = '1921') AND (parsebigdecimal(g_0.StringKey, '$') = 1)"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
checkNodeTypes(plan, new int[] {
1, // Access
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleMergeVirtual.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleMergeVirtual.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleMergeVirtual.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -352,7 +352,7 @@
// Plan query
ProcessorPlan plan = TestOptimizer.helpPlan(sql, metadata,
null, capFinder,
- new String[] { "SELECT v_0.c_0 FROM (SELECT convert(g_0.TimestampValue, date) AS c_0 FROM BQT1.SmallA AS g_0, BQT1.SmallB AS g_1 WHERE g_0.stringkey = g_1.stringkey) AS v_0 GROUP BY v_0.c_0" }, //$NON-NLS-1$
+ new String[] { "SELECT v_0.c_0 FROM (SELECT convert(g_0.TimestampValue, date) AS c_0 FROM BQT1.SmallA AS g_0, BQT1.SmallB AS g_1 WHERE g_0.StringKey = g_1.StringKey) AS v_0 GROUP BY v_0.c_0" }, //$NON-NLS-1$
TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING);
TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN);
}
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleRaiseNull.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleRaiseNull.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestRuleRaiseNull.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -164,7 +164,7 @@
String sql = "select b.intkey, b.x from (select intkey, intnum as x from bqt1.smalla where 1 = 0 union all select 1 as z, intkey as b from bqt1.smallb) b inner join bqt1.smalla on b.intkey = bqt1.smalla.intkey"; //$NON-NLS-1$
ProcessorPlan plan = TestOptimizer.helpPlan(sql, RealMetadataFactory.exampleBQTCached(),
- new String[]{"SELECT g_0.intkey FROM BQT1.SmallB AS g_0, BQT1.SmallA AS g_1 WHERE g_1.IntKey = 1"}, TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
+ new String[]{"SELECT g_0.IntKey FROM BQT1.SmallB AS g_0, BQT1.SmallA AS g_1 WHERE g_1.IntKey = 1"}, TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
TestOptimizer.checkNodeTypes(plan, TestOptimizer.FULL_PUSHDOWN);
}
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -1036,7 +1036,7 @@
BasicSourceCapabilities bsc = getTypicalCapabilities();
bsc.setCapabilitySupport(Capability.QUERY_AGGREGATES_MAX, true);
bsc.setCapabilitySupport(Capability.QUERY_GROUP_BY, true);
- TestOptimizer.helpPlan(sql, RealMetadataFactory.exampleBQTCached(), new String[] {"SELECT g_0.shortvalue, g_0.intnum, g_0.intkey FROM BQT1.SmallA AS g_0"}, new DefaultCapabilitiesFinder(bsc), ComparisonMode.EXACT_COMMAND_STRING);
+ TestOptimizer.helpPlan(sql, RealMetadataFactory.exampleBQTCached(), new String[] {"SELECT g_0.ShortValue, g_0.IntNum, g_0.IntKey FROM BQT1.SmallA AS g_0"}, new DefaultCapabilitiesFinder(bsc), ComparisonMode.EXACT_COMMAND_STRING);
}
@Test public void testInvalidGeneratedSemijoinQuery1() throws Exception {
@@ -1086,7 +1086,7 @@
ProcessorPlan plan = TestOptimizer.helpPlan("SELECT 1 FROM bqt1.smalla as Y93 INNER JOIN bqt1.smallb as AG5 ON 1 = 1 WHERE EXISTS (SELECT 'Y' FROM bqt1.mediuma WHERE AG5.intkey = 1 AND Y93.intkey = 1 )", //$NON-NLS-1$
RealMetadataFactory.exampleBQTCached(), null, new DefaultCapabilitiesFinder(bsc),
new String[] {
- "SELECT 1 FROM BQT1.SmallA AS g_0 CROSS JOIN BQT1.SmallB AS g_1 WHERE EXISTS (SELECT 'Y' FROM BQT1.MediumA AS g_2 WHERE (g_1.intkey = 1) AND (g_0.intkey = 1))"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
+ "SELECT 1 FROM BQT1.SmallA AS g_0 CROSS JOIN BQT1.SmallB AS g_1 WHERE EXISTS (SELECT 'Y' FROM BQT1.MediumA AS g_2 WHERE (g_1.IntKey = 1) AND (g_0.IntKey = 1))"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
TestOptimizer.checkNodeTypes(plan, FULL_PUSHDOWN);
}
@@ -1104,7 +1104,7 @@
TestOptimizer.helpPlan("SELECT 1 FROM bqt1.smalla as Y93 LEFT OUTER JOIN bqt1.smallb as AG5 ON EXISTS (SELECT 'Y' FROM bqt1.mediuma WHERE AG5.intkey = 1 AND Y93.intkey = 1 )", //$NON-NLS-1$
RealMetadataFactory.exampleBQTCached(), null, new DefaultCapabilitiesFinder(bsc),
new String[] {
- "SELECT g_0.intkey FROM BQT1.SmallA AS g_0", "SELECT g_0.intkey FROM BQT1.SmallB AS g_0"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
+ "SELECT g_0.IntKey FROM BQT1.SmallA AS g_0", "SELECT g_0.IntKey FROM BQT1.SmallB AS g_0"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
}
/**
@@ -1122,7 +1122,7 @@
TestOptimizer.helpPlan("SELECT 1 FROM bqt1.smalla as Y93 LEFT OUTER JOIN bqt1.smallb as AG5 ON EXISTS (SELECT 'Y' FROM bqt1.mediuma WHERE AG5.intkey = 1 AND Y93.intkey = 1 )", //$NON-NLS-1$
RealMetadataFactory.exampleBQTCached(), null, new DefaultCapabilitiesFinder(bsc),
new String[] {
- "SELECT 1 FROM BQT1.SmallA AS g_0 LEFT OUTER JOIN BQT1.SmallB AS g_1 ON EXISTS (SELECT 'Y' FROM BQT1.MediumA AS g_2 WHERE (g_1.intkey = 1) AND (g_0.intkey = 1))"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
+ "SELECT 1 FROM BQT1.SmallA AS g_0 LEFT OUTER JOIN BQT1.SmallB AS g_1 ON EXISTS (SELECT 'Y' FROM BQT1.MediumA AS g_2 WHERE (g_1.IntKey = 1) AND (g_0.IntKey = 1))"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
}
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestUnionPlanning.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestUnionPlanning.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestUnionPlanning.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -188,8 +188,8 @@
@Test public void testUnionPushDownWithJoin1() throws Exception {
ProcessorPlan plan = TestOptimizer.helpPlan("select * from (SELECT IntKey FROM BQT1.SmallA where intkey in (1, 2) UNION ALL SELECT intkey FROM BQT2.SmallA where intkey in (3, 4)) A inner join (SELECT intkey FROM BQT1.SmallB where intkey in (1, 2) UNION ALL SELECT intkey FROM BQT2.SmallB where intkey in (3, 4)) B on a.intkey = b.intkey where a.intkey in (1, 4)", RealMetadataFactory.exampleBQTCached(), null, TestOptimizer.getGenericFinder(),//$NON-NLS-1$
- new String[] { "SELECT g_1.intkey, g_0.IntKey FROM BQT1.SmallA AS g_0, BQT1.SmallB AS g_1 WHERE (g_0.IntKey = g_1.intkey) AND (g_0.intkey IN (1)) AND (g_0.IntKey = 1) AND (g_1.intkey = 1)",
- "SELECT g_1.intkey, g_0.intkey FROM BQT2.SmallA AS g_0, BQT2.SmallB AS g_1 WHERE (g_0.intkey = g_1.intkey) AND (g_0.intkey IN (4)) AND (g_0.intkey = 4) AND (g_1.intkey = 4)" }, ComparisonMode.EXACT_COMMAND_STRING);
+ new String[] { "SELECT g_1.IntKey, g_0.IntKey FROM BQT1.SmallA AS g_0, BQT1.SmallB AS g_1 WHERE (g_0.IntKey = g_1.IntKey) AND (g_0.IntKey IN (1)) AND (g_0.IntKey = 1) AND (g_1.IntKey = 1)"
+ , "SELECT g_1.IntKey, g_0.IntKey FROM BQT2.SmallA AS g_0, BQT2.SmallB AS g_1 WHERE (g_0.IntKey = g_1.IntKey) AND (g_0.IntKey IN (4)) AND (g_0.IntKey = 4) AND (g_1.IntKey = 4)" }, ComparisonMode.EXACT_COMMAND_STRING);
TestOptimizer.checkNodeTypes(plan, new int[] {
2, // Access
@@ -211,7 +211,7 @@
@Test public void testUnionWithPartitionedAggregate() throws Exception {
ProcessorPlan plan = TestOptimizer.helpPlan("select max(intnum) from (SELECT IntKey, intnum FROM BQT1.SmallA where intkey in (1, 2) UNION ALL SELECT intkey, intnum FROM BQT2.SmallA where intkey in (3, 4)) A group by intkey", RealMetadataFactory.exampleBQTCached(), null, TestInlineView.getInliveViewCapabilitiesFinder(),//$NON-NLS-1$
- new String[] { "SELECT MAX(g_0.intnum) FROM BQT2.SmallA AS g_0 WHERE g_0.intkey IN (3, 4) GROUP BY g_0.intkey", "SELECT MAX(g_0.intnum) FROM BQT1.SmallA AS g_0 WHERE g_0.intkey IN (1, 2) GROUP BY g_0.IntKey" }, ComparisonMode.EXACT_COMMAND_STRING);
+ new String[] { "SELECT MAX(g_0.IntNum) FROM BQT1.SmallA AS g_0 WHERE g_0.IntKey IN (1, 2) GROUP BY g_0.IntKey", "SELECT MAX(g_0.IntNum) FROM BQT2.SmallA AS g_0 WHERE g_0.IntKey IN (3, 4) GROUP BY g_0.IntKey" }, ComparisonMode.EXACT_COMMAND_STRING);
TestOptimizer.checkNodeTypes(plan, new int[] {
2, // Access
@@ -233,7 +233,7 @@
@Test public void testUnionWithUnnecessaryGroupBy() throws Exception {
ProcessorPlan plan = TestOptimizer.helpPlan("select intkey from (SELECT IntKey, intnum FROM BQT1.SmallA UNION ALL SELECT intkey, intnum FROM BQT2.SmallA) A group by intkey", RealMetadataFactory.exampleBQTCached(), null, TestInlineView.getInliveViewCapabilitiesFinder(),//$NON-NLS-1$
- new String[] { "SELECT g_0.intkey FROM BQT2.SmallA AS g_0", "SELECT g_0.IntKey FROM BQT1.SmallA AS g_0" }, ComparisonMode.EXACT_COMMAND_STRING);
+ new String[] { "SELECT g_0.IntKey FROM BQT1.SmallA AS g_0", "SELECT g_0.IntKey FROM BQT2.SmallA AS g_0" }, ComparisonMode.EXACT_COMMAND_STRING);
TestOptimizer.checkNodeTypes(plan, new int[] {
2, // Access
@@ -281,10 +281,10 @@
@Test public void testUnionPartitionedWithMerge() throws Exception {
//"select max(intnum) from (select * from (SELECT IntKey, intnum FROM BQT1.SmallA where intkey in (1, 2) UNION ALL SELECT intkey, intnum FROM BQT2.SmallA where intkey in (3, 4)) A where intkey in (1, 2, 3, 4) UNION ALL select intkey, intnum from bqt2.smallb where intkey in 6) B group by intkey"
ProcessorPlan plan = TestOptimizer.helpPlan("select * from (select * from (SELECT IntKey, intnum FROM BQT1.SmallA UNION ALL SELECT intkey, intnum FROM BQT2.SmallA) A where intkey in (1, 2, 3, 4) UNION ALL select intkey, intnum from bqt2.smallb where intkey in (6)) B inner join (SELECT IntKey, intnum FROM BQT1.SmallA where intkey in (1, 2) UNION ALL SELECT intkey, intnum FROM BQT2.SmallA where intkey in (5, 6)) C on b.intkey = c.intkey", RealMetadataFactory.exampleBQTCached(), null, TestInlineView.getInliveViewCapabilitiesFinder(),//$NON-NLS-1$
- new String[] { "SELECT g_0.intkey, g_0.intnum FROM BQT2.SmallA AS g_0 WHERE g_0.intkey IN (1, 2)",
- "SELECT g_0.IntKey, g_0.intnum FROM BQT1.SmallA AS g_0 WHERE g_0.IntKey IN (1, 2)",
- "SELECT g_1.IntKey, g_1.IntNum, g_0.intkey, g_0.intnum FROM BQT2.SmallB AS g_0, BQT2.SmallA AS g_1 WHERE (g_0.intkey = g_1.IntKey) AND (g_0.intkey = 6) AND (g_1.IntKey = 6)",
- "SELECT g_0.IntKey AS c_0, g_0.IntNum AS c_1 FROM BQT1.SmallA AS g_0 WHERE g_0.IntKey IN (1, 2) ORDER BY c_0" }, ComparisonMode.EXACT_COMMAND_STRING);
+ new String[] { "SELECT g_0.IntKey AS c_0, g_0.IntNum AS c_1 FROM BQT1.SmallA AS g_0 WHERE g_0.IntKey IN (1, 2) ORDER BY c_0",
+ "SELECT g_0.IntKey, g_0.IntNum FROM BQT1.SmallA AS g_0 WHERE g_0.IntKey IN (1, 2)",
+ "SELECT g_0.IntKey, g_0.IntNum FROM BQT2.SmallA AS g_0 WHERE g_0.IntKey IN (1, 2)",
+ "SELECT g_1.IntKey, g_1.IntNum, g_0.IntKey, g_0.IntNum FROM BQT2.SmallB AS g_0, BQT2.SmallA AS g_1 WHERE (g_0.IntKey = g_1.IntKey) AND (g_0.IntKey = 6) AND (g_1.IntKey = 6)" }, ComparisonMode.EXACT_COMMAND_STRING);
TestOptimizer.checkNodeTypes(plan, new int[] {
4, // Access
@@ -336,7 +336,7 @@
@Test public void testUnionPartitionedDistinct() throws Exception {
ProcessorPlan plan = TestOptimizer.helpPlan("select distinct * from (SELECT 1 as IntKey, intnum FROM BQT1.SmallA UNION ALL SELECT 2 as intkey, intnum FROM BQT2.SmallA) A", RealMetadataFactory.exampleBQTCached(), null, TestInlineView.getInliveViewCapabilitiesFinder(),//$NON-NLS-1$
- new String[] { "SELECT DISTINCT g_0.intnum FROM BQT2.SmallA AS g_0", "SELECT DISTINCT g_0.intnum FROM BQT1.SmallA AS g_0" }, ComparisonMode.EXACT_COMMAND_STRING);
+ new String[] { "SELECT DISTINCT g_0.IntNum FROM BQT2.SmallA AS g_0", "SELECT DISTINCT g_0.IntNum FROM BQT1.SmallA AS g_0" }, ComparisonMode.EXACT_COMMAND_STRING);
TestOptimizer.checkNodeTypes(plan, new int[] {
2, // Access
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/relational/TestAliasGenerator.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/relational/TestAliasGenerator.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/relational/TestAliasGenerator.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -48,6 +48,7 @@
boolean stripColumnAliases, QueryMetadataInterface metadata) throws TeiidComponentException, TeiidProcessingException {
Command command = TestResolver.helpResolve(sql, metadata);
command = QueryRewriter.rewrite(command, metadata, null);
+ command = (Command) command.clone();
command.acceptVisitor(new AliasGenerator(aliasGroups, stripColumnAliases));
assertEquals(expected, command.toString());
return command;
@@ -74,19 +75,19 @@
String sql = "select e1 from pm1.g1 order by e1"; //$NON-NLS-1$
String expected = "SELECT g_0.e1 AS c_0 FROM pm1.g1 AS g_0 ORDER BY c_0"; //$NON-NLS-1$
Query command = (Query)helpTest(sql, expected, true, false, RealMetadataFactory.example1Cached());
- assertEquals(((Symbol)command.getOrderBy().getSortKeys().get(0)).getName(), "e1"); //$NON-NLS-1$
- assertEquals(((Symbol)command.getProjectedSymbols().get(0)).getShortName(), "e1"); //$NON-NLS-1$
+ assertEquals(((Symbol)command.getOrderBy().getSortKeys().get(0)).getName(), "c_0"); //$NON-NLS-1$
+ assertEquals(((Symbol)command.getProjectedSymbols().get(0)).getShortName(), "c_0"); //$NON-NLS-1$
}
@Test public void testInlineViewWithSubQuery() throws Exception {
String sql = "select intnum from (select intnum from bqt1.smallb where intnum in (select intnum a from bqt1.smalla)) b"; //$NON-NLS-1$
- String expected = "SELECT v_0.c_0 FROM (SELECT g_0.intnum AS c_0 FROM BQT1.SmallB AS g_0 WHERE g_0.intnum IN (SELECT g_1.intnum FROM BQT1.SmallA AS g_1)) AS v_0"; //$NON-NLS-1$
+ String expected = "SELECT v_0.c_0 FROM (SELECT g_0.IntNum AS c_0 FROM BQT1.SmallB AS g_0 WHERE g_0.IntNum IN (SELECT g_1.IntNum FROM BQT1.SmallA AS g_1)) AS v_0"; //$NON-NLS-1$
helpTest(sql, expected, true, false, RealMetadataFactory.exampleBQTCached());
}
@Test public void testInlineViewOrderBy() throws Exception {
String sql = "select intnum from (select intnum from bqt1.smallb) b order by b.intnum"; //$NON-NLS-1$
- String expected = "SELECT v_0.c_0 FROM (SELECT g_0.intnum AS c_0 FROM BQT1.SmallB AS g_0) AS v_0 ORDER BY c_0"; //$NON-NLS-1$
+ String expected = "SELECT v_0.c_0 FROM (SELECT g_0.IntNum AS c_0 FROM BQT1.SmallB AS g_0) AS v_0 ORDER BY c_0"; //$NON-NLS-1$
Command command = helpTest(sql, expected, true, false, RealMetadataFactory.exampleBQTCached());
LanguageBridgeFactory lbf = new LanguageBridgeFactory(RealMetadataFactory.exampleBQTCached());
org.teiid.language.Command c = lbf.translate(command);
@@ -95,13 +96,13 @@
@Test public void testNestedInlineViewOrderBy() throws Exception {
String sql = "select x from (select intnum x from (select intnum from bqt1.smallb) b order by x) y order by x"; //$NON-NLS-1$
- String expected = "SELECT v_1.c_0 FROM (SELECT v_0.c_0 FROM (SELECT g_0.intnum AS c_0 FROM BQT1.SmallB AS g_0) AS v_0) AS v_1 ORDER BY c_0"; //$NON-NLS-1$
+ String expected = "SELECT v_1.c_0 FROM (SELECT v_0.c_0 FROM (SELECT g_0.IntNum AS c_0 FROM BQT1.SmallB AS g_0) AS v_0) AS v_1 ORDER BY c_0"; //$NON-NLS-1$
helpTest(sql, expected, true, false, RealMetadataFactory.exampleBQTCached());
}
@Test public void testInlineViewWithOnClause() throws Exception {
String sql = "select abcd.efg from (select intkey as efg from bqt1.smalla) abcd inner join (select intnum from bqt1.smallb) b on (b.intnum = abcd.efg)"; //$NON-NLS-1$
- String expected = "SELECT v_0.c_0 FROM (SELECT g_0.intkey AS c_0 FROM BQT1.SmallA AS g_0) AS v_0 INNER JOIN (SELECT g_1.intnum AS c_0 FROM BQT1.SmallB AS g_1) AS v_1 ON v_1.c_0 = v_0.c_0"; //$NON-NLS-1$
+ String expected = "SELECT v_0.c_0 FROM (SELECT g_0.IntKey AS c_0 FROM BQT1.SmallA AS g_0) AS v_0 INNER JOIN (SELECT g_1.IntNum AS c_0 FROM BQT1.SmallB AS g_1) AS v_1 ON v_1.c_0 = v_0.c_0"; //$NON-NLS-1$
helpTest(sql, expected, true, false, RealMetadataFactory.exampleBQTCached());
}
@@ -119,19 +120,19 @@
@Test public void testCorrelatedRefernce() throws Exception {
String sql = "select intnum, stringnum from (select intnum, stringnum from bqt1.smallb) b where intnum in (select b.stringnum || b.intnum from (select intnum from bqt1.smalla) b) "; //$NON-NLS-1$
- String expected = "SELECT v_0.c_0, v_0.c_1 FROM (SELECT g_0.intnum AS c_0, g_0.stringnum AS c_1 FROM BQT1.SmallB AS g_0) AS v_0 WHERE convert(v_0.c_0, string) IN (SELECT concat(v_0.c_1, convert(v_1.c_0, string)) FROM (SELECT g_1.intnum AS c_0 FROM BQT1.SmallA AS g_1) AS v_1)"; //$NON-NLS-1$
+ String expected = "SELECT v_0.c_0, v_0.c_1 FROM (SELECT g_0.IntNum AS c_0, g_0.StringNum AS c_1 FROM BQT1.SmallB AS g_0) AS v_0 WHERE convert(v_0.c_0, string) IN (SELECT concat(v_0.c_1, convert(v_1.c_0, string)) FROM (SELECT g_1.IntNum AS c_0 FROM BQT1.SmallA AS g_1) AS v_1)"; //$NON-NLS-1$
helpTest(sql, expected, true, false, RealMetadataFactory.exampleBQTCached());
}
@Test public void testCorrelatedRefernce1() throws Exception {
String sql = "select intnum, stringnum from bqt1.smallb where intnum in (select stringnum || b.intnum from (select intnum from bqt1.smalla) b) "; //$NON-NLS-1$
- String expected = "SELECT g_0.intnum, g_0.stringnum FROM BQT1.SmallB AS g_0 WHERE convert(g_0.intnum, string) IN (SELECT concat(g_0.stringnum, convert(v_0.c_0, string)) FROM (SELECT g_1.intnum AS c_0 FROM BQT1.SmallA AS g_1) AS v_0)"; //$NON-NLS-1$
+ String expected = "SELECT g_0.IntNum, g_0.StringNum FROM BQT1.SmallB AS g_0 WHERE convert(g_0.IntNum, string) IN (SELECT concat(g_0.StringNum, convert(v_0.c_0, string)) FROM (SELECT g_1.IntNum AS c_0 FROM BQT1.SmallA AS g_1) AS v_0)"; //$NON-NLS-1$
helpTest(sql, expected, true, false, RealMetadataFactory.exampleBQTCached());
}
@Test public void testGroupAliasNotSupported() throws Exception {
String sql = "select b.intkey from bqt1.smalla b"; //$NON-NLS-1$
- String expected = "SELECT BQT1.SmallA.intkey FROM BQT1.SmallA"; //$NON-NLS-1$
+ String expected = "SELECT BQT1.SmallA.IntKey FROM BQT1.SmallA"; //$NON-NLS-1$
helpTest(sql, expected, false, false, RealMetadataFactory.exampleBQTCached());
}
@@ -149,25 +150,25 @@
@Test public void testUnrelatedOrderBy1() throws Exception {
String sql = "SELECT b.IntKey FROM (select intkey, stringkey from BQT1.SmallA) a, (select intkey, stringkey from BQT1.SmallA) b ORDER BY a.StringKey"; //$NON-NLS-1$
- String expected = "SELECT v_1.c_0 FROM (SELECT g_0.intkey AS c_0, g_0.stringkey AS c_1 FROM BQT1.SmallA AS g_0) AS v_0, (SELECT g_1.intkey AS c_0, g_1.stringkey AS c_1 FROM BQT1.SmallA AS g_1) AS v_1 ORDER BY v_0.c_1"; //$NON-NLS-1$
+ String expected = "SELECT v_1.c_0 FROM (SELECT g_0.IntKey AS c_0, g_0.StringKey AS c_1 FROM BQT1.SmallA AS g_0) AS v_0, (SELECT g_1.IntKey AS c_0, g_1.StringKey AS c_1 FROM BQT1.SmallA AS g_1) AS v_1 ORDER BY v_0.c_1"; //$NON-NLS-1$
helpTest(sql, expected, true, false, RealMetadataFactory.exampleBQTCached());
}
@Test public void testUnrelatedOrderBy2() throws Exception {
String sql = "SELECT b.IntKey FROM (select intkey, stringkey from BQT1.SmallA) a, (select intkey, stringkey from BQT1.SmallA) b ORDER BY a.StringKey || b.intKey"; //$NON-NLS-1$
- String expected = "SELECT v_1.c_0 FROM (SELECT g_0.intkey AS c_0, g_0.stringkey AS c_1 FROM BQT1.SmallA AS g_0) AS v_0, (SELECT g_1.intkey AS c_0, g_1.stringkey AS c_1 FROM BQT1.SmallA AS g_1) AS v_1 ORDER BY (v_0.c_1 || v_1.c_0)"; //$NON-NLS-1$
+ String expected = "SELECT v_1.c_0 FROM (SELECT g_0.IntKey AS c_0, g_0.StringKey AS c_1 FROM BQT1.SmallA AS g_0) AS v_0, (SELECT g_1.IntKey AS c_0, g_1.StringKey AS c_1 FROM BQT1.SmallA AS g_1) AS v_1 ORDER BY (v_0.c_1 || v_1.c_0)"; //$NON-NLS-1$
helpTest(sql, expected, true, false, RealMetadataFactory.exampleBQTCached());
}
@Test public void testStripAliases() throws Exception {
String sql = "select intkey as a, stringkey as b from BQT1.SmallA ORDER BY a, b"; //$NON-NLS-1$
- String expected = "SELECT g_0.intkey, g_0.stringkey FROM BQT1.SmallA AS g_0 ORDER BY g_0.intkey, g_0.stringkey"; //$NON-NLS-1$
+ String expected = "SELECT g_0.IntKey, g_0.StringKey FROM BQT1.SmallA AS g_0 ORDER BY g_0.IntKey, g_0.StringKey"; //$NON-NLS-1$
helpTest(sql, expected, true, true, RealMetadataFactory.exampleBQTCached());
}
@Test public void testStripAliases1() throws Exception {
String sql = "select intkey as a, stringkey as b from BQT1.SmallA ORDER BY a, b"; //$NON-NLS-1$
- String expected = "SELECT BQT1.SmallA.intkey, BQT1.SmallA.stringkey FROM BQT1.SmallA ORDER BY BQT1.SmallA.intkey, BQT1.SmallA.stringkey"; //$NON-NLS-1$
+ String expected = "SELECT BQT1.SmallA.IntKey, BQT1.SmallA.StringKey FROM BQT1.SmallA ORDER BY BQT1.SmallA.IntKey, BQT1.SmallA.StringKey"; //$NON-NLS-1$
Command command = helpTest(sql, expected, false, true, RealMetadataFactory.exampleBQTCached());
LanguageBridgeFactory lbf = new LanguageBridgeFactory(RealMetadataFactory.exampleBQTCached());
org.teiid.language.Command c = lbf.translate(command);
Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestOptionsAndHints.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -40,6 +40,7 @@
import org.teiid.query.sql.symbol.GroupSymbol;
import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.Reference;
+import org.teiid.translator.CacheDirective.Scope;
@SuppressWarnings("nls")
public class TestOptionsAndHints {
@@ -966,10 +967,10 @@
ufc.setGroup(new GroupSymbol("t1")); //$NON-NLS-1$
query.setFrom(from);
CacheHint hint = new CacheHint();
- hint.setScope("session");
+ hint.setScope(Scope.SESSION);
hint.setPrefersMemory(true);
query.setCacheHint(hint);
- TestParser.helpTest(sql, "/*+ cache(pref_mem scope:session) */ SELECT * FROM t1", query); //$NON-NLS-1$
+ TestParser.helpTest(sql, "/*+ cache(pref_mem scope:SESSION) */ SELECT * FROM t1", query); //$NON-NLS-1$
}
@Test public void testCache1() {
Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestArrayTable.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestArrayTable.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestArrayTable.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -75,7 +75,7 @@
public static void process(String sql, List[] expectedResults) throws Exception {
HardcodedDataManager dataManager = new HardcodedDataManager();
- dataManager.addData("SELECT bqt1.smalla.objectvalue FROM bqt1.smalla", new List[] {Collections.singletonList(new Object[] {"a", 1, 2}), Collections.singletonList(new Object[] {"b", 3, 6}), Collections.singletonList(null)} );
+ dataManager.addData("SELECT BQT1.SmallA.ObjectValue FROM BQT1.SmallA", new List[] {Collections.singletonList(new Object[] {"a", 1, 2}), Collections.singletonList(new Object[] {"b", 3, 6}), Collections.singletonList(null)} );
ProcessorPlan plan = helpGetPlan(helpParse(sql), RealMetadataFactory.exampleBQTCached());
helpProcess(plan, createCommandContext(), dataManager, expectedResults);
}
Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestCommonTableOptimizations.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestCommonTableOptimizations.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestCommonTableOptimizations.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -28,6 +28,7 @@
import java.util.Arrays;
import java.util.List;
+import org.junit.Ignore;
import org.junit.Test;
import org.teiid.query.unittest.RealMetadataFactory;
@@ -52,5 +53,25 @@
helpProcess(plan, dataManager, expected);
assertEquals(3, dataManager.getCommandHistory().size());
}
+
+ @Ignore
+ @Test public void testDuplicateSimpleQuery() {
+ String sql = "SELECT e1 FROM pm1.g1 union all select e2 from pm1.g1"; //$NON-NLS-1$
+ List<?>[] expected = new List[] {
+ Arrays.asList("a"), //$NON-NLS-1$
+ Arrays.asList("b"), //$NON-NLS-1$
+ Arrays.asList("a"), //$NON-NLS-1$
+ Arrays.asList("b"), //$NON-NLS-1$
+ };
+
+ HardcodedDataManager dataManager = new HardcodedDataManager();
+ dataManager.addData("SELECT pm1.g1.e1 FROM pm1.g1", new List<?>[] {Arrays.asList("a"), Arrays.asList("b")});
+
+ ProcessorPlan plan = helpGetPlan(sql, RealMetadataFactory.example1Cached());
+
+ helpProcess(plan, dataManager, expected);
+ assertEquals(3, dataManager.getCommandHistory().size());
+ }
+
}
Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestDependentJoins.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestDependentJoins.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestDependentJoins.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -531,10 +531,10 @@
});
HardcodedDataManager dataManager = new HardcodedDataManager();
- dataManager.addData("SELECT g_0.stringkey FROM BQT1.SmallB AS g_0", //$NON-NLS-1$
+ dataManager.addData("SELECT g_0.StringKey FROM BQT1.SmallB AS g_0", //$NON-NLS-1$
new List[] { Arrays.asList(new Object[] { "1t" }), //$NON-NLS-1$
Arrays.asList(new Object[] { "2" })}); //$NON-NLS-1$
- dataManager.addData("SELECT g_0.stringkey, g_0.intkey FROM BQT1.SmallA AS g_0", //$NON-NLS-1$
+ dataManager.addData("SELECT g_0.StringKey, g_0.IntKey FROM BQT1.SmallA AS g_0", //$NON-NLS-1$
new List[] { Arrays.asList(new Object[] { "1", 1 })}); //$NON-NLS-1$
@@ -568,7 +568,7 @@
// Plan query
ProcessorPlan plan = TestOptimizer.helpPlan(sql, RealMetadataFactory.exampleBQTCached(), null, capFinder,
- new String[] {"SELECT g_0.stringkey, g_0.intkey FROM BQT1.SmallA AS g_0 WHERE g_0.intkey IN (<dependent values>)", "SELECT g_0.stringkey, g_0.intkey FROM BQT2.SmallB AS g_0"}, TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$ //$NON-NLS-2$
+ new String[] {"SELECT g_0.StringKey, g_0.IntKey FROM BQT1.SmallA AS g_0 WHERE g_0.IntKey IN (<dependent values>)", "SELECT g_0.StringKey, g_0.IntKey FROM BQT2.SmallB AS g_0"}, TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$ //$NON-NLS-2$
TestOptimizer.checkNodeTypes(plan, new int[] {
1, // Access
@@ -588,10 +588,10 @@
});
HardcodedDataManager dataManager = new HardcodedDataManager();
- dataManager.addData("SELECT g_0.stringkey, g_0.intkey FROM BQT2.SmallB AS g_0", //$NON-NLS-1$
+ dataManager.addData("SELECT g_0.StringKey, g_0.IntKey FROM BQT2.SmallB AS g_0", //$NON-NLS-1$
new List[] { Arrays.asList(new Object[] { "1t", 1 }), //$NON-NLS-1$
Arrays.asList(new Object[] { "2t", 2 })}); //$NON-NLS-1$
- dataManager.addData("SELECT g_0.stringkey, g_0.intkey FROM BQT1.SmallA AS g_0 WHERE g_0.intkey IN (1, 2)", //$NON-NLS-1$
+ dataManager.addData("SELECT g_0.StringKey, g_0.IntKey FROM BQT1.SmallA AS g_0 WHERE g_0.IntKey IN (1, 2)", //$NON-NLS-1$
new List[] { Arrays.asList(new Object[] { "1", 1 })}); //$NON-NLS-1$
Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestMaterialization.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestMaterialization.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestMaterialization.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -68,9 +68,9 @@
globalStore = new GlobalTableStoreImpl(bm, actualMetadata);
metadata = new TempMetadataAdapter(actualMetadata, tempStore.getMetadataStore());
hdm = new HardcodedDataManager();
- hdm.addData("SELECT matsrc.x FROM matsrc", new List[] {Arrays.asList((String)null), Arrays.asList("one"), Arrays.asList("two"), Arrays.asList("three")});
- hdm.addData("SELECT MATTABLE.INFO.E1, MATTABLE.INFO.E2 FROM MATTABLE.INFO", new List[] {Arrays.asList("a", 1), Arrays.asList("a", 2)});
- hdm.addData("SELECT MATTABLE.INFO.E2, MATTABLE.INFO.E1 FROM MATTABLE.INFO", new List[] {Arrays.asList(1, "a"), Arrays.asList(2, "a")});
+ hdm.addData("SELECT MatSrc.MatSrc.x FROM MatSrc.MatSrc", new List[] {Arrays.asList((String)null), Arrays.asList("one"), Arrays.asList("two"), Arrays.asList("three")});
+ hdm.addData("SELECT MatTable.info.e1, MatTable.info.e2 FROM MatTable.info", new List[] {Arrays.asList("a", 1), Arrays.asList("a", 2)});
+ hdm.addData("SELECT MatTable.info.e2, MatTable.info.e1 FROM MatTable.info", new List[] {Arrays.asList(1, "a"), Arrays.asList(2, "a")});
SessionAwareCache<CachedResults> cache = new SessionAwareCache<CachedResults>();
cache.setTupleBufferCache(bm);
Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -5759,9 +5759,9 @@
"WHERE SMALLA.INTKEY = SMALLB.INTKEY AND SMALLA.INTKEY = MEDIUMA.INTKEY) AS X " + //$NON-NLS-1$
"WHERE X.NEWFIELD = -3"; //$NON-NLS-1$
- String expectedAtomic1 = "SELECT BQT1.SMALLB.INTKEY, BQT1.SMALLB.INTNUM FROM BQT1.SMALLB"; //$NON-NLS-1$
- String expectedAtomic2 = "SELECT BQT1.MEDIUMA.INTKEY FROM BQT1.MEDIUMA"; //$NON-NLS-1$
- String expectedAtomic3 = "SELECT BQT1.SMALLA.INTKEY, BQT1.SMALLA.STRINGNUM FROM BQT1.SMALLA"; //$NON-NLS-1$
+ String expectedAtomic1 = "SELECT BQT1.SmallB.IntKey, BQT1.SmallB.IntNum FROM BQT1.SmallB"; //$NON-NLS-1$
+ String expectedAtomic2 = "SELECT BQT1.MediumA.IntKey FROM BQT1.MediumA"; //$NON-NLS-1$
+ String expectedAtomic3 = "SELECT BQT1.SmallA.IntKey, BQT1.SmallA.StringNum FROM BQT1.SmallA"; //$NON-NLS-1$
// Plan query
@@ -5853,14 +5853,14 @@
Arrays.asList(new Object[] { "2", new Integer(2), new Integer(6) }), //$NON-NLS-1$
Arrays.asList(new Object[] { "3", new Integer(3), new Integer(7) }), //$NON-NLS-1$
};
- dataManager.addData("SELECT BQT1.SmallA.stringkey, BQT1.SmallA.intkey, BQT1.SmallA.intnum FROM BQT1.SmallA", data1); //$NON-NLS-1$
+ dataManager.addData("SELECT BQT1.SmallA.StringKey, BQT1.SmallA.IntKey, BQT1.SmallA.IntNum FROM BQT1.SmallA", data1); //$NON-NLS-1$
List[] data2 = new List[] {
Arrays.asList(new Object[] { "1" }), //$NON-NLS-1$
Arrays.asList(new Object[] { "2" }), //$NON-NLS-1$
Arrays.asList(new Object[] { "3" }), //$NON-NLS-1$
};
- dataManager.addData("SELECT BQT2.MediumB.stringkey FROM BQT2.MediumB", data2); //$NON-NLS-1$
+ dataManager.addData("SELECT BQT2.MediumB.StringKey FROM BQT2.MediumB", data2); //$NON-NLS-1$
// Run query
List[] expectedResults = new List[] {
@@ -6245,9 +6245,9 @@
// Construct data manager with data
HardcodedDataManager dataManager = new HardcodedDataManager();
- dataManager.addData("SELECT g_0.intkey, g_0.intnum FROM BQT2.SmallA AS g_0", //$NON-NLS-1$
+ dataManager.addData("SELECT g_0.IntKey, g_0.IntNum FROM BQT2.SmallA AS g_0", //$NON-NLS-1$
new List[] { Arrays.asList(new Object[] { new Integer(1), new Integer(1) })});
- dataManager.addData("SELECT g_1.intnum AS c_0, 1 AS c_1 FROM BQT1.SmallA AS g_1 UNION ALL SELECT g_0.IntKey AS c_0, g_0.IntNum AS c_1 FROM BQT1.SmallA AS g_0", //$NON-NLS-1$
+ dataManager.addData("SELECT g_1.IntNum AS c_0, 1 AS c_1 FROM BQT1.SmallA AS g_1 UNION ALL SELECT g_0.IntKey AS c_0, g_0.IntNum AS c_1 FROM BQT1.SmallA AS g_0", //$NON-NLS-1$
new List[] { Arrays.asList(new Object[] { new Integer(1), new Integer(1) }),
Arrays.asList(new Object[] { new Integer(1), new Integer(1) })});
helpProcess(plan, dataManager, expected);
@@ -7083,7 +7083,7 @@
// Plan query
ProcessorPlan plan = TestOptimizer.helpPlan(sql, RealMetadataFactory.exampleBQTCached(),
- new String[] {"SELECT b.intkey FROM bqt2.SMALLA AS b", "SELECT a.intkey FROM bqt1.smalla AS a"}, new DefaultCapabilitiesFinder(), ComparisonMode.CORRECTED_COMMAND_STRING); //$NON-NLS-1$ //$NON-NLS-2$
+ new String[] {"SELECT b.IntKey FROM bqt2.SMALLA AS b", "SELECT a.IntKey FROM bqt1.smalla AS a"}, new DefaultCapabilitiesFinder(), ComparisonMode.CORRECTED_COMMAND_STRING); //$NON-NLS-1$ //$NON-NLS-2$
TestOptimizer.checkNodeTypes(plan, new int[] {
2, // Access
Modified: trunk/engine/src/test/java/org/teiid/query/unittest/RealMetadataFactory.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/unittest/RealMetadataFactory.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/engine/src/test/java/org/teiid/query/unittest/RealMetadataFactory.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -42,8 +42,8 @@
import org.teiid.core.types.DataTypeManager.DefaultDataClasses;
import org.teiid.core.types.DataTypeManager.DefaultDataTypes;
import org.teiid.dqp.internal.process.DQPWorkContext;
+import org.teiid.metadata.*;
import org.teiid.metadata.BaseColumn.NullType;
-import org.teiid.metadata.*;
import org.teiid.metadata.Column.SearchType;
import org.teiid.metadata.ProcedureParameter.Type;
import org.teiid.metadata.Table.TriggerEvent;
@@ -51,7 +51,14 @@
import org.teiid.query.function.SystemFunctionManager;
import org.teiid.query.function.UDFSource;
import org.teiid.query.mapping.relational.QueryNode;
-import org.teiid.query.mapping.xml.*;
+import org.teiid.query.mapping.xml.MappingAttribute;
+import org.teiid.query.mapping.xml.MappingDocument;
+import org.teiid.query.mapping.xml.MappingElement;
+import org.teiid.query.mapping.xml.MappingNode;
+import org.teiid.query.mapping.xml.MappingOutputter;
+import org.teiid.query.mapping.xml.MappingSequenceNode;
+import org.teiid.query.mapping.xml.MappingVisitor;
+import org.teiid.query.mapping.xml.Navigator;
import org.teiid.query.metadata.CompositeMetadataStore;
import org.teiid.query.metadata.QueryMetadataInterface;
import org.teiid.query.metadata.TransformationMetadata;
@@ -364,7 +371,7 @@
Table physGroup_virtSrc = createPhysicalGroup("MatSrc", physModel_virtSrc); //$NON-NLS-1$
createElements(physGroup_virtSrc,
- new String[] { "X" }, //$NON-NLS-1$
+ new String[] { "x" }, //$NON-NLS-1$
new String[] { DataTypeManager.DefaultDataTypes.STRING});
QueryNode virtTrans = new QueryNode("SELECT x as e1 FROM MatSrc.MatSrc"); //$NON-NLS-1$ //$NON-NLS-2$
Modified: trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestTPCR.java
===================================================================
--- trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestTPCR.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestTPCR.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -63,7 +63,7 @@
Arrays.asList(new Object[] { new Double(3459808.0), new BigDecimal("405838.6989"), TimestampUtil.createDate(95, 2, 4), new Double(0.0) }), //$NON-NLS-1$
Arrays.asList(new Object[] { new Double(492164.0), new BigDecimal("390324.0610"), TimestampUtil.createDate(95, 1, 19), new Double(0.0) }) }; //$NON-NLS-1$
- dataMgr.addData("SELECT g_2.l_orderkey AS c_0, SUM((g_2.l_extendedprice * (1 - g_2.l_discount))) AS c_1, g_1.o_orderdate AS c_2, g_1.o_shippriority AS c_3 FROM TPCR_Oracle_9i.CUSTOMER AS g_0, TPCR_Oracle_9i.ORDERS AS g_1, TPCR_Oracle_9i.LINEITEM AS g_2 WHERE (g_0.c_custkey = g_1.o_custkey) AND (g_2.l_orderkey = g_1.o_orderkey) AND (g_0.c_mktsegment = 'BUILDING') AND (g_1.o_orderdate < {d'1995-03-15'}) AND (g_2.l_shipdate > {ts'1995-03-15 00:00:00.0'}) GROUP BY g_2.l_orderkey, g_1.o_orderdate, g_1.o_shippriority ORDER BY c_1 DESC NULLS LAST, c_2 NULLS FIRST", //$NON-NLS-1$
+ dataMgr.addData("SELECT g_2.L_ORDERKEY AS c_0, SUM((g_2.L_EXTENDEDPRICE * (1 - g_2.L_DISCOUNT))) AS c_1, g_1.O_ORDERDATE AS c_2, g_1.O_SHIPPRIORITY AS c_3 FROM TPCR_Oracle_9i.CUSTOMER AS g_0, TPCR_Oracle_9i.ORDERS AS g_1, TPCR_Oracle_9i.LINEITEM AS g_2 WHERE (g_0.C_CUSTKEY = g_1.O_CUSTKEY) AND (g_2.L_ORDERKEY = g_1.O_ORDERKEY) AND (g_0.C_MKTSEGMENT = 'BUILDING') AND (g_1.O_ORDERDATE < {d'1995-03-15'}) AND (g_2.L_SHIPDATE > {ts'1995-03-15 00:00:00.0'}) GROUP BY g_2.L_ORDERKEY, g_1.O_ORDERDATE, g_1.O_SHIPPRIORITY ORDER BY c_1 DESC NULLS LAST, c_2 NULLS FIRST", //$NON-NLS-1$
expected);
doProcess(METADATA,
Modified: trunk/test-integration/common/src/test/java/org/teiid/jdbc/TestLocalConnections.java
===================================================================
--- trunk/test-integration/common/src/test/java/org/teiid/jdbc/TestLocalConnections.java 2012-07-09 14:31:47 UTC (rev 4226)
+++ trunk/test-integration/common/src/test/java/org/teiid/jdbc/TestLocalConnections.java 2012-07-09 18:59:20 UTC (rev 4227)
@@ -295,7 +295,7 @@
Statement s;
try {
s = c.createStatement();
- assertTrue(s.execute("select part_id from parts union all select part_id from parts"));
+ assertTrue(s.execute("select part_id from parts union all select part_name from parts"));
ResultSet r = s.getResultSet();
//wake up the other source thread, should put the requestworkitem into the more work state
13 years, 9 months
teiid SVN: r4226 - in branches/7.4.x/engine/src: test/java/org/teiid/query/optimizer and 1 other directory.
by teiid-commits@lists.jboss.org
Author: jolee
Date: 2012-07-09 10:31:47 -0400 (Mon, 09 Jul 2012)
New Revision: 4226
Modified:
branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushSelectCriteria.java
branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
Log:
TEIID-2093: MAKEDEP causes AssertionError (backport for 7.4.x)
Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushSelectCriteria.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushSelectCriteria.java 2012-07-08 20:12:37 UTC (rev 4225)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushSelectCriteria.java 2012-07-09 14:31:47 UTC (rev 4226)
@@ -40,6 +40,7 @@
import org.teiid.query.optimizer.relational.OptimizerRule;
import org.teiid.query.optimizer.relational.RuleStack;
import org.teiid.query.optimizer.relational.plantree.NodeConstants;
+import org.teiid.query.optimizer.relational.plantree.NodeConstants.Info;
import org.teiid.query.optimizer.relational.plantree.NodeEditor;
import org.teiid.query.optimizer.relational.plantree.NodeFactory;
import org.teiid.query.optimizer.relational.plantree.PlanNode;
@@ -113,7 +114,7 @@
boolean moved = false;
- if((critNode.getGroups().isEmpty() && critNode.getSubqueryContainers().isEmpty()) || !atBoundary(critNode, sourceNode)) {
+ if(critNode.hasBooleanProperty(Info.IS_PUSHED) || (critNode.getGroups().isEmpty() && critNode.getSubqueryContainers().isEmpty()) || !atBoundary(critNode, sourceNode)) {
deadNodes.add(critNode);
continue;
}
Modified: branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
===================================================================
--- branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java 2012-07-08 20:12:37 UTC (rev 4225)
+++ branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java 2012-07-09 14:31:47 UTC (rev 4226)
@@ -6286,7 +6286,7 @@
String sql = "select a.e1 from (select 1 e1) a, (select e1, 1 as a, x from (select e1, CASE WHEN e1 = 'a' THEN e2 ELSE e3 END as x from pm1.g2) y group by e1, x) b where a.e1 = b.x"; //$NON-NLS-1$
ProcessorPlan plan = helpPlan(sql, metadata, null, capFinder,
- new String[] {"SELECT v_1.c_0 FROM (SELECT v_0.c_1 AS c_0 FROM (SELECT g_0.e1 AS c_0, CASE WHEN g_0.e1 = 'a' THEN g_0.e2 ELSE g_0.e3 END AS c_1 FROM pm1.g2 AS g_0 WHERE CASE WHEN g_0.e1 = 'a' THEN g_0.e2 ELSE g_0.e3 END IN (<dependent values>)) AS v_0 GROUP BY v_0.c_0, v_0.c_1) AS v_1 ORDER BY c_0"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
+ new String[] {"SELECT v_1.c_0 FROM (SELECT v_0.c_1 AS c_0 FROM (SELECT g_0.e1 AS c_0, CASE WHEN g_0.e1 = 'a' THEN g_0.e2 ELSE g_0.e3 END AS c_1 FROM pm1.g2 AS g_0) AS v_0 GROUP BY v_0.c_0, v_0.c_1) AS v_1 WHERE v_1.c_0 IN (<dependent values>) ORDER BY c_0"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
checkNodeTypes(plan, new int[] {
0, // Access
13 years, 9 months
teiid SVN: r4225 - in trunk/engine/src/main/java/org/teiid/query: processor/relational and 1 other directory.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2012-07-08 16:12:37 -0400 (Sun, 08 Jul 2012)
New Revision: 4225
Removed:
trunk/engine/src/main/java/org/teiid/query/processor/relational/SourceNode.java
Modified:
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/SelectNode.java
Log:
TEIID-2094 fix for projection issue
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java 2012-07-08 12:06:55 UTC (rev 4224)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java 2012-07-08 20:12:37 UTC (rev 4225)
@@ -398,6 +398,8 @@
SelectNode selnode = new SelectNode(getID());
selnode.setCriteria(crit);
+ //in case the parent was a source
+ selnode.setProjectedExpressions((List<Expression>) node.getProperty(NodeConstants.Info.PROJECT_COLS));
processNode = selnode;
break;
@@ -489,19 +491,12 @@
if(symbolMap != null) {
PlanNode child = node.getLastChild();
- if (node.getParent().getType() == NodeConstants.Types.PROJECT
- && node.getParent().getProperty(NodeConstants.Info.INTO_GROUP) != null) {
- return null;
- }
- if (child.getType() == NodeConstants.Types.PROJECT) {
+ if (child.getType() == NodeConstants.Types.PROJECT
+ || child.getType() == NodeConstants.Types.SELECT) {
//update the project cols based upon the original output
child.setProperty(NodeConstants.Info.PROJECT_COLS, child.getProperty(NodeConstants.Info.OUTPUT_COLS));
- child.setProperty(NodeConstants.Info.OUTPUT_COLS, node.getProperty(NodeConstants.Info.OUTPUT_COLS));
- return null;
}
- //TODO: vet the other node types for how they project, specifically select/join/windowfunctionproject nodes cannot have their elements modified
- processNode = new SourceNode(getID());
- break;
+ child.setProperty(NodeConstants.Info.OUTPUT_COLS, node.getProperty(NodeConstants.Info.OUTPUT_COLS));
}
return null;
case NodeConstants.Types.SET_OP:
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/SelectNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/SelectNode.java 2012-07-08 12:06:55 UTC (rev 4224)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/SelectNode.java 2012-07-08 20:12:37 UTC (rev 4225)
@@ -39,15 +39,17 @@
import org.teiid.query.processor.ProcessorDataManager;
import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.lang.Criteria;
+import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.util.CommandContext;
public class SelectNode extends SubqueryAwareRelationalNode {
private Criteria criteria;
+ private List<Expression> projectedExpressions;
// Derived element lookup map
- private Map elementMap;
+ private Map<Expression, Integer> elementMap;
private int[] projectionIndexes;
// State if blocked on evaluating a criteria
@@ -77,6 +79,10 @@
return this.criteria;
}
+ public void setProjectedExpressions(List<Expression> projectedExpressions) {
+ this.projectedExpressions = projectedExpressions;
+ }
+
@Override
public void initialize(CommandContext context, BufferManager bufferManager,
ProcessorDataManager dataMgr) {
@@ -84,7 +90,7 @@
// Create element lookup map for evaluating project expressions
if(this.elementMap == null) {
this.elementMap = createLookupMap(this.getChildren()[0].getElements());
- this.projectionIndexes = getProjectionIndexes(this.elementMap, getElements());
+ this.projectionIndexes = getProjectionIndexes(this.elementMap, projectedExpressions!=null?projectedExpressions:getElements());
}
}
@@ -133,6 +139,7 @@
target.criteria = criteria;
target.elementMap = source.elementMap;
target.projectionIndexes = source.projectionIndexes;
+ target.projectedExpressions = source.projectedExpressions;
}
public PlanNode getDescriptionProperties() {
Deleted: trunk/engine/src/main/java/org/teiid/query/processor/relational/SourceNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/SourceNode.java 2012-07-08 12:06:55 UTC (rev 4224)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/SourceNode.java 2012-07-08 20:12:37 UTC (rev 4225)
@@ -1,50 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership. Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.query.processor.relational;
-
-import org.teiid.common.buffer.BlockedException;
-import org.teiid.common.buffer.TupleBatch;
-import org.teiid.core.TeiidComponentException;
-import org.teiid.core.TeiidProcessingException;
-
-public class SourceNode extends RelationalNode {
- protected SourceNode() {
- }
-
- public SourceNode(int id) {
- super(id);
- }
-
- @Override
- protected TupleBatch nextBatchDirect() throws BlockedException,
- TeiidComponentException, TeiidProcessingException {
- return getChildren()[0].nextBatch();
- }
-
- @Override
- public Object clone() {
- SourceNode clone = new SourceNode();
- clone.copy(this, clone);
- return clone;
- }
-}
\ No newline at end of file
13 years, 9 months
teiid SVN: r4224 - in trunk/engine/src: main/java/org/teiid/query/processor/relational and 1 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2012-07-08 08:06:55 -0400 (Sun, 08 Jul 2012)
New Revision: 4224
Added:
trunk/engine/src/main/java/org/teiid/query/processor/relational/SourceNode.java
Modified:
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
trunk/engine/src/test/java/org/teiid/query/processor/TestDependentJoins.java
Log:
TEIID-2094 fix for projection issue
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java 2012-07-05 20:35:48 UTC (rev 4223)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java 2012-07-08 12:06:55 UTC (rev 4224)
@@ -449,18 +449,6 @@
break;
case NodeConstants.Types.SOURCE:
- SymbolMap symbolMap = (SymbolMap) node.getProperty(NodeConstants.Info.SYMBOL_MAP);
- if(symbolMap != null) {
- PlanNode child = node.getLastChild();
-
- if (node.getParent().getType() != NodeConstants.Types.PROJECT || node.getParent().getProperty(NodeConstants.Info.INTO_GROUP) == null) {
- if (child.getType() == NodeConstants.Types.PROJECT) {
- //update the project cols based upon the original output
- child.setProperty(NodeConstants.Info.PROJECT_COLS, child.getProperty(NodeConstants.Info.OUTPUT_COLS));
- }
- child.setProperty(NodeConstants.Info.OUTPUT_COLS, node.getProperty(NodeConstants.Info.OUTPUT_COLS));
- }
- }
Object source = node.getProperty(NodeConstants.Info.TABLE_FUNCTION);
if (source instanceof XMLTable) {
XMLTable xt = (XMLTable)source;
@@ -497,6 +485,24 @@
processNode = atn;
break;
}
+ SymbolMap symbolMap = (SymbolMap) node.getProperty(NodeConstants.Info.SYMBOL_MAP);
+ if(symbolMap != null) {
+ PlanNode child = node.getLastChild();
+
+ if (node.getParent().getType() == NodeConstants.Types.PROJECT
+ && node.getParent().getProperty(NodeConstants.Info.INTO_GROUP) != null) {
+ return null;
+ }
+ if (child.getType() == NodeConstants.Types.PROJECT) {
+ //update the project cols based upon the original output
+ child.setProperty(NodeConstants.Info.PROJECT_COLS, child.getProperty(NodeConstants.Info.OUTPUT_COLS));
+ child.setProperty(NodeConstants.Info.OUTPUT_COLS, node.getProperty(NodeConstants.Info.OUTPUT_COLS));
+ return null;
+ }
+ //TODO: vet the other node types for how they project, specifically select/join/windowfunctionproject nodes cannot have their elements modified
+ processNode = new SourceNode(getID());
+ break;
+ }
return null;
case NodeConstants.Types.SET_OP:
Operation setOp = (Operation) node.getProperty(NodeConstants.Info.SET_OPERATION);
Added: trunk/engine/src/main/java/org/teiid/query/processor/relational/SourceNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/SourceNode.java (rev 0)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/SourceNode.java 2012-07-08 12:06:55 UTC (rev 4224)
@@ -0,0 +1,50 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.query.processor.relational;
+
+import org.teiid.common.buffer.BlockedException;
+import org.teiid.common.buffer.TupleBatch;
+import org.teiid.core.TeiidComponentException;
+import org.teiid.core.TeiidProcessingException;
+
+public class SourceNode extends RelationalNode {
+ protected SourceNode() {
+ }
+
+ public SourceNode(int id) {
+ super(id);
+ }
+
+ @Override
+ protected TupleBatch nextBatchDirect() throws BlockedException,
+ TeiidComponentException, TeiidProcessingException {
+ return getChildren()[0].nextBatch();
+ }
+
+ @Override
+ public Object clone() {
+ SourceNode clone = new SourceNode();
+ clone.copy(this, clone);
+ return clone;
+ }
+}
\ No newline at end of file
Property changes on: trunk/engine/src/main/java/org/teiid/query/processor/relational/SourceNode.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestDependentJoins.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestDependentJoins.java 2012-07-05 20:35:48 UTC (rev 4223)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestDependentJoins.java 2012-07-08 12:06:55 UTC (rev 4224)
@@ -97,7 +97,47 @@
// Run query
TestProcessor.helpProcess(plan, dataManager, expected);
}
+
+ @Test public void testDependentView() {
+ String sql = "SELECT v.e1 FROM (select distinct e1 from pm1.g1) as v, pm2.g1 WHERE v.e1=pm2.g1.e1 order by v.e1 option makedep v"; //$NON-NLS-1$
+
+ List[] expected = new List[] {
+ Arrays.asList(new Object[] { "a" }), //$NON-NLS-1$
+ Arrays.asList(new Object[] { "a" }), //$NON-NLS-1$
+ Arrays.asList(new Object[] { "a" }), //$NON-NLS-1$
+ Arrays.asList(new Object[] { "b" }), //$NON-NLS-1$
+ Arrays.asList(new Object[] { "c" }) //$NON-NLS-1$
+ };
+
+ FakeDataManager dataManager = new FakeDataManager();
+ TestProcessor.sampleData1(dataManager);
+
+ ProcessorPlan plan = TestProcessor.helpGetPlan(sql, RealMetadataFactory.example1Cached());
+ TestProcessor.helpProcess(plan, dataManager, expected);
+ }
+
+ /**
+ * specific test for TEIID-2094
+ */
+ @Test public void testDependentView1() {
+ String sql = "SELECT v.e1 FROM (select distinct e1 from pm1.g1) as v, pm2.g1 WHERE v.e1=pm2.g1.e1 order by v.e1 option makedep v"; //$NON-NLS-1$
+
+ List[] expected = new List[] {
+ Arrays.asList(new Object[] { "a" }), //$NON-NLS-1$
+ };
+
+ HardcodedDataManager dataManager = new HardcodedDataManager(RealMetadataFactory.example1Cached());
+ dataManager.addData("SELECT g_0.e1 AS c_0 FROM g1 AS g_0 ORDER BY c_0", new List<?>[] {Arrays.asList("a")});
+ dataManager.addData("SELECT v_0.c_0 FROM (SELECT DISTINCT g_0.e1 AS c_0 FROM g1 AS g_0) AS v_0 WHERE v_0.c_0 = 'a'", new List<?>[] {Arrays.asList("a")});
+
+ BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
+ caps.setCapabilitySupport(Capability.QUERY_FROM_INLINE_VIEWS, true);
+ ProcessorPlan plan = TestProcessor.helpGetPlan(sql, RealMetadataFactory.example1Cached(), new DefaultCapabilitiesFinder(caps));
+
+ TestProcessor.helpProcess(plan, dataManager, expected);
+ }
+
/** SELECT pm1.g1.e1 FROM pm1.g1, pm2.g1 WHERE pm2.g1.e1=pm1.g1.e1 AND pm1.g1.e2=pm2.g1.e2 */
@Test public void testMultiCritDepJoin2() {
// Create query
13 years, 9 months