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() {
12 years, 8 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 {
12 years, 8 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
12 years, 8 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);
}
12 years, 8 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
12 years, 8 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
12 years, 8 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
12 years, 8 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
12 years, 8 months
teiid SVN: r4223 - in trunk: engine/src/main/java/org/teiid/query/eval and 4 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2012-07-05 16:35:48 -0400 (Thu, 05 Jul 2012)
New Revision: 4223
Added:
trunk/engine/src/main/java/org/teiid/query/xquery/saxon/AbstractXMLStreamReader.java
trunk/engine/src/main/java/org/teiid/query/xquery/saxon/XMLEventStreamReader.java
Modified:
trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html
trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java
trunk/engine/src/main/java/org/teiid/query/function/source/SystemSource.java
trunk/engine/src/main/java/org/teiid/query/function/source/XMLSystemFunctions.java
trunk/engine/src/main/java/org/teiid/query/xquery/saxon/PathMapFilter.java
trunk/engine/src/main/java/org/teiid/query/xquery/saxon/SaxonXQueryExpression.java
trunk/engine/src/main/java/org/teiid/query/xquery/saxon/XQueryEvaluator.java
trunk/engine/src/test/java/org/teiid/query/function/source/TestXMLSystemFunctions.java
trunk/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java
Log:
TEIID-2092 allowing for streaming json processing
Modified: trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html
===================================================================
--- trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html 2012-07-05 15:43:21 UTC (rev 4222)
+++ trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html 2012-07-05 20:35:48 UTC (rev 4223)
@@ -28,6 +28,7 @@
<UL>
<li><B>VDB Reuse</B> a vdb.xml can now declare imported vdbs to reuse metadata.
<LI><B>Comparable Object</B> - the system property org.teiid.comparableObject can be set to use OBJECT values in comparison/sorting/grouping operations. It is expected that the object values correctly implement Comparable.compareTo.
+ <LI><B>Admin Metadata</B> - you can now retrieve metadata in DDL from the admin api via the getSchema method.
</UL>
<h2><a name="Compatibility">Compatibility Issues</a></h2>
@@ -48,6 +49,7 @@
<li>VDB.Status now has three states - LOADING, ACTIVE, REMOVED. To check for validity use the isValid method, rather than checking for the VALID state.
<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.
<ul>
<h4>from 7.x</h4>
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-05 15:43:21 UTC (rev 4222)
+++ trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java 2012-07-05 20:35:48 UTC (rev 4223)
@@ -77,6 +77,7 @@
import org.teiid.query.xquery.saxon.XQueryEvaluator;
import org.teiid.query.xquery.saxon.SaxonXQueryExpression.Result;
import org.teiid.query.xquery.saxon.SaxonXQueryExpression.RowProcessor;
+import org.teiid.translator.SourceSystemFunctions;
import org.teiid.translator.WSConnection.Util;
public class Evaluator {
@@ -872,7 +873,7 @@
TeiidComponentException {
Object contextItem = null;
for (DerivedColumn passing : cols) {
- Object value = this.evaluate(passing.getExpression(), tuple);
+ Object value = evaluateParameter(tuple, passing);
if (passing.getAlias() == null) {
contextItem = value;
} else {
@@ -882,6 +883,39 @@
return contextItem;
}
+ private Object evaluateParameter(List<?> tuple, DerivedColumn passing)
+ throws ExpressionEvaluationException, BlockedException,
+ TeiidComponentException {
+ if (passing.getExpression() instanceof Function) {
+ Function f = (Function)passing.getExpression();
+ //narrow optimization of json based documents to allow for lower overhead streaming
+ if (f.getFunctionDescriptor().getName().equalsIgnoreCase(SourceSystemFunctions.JSONTOXML)) {
+ String rootName = (String)this.evaluate(f.getArg(0), tuple);
+ Object lob = this.evaluate(f.getArg(1), tuple);
+ if (rootName == null || lob == null) {
+ return null;
+ }
+ try {
+ if (lob instanceof Blob) {
+ return XMLSystemFunctions.jsonToXml(context, rootName, (Blob)lob, true);
+ }
+ return XMLSystemFunctions.jsonToXml(context, rootName, (Clob)lob, true);
+ } catch (IOException e) {
+ throw new FunctionExecutionException(QueryPlugin.Event.TEIID30384, e, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30384, f.getFunctionDescriptor().getName()));
+ } catch (SQLException e) {
+ throw new FunctionExecutionException(QueryPlugin.Event.TEIID30384, e, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30384, f.getFunctionDescriptor().getName()));
+ } catch (TeiidProcessingException e) {
+ throw new FunctionExecutionException(QueryPlugin.Event.TEIID30384, e, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30384, f.getFunctionDescriptor().getName()));
+ }
+ }
+ } else if (passing.getExpression() instanceof XMLParse) {
+ XMLParse xmlParse = (XMLParse)passing.getExpression();
+ xmlParse.setWellFormed(true);
+ }
+ Object value = this.evaluate(passing.getExpression(), tuple);
+ return value;
+ }
+
private Evaluator.NameValuePair<Object>[] getNameValuePairs(List<?> tuple, List<DerivedColumn> args, boolean xmlNames)
throws ExpressionEvaluationException, BlockedException, TeiidComponentException {
Evaluator.NameValuePair<Object>[] nameValuePairs = new Evaluator.NameValuePair[args.size()];
Modified: trunk/engine/src/main/java/org/teiid/query/function/source/SystemSource.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/function/source/SystemSource.java 2012-07-05 15:43:21 UTC (rev 4222)
+++ trunk/engine/src/main/java/org/teiid/query/function/source/SystemSource.java 2012-07-05 20:35:48 UTC (rev 4223)
@@ -974,6 +974,12 @@
new FunctionParameter("document", DataTypeManager.DefaultDataTypes.CLOB, QueryPlugin.Util.getString("SystemSource.xpath_param1")), //$NON-NLS-1$ //$NON-NLS-2$
new FunctionParameter("xpath", DataTypeManager.DefaultDataTypes.STRING, QueryPlugin.Util.getString("SystemSource.xpath_param2"))}, //$NON-NLS-1$ //$NON-NLS-2$
new FunctionParameter("result", DataTypeManager.DefaultDataTypes.STRING, QueryPlugin.Util.getString("SystemSource.xpathvalue_result")) ) ); //$NON-NLS-1$ //$NON-NLS-2$
+
+ functions.add(new FunctionMethod(SourceSystemFunctions.XPATHVALUE, QueryPlugin.Util.getString("SystemSource.xpathvalue_description"), XML, XML_FUNCTION_CLASS, "xpathValue", //$NON-NLS-1$ //$NON-NLS-2$
+ new FunctionParameter[] {
+ new FunctionParameter("document", DataTypeManager.DefaultDataTypes.BLOB, QueryPlugin.Util.getString("SystemSource.xpath_param1")), //$NON-NLS-1$ //$NON-NLS-2$
+ new FunctionParameter("xpath", DataTypeManager.DefaultDataTypes.STRING, QueryPlugin.Util.getString("SystemSource.xpath_param2"))}, //$NON-NLS-1$ //$NON-NLS-2$
+ new FunctionParameter("result", DataTypeManager.DefaultDataTypes.STRING, QueryPlugin.Util.getString("SystemSource.xpathvalue_result")) ) ); //$NON-NLS-1$ //$NON-NLS-2$
functions.add(new FunctionMethod(SourceSystemFunctions.XPATHVALUE, QueryPlugin.Util.getString("SystemSource.xpathvalue_description"), XML, XML_FUNCTION_CLASS, "xpathValue", //$NON-NLS-1$ //$NON-NLS-2$
new FunctionParameter[] {
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-05 15:43:21 UTC (rev 4222)
+++ trunk/engine/src/main/java/org/teiid/query/function/source/XMLSystemFunctions.java 2012-07-05 20:35:48 UTC (rev 4223)
@@ -47,18 +47,19 @@
import javax.xml.namespace.QName;
import javax.xml.stream.EventFilter;
import javax.xml.stream.FactoryConfigurationError;
+import javax.xml.stream.Location;
import javax.xml.stream.XMLEventFactory;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
import javax.xml.stream.events.XMLEvent;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stax.StAXSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.xpath.XPathExpressionException;
@@ -83,6 +84,7 @@
import org.teiid.common.buffer.FileStoreInputStreamFactory;
import org.teiid.core.TeiidComponentException;
import org.teiid.core.TeiidProcessingException;
+import org.teiid.core.TeiidRuntimeException;
import org.teiid.core.types.ClobImpl;
import org.teiid.core.types.ClobType;
import org.teiid.core.types.SQLXMLImpl;
@@ -90,6 +92,7 @@
import org.teiid.core.types.XMLTranslator;
import org.teiid.core.types.XMLType;
import org.teiid.core.types.XMLType.Type;
+import org.teiid.jdbc.TeiidSQLException;
import org.teiid.query.QueryPlugin;
import org.teiid.query.eval.Evaluator;
import org.teiid.query.function.CharsetUtils;
@@ -110,50 +113,54 @@
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$
- //TODO: this could be done fully streaming without holding the intermediate xml output
private static final class JsonToXmlContentHandler implements
- ContentHandler {
- private final XMLStreamWriter streamWriter;
+ ContentHandler, XMLEventReader {
+ private Reader reader;
+ private JSONParser parser;
+ private XMLEventFactory eventFactory;
+
+ private LinkedList<String> nameStack = new LinkedList<String>();
+ private LinkedList<XMLEvent> eventStack = new LinkedList<XMLEvent>();
+
private boolean rootArray;
- private LinkedList<String> nameStack = new LinkedList<String>();
+ private boolean end;
+ private boolean declaredNs;
private JsonToXmlContentHandler(String rootName,
- XMLStreamWriter streamWriter) {
- this.streamWriter = streamWriter;
- this.nameStack.push(rootName);
+ Reader reader, JSONParser parser, XMLEventFactory eventFactory) {
+ this.nameStack.push(escapeName(rootName, true));
+ this.reader = reader;
+ this.eventFactory = eventFactory;
+ this.parser = parser;
}
@Override
public boolean startObjectEntry(String key)
throws org.json.simple.parser.ParseException, IOException {
- this.nameStack.push(key);
- return true;
+ this.nameStack.push(escapeName(key, true));
+ return false;
}
@Override
public boolean startObject() throws org.json.simple.parser.ParseException,
IOException {
start();
- return true;
+ return false;
}
- private void start()
- throws IOException {
- try {
- streamWriter.writeStartElement(escapeName(this.nameStack.peek(), true));
- } catch (XMLStreamException e) {
- throw new IOException(e);
+ private void start() {
+ eventStack.add(eventFactory.createStartElement("", "", nameStack.peek())); //$NON-NLS-1$ //$NON-NLS-2$
+ if (!declaredNs) {
+ eventStack.add(eventFactory.createNamespace("xsi", XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI)); //$NON-NLS-1$
+ declaredNs = true;
}
}
@Override
public void startJSON() throws org.json.simple.parser.ParseException,
IOException {
- try {
- streamWriter.writeStartDocument();
- } catch (XMLStreamException e) {
- throw new IOException(e);
- }
+ //specify the defaults, since different providers emit/omit differently
+ eventStack.add(eventFactory.createStartDocument("UTF-8", "1.0")); //$NON-NLS-1$ //$NON-NLS-2$
}
@Override
@@ -163,58 +170,55 @@
this.rootArray = true;
start();
}
- return true;
+ return false;
}
@Override
public boolean primitive(Object value)
throws org.json.simple.parser.ParseException, IOException {
start();
- try {
- if (value != null) {
- streamWriter.writeCharacters(value.toString());
- } else {
- streamWriter.writeNamespace("xsi", XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI); //$NON-NLS-1$
- streamWriter.writeAttribute("xsi", XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "nil", "true"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ if (value != null) {
+ String type = "decimal"; //$NON-NLS-1$
+ if (value instanceof String) {
+ type = null;
+ } else if (value instanceof Boolean) {
+ type = "boolean"; //$NON-NLS-1$
}
- } catch (XMLStreamException e) {
- throw new IOException(e);
+ if (type != null) {
+ //we need to differentiate boolean/decimal entries from their string counter parts
+ eventStack.add(eventFactory.createAttribute("xsi", XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "type", type)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ eventStack.add(eventFactory.createCharacters(value.toString()));
+ } else {
+ eventStack.add(eventFactory.createAttribute("xsi", XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "nil", "true")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
end();
- return true;
+ return true; //return true, otherwise we don't get the endObjectEntry
}
- private void end()
- throws IOException {
- try {
- streamWriter.writeEndElement();
- } catch (XMLStreamException e) {
- throw new IOException(e);
- }
+ private void end() {
+ eventStack.add(eventFactory.createEndElement("", "", nameStack.peek())); //$NON-NLS-1$ //$NON-NLS-2$
}
@Override
public boolean endObjectEntry()
throws org.json.simple.parser.ParseException, IOException {
this.nameStack.pop();
- return true;
+ return false;
}
@Override
public boolean endObject() throws org.json.simple.parser.ParseException,
IOException {
end();
- return true;
+ return false;
}
@Override
public void endJSON() throws org.json.simple.parser.ParseException,
IOException {
- try {
- streamWriter.writeEndDocument();
- } catch (XMLStreamException e) {
- throw new IOException(e);
- }
+ this.eventStack.add(eventFactory.createEndDocument());
+ end = true;
}
@Override
@@ -223,8 +227,76 @@
if (this.nameStack.size() == 1 && rootArray) {
end();
}
- return true;
+ return false;
}
+
+ @Override
+ public void close() throws XMLStreamException {
+ try {
+ //this is explicitly against the javadoc, but
+ //it's our only chance to close the reader
+ this.reader.close();
+ } catch (IOException e) {
+ }
+ }
+
+ @Override
+ public String getElementText() throws XMLStreamException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public Object getProperty(String name) throws IllegalArgumentException {
+ return null;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return !eventStack.isEmpty() || !end;
+ }
+
+ @Override
+ public XMLEvent nextEvent() throws XMLStreamException {
+ while (eventStack.isEmpty() && !end) {
+ try {
+ parser.parse(reader, this, true);
+ } catch (IOException e) {
+ throw new XMLStreamException(e);
+ } catch (ParseException e) {
+ throw new XMLStreamException(e);
+ }
+ }
+ return eventStack.remove();
+ }
+
+ @Override
+ public XMLEvent nextTag() throws XMLStreamException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public XMLEvent peek() throws XMLStreamException {
+ if (hasNext()) {
+ XMLEvent next = next();
+ this.eventStack.push(next);
+ return next;
+ }
+ return null;
+ }
+
+ @Override
+ public XMLEvent next() {
+ try {
+ return nextEvent();
+ } catch (XMLStreamException e) {
+ throw new TeiidRuntimeException(e);
+ }
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
}
private static ThreadLocal<TransformerFactory> threadLocalTransformerFactory = new ThreadLocal<TransformerFactory>() {
@@ -239,8 +311,13 @@
};
static ThreadLocal<XMLEventFactory> threadLocalEventtFactory = new ThreadLocal<XMLEventFactory>() {
protected XMLEventFactory initialValue() {
- return XMLEventFactory.newInstance();
+ return XMLEventFactory.newFactory();
}
+ public XMLEventFactory get() {
+ XMLEventFactory eventFactory = super.get();
+ eventFactory.setLocation(null);
+ return eventFactory;
+ }
};
private static final String P_OUTPUT_VALIDATE_STRUCTURE = "com.ctc.wstx.outputValidateStructure"; //$NON-NLS-1$
static XMLOutputFactory newXmlOutputFactory() throws FactoryConfigurationError {
@@ -436,7 +513,7 @@
fs.remove();
throw new TeiidProcessingException(QueryPlugin.Event.TEIID30437, e);
}
- eventFactory = XMLEventFactory.newInstance();
+ eventFactory = threadLocalEventtFactory.get();
}
public void addValue(Object object) throws TeiidProcessingException {
@@ -712,6 +789,10 @@
}
public static SQLXML jsonToXml(CommandContext context, final String rootName, final Blob json) throws TeiidComponentException, TeiidProcessingException, SQLException, IOException {
+ return jsonToXml(context, rootName, json, false);
+ }
+
+ public static SQLXML jsonToXml(CommandContext context, final String rootName, final Blob json, boolean stream) throws TeiidComponentException, TeiidProcessingException, SQLException, IOException {
InputStream is = json.getBinaryStream();
PushbackInputStream pStream = new PushbackInputStream(is, 4);
byte[] encoding = new byte[3];
@@ -734,33 +815,81 @@
}
}
Reader r = new InputStreamReader(pStream, charset);
- return jsonToXml(context, rootName, r);
+ return jsonToXml(context, rootName, r, stream);
}
-
+
public static SQLXML jsonToXml(CommandContext context, final String rootName, final Clob json) throws TeiidComponentException, TeiidProcessingException, SQLException {
- return jsonToXml(context, rootName, json.getCharacterStream());
+ return jsonToXml(context, rootName, json, false);
}
-
+
+ public static SQLXML jsonToXml(CommandContext context, final String rootName, final Clob json, boolean stream) throws TeiidComponentException, TeiidProcessingException, SQLException {
+ return jsonToXml(context, rootName, json.getCharacterStream(), stream);
+ }
+
private static SQLXML jsonToXml(CommandContext context,
- final String rootName, final Reader r) throws TeiidComponentException,
+ final String rootName, final Reader r, boolean stream) throws TeiidComponentException,
TeiidProcessingException {
+ JSONParser parser = new JSONParser();
+ final JsonToXmlContentHandler reader = new JsonToXmlContentHandler(rootName, r, parser, threadLocalEventtFactory.get());
+
+ 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;
+ }
+ });
+ return new SQLXMLImpl() {
+ @SuppressWarnings("unchecked")
+ public <T extends Source> T getSource(Class<T> sourceClass) throws SQLException {
+ if (sourceClass == null || sourceClass == StAXSource.class) {
+ StAXSource source;
+ try {
+ source = new StAXSource(reader);
+ } catch (XMLStreamException e) {
+ throw TeiidSQLException.create(e);
+ }
+ return (T) source;
+ }
+ throw new AssertionError("unsupported source type"); //$NON-NLS-1$
+ }
+ };
+ }
XMLType result = new XMLType(XMLSystemFunctions.saveToBufferManager(context.getBufferManager(), new XMLTranslator() {
@Override
public void translate(Writer writer) throws TransformerException,
IOException {
try {
- JSONParser parser = new JSONParser();
XMLOutputFactory factory = getOutputFactory();
- final XMLStreamWriter streamWriter = factory.createXMLStreamWriter(writer);
-
- parser.parse(r, new JsonToXmlContentHandler(escapeName(rootName, true), streamWriter));
-
+ final XMLEventWriter streamWriter = factory.createXMLEventWriter(writer);
+
+ streamWriter.add(reader);
streamWriter.flush(); //woodstox needs a flush rather than a close
} catch (XMLStreamException e) {
throw new TransformerException(e);
- } catch (ParseException e) {
- throw new TransformerException(e);
} finally {
try {
r.close();
Added: trunk/engine/src/main/java/org/teiid/query/xquery/saxon/AbstractXMLStreamReader.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/xquery/saxon/AbstractXMLStreamReader.java (rev 0)
+++ trunk/engine/src/main/java/org/teiid/query/xquery/saxon/AbstractXMLStreamReader.java 2012-07-05 20:35:48 UTC (rev 4223)
@@ -0,0 +1,180 @@
+/*
+ * Copyright 2002-2009 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.teiid.query.xquery.saxon;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+/**
+ * Abstract base class for <code>XMLStreamReader</code>s.
+ *
+ * @author Arjen Poutsma
+ * @since 3.0
+ */
+abstract class AbstractXMLStreamReader implements XMLStreamReader {
+
+ public String getElementText() throws XMLStreamException {
+ if (getEventType() != XMLStreamConstants.START_ELEMENT) {
+ throw new XMLStreamException("parser must be on START_ELEMENT to read next text", getLocation());
+ }
+ int eventType = next();
+ StringBuilder builder = new StringBuilder();
+ while (eventType != XMLStreamConstants.END_ELEMENT) {
+ if (eventType == XMLStreamConstants.CHARACTERS || eventType == XMLStreamConstants.CDATA ||
+ eventType == XMLStreamConstants.SPACE || eventType == XMLStreamConstants.ENTITY_REFERENCE) {
+ builder.append(getText());
+ }
+ else if (eventType == XMLStreamConstants.PROCESSING_INSTRUCTION ||
+ eventType == XMLStreamConstants.COMMENT) {
+ // skipping
+ }
+ else if (eventType == XMLStreamConstants.END_DOCUMENT) {
+ throw new XMLStreamException("unexpected end of document when reading element text content",
+ getLocation());
+ }
+ else if (eventType == XMLStreamConstants.START_ELEMENT) {
+ throw new XMLStreamException("element text content may not contain START_ELEMENT", getLocation());
+ }
+ else {
+ throw new XMLStreamException("Unexpected event type " + eventType, getLocation());
+ }
+ eventType = next();
+ }
+ return builder.toString();
+ }
+
+ public String getAttributeLocalName(int index) {
+ return getAttributeName(index).getLocalPart();
+ }
+
+ public String getAttributeNamespace(int index) {
+ return getAttributeName(index).getNamespaceURI();
+ }
+
+ public String getAttributePrefix(int index) {
+ return getAttributeName(index).getPrefix();
+ }
+
+ public String getNamespaceURI() {
+ int eventType = getEventType();
+ if (eventType == XMLStreamConstants.START_ELEMENT || eventType == XMLStreamConstants.END_ELEMENT) {
+ return getName().getNamespaceURI();
+ }
+ else {
+ throw new IllegalStateException("parser must be on START_ELEMENT or END_ELEMENT state");
+ }
+ }
+
+ public String getNamespaceURI(String prefix) {
+ return getNamespaceContext().getNamespaceURI(prefix);
+ }
+
+ public boolean hasText() {
+ int eventType = getEventType();
+ return eventType == XMLStreamConstants.SPACE || eventType == XMLStreamConstants.CHARACTERS ||
+ eventType == XMLStreamConstants.COMMENT || eventType == XMLStreamConstants.CDATA ||
+ eventType == XMLStreamConstants.ENTITY_REFERENCE;
+ }
+
+ public String getPrefix() {
+ int eventType = getEventType();
+ if (eventType == XMLStreamConstants.START_ELEMENT || eventType == XMLStreamConstants.END_ELEMENT) {
+ return getName().getPrefix();
+ }
+ else {
+ throw new IllegalStateException("parser must be on START_ELEMENT or END_ELEMENT state");
+ }
+ }
+
+ public boolean hasName() {
+ int eventType = getEventType();
+ return eventType == XMLStreamConstants.START_ELEMENT || eventType == XMLStreamConstants.END_ELEMENT;
+ }
+
+ public boolean isWhiteSpace() {
+ return getEventType() == XMLStreamConstants.SPACE;
+ }
+
+ public boolean isStartElement() {
+ return getEventType() == XMLStreamConstants.START_ELEMENT;
+ }
+
+ public boolean isEndElement() {
+ return getEventType() == XMLStreamConstants.END_ELEMENT;
+ }
+
+ public boolean isCharacters() {
+ return getEventType() == XMLStreamConstants.CHARACTERS;
+ }
+
+ public int nextTag() throws XMLStreamException {
+ int eventType = next();
+ while (eventType == XMLStreamConstants.CHARACTERS && isWhiteSpace() ||
+ eventType == XMLStreamConstants.CDATA && isWhiteSpace() || eventType == XMLStreamConstants.SPACE ||
+ eventType == XMLStreamConstants.PROCESSING_INSTRUCTION || eventType == XMLStreamConstants.COMMENT) {
+ eventType = next();
+ }
+ if (eventType != XMLStreamConstants.START_ELEMENT && eventType != XMLStreamConstants.END_ELEMENT) {
+ throw new XMLStreamException("expected start or end tag", getLocation());
+ }
+ return eventType;
+ }
+
+ public void require(int expectedType, String namespaceURI, String localName) throws XMLStreamException {
+ int eventType = getEventType();
+ if (eventType != expectedType) {
+ throw new XMLStreamException("Expected [" + expectedType + "] but read [" + eventType + "]");
+ }
+ }
+
+ public String getAttributeValue(String namespaceURI, String localName) {
+ for (int i = 0; i < getAttributeCount(); i++) {
+ QName name = getAttributeName(i);
+ if (name.getLocalPart().equals(localName) &&
+ (namespaceURI == null || name.getNamespaceURI().equals(namespaceURI))) {
+ return getAttributeValue(i);
+ }
+ }
+ return null;
+ }
+
+ public boolean hasNext() throws XMLStreamException {
+ return getEventType() != END_DOCUMENT;
+ }
+
+ public String getLocalName() {
+ return getName().getLocalPart();
+ }
+
+ public char[] getTextCharacters() {
+ return getText().toCharArray();
+ }
+
+ public int getTextCharacters(int sourceStart, char[] target, int targetStart, int length)
+ throws XMLStreamException {
+ char[] source = getTextCharacters();
+ length = Math.min(length, source.length);
+ System.arraycopy(source, sourceStart, target, targetStart, length);
+ return length;
+ }
+
+ public int getTextLength() {
+ return getText().length();
+ }
+}
Property changes on: trunk/engine/src/main/java/org/teiid/query/xquery/saxon/AbstractXMLStreamReader.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/engine/src/main/java/org/teiid/query/xquery/saxon/PathMapFilter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/xquery/saxon/PathMapFilter.java 2012-07-05 15:43:21 UTC (rev 4222)
+++ trunk/engine/src/main/java/org/teiid/query/xquery/saxon/PathMapFilter.java 2012-07-05 20:35:48 UTC (rev 4223)
@@ -86,7 +86,7 @@
}
}
-
+ private boolean closed;
private LinkedList<MatchContext> matchContext = new LinkedList<MatchContext>();
public PathMapFilter(PathMapRoot root) {
@@ -192,5 +192,13 @@
super.startContent();
}
}
+
+ @Override
+ public void close() throws XPathException {
+ if (!closed) {
+ super.close();
+ closed = true;
+ }
+ }
}
\ No newline at end of file
Modified: trunk/engine/src/main/java/org/teiid/query/xquery/saxon/SaxonXQueryExpression.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/xquery/saxon/SaxonXQueryExpression.java 2012-07-05 15:43:21 UTC (rev 4222)
+++ trunk/engine/src/main/java/org/teiid/query/xquery/saxon/SaxonXQueryExpression.java 2012-07-05 20:35:48 UTC (rev 4223)
@@ -33,10 +33,12 @@
import java.util.Map;
import java.util.Properties;
+import javax.xml.stream.XMLStreamException;
import javax.xml.transform.ErrorListener;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
+import javax.xml.transform.stax.StAXSource;
import net.sf.saxon.Configuration;
import net.sf.saxon.expr.AxisExpression;
@@ -115,6 +117,20 @@
public void close() {
for (Source source : sources) {
Util.closeSource(source);
+ if (source instanceof StAXSource) {
+ StAXSource ss = (StAXSource)source;
+ if (ss.getXMLEventReader() != null) {
+ try {
+ ss.getXMLEventReader().close();
+ } catch (XMLStreamException e) {
+ }
+ } else {
+ try {
+ ss.getXMLStreamReader().close();
+ } catch (XMLStreamException e) {
+ }
+ }
+ }
}
if (iter != null) {
iter.close();
Added: trunk/engine/src/main/java/org/teiid/query/xquery/saxon/XMLEventStreamReader.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/xquery/saxon/XMLEventStreamReader.java (rev 0)
+++ trunk/engine/src/main/java/org/teiid/query/xquery/saxon/XMLEventStreamReader.java 2012-07-05 20:35:48 UTC (rev 4223)
@@ -0,0 +1,256 @@
+/*
+ * Copyright 2002-2010 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.teiid.query.xquery.saxon;
+
+import java.util.Iterator;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.namespace.QName;
+import javax.xml.stream.Location;
+import javax.xml.stream.XMLEventReader;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.events.Attribute;
+import javax.xml.stream.events.Namespace;
+import javax.xml.stream.events.ProcessingInstruction;
+import javax.xml.stream.events.StartDocument;
+import javax.xml.stream.events.XMLEvent;
+
+/**
+ * Implementation of the {@link javax.xml.stream.XMLStreamReader} interface that wraps a {@link XMLEventReader}. Useful,
+ * because the StAX {@link javax.xml.stream.XMLInputFactory} allows one to create a event reader from a stream reader,
+ * but not vice-versa.
+ *
+ * @author Arjen Poutsma
+ * @since 3.0
+ * @see StaxUtils#createEventStreamReader(javax.xml.stream.XMLEventReader)
+ */
+class XMLEventStreamReader extends AbstractXMLStreamReader {
+
+ private XMLEvent event;
+
+ private final XMLEventReader eventReader;
+
+ XMLEventStreamReader(XMLEventReader eventReader) throws XMLStreamException {
+ this.eventReader = eventReader;
+ event = eventReader.nextEvent();
+ }
+
+ public boolean isStandalone() {
+ if (event.isStartDocument()) {
+ return ((StartDocument) event).isStandalone();
+ }
+ else {
+ throw new IllegalStateException();
+ }
+ }
+
+ public String getVersion() {
+ if (event.isStartDocument()) {
+ return ((StartDocument) event).getVersion();
+ }
+ else {
+ return null;
+ }
+ }
+
+ public int getTextStart() {
+ return 0;
+ }
+
+ public String getText() {
+ if (event.isCharacters()) {
+ return event.asCharacters().getData();
+ }
+ else {
+ throw new IllegalStateException();
+ }
+ }
+
+ public String getPITarget() {
+ if (event.isProcessingInstruction()) {
+ return ((ProcessingInstruction) event).getTarget();
+ }
+ else {
+ throw new IllegalStateException();
+ }
+ }
+
+ public String getPIData() {
+ if (event.isProcessingInstruction()) {
+ return ((ProcessingInstruction) event).getData();
+ }
+ else {
+ throw new IllegalStateException();
+ }
+ }
+
+ public int getNamespaceCount() {
+ Iterator namespaces;
+ if (event.isStartElement()) {
+ namespaces = event.asStartElement().getNamespaces();
+ }
+ else if (event.isEndElement()) {
+ namespaces = event.asEndElement().getNamespaces();
+ }
+ else {
+ throw new IllegalStateException();
+ }
+ return countIterator(namespaces);
+ }
+
+ public NamespaceContext getNamespaceContext() {
+ if (event.isStartElement()) {
+ return event.asStartElement().getNamespaceContext();
+ }
+ else {
+ throw new IllegalStateException();
+ }
+ }
+
+ public QName getName() {
+ if (event.isStartElement()) {
+ return event.asStartElement().getName();
+ }
+ else if (event.isEndElement()) {
+ return event.asEndElement().getName();
+ }
+ else {
+ throw new IllegalStateException();
+ }
+ }
+
+ public Location getLocation() {
+ return event.getLocation();
+ }
+
+ public int getEventType() {
+ return event.getEventType();
+ }
+
+ public String getEncoding() {
+ return null;
+ }
+
+ public String getCharacterEncodingScheme() {
+ return null;
+ }
+
+ public int getAttributeCount() {
+ if (!event.isStartElement()) {
+ throw new IllegalStateException();
+ }
+ Iterator attributes = event.asStartElement().getAttributes();
+ return countIterator(attributes);
+ }
+
+ public void close() throws XMLStreamException {
+ eventReader.close();
+ }
+
+ public QName getAttributeName(int index) {
+ return getAttribute(index).getName();
+ }
+
+ public String getAttributeType(int index) {
+ return getAttribute(index).getDTDType();
+ }
+
+ public String getAttributeValue(int index) {
+ return getAttribute(index).getValue();
+ }
+
+ public String getNamespacePrefix(int index) {
+ return getNamespace(index).getPrefix();
+ }
+
+ public String getNamespaceURI(int index) {
+ return getNamespace(index).getNamespaceURI();
+ }
+
+ public Object getProperty(String name) throws IllegalArgumentException {
+ return eventReader.getProperty(name);
+ }
+
+ public boolean isAttributeSpecified(int index) {
+ return getAttribute(index).isSpecified();
+ }
+
+ public int next() throws XMLStreamException {
+ event = eventReader.nextEvent();
+ return event.getEventType();
+ }
+
+ public boolean standaloneSet() {
+ if (event.isStartDocument()) {
+ return ((StartDocument) event).standaloneSet();
+ }
+ else {
+ throw new IllegalStateException();
+ }
+ }
+
+ private int countIterator(Iterator iterator) {
+ int count = 0;
+ while (iterator.hasNext()) {
+ iterator.next();
+ count++;
+ }
+ return count;
+ }
+
+ private Attribute getAttribute(int index) {
+ if (!event.isStartElement()) {
+ throw new IllegalStateException();
+ }
+ int count = 0;
+ Iterator attributes = event.asStartElement().getAttributes();
+ while (attributes.hasNext()) {
+ Attribute attribute = (Attribute) attributes.next();
+ if (count == index) {
+ return attribute;
+ }
+ else {
+ count++;
+ }
+ }
+ throw new IllegalArgumentException();
+ }
+
+ private Namespace getNamespace(int index) {
+ Iterator namespaces;
+ if (event.isStartElement()) {
+ namespaces = event.asStartElement().getNamespaces();
+ }
+ else if (event.isEndElement()) {
+ namespaces = event.asEndElement().getNamespaces();
+ }
+ else {
+ throw new IllegalStateException();
+ }
+ int count = 0;
+ while (namespaces.hasNext()) {
+ Namespace namespace = (Namespace) namespaces.next();
+ if (count == index) {
+ return namespace;
+ }
+ else {
+ count++;
+ }
+ }
+ throw new IllegalArgumentException();
+ }
+}
Property changes on: trunk/engine/src/main/java/org/teiid/query/xquery/saxon/XMLEventStreamReader.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/engine/src/main/java/org/teiid/query/xquery/saxon/XQueryEvaluator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/xquery/saxon/XQueryEvaluator.java 2012-07-05 15:43:21 UTC (rev 4222)
+++ trunk/engine/src/main/java/org/teiid/query/xquery/saxon/XQueryEvaluator.java 2012-07-05 20:35:48 UTC (rev 4223)
@@ -27,12 +27,16 @@
import java.sql.SQLXML;
import java.util.Map;
+import javax.xml.stream.XMLStreamException;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
+import javax.xml.transform.stax.StAXSource;
import net.sf.saxon.AugmentedSource;
import net.sf.saxon.Configuration;
import net.sf.saxon.event.ProxyReceiver;
+import net.sf.saxon.evpull.PullEventSource;
+import net.sf.saxon.evpull.StaxToEventBridge;
import net.sf.saxon.om.DocumentInfo;
import net.sf.saxon.om.NodeInfo;
import net.sf.saxon.query.DynamicQueryContext;
@@ -83,6 +87,7 @@
if(value instanceof SQLXML) {
value = XMLSystemFunctions.convertToSource(value);
result.sources.add((Source)value);
+ value = wrapStax((Source)value, xquery.getConfig());
} else if (value instanceof java.util.Date) {
value = XMLSystemFunctions.convertToAtomicValue(value);
}
@@ -94,6 +99,7 @@
if (context != null) {
Source source = XMLSystemFunctions.convertToSource(context);
result.sources.add(source);
+ source = wrapStax(source, xquery.getConfig());
if (xquery.contextRoot != null) {
//create our own filter as this logic is not provided in the free saxon
ProxyReceiver filter = new PathMapFilter(xquery.contextRoot);
@@ -158,6 +164,27 @@
}
}
+ private static Source wrapStax(Source value, Configuration config) throws TeiidProcessingException {
+ if (value instanceof StAXSource) {
+ //saxon doesn't like staxsources
+ StaxToEventBridge sb = new StaxToEventBridge();
+ sb.setPipelineConfiguration(config.makePipelineConfiguration());
+ StAXSource staxSource = (StAXSource)value;
+ if (staxSource.getXMLEventReader() != null) {
+ try {
+ sb.setXMLStreamReader(new XMLEventStreamReader(staxSource.getXMLEventReader()));
+ } catch (XMLStreamException e) {
+ //should not happen as the StAXSource already peeked
+ throw new TeiidProcessingException(e);
+ }
+ } else {
+ sb.setXMLStreamReader(staxSource.getXMLStreamReader());
+ }
+ value = new PullEventSource(sb);
+ }
+ return value;
+ }
+
/**
* Converts a xom node into something readable by Saxon
* @param node
Modified: trunk/engine/src/test/java/org/teiid/query/function/source/TestXMLSystemFunctions.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/function/source/TestXMLSystemFunctions.java 2012-07-05 15:43:21 UTC (rev 4222)
+++ trunk/engine/src/test/java/org/teiid/query/function/source/TestXMLSystemFunctions.java 2012-07-05 20:35:48 UTC (rev 4223)
@@ -194,7 +194,7 @@
@Test public void testJsonToXml() throws Exception {
String json = "[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}]";
- String expected = "<?xml version=\"1.0\" ?><Array><Array>0</Array><Array><_u0031_><_u0032_><_u0033_><_u0034_>5</_u0034_><_u0034_><_u0036_>7</_u0036_></_u0034_></_u0033_></_u0032_></_u0031_></Array></Array>";
+ String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Array xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><Array xsi:type=\"decimal\">0</Array><Array><_u0031_><_u0032_><_u0033_><_u0034_ xsi:type=\"decimal\">5</_u0034_><_u0034_><_u0036_ xsi:type=\"decimal\">7</_u0036_></_u0034_></_u0033_></_u0032_></_u0031_></Array></Array>";
helpTestJson(json, "Array", expected);
}
@@ -214,25 +214,25 @@
@Test public void testJsonToXml1() throws Exception {
String json = "{ \"firstName\": \"John\", \"lastName\": \"Smith\", \"age\": 25, \"address\": { \"streetAddress\": \"21 2nd Street\", \"city\": \"New York\", \"state\": \"NY\", "+
"\"postalCode\": \"10021\" }, \"phoneNumber\": [ { \"type\": \"home\", \"number\": \"212 555-1234\" }, { \"type\": \"fax\", \"number\": \"646 555-4567\" } ] }";
- String expected = "<?xml version=\"1.0\" ?><Person><firstName>John</firstName><lastName>Smith</lastName><age>25</age><address><streetAddress>21 2nd Street</streetAddress><city>New York</city><state>NY</state><postalCode>10021</postalCode></address><phoneNumber><type>home</type><number>212 555-1234</number></phoneNumber><phoneNumber><type>fax</type><number>646 555-4567</number></phoneNumber></Person>";
+ String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Person xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><firstName>John</firstName><lastName>Smith</lastName><age xsi:type=\"decimal\">25</age><address><streetAddress>21 2nd Street</streetAddress><city>New York</city><state>NY</state><postalCode>10021</postalCode></address><phoneNumber><type>home</type><number>212 555-1234</number></phoneNumber><phoneNumber><type>fax</type><number>646 555-4567</number></phoneNumber></Person>";
helpTestJson(json, "Person", expected);
}
@Test public void testJsonToXml2() throws Exception {
String json = "{ \"firstName\": null }";
- String expected = "<?xml version=\"1.0\" ?><Person><firstName xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"></firstName></Person>";
+ String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Person xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><firstName xsi:nil=\"true\"></firstName></Person>";
helpTestJson(json, "Person", expected);
}
@Test public void testJsonToXml3() throws Exception {
String json = "{ \"kids\":[{ \"firstName\" : \"George\" }, { \"firstName\" : \"Jerry\" }]}";
- String expected = "<?xml version=\"1.0\" ?><Person><kids><firstName>George</firstName></kids><kids><firstName>Jerry</firstName></kids></Person>";
+ String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Person xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><kids><firstName>George</firstName></kids><kids><firstName>Jerry</firstName></kids></Person>";
helpTestJson(json, "Person", expected);
}
@Test public void testJsonToXml4() throws Exception {
String json = "{ \"kids\":[{ \"firstName\" : \"George\" }, { \"firstName\" : \"Jerry\" }]}";
- String expected = "<?xml version=\"1.0\" ?><Person><kids><firstName>George</firstName></kids><kids><firstName>Jerry</firstName></kids></Person>";
+ String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Person xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><kids><firstName>George</firstName></kids><kids><firstName>Jerry</firstName></kids></Person>";
helpTestJson(json, "Person", expected);
}
@@ -242,7 +242,7 @@
*/
@Test public void testJsonToXml5() throws Exception {
String json = "[[],{\"x\": 1},[]]";
- String expected = "<?xml version=\"1.0\" ?><Person><Person></Person><Person><x>1</x></Person><Person></Person></Person>";
+ String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Person xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><Person></Person><Person><x xsi:type=\"decimal\">1</x></Person><Person></Person></Person>";
helpTestJson(json, "Person", expected);
}
Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java 2012-07-05 15:43:21 UTC (rev 4222)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java 2012-07-05 20:35:48 UTC (rev 4223)
@@ -27,6 +27,7 @@
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
+import java.sql.Blob;
import java.sql.Timestamp;
import java.util.Arrays;
import java.util.List;
@@ -515,4 +516,18 @@
process(sql, expected);
}
+ @Test public void testJsonStreamingXmlTable() throws Exception {
+ String sql = "select * from xmltable('/Person/phoneNumber' passing jsontoxml('Person', cast(? as blob)) columns x string path 'type', y string path 'number') as x"; //$NON-NLS-1$
+
+ List<?>[] expected = new List<?>[] {
+ Arrays.asList("home", "212 555-1234"),
+ Arrays.asList("fax", "646 555-4567"),
+ };
+
+ Blob b = BlobType.createBlob(("{ \"firstName\": \"John\", \"lastName\": \"Smith\", \"age\": 25, \"address\": { \"streetAddress\": \"21 2nd Street\", \"city\": \"New York\", \"state\": \"NY\", "+
+ "\"postalCode\": \"10021\" }, \"phoneNumber\": [ { \"type\": \"home\", \"number\": \"212 555-1234\" }, { \"type\": \"fax\", \"number\": \"646 555-4567\" } ] }").getBytes(Charset.forName("UTF-8")));
+
+ processPreparedStatement(sql, expected, dataManager, new DefaultCapabilitiesFinder(), RealMetadataFactory.example1Cached(), Arrays.asList(b));
+ }
+
}
12 years, 8 months