[teiid-commits] teiid SVN: r903 - in trunk: connector-api/src/main/java/org/teiid/connector/basic and 36 other directories.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Mon May 11 10:34:31 EDT 2009
Author: shawkins
Date: 2009-05-11 10:34:31 -0400 (Mon, 11 May 2009)
New Revision: 903
Added:
trunk/connector-api/src/main/java/org/teiid/connector/language/IInsertExpressionValueSource.java
trunk/connector-api/src/main/java/org/teiid/connector/language/IInsertValueSource.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/InsertValueExpressionsImpl.java
trunk/engine/src/test/java/com/metamatrix/query/processor/TestInsertProcessing.java
Removed:
trunk/connector-api/src/main/java/org/teiid/connector/language/IBulkInsert.java
trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCConnector.java
trunk/engine/src/main/java/com/metamatrix/query/sql/lang/BulkInsert.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/BulkInsertImpl.java
trunk/engine/src/test/java/com/metamatrix/query/sql/lang/TestBulkInsert.java
trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/language/TestBulkInsertImpl.java
Modified:
trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorCapabilities.java
trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnectorCapabilities.java
trunk/connector-api/src/main/java/org/teiid/connector/language/IExpression.java
trunk/connector-api/src/main/java/org/teiid/connector/language/IInsert.java
trunk/connector-api/src/main/java/org/teiid/connector/language/ILanguageFactory.java
trunk/connector-api/src/main/java/org/teiid/connector/language/ILiteral.java
trunk/connector-api/src/main/java/org/teiid/connector/language/IQueryCommand.java
trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/AbstractLanguageVisitor.java
trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/HierarchyVisitor.java
trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/LanguageObjectVisitor.java
trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/CollectorVisitor.java
trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/SQLStringVisitor.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCBaseExecution.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCCapabilities.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCPropertyNames.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCQueryExecution.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCUpdateExecution.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/SimpleCapabilities.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/access/AccessCapabilities.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/db2/DB2Capabilities.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleCapabilities.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleSQLTranslator.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/SequeLinkOracleCapabilities.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/sqlserver/SqlServerCapabilities.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/sybase/SybaseCapabilities.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/teradata/TeradataCapabilities.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/BindValueVisitor.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/ReplacementVisitor.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/SQLConversionVisitor.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/TranslatedCommand.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/Translator.java
trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnector.java
trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnectorCapabilities.java
trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnectorPropertyNames.java
trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPUpdateExecution.java
trunk/connectors/connector-ldap/src/main/resources/connector-ldap.xml
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Connector.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/SalesforceCapabilities.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/visitors/InsertVisitor.java
trunk/connectors/connector-salesforce/src/main/resources/connector-salesforce.xml
trunk/engine/src/main/java/com/metamatrix/query/optimizer/capabilities/SourceCapabilities.java
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/PlanToProcessConverter.java
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleCollapseSource.java
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleRaiseAccess.java
trunk/engine/src/main/java/com/metamatrix/query/processor/relational/ProjectIntoNode.java
trunk/engine/src/main/java/com/metamatrix/query/sql/LanguageVisitor.java
trunk/engine/src/main/java/com/metamatrix/query/sql/lang/Insert.java
trunk/engine/src/main/java/com/metamatrix/query/sql/navigator/PreOrPostOrderNavigator.java
trunk/engine/src/main/java/com/metamatrix/query/sql/symbol/Constant.java
trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/EvaluatableVisitor.java
trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/EvaluateExpressionVisitor.java
trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/SQLStringVisitor.java
trunk/engine/src/main/java/com/metamatrix/query/tempdata/TempTableStoreImpl.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/CapabilitiesConverter.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/InsertImpl.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageBridgeFactory.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageFactoryImpl.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LiteralImpl.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/ProcedureImpl.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/SetClauseImpl.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/SetClauseListImpl.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java
trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java
trunk/engine/src/test/java/com/metamatrix/query/processor/relational/TestProjectIntoNode.java
trunk/engine/src/test/java/com/metamatrix/query/sql/symbol/TestConstant.java
trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/language/TestInsertImpl.java
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestCallableStatement.java
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatementBatchedUpdate.java
Log:
TEIID-525 TEIID-124 TEIID-572 removing redundant max in property overrides, adding pushdown of insert with a query expression, and adding full pushdown of all bulk update operations.
Modified: trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorCapabilities.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorCapabilities.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorCapabilities.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -25,7 +25,7 @@
import java.util.List;
import org.teiid.connector.language.IBatchedUpdates;
-import org.teiid.connector.language.IBulkInsert;
+import org.teiid.connector.language.ISetQuery;
/**
@@ -372,9 +372,16 @@
boolean supportsBatchedUpdates();
/**
- * Whether the source supports {@link IBulkInsert}
+ * Whether the source supports updates with multiple value sets
* @since 6.0
*/
- boolean supportsBulkInsert();
+ boolean supportsBulkUpdate();
+
+ /**
+ * Support indicates that the connector can accept INSERTs with
+ * values specified by an {@link ISetQuery}.
+ * @since 6.1
+ */
+ boolean supportsInsertWithQueryExpression();
}
Modified: trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnectorCapabilities.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnectorCapabilities.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnectorCapabilities.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -35,8 +35,6 @@
*/
public class BasicConnectorCapabilities implements ConnectorCapabilities {
- protected int maxInCriteriaSize = -1;
-
/**
* Construct the basic capabilities class.
*/
@@ -272,7 +270,7 @@
* @since 4.2
*/
public int getMaxInCriteriaSize() {
- return this.maxInCriteriaSize;
+ return -1;
}
/**
@@ -335,11 +333,6 @@
}
@Override
- public boolean supportsBulkInsert() {
- return false;
- }
-
- @Override
public boolean supportsGroupBy() {
return false;
}
@@ -368,5 +361,15 @@
public boolean supportsCompareCriteriaOrdered() {
return false;
}
+
+ @Override
+ public boolean supportsInsertWithQueryExpression() {
+ return false;
+ }
+ @Override
+ public boolean supportsBulkUpdate() {
+ return false;
+ }
+
}
Deleted: trunk/connector-api/src/main/java/org/teiid/connector/language/IBulkInsert.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/language/IBulkInsert.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/language/IBulkInsert.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -1,39 +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.connector.language;
-
-import java.util.List;
-
-/**
- * This is a simple variation of insert, where multiple rows with single insert
- * will be loaded.
- */
-public interface IBulkInsert extends IInsert {
-
- /**
- * Get the list of row values for this bulk insert
- * @return list; never null
- */
- List<List<?>> getRows();
-
-}
Modified: trunk/connector-api/src/main/java/org/teiid/connector/language/IExpression.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/language/IExpression.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/language/IExpression.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -30,21 +30,17 @@
public interface IExpression extends ILanguageObject {
/**
- * Determine the type returned by this expression. The connector should
- * return an object of this type if this expression is used in a SELECT
- * clause.
+ * Determine the type returned by this expression.
*
* @return The type, as defined by a Java class
*/
- Class getType();
+ Class<?> getType();
/**
- * Set the type returned by this expression. The connector should
- * return an object of this type if this expression is used in a SELECT
- * clause.
+ * Set the type returned by this expression.
*
* @param type The type, as defined by a Java class
*/
- void setType(Class type);
+ void setType(Class<?> type);
}
Modified: trunk/connector-api/src/main/java/org/teiid/connector/language/IInsert.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/language/IInsert.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/language/IInsert.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -42,12 +42,18 @@
List<IElement> getElements();
/**
- * Get list of values being inserted
- * @return List of ILiteral
+ * Get the IInsertValues
+ * @return
*/
- List<IExpression> getValues();
+ IInsertValueSource getValueSource();
/**
+ * Set the IInsertValues
+ * @param values
+ */
+ void setValueSource(IInsertValueSource values);
+
+ /**
* Set group that is being inserted into.
* @param group Insert group
*/
Added: trunk/connector-api/src/main/java/org/teiid/connector/language/IInsertExpressionValueSource.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/language/IInsertExpressionValueSource.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/connector/language/IInsertExpressionValueSource.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -0,0 +1,9 @@
+package org.teiid.connector.language;
+
+import java.util.List;
+
+public interface IInsertExpressionValueSource extends IInsertValueSource, ILanguageObject {
+
+ List<IExpression> getValues();
+
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/connector/language/IInsertExpressionValueSource.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/connector-api/src/main/java/org/teiid/connector/language/IInsertValueSource.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/language/IInsertValueSource.java (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/connector/language/IInsertValueSource.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -0,0 +1,5 @@
+package org.teiid.connector.language;
+
+public interface IInsertValueSource extends ILanguageObject {
+
+}
Property changes on: trunk/connector-api/src/main/java/org/teiid/connector/language/IInsertValueSource.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: trunk/connector-api/src/main/java/org/teiid/connector/language/ILanguageFactory.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/language/ILanguageFactory.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/language/ILanguageFactory.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -106,7 +106,7 @@
* @param type Data type returned
* @return New IFunction
*/
- IFunction createFunction(String functionName, IExpression[] args, Class type);
+ IFunction createFunction(String functionName, IExpression[] args, Class<?> type);
/**
* Create new function
@@ -115,7 +115,7 @@
* @param type Data type returned
* @return New IFunction
*/
- IFunction createFunction(String functionName, List<? extends IExpression> args, Class type);
+ IFunction createFunction(String functionName, List<? extends IExpression> args, Class<?> type);
/**
* Create new group.
@@ -157,16 +157,14 @@
* @param values List of IExpression (usually ILiteral)
* @return New IInsert
*/
- IInsert createInsert(IGroup group, List<IElement> columns, List<? extends IExpression> values);
+ IInsert createInsert(IGroup group, List<IElement> columns, IInsertValueSource valueSource);
/**
- * Create new bulk insert command
- * @param group Insert group
- * @param columns List of IElement being inserted into
- * @param List of Lists containing the actual values
- * @return New IBulkInsert
+ * Create a new value source for an insert command
+ * @param values
+ * @return
*/
- IBulkInsert createBulkInsert(IGroup group, List<? extends IElement> columns, List<List<Object>> rows);
+ IInsertExpressionValueSource createInsertExpressionValueSource(List<IExpression> values);
/**
* Create new IS NULL criteria
Modified: trunk/connector-api/src/main/java/org/teiid/connector/language/ILiteral.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/language/ILiteral.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/language/ILiteral.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -38,7 +38,7 @@
* Get the Java type of the literal
* @return Java class name of type
*/
- Class getType();
+ Class<?> getType();
/**
* Set the value of the literal
@@ -50,13 +50,29 @@
* Set the Java type of the literal
* @param type Java class name of type
*/
- void setType(Class type);
+ void setType(Class<?> type);
/**
* Returns true if this literal should be treated as a bind value
*/
boolean isBindValue();
+ /**
+ * Set whether this literal should be treated as a bind value
+ * @param bindValue
+ */
void setBindValue(boolean bindValue);
+
+ /**
+ * Returns true if the value for this literal is a list of values.
+ * @return
+ */
+ boolean isMultiValued();
+
+ /**
+ * Set whether the value for this literal is a list of values.
+ * @param multiValued
+ */
+ void setMultiValued(boolean multiValued);
}
Modified: trunk/connector-api/src/main/java/org/teiid/connector/language/IQueryCommand.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/language/IQueryCommand.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/language/IQueryCommand.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -22,7 +22,7 @@
package org.teiid.connector.language;
-public interface IQueryCommand extends ICommand {
+public interface IQueryCommand extends ICommand, IInsertValueSource {
/**
* Set ORDER BY clause, may be null.
Modified: trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/AbstractLanguageVisitor.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/AbstractLanguageVisitor.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/AbstractLanguageVisitor.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -26,7 +26,6 @@
import org.teiid.connector.language.IAggregate;
import org.teiid.connector.language.IBatchedUpdates;
-import org.teiid.connector.language.IBulkInsert;
import org.teiid.connector.language.ICompareCriteria;
import org.teiid.connector.language.ICompoundCriteria;
import org.teiid.connector.language.IDelete;
@@ -39,6 +38,7 @@
import org.teiid.connector.language.IInCriteria;
import org.teiid.connector.language.IInlineView;
import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertExpressionValueSource;
import org.teiid.connector.language.IIsNullCriteria;
import org.teiid.connector.language.IJoin;
import org.teiid.connector.language.ILanguageObject;
@@ -129,7 +129,7 @@
public void visit(IInCriteria obj) {}
public void visit(IInlineView obj) {}
public void visit(IInsert obj) {}
- public void visit(IBulkInsert obj) {}
+ public void visit(IInsertExpressionValueSource obj) {}
public void visit(IIsNullCriteria obj) {}
public void visit(IJoin obj) {}
public void visit(ILikeCriteria obj) {}
Modified: trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/HierarchyVisitor.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/HierarchyVisitor.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/HierarchyVisitor.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -34,6 +34,7 @@
import org.teiid.connector.language.IInCriteria;
import org.teiid.connector.language.IInlineView;
import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertExpressionValueSource;
import org.teiid.connector.language.IIsNullCriteria;
import org.teiid.connector.language.IJoin;
import org.teiid.connector.language.ILikeCriteria;
@@ -41,6 +42,7 @@
import org.teiid.connector.language.IOrderBy;
import org.teiid.connector.language.IProcedure;
import org.teiid.connector.language.IQuery;
+import org.teiid.connector.language.IQueryCommand;
import org.teiid.connector.language.IScalarSubquery;
import org.teiid.connector.language.ISearchedCaseExpression;
import org.teiid.connector.language.ISelect;
@@ -127,9 +129,16 @@
public void visit(IInsert obj) {
visitNode(obj.getGroup());
visitNodes(obj.getElements());
- visitNodes(obj.getValues());
+ if (!(obj.getValueSource() instanceof IQueryCommand) || visitSubcommands) {
+ visitNode(obj.getValueSource());
+ }
}
+ @Override
+ public void visit(IInsertExpressionValueSource obj) {
+ visitNodes(obj.getValues());
+ }
+
public void visit(IIsNullCriteria obj) {
visitNode(obj.getExpression());
}
Modified: trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/LanguageObjectVisitor.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/LanguageObjectVisitor.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/LanguageObjectVisitor.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -29,7 +29,7 @@
public interface LanguageObjectVisitor {
public void visit(IAggregate obj);
public void visit(IBatchedUpdates obj);
- public void visit(IBulkInsert obj);
+ public void visit(IInsertExpressionValueSource obj);
public void visit(ICompareCriteria obj);
public void visit(ICompoundCriteria obj);
public void visit(IDelete obj);
Modified: trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/CollectorVisitor.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/CollectorVisitor.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/CollectorVisitor.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -22,9 +22,48 @@
package org.teiid.connector.visitor.util;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
-import org.teiid.connector.language.*;
+import org.teiid.connector.language.IAggregate;
+import org.teiid.connector.language.IBatchedUpdates;
+import org.teiid.connector.language.ICompareCriteria;
+import org.teiid.connector.language.ICompoundCriteria;
+import org.teiid.connector.language.IDelete;
+import org.teiid.connector.language.IElement;
+import org.teiid.connector.language.IExistsCriteria;
+import org.teiid.connector.language.IFrom;
+import org.teiid.connector.language.IFunction;
+import org.teiid.connector.language.IGroup;
+import org.teiid.connector.language.IGroupBy;
+import org.teiid.connector.language.IInCriteria;
+import org.teiid.connector.language.IInlineView;
+import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertExpressionValueSource;
+import org.teiid.connector.language.IIsNullCriteria;
+import org.teiid.connector.language.IJoin;
+import org.teiid.connector.language.ILanguageObject;
+import org.teiid.connector.language.ILikeCriteria;
+import org.teiid.connector.language.ILimit;
+import org.teiid.connector.language.ILiteral;
+import org.teiid.connector.language.INotCriteria;
+import org.teiid.connector.language.IOrderBy;
+import org.teiid.connector.language.IOrderByItem;
+import org.teiid.connector.language.IParameter;
+import org.teiid.connector.language.IProcedure;
+import org.teiid.connector.language.IQuery;
+import org.teiid.connector.language.IScalarSubquery;
+import org.teiid.connector.language.ISearchedCaseExpression;
+import org.teiid.connector.language.ISelect;
+import org.teiid.connector.language.ISelectSymbol;
+import org.teiid.connector.language.ISetClause;
+import org.teiid.connector.language.ISetClauseList;
+import org.teiid.connector.language.ISetQuery;
+import org.teiid.connector.language.ISubqueryCompareCriteria;
+import org.teiid.connector.language.ISubqueryInCriteria;
+import org.teiid.connector.language.IUpdate;
import org.teiid.connector.visitor.framework.DelegatingHierarchyVisitor;
import org.teiid.connector.visitor.framework.LanguageObjectVisitor;
@@ -153,7 +192,7 @@
/*
* @see com.metamatrix.data.visitor.framework.LanguageObjectVisitor#visit(com.metamatrix.data.language.IBulkInsert)
*/
- public void visit(IBulkInsert obj) {
+ public void visit(IInsertExpressionValueSource obj) {
checkInstance(obj);
}
/*
Modified: trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/SQLStringVisitor.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/SQLStringVisitor.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/SQLStringVisitor.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -27,7 +27,6 @@
import org.teiid.connector.api.ConnectorException;
import org.teiid.connector.language.IAggregate;
-import org.teiid.connector.language.IBulkInsert;
import org.teiid.connector.language.ICommand;
import org.teiid.connector.language.ICompareCriteria;
import org.teiid.connector.language.ICompoundCriteria;
@@ -44,6 +43,7 @@
import org.teiid.connector.language.IInCriteria;
import org.teiid.connector.language.IInlineView;
import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertExpressionValueSource;
import org.teiid.connector.language.IIsNullCriteria;
import org.teiid.connector.language.IJoin;
import org.teiid.connector.language.ILanguageObject;
@@ -124,11 +124,11 @@
*/
protected void append(List<? extends ILanguageObject> items) {
if (items != null && items.size() != 0) {
- append((ILanguageObject)items.get(0));
+ append(items.get(0));
for (int i = 1; i < items.size(); i++) {
buffer.append(COMMA)
.append(SPACE);
- append((ILanguageObject)items.get(i));
+ append(items.get(i));
}
}
}
@@ -538,57 +538,35 @@
* @see com.metamatrix.data.visitor.LanguageObjectVisitor#visit(org.teiid.connector.language.IInsert)
*/
public void visit(IInsert obj) {
- formatBasicInsert(obj);
- buffer.append(SPACE)
- .append(VALUES)
- .append(SPACE)
- .append(LPAREN);
- append(obj.getValues());
- buffer.append(RPAREN);
- }
-
- /**
- * @param obj
- */
- private void formatBasicInsert(IInsert obj) {
- buffer.append(INSERT)
- .append(SPACE);
- buffer.append(getSourceComment(obj));
- buffer.append(INTO)
- .append(SPACE);
- append(obj.getGroup());
- if (obj.getElements() != null && obj.getElements().size() != 0) {
- buffer.append(SPACE)
- .append(LPAREN);
+ buffer.append(INSERT).append(SPACE);
+ buffer.append(getSourceComment(obj));
+ buffer.append(INTO).append(SPACE);
+ append(obj.getGroup());
+ if (obj.getElements() != null && obj.getElements().size() != 0) {
+ buffer.append(SPACE).append(LPAREN);
- int elementCount= obj.getElements().size();
- for(int i=0; i<elementCount; i++) {
- buffer.append(getElementName(obj.getElements().get(i), false));
- if (i<elementCount-1) {
- buffer.append(COMMA);
- buffer.append(SPACE);
- }
- }
+ int elementCount = obj.getElements().size();
+ for (int i = 0; i < elementCount; i++) {
+ buffer.append(getElementName(obj.getElements().get(i), false));
+ if (i < elementCount - 1) {
+ buffer.append(COMMA);
+ buffer.append(SPACE);
+ }
+ }
- buffer.append(RPAREN);
- }
+ buffer.append(RPAREN);
+ }
+ buffer.append(SPACE);
+ append(obj.getValueSource());
}
- public void visit(IBulkInsert obj) {
- formatBasicInsert(obj);
- buffer.append(SPACE)
- .append(VALUES)
- .append(SPACE)
- .append(LPAREN);
- int elementCount= obj.getElements().size();
- for(int i=0; i<elementCount; i++) {
- buffer.append(UNDEFINED_PARAM);
- if (i<elementCount-1) {
- buffer.append(COMMA);
- }
- }
- buffer.append(RPAREN);
- }
+ @Override
+ public void visit(IInsertExpressionValueSource obj) {
+ buffer.append(VALUES).append(SPACE).append(LPAREN);
+ append(obj.getValues());
+ buffer.append(RPAREN);
+ }
+
/**
* @see com.metamatrix.data.visitor.LanguageObjectVisitor#visit(org.teiid.connector.language.IIsNullCriteria)
*/
@@ -720,7 +698,9 @@
* @see com.metamatrix.data.visitor.LanguageObjectVisitor#visit(org.teiid.connector.language.ILiteral)
*/
public void visit(ILiteral obj) {
- if (obj.getValue() == null) {
+ if (obj.isBindValue()) {
+ buffer.append("?"); //$NON-NLS-1$
+ } else if (obj.getValue() == null) {
buffer.append(NULL);
} else {
Class type = obj.getType();
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCBaseExecution.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCBaseExecution.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCBaseExecution.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -28,6 +28,7 @@
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.Statement;
+import java.util.List;
import java.util.Properties;
import org.teiid.connector.api.ConnectorException;
@@ -39,6 +40,7 @@
import org.teiid.connector.jdbc.translator.TranslatedCommand;
import org.teiid.connector.jdbc.translator.Translator;
import org.teiid.connector.language.ICommand;
+import org.teiid.connector.language.ILiteral;
import com.metamatrix.common.util.PropertiesUtils;
@@ -90,7 +92,29 @@
fetchSize = Math.min(fetchSize, maxResultRows);
}
}
+
+ /**
+ * Return true if this is a batched update
+ */
+ protected void bindPreparedStatementValues(PreparedStatement stmt, TranslatedCommand tc, int rowCount) throws SQLException {
+ List params = tc.getPreparedValues();
+ for (int row = 0; row < rowCount; row++) {
+ for (int i = 0; i< params.size(); i++) {
+ ILiteral paramValue = (ILiteral)params.get(i);
+ Object value = paramValue.getValue();
+ if (paramValue.isMultiValued()) {
+ value = ((List<?>)value).get(row);
+ }
+ Class paramType = paramValue.getType();
+ sqlTranslator.bindValue(stmt, value, paramType, i+1);
+ if (rowCount > 1) {
+ stmt.addBatch();
+ }
+ }
+ }
+ }
+
// ===========================================================================================================================
// Methods
// ===========================================================================================================================
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCCapabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCCapabilities.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCCapabilities.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -32,19 +32,16 @@
*/
public class JDBCCapabilities extends BasicConnectorCapabilities {
- public static final int DEFAULT_JDBC_MAX_IN_CRITERIA_SIZE = 1000;
-
/**
*
*/
public JDBCCapabilities() {
- this.setMaxInCriteriaSize(DEFAULT_JDBC_MAX_IN_CRITERIA_SIZE);
}
/*
* @see com.metamatrix.data.ConnectorCapabilities#getSupportedFunctions()
*/
- public List getSupportedFunctions() {
+ public List<String> getSupportedFunctions() {
return Arrays.asList(new String[] { "+", "-", "*", "/" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}
@@ -53,13 +50,9 @@
* @since 4.2
*/
public int getMaxInCriteriaSize() {
- return maxInCriteriaSize;
+ return 1000;
}
- public void setMaxInCriteriaSize(int maxInCriteriaSize) {
- this.maxInCriteriaSize = maxInCriteriaSize;
- }
-
@Override
public boolean supportsGroupBy() {
return true;
@@ -291,7 +284,7 @@
}
@Override
- public boolean supportsBulkInsert() {
+ public boolean supportsBulkUpdate() {
return true;
}
@@ -324,5 +317,10 @@
public boolean supportsSelectExpression() {
return true;
}
+
+ @Override
+ public boolean supportsInsertWithQueryExpression() {
+ return true;
+ }
}
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCPropertyNames.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCPropertyNames.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCPropertyNames.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -36,14 +36,6 @@
public static final String TRIM_STRINGS = "TrimStrings"; //$NON-NLS-1$
/**
- * This is the property name of the ConnectorService property that defines
- * the size of a SetCriteria (IN criteria) before the criteria is broken into
- * multiple queries and the results are aggregated. 0 indicates that set
- * criteria should never be broken. The default value should be 0.
- */
- public static final String SET_CRITERIA_BATCH_SIZE = "SetCriteriaBatchSize"; //$NON-NLS-1$
-
- /**
* This is the property name used to set the transaction isolation level on
* a connector's data source. The value string must be the the same as one of the
* names of the values of the transaction isolation levels defined in
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCQueryExecution.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCQueryExecution.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCQueryExecution.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -93,7 +93,7 @@
results = getStatement().executeQuery(sql);
} else {
PreparedStatement pstatement = getPreparedStatement(sql);
- sqlTranslator.bindPreparedStatementValues(this.connection, pstatement, translatedComm);
+ bindPreparedStatementValues(pstatement, translatedComm, 1);
results = pstatement.executeQuery();
}
addStatementWarnings();
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCUpdateExecution.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCUpdateExecution.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCUpdateExecution.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -37,8 +37,8 @@
import org.teiid.connector.jdbc.translator.TranslatedCommand;
import org.teiid.connector.jdbc.translator.Translator;
import org.teiid.connector.language.IBatchedUpdates;
-import org.teiid.connector.language.IBulkInsert;
import org.teiid.connector.language.ICommand;
+import org.teiid.connector.language.ILiteral;
/**
@@ -71,15 +71,13 @@
@Override
public void execute() throws ConnectorException {
- if (command instanceof IBulkInsert) {
- result = new int [] {execute((IBulkInsert)command)};
- } else if (command instanceof IBatchedUpdates) {
+ if (command instanceof IBatchedUpdates) {
result = execute(((IBatchedUpdates)command));
} else {
// translate command
TranslatedCommand translatedComm = translateCommand(command);
- result = new int [] {executeTranslatedCommand(translatedComm)};
+ result = executeTranslatedCommand(translatedComm);
}
}
@@ -119,7 +117,7 @@
}
pstmt = getPreparedStatement(command.getSql());
}
- sqlTranslator.bindPreparedStatementValues(this.connection, pstmt, command);
+ bindPreparedStatementValues(pstmt, command, 1);
pstmt.addBatch();
} else {
if (previousCommand != null && previousCommand.isPrepared()) {
@@ -149,44 +147,6 @@
return results;
}
- /**
- * An implementation to bulk insert rows into single table.
- *
- * @param command
- * @return
- * @throws ConnectorException
- */
- public int execute(IBulkInsert command) throws ConnectorException {
- boolean succeeded = false;
-
- // translate command
- TranslatedCommand translatedComm = translateCommand(command);
-
- // create statement or PreparedStatement and execute
- String sql = translatedComm.getSql();
-
- boolean commitType = getAutoCommit(translatedComm);
- int updateCount = -1;
- try {
- // temporarily turn the auto commit off, and set it back to what it was
- // before at the end of the command execution.
- if (commitType) {
- connection.setAutoCommit(false);
- }
- PreparedStatement stmt = getPreparedStatement(sql);
- updateCount = sqlTranslator.executeStatementForBulkInsert(this.connection, stmt, translatedComm);
- addStatementWarnings();
- succeeded = true;
- } catch (SQLException e) {
- throw new JDBCExecutionException(e, translatedComm);
- } finally {
- if (commitType) {
- restoreAutoCommit(!succeeded, translatedComm);
- }
- }
- return updateCount;
- }
-
private void executeBatch(int commandCount,
int[] results,
List<TranslatedCommand> commands) throws ConnectorException {
@@ -198,7 +158,7 @@
}
commands.clear();
} catch (SQLException err) {
- throw new JDBCExecutionException(err, commands.toArray(new TranslatedCommand[commands.size()])); //$NON-NLS-1$
+ throw new JDBCExecutionException(err, commands.toArray(new TranslatedCommand[commands.size()]));
}
}
@@ -207,23 +167,51 @@
* @throws ConnectorException
* @since 4.3
*/
- private int executeTranslatedCommand(TranslatedCommand translatedComm) throws ConnectorException {
+ private int[] executeTranslatedCommand(TranslatedCommand translatedComm) throws ConnectorException {
// create statement or PreparedStatement and execute
String sql = translatedComm.getSql();
-
+ boolean commitType = false;
+ boolean succeeded = false;
try {
- int updateCount;
+ int updateCount = 0;
if (!translatedComm.isPrepared()) {
updateCount = getStatement().executeUpdate(sql);
} else {
PreparedStatement pstatement = getPreparedStatement(sql);
- sqlTranslator.bindPreparedStatementValues(this.connection, pstatement, translatedComm);
- updateCount = pstatement.executeUpdate();
+ int rowCount = 1;
+ for (int i = 0; i< translatedComm.getPreparedValues().size(); i++) {
+ ILiteral paramValue = (ILiteral)translatedComm.getPreparedValues().get(i);
+ if (paramValue.isMultiValued()) {
+ rowCount = ((List<?>)paramValue).size();
+ break;
+ }
+ }
+ if (rowCount > 1) {
+ commitType = getAutoCommit(translatedComm);
+ if (commitType) {
+ connection.setAutoCommit(false);
+ }
+ }
+ bindPreparedStatementValues(pstatement, translatedComm, rowCount);
+ if (rowCount > 1) {
+ int[] results = pstatement.executeBatch();
+
+ for (int i=0; i<results.length; i++) {
+ updateCount += results[i];
+ }
+ succeeded = true;
+ } else {
+ updateCount = pstatement.executeUpdate();
+ }
}
addStatementWarnings();
- return updateCount;
+ return new int[] {updateCount};
} catch (SQLException err) {
throw new JDBCExecutionException(err, translatedComm);
+ } finally {
+ if (commitType) {
+ restoreAutoCommit(!succeeded, translatedComm);
+ }
}
}
@@ -253,9 +241,14 @@
if (exceptionOccurred) {
connection.rollback();
}
- connection.setAutoCommit(true);
} catch (SQLException err) {
throw new JDBCExecutionException(err, command);
+ } finally {
+ try {
+ connection.setAutoCommit(true);
+ } catch (SQLException err) {
+ throw new JDBCExecutionException(err, command);
+ }
}
}
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/SimpleCapabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/SimpleCapabilities.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/SimpleCapabilities.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -34,10 +34,13 @@
public class SimpleCapabilities extends JDBCCapabilities {
public SimpleCapabilities() {
- // Max acceptable by all BQT dbs (Sybase=250, Oracle=1000)
- setMaxInCriteriaSize(250);
}
+ @Override
+ public int getMaxInCriteriaSize() {
+ return 250;
+ }
+
/*
* @see com.metamatrix.data.api.ConnectorCapabilities#supportsCompareCriteriaEquals()
*/
@@ -262,5 +265,10 @@
public boolean supportsUnions() {
return false;
}
+
+ @Override
+ public boolean supportsInsertWithQueryExpression() {
+ return false;
+ }
}
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/access/AccessCapabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/access/AccessCapabilities.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/access/AccessCapabilities.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -37,5 +37,10 @@
public boolean supportsRowLimit() {
return true;
}
+
+ @Override
+ public boolean supportsInsertWithQueryExpression() {
+ return false;
+ }
}
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/db2/DB2Capabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/db2/DB2Capabilities.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/db2/DB2Capabilities.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -34,12 +34,9 @@
*/
public class DB2Capabilities extends JDBCCapabilities {
- public static final int DB2_MAX_SET_SIZE = 1000;
-
public DB2Capabilities() {
- this.setMaxInCriteriaSize(DB2_MAX_SET_SIZE);
- }
-
+ }
+
/**
* @see com.metamatrix.data.ConnectorCapabilities#getSupportedFunctions()
*/
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleCapabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleCapabilities.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleCapabilities.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -33,12 +33,9 @@
*/
public class OracleCapabilities extends JDBCCapabilities {
- public static final int ORACLE_MAX_SET_SIZE = 1000;
-
public OracleCapabilities() {
- this.setMaxInCriteriaSize(ORACLE_MAX_SET_SIZE);
- }
-
+ }
+
/**
* @see com.metamatrix.data.ConnectorCapabilities#getSupportedFunctions()
*/
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleSQLTranslator.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleSQLTranslator.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleSQLTranslator.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -45,6 +45,7 @@
import org.teiid.connector.language.IElement;
import org.teiid.connector.language.IGroup;
import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertExpressionValueSource;
import org.teiid.connector.language.ILimit;
import org.teiid.connector.language.IQueryCommand;
import org.teiid.connector.language.ISetQuery.Operation;
@@ -101,8 +102,13 @@
* then pull the Sequence name out of the name in source of the column.
*/
IInsert insert = (IInsert)command;
+
+ if (!(insert.getValueSource() instanceof IInsertExpressionValueSource)) {
+ return command;
+ }
+ IInsertExpressionValueSource values = (IInsertExpressionValueSource)insert.getValueSource();
List<Element> allElements = insert.getGroup().getMetadataObject().getChildren();
- if (allElements.size() == insert.getValues().size()) {
+ if (allElements.size() == values.getValues().size()) {
return command;
}
@@ -134,7 +140,7 @@
int delimiterIndex = sequence.indexOf(SQLReservedWords.DOT);
if (delimiterIndex == -1) {
- throw new ConnectorException("Invalid name in source sequence format. Expected <element name>" + SEQUENCE + "<sequence name>.<sequence value>, but was " + name);
+ throw new ConnectorException("Invalid name in source sequence format. Expected <element name>" + SEQUENCE + "<sequence name>.<sequence value>, but was " + name); //$NON-NLS-1$ //$NON-NLS-2$
}
String sequenceGroupName = sequence.substring(0, delimiterIndex);
String sequenceElementName = sequence.substring(delimiterIndex + 1);
@@ -142,7 +148,7 @@
IGroup sequenceGroup = this.getLanguageFactory().createGroup(sequenceGroupName, null, null);
IElement sequenceElement = this.getLanguageFactory().createElement(sequenceElementName, sequenceGroup, null, element.getJavaType());
insert.getElements().add(index, this.getLanguageFactory().createElement(element.getName(), insert.getGroup(), element, element.getJavaType()));
- insert.getValues().add(index, sequenceElement);
+ values.getValues().add(index, sequenceElement);
}
return command;
}
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/SequeLinkOracleCapabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/SequeLinkOracleCapabilities.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/SequeLinkOracleCapabilities.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -30,7 +30,7 @@
public class SequeLinkOracleCapabilities extends OracleCapabilities {
@Override
- public boolean supportsBulkInsert() {
+ public boolean supportsBulkUpdate() {
return false;
}
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/sqlserver/SqlServerCapabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/sqlserver/SqlServerCapabilities.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/sqlserver/SqlServerCapabilities.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -33,12 +33,9 @@
*/
public class SqlServerCapabilities extends JDBCCapabilities {
- public static final int SQLSRVR_MAX_SET_SIZE = 1000;
-
public SqlServerCapabilities() {
- this.setMaxInCriteriaSize(SQLSRVR_MAX_SET_SIZE);
- }
-
+ }
+
/**
* @see com.metamatrix.data.ConnectorCapabilities#getSupportedFunctions()
*/
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/sybase/SybaseCapabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/sybase/SybaseCapabilities.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/sybase/SybaseCapabilities.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -34,10 +34,12 @@
*/
public class SybaseCapabilities extends JDBCCapabilities {
- public static final int SYBASE_MAX_SET_SIZE = 250;
-
public SybaseCapabilities() {
- this.setMaxInCriteriaSize(SYBASE_MAX_SET_SIZE);
+ }
+
+ @Override
+ public int getMaxInCriteriaSize() {
+ return 250;
}
/**
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/teradata/TeradataCapabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/teradata/TeradataCapabilities.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/teradata/TeradataCapabilities.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -34,10 +34,7 @@
*/
public class TeradataCapabilities extends JDBCCapabilities {
- public static final int TERADATA_MAX_SET_SIZE = 1000;
-
public TeradataCapabilities() {
- this.setMaxInCriteriaSize(TERADATA_MAX_SET_SIZE);
}
/*
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/BindValueVisitor.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/BindValueVisitor.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/BindValueVisitor.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -28,6 +28,7 @@
import org.teiid.connector.language.IInCriteria;
import org.teiid.connector.language.IInlineView;
import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertExpressionValueSource;
import org.teiid.connector.language.ILanguageObject;
import org.teiid.connector.language.ILikeCriteria;
import org.teiid.connector.language.ILiteral;
@@ -111,7 +112,7 @@
}
@Override
- public void visit(IInsert obj) {
+ public void visit(IInsertExpressionValueSource obj) {
replaceWithBinding = true;
visitNodes(obj.getValues());
}
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/ReplacementVisitor.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/ReplacementVisitor.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/ReplacementVisitor.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -34,7 +34,7 @@
import org.teiid.connector.language.IGroupBy;
import org.teiid.connector.language.IInCriteria;
import org.teiid.connector.language.IInlineView;
-import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertExpressionValueSource;
import org.teiid.connector.language.IIsNullCriteria;
import org.teiid.connector.language.ILikeCriteria;
import org.teiid.connector.language.IQueryCommand;
@@ -106,7 +106,7 @@
List<IExpression> expressions = obj.getElements();
for (int i=0; i<expressions.size(); i++) {
- IExpression expression = (IExpression)expressions.get(i);
+ IExpression expression = expressions.get(i);
expressions.set(i, replaceFunction(expression));
}
}
@@ -119,22 +119,20 @@
List<IExpression> rightExprs = obj.getRightExpressions();
for(int i=0; i<rightExprs.size(); i++) {
- IExpression expr = (IExpression) rightExprs.get(i);
+ IExpression expr = rightExprs.get(i);
rightExprs.set(i, replaceFunction(expr));
}
}
-
- /**
- * @see com.metamatrix.data.visitor.SQLStringVisitor#visit(org.teiid.connector.language.IInsert)
- */
- public void visit(IInsert obj) {
+
+ @Override
+ public void visit(IInsertExpressionValueSource obj) {
List<IExpression> values = obj.getValues();
for(int i=0; i<values.size(); i++) {
- IExpression expr = (IExpression) values.get(i);
+ IExpression expr = values.get(i);
values.set(i, replaceFunction(expr));
}
- }
+ }
/*
* @see com.metamatrix.data.visitor.LanguageObjectVisitor#visit(com.metamatrix.data.language.IIsNullCriteria)
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/SQLConversionVisitor.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/SQLConversionVisitor.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/SQLConversionVisitor.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -37,9 +37,7 @@
import org.teiid.connector.api.ExecutionContext;
import org.teiid.connector.api.TypeFacility;
-import org.teiid.connector.language.IBulkInsert;
import org.teiid.connector.language.ICommand;
-import org.teiid.connector.language.IElement;
import org.teiid.connector.language.IFunction;
import org.teiid.connector.language.ILanguageObject;
import org.teiid.connector.language.ILimit;
@@ -71,7 +69,6 @@
private boolean prepared;
private List preparedValues = new ArrayList();
- private List preparedTypes = new ArrayList();
private Set<ILanguageObject> recursionObjects = Collections.newSetFromMap(new IdentityHashMap<ILanguageObject, Boolean>());
@@ -123,19 +120,6 @@
}
}
- public void visit(IBulkInsert obj) {
- this.prepared = true;
-
- super.visit(obj);
-
- for (int i = 0; i < obj.getElements().size(); i++) {
- IElement element = (IElement) obj.getElements().get(i);
- this.preparedTypes.add(element.getType());
- }
-
- this.preparedValues = obj.getRows();
- }
-
/**
* @param type
* @param object
@@ -203,8 +187,7 @@
public void visit(ILiteral obj) {
if (this.prepared && obj.isBindValue()) {
buffer.append(UNDEFINED_PARAM);
- preparedValues.add(obj.getValue());
- preparedTypes.add(obj.getType());
+ preparedValues.add(obj);
} else {
translateSQLType(obj.getType(), obj.getValue(), buffer);
}
@@ -290,13 +273,6 @@
return this.preparedValues;
}
- /**
- * @return the preparedValues
- */
- List getPreparedTypes() {
- return this.preparedTypes;
- }
-
public boolean isPrepared() {
return prepared;
}
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/TranslatedCommand.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/TranslatedCommand.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/TranslatedCommand.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -45,7 +45,6 @@
private String sql;
private boolean prepared;
private List preparedValues;
- private List preparedTypes;
private SQLConversionVisitor sqlConversionVisitor;
private ReplacementVisitor functionVisitor;
@@ -74,7 +73,6 @@
public void translateCommand(ICommand command) throws ConnectorException {
this.sql = getSQL(command);
this.preparedValues = this.sqlConversionVisitor.getPreparedValues();
- this.preparedTypes = this.sqlConversionVisitor.getPreparedTypes();
this.prepared = this.sqlConversionVisitor.isPrepared();
}
@@ -128,15 +126,6 @@
}
/**
- * Return List of types to set on a prepared statement, if
- * necessary (see {@link #getStatementType})
- * @return List of types to be set on a prepared statement
- */
- public List getPreparedTypes() {
- return preparedTypes;
- }
-
- /**
* Get String SQL of translated command; but use
* {@link #nextLargeSetQuerySQL} if this command is
* a {@link #isLargeSetQuery large set query}
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/Translator.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/Translator.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/Translator.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -462,30 +462,6 @@
}
/**
- * Will be called by Query and Update executions if a PreparedStatement is used.
- *
- * bindValue is ultimately called from this method and for binding CallableStatement
- * values, so subclasses should override that method if necessery to change the binding
- * behavior.
- *
- * @see com.metamatrix.connector.jdbc.extension.ResultsTranslator#bindPreparedStatementValues(java.sql.Connection, java.sql.PreparedStatement, org.teiid.connector.jdbc.translator.TranslatedCommand)
- */
- public void bindPreparedStatementValues(Connection conn, PreparedStatement stmt, TranslatedCommand command) throws SQLException {
- List params = command.getPreparedValues();
-
- setPreparedStatementValues(stmt, params, command.getPreparedTypes());
- }
-
- private void setPreparedStatementValues(PreparedStatement stmt, List paramValues, List paramTypes) throws SQLException {
- for (int i = 0; i< paramValues.size(); i++) {
- Object parmvalue = paramValues.get(i);
- Class paramType = (Class)paramTypes.get(i);
- // this means the params is one row
- bindValue(stmt, parmvalue, paramType, i+1);
- }
- }
-
- /**
* Sets prepared statement parameter i with param.
*
* Performs special handling to translate dates using the database time zone and to
@@ -498,7 +474,7 @@
* @param cal
* @throws SQLException
*/
- protected void bindValue(PreparedStatement stmt, Object param, Class paramType, int i) throws SQLException {
+ public void bindValue(PreparedStatement stmt, Object param, Class paramType, int i) throws SQLException {
int type = TypeFacility.getSQLTypeFromRuntimeType(paramType);
if (param == null) {
@@ -529,34 +505,6 @@
stmt.setObject(i, param, type);
}
- /**
- * Execute a bulk insert on the given preparedstatement.
- * @param conn
- * @param stmt
- * @param command
- * @return
- * @throws SQLException
- */
- public int executeStatementForBulkInsert(Connection conn, PreparedStatement stmt, TranslatedCommand command) throws SQLException {
- List rows = command.getPreparedValues();
- int updateCount = 0;
-
- for (int i = 0; i< rows.size(); i++) {
- List row = (List) rows.get(i);
-
- setPreparedStatementValues(stmt, row, command.getPreparedTypes());
-
- stmt.addBatch();
- }
-
- int[] results = stmt.executeBatch();
-
- for (int i=0; i<results.length; i++) {
- updateCount += results[i];
- }
- return updateCount;
- }
-
/**
* Retrieve the value on the current resultset row for the given column index.
* @param results
@@ -818,16 +766,6 @@
result = getDefaultCapabilities().newInstance();
}
- if (result instanceof JDBCCapabilities) {
- String setCriteriaBatchSize = this.environment.getProperties().getProperty(JDBCPropertyNames.SET_CRITERIA_BATCH_SIZE);
- if (setCriteriaBatchSize != null) {
- int maxInCriteriaSize = Integer
- .parseInt(setCriteriaBatchSize);
- if (maxInCriteriaSize > 0) {
- ((JDBCCapabilities) result).setMaxInCriteriaSize(maxInCriteriaSize);
- }
- }
- }
return result;
} catch (Exception e) {
throw new ConnectorException(e);
Deleted: trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCConnector.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCConnector.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCConnector.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -1,63 +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.connector.jdbc;
-
-import java.util.Properties;
-
-import static org.junit.Assert.*;
-import org.junit.Test;
-import org.teiid.connector.api.ConnectorCapabilities;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.jdbc.translator.Translator;
-
-import com.metamatrix.cdk.api.EnvironmentUtility;
-
-
-public class TestJDBCConnector {
-
- public void helpTestMaxIn(int setting, int expected) throws Exception {
- Properties connProps = new Properties();
- connProps.setProperty(JDBCPropertyNames.SET_CRITERIA_BATCH_SIZE, String.valueOf(setting));
- connProps.setProperty(JDBCPropertyNames.EXT_CAPABILITY_CLASS, SimpleCapabilities.class.getName());
- Translator t = new Translator();
- t.initialize(EnvironmentUtility.createEnvironment(connProps));
- ConnectorCapabilities caps = t.getConnectorCapabilities();
- int maxIn = caps.getMaxInCriteriaSize();
- assertEquals(expected, maxIn);
- }
-
- @Test
- public void test1() throws Exception {
- helpTestMaxIn(-1, 250);
- }
-
- @Test
- public void test2() throws Exception {
- helpTestMaxIn(0, 250);
- }
-
- @Test
- public void test3() throws Exception {
- helpTestMaxIn(1, 1);
- }
-}
Modified: trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnector.java
===================================================================
--- trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnector.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnector.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -73,24 +73,8 @@
}
this.props = env.getProperties();
- // Get properties for initial connection.
- // LDAP Max In Criteria
- String ldapMaxCriteriaStr = props.getProperty(LDAPConnectorPropertyNames.LDAP_MAX_CRITERIA);
- if(ldapMaxCriteriaStr!=null) {
- try {
- ldapMaxCriteria = Integer.parseInt(ldapMaxCriteriaStr);
- } catch (NumberFormatException ex) {
- final String msg = LDAPPlugin.Util.getString("LDAPConnection.maxCriteriaParseError"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
- } else {
- final String msg = LDAPPlugin.Util.getString("LDAPConnection.maxCriteriaPropNotFound"); //$NON-NLS-1$
- throw new ConnectorException(msg);
- }
-
// Create and configure capabilities class.
myCaps = new LDAPConnectorCapabilities();
- myCaps.setInCriteriaSize(ldapMaxCriteria);
}
/**
Modified: trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnectorCapabilities.java
===================================================================
--- trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnectorCapabilities.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnectorCapabilities.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -29,8 +29,9 @@
*/
public class LDAPConnectorCapabilities extends BasicConnectorCapabilities {
- public void setInCriteriaSize(int maxInCriteriaSize) {
- this.maxInCriteriaSize = maxInCriteriaSize;
+ @Override
+ public int getMaxInCriteriaSize() {
+ return 1000;
}
public boolean supportsCompareCriteriaEquals() {
Modified: trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnectorPropertyNames.java
===================================================================
--- trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnectorPropertyNames.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnectorPropertyNames.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -29,7 +29,6 @@
public static final String LDAP_ADMIN_USER_DN = "LdapAdminUserDN"; //$NON-NLS-1$
public static final String LDAP_ADMIN_USER_PASSWORD = "LdapAdminUserPassword"; //$NON-NLS-1$
public static final String LDAP_TXN_TIMEOUT_IN_MILLIS = "LdapTxnTimeoutInMillis"; //$NON-NLS-1$
- public static final String LDAP_MAX_CRITERIA = "LdapMaxCriteria"; //$NON-NLS-1$
public static final String LDAP_DEFAULT_BASEDN = "SearchDefaultBaseDN"; //$NON-NLS-1$
public static final String LDAP_DEFAULT_SCOPE = "SearchDefaultScope"; //$NON-NLS-1$
public static final String LDAP_RESTRICT_TO_OBJECTCLASS = "RestrictToObjectClass"; //$NON-NLS-1$
Modified: trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPUpdateExecution.java
===================================================================
--- trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPUpdateExecution.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPUpdateExecution.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -46,6 +46,7 @@
import org.teiid.connector.language.IElement;
import org.teiid.connector.language.IExpression;
import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertExpressionValueSource;
import org.teiid.connector.language.ILiteral;
import org.teiid.connector.language.ISetClause;
import org.teiid.connector.language.IUpdate;
@@ -164,7 +165,7 @@
throws ConnectorException {
List insertElementList = ((IInsert)command).getElements();
- List insertValueList = ((IInsert)command).getValues();
+ List insertValueList = ((IInsertExpressionValueSource)((IInsert)command).getValueSource()).getValues();
// create a new attribute list with case ignored in attribute
// names
Attributes insertAttrs = new BasicAttributes(true);
Modified: trunk/connectors/connector-ldap/src/main/resources/connector-ldap.xml
===================================================================
--- trunk/connectors/connector-ldap/src/main/resources/connector-ldap.xml 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-ldap/src/main/resources/connector-ldap.xml 2009-05-11 14:34:31 UTC (rev 903)
@@ -2,11 +2,9 @@
<PropertyDefinition Name="ConnectorClassPath" DisplayName="Class Path" ShortDescription="" Multiplicity="0..1" IsPreferred="true"/>
<PropertyDefinition Name="ConnectorTypeClassPath" DisplayName="Connector Type Class Path" ShortDescription="Connector Type classpath (defined by system, do not modify)" DefaultValue="extensionjar:connector_patch.jar;extensionjar:${project.artifactId}-${project.version}.jar;${classpath}" Multiplicity="0..1" IsExpert="true"/>
<PropertyDefinition Name="SearchDefaultBaseDN" DisplayName="Default Search Base DN" ShortDescription="Default Base DN for LDAP Searches" IsExpert="true" />
- <PropertyDefinition Name="com.metamatrix.data.pool.cleaning_interval" DisplayName="Pool cleaning Interval (seconds)" ShortDescription="Set the interval to cleaning the pool" DefaultValue="300" PropertyType="Integer" IsExpert="true" />
<PropertyDefinition Name="LdapAdminUserDN" DisplayName="Ldap Admin User DN" ShortDescription="User DN for the LDAP admin account." DefaultValue="cn=<>,ou=<>,dc=<>" Multiplicity="1" IsPreferred="true" />
<PropertyDefinition Name="Standard" DisplayName="Standard Type" ShortDescription="Standard Built-in Connector Type" DefaultValue="true" PropertyType="Boolean" IsExpert="true" IsModifiable="false" />
<PropertyDefinition Name="ConnectorClass" DisplayName="Connector Class" ShortDescription="" DefaultValue="com.metamatrix.connector.ldap.LDAPConnector" Multiplicity="1" IsExpert="true" />
- <PropertyDefinition Name="LdapMaxCriteria" DisplayName="Ldap Max Criteria" ShortDescription="Maximum number of criteria supported in an LDAP search filter." DefaultValue="1000" Multiplicity="1" />
<PropertyDefinition Name="LdapAdminUserPassword" DisplayName="Ldap Admin Password" ShortDescription="Password of the LDAP admin user account." Multiplicity="1" IsMasked="true" IsPreferred="true" />
<PropertyDefinition Name="SearchDefaultScope" DisplayName="Default Search Scope" ShortDescription="Default Scope for LDAP Searches" DefaultValue="SUBTREE_SCOPE" Multiplicity="1">
<AllowedValue>OBJECT_SCOPE</AllowedValue>
@@ -14,10 +12,6 @@
<AllowedValue>SUBTREE_SCOPE</AllowedValue>
</PropertyDefinition>
<PropertyDefinition Name="RestrictToObjectClass" DisplayName="Restrict Searches To Named Object Class" ShortDescription="Restrict Searches to objectClass named in the Name field for a table" DefaultValue="false" PropertyType="Boolean" IsExpert="true" />
- <PropertyDefinition Name="com.metamatrix.data.pool.max_connections" DisplayName="Pool Maximum Connections" ShortDescription="Set the maximum number of connections for the connection pool" DefaultValue="100" Multiplicity="1" PropertyType="Integer" IsExpert="true" />
<PropertyDefinition Name="LdapTxnTimeoutInMillis" DisplayName="Ldap Transaction Timeout (ms)" ShortDescription="Timeout value for LDAP searches. Defaults to TCP timeout value." />
- <PropertyDefinition Name="com.metamatrix.data.pool.wait_for_source_time" DisplayName="Pool Connection Waiting Time (milliseconds)" ShortDescription="Set the time to wait if the connection is not available" DefaultValue="60000" PropertyType="Integer" IsExpert="true" />
<PropertyDefinition Name="LdapUrl" DisplayName="Ldap URL" ShortDescription="Ldap URL of the server, including port number." DefaultValue="ldap://<ldapServer>:<389>" Multiplicity="1" IsPreferred="true" />
- <PropertyDefinition Name="com.metamatrix.data.pool.live_and_unused_time" DisplayName="Pool Connection Idle Time (seconds)" ShortDescription="Set the idle time of the connection before it should be closed if pool shrinking is enabled" DefaultValue="300" PropertyType="Integer" IsExpert="true" />
- <PropertyDefinition Name="com.metamatrix.data.pool.enable_shrinking" DisplayName="Pool Shrinking Enabled" ShortDescription="Set whether to enable the pool shrinking" DefaultValue="true" PropertyType="Boolean" IsExpert="true" />
</ComponentType>
\ No newline at end of file
Modified: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Connector.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Connector.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Connector.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -119,15 +119,6 @@
} catch (Exception e) {
throw new ConnectorException(e, "Unable to load Capabilities Class");
}
- try {
- String inLimitString = env.getProperties().getProperty("InLimit", Integer.toString(-1));
- int inLimit = inLimitString == null ? -1 : Integer.decode(inLimitString).intValue();
- salesforceCapabilites.setMaxInCriteriaSize(inLimit);
- } catch (NumberFormatException e) {
- throw new ConnectorException(Messages.getString("SalesforceConnection.bad.IN.value"));
- }
-
-
logger.logTrace("Return SalesforceSourceConnection.initialize()");
}
Modified: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/SalesforceCapabilities.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/SalesforceCapabilities.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/SalesforceCapabilities.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -30,13 +30,9 @@
public class SalesforceCapabilities extends BasicConnectorCapabilities {
public int getMaxInCriteriaSize() {
- return maxInCriteriaSize;
+ return 100;
}
- public void setMaxInCriteriaSize(int size) {
- maxInCriteriaSize = size;
- }
-
public List getSupportedFunctions() {
List<String> supportedFunctions = new ArrayList<String>();
supportedFunctions.add("includes");
Modified: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/visitors/InsertVisitor.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/visitors/InsertVisitor.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/visitors/InsertVisitor.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -31,6 +31,7 @@
import org.teiid.connector.language.IElement;
import org.teiid.connector.language.IExpression;
import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertExpressionValueSource;
import org.teiid.connector.language.ILiteral;
import org.teiid.connector.metadata.runtime.Element;
import org.teiid.connector.metadata.runtime.RuntimeMetadata;
@@ -51,7 +52,7 @@
loadColumnMetadata(insert.getGroup());
List<IElement> columns = insert.getElements();
- List<IExpression> values = insert.getValues();
+ List<IExpression> values = ((IInsertExpressionValueSource)insert.getValueSource()).getValues();
if(columns.size() != values.size()) {
throw new ConnectorException("Error: columns.size and values.size are not the same.");
}
Modified: trunk/connectors/connector-salesforce/src/main/resources/connector-salesforce.xml
===================================================================
--- trunk/connectors/connector-salesforce/src/main/resources/connector-salesforce.xml 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-salesforce/src/main/resources/connector-salesforce.xml 2009-05-11 14:34:31 UTC (rev 903)
@@ -4,9 +4,7 @@
<PropertyDefinition Name="username" DisplayName="User Name" ShortDescription="Name value for Salesforce authentication" DefaultValue="" Multiplicity="1" IsPreferred="true" />
<PropertyDefinition Name="ConnectorStateClass" DisplayName="Connector State Class" ShortDescription="" DefaultValue="com.metamatrix.connector.salesforce.ConnectorState" Multiplicity="1" IsExpert="true" />
<PropertyDefinition Name="ConnectorClass" DisplayName="Connector Class" ShortDescription="" DefaultValue="com.metamatrix.connector.salesforce.Connector" Multiplicity="1" IsExpert="true" />
- <PropertyDefinition Name="InLimit" DisplayName="IN Criteria Limit" ShortDescription="The maximum number of values that can be supplied in an IN criteria" DefaultValue="-1" Multiplicity="1" IsExpert="true" />
<PropertyDefinition Name="password" DisplayName="Password" ShortDescription="Password value for Salesforce authentication" DefaultValue="" Multiplicity="1" IsMasked="true" IsPreferred="true" />
<PropertyDefinition Name="URL" DisplayName="Salesforce URL" ShortDescription="URL for connecting to Salesforce" DefaultValue="" IsExpert="true" />
<PropertyDefinition Name="ConnectorCapabilities" DisplayName="Connector Capabilities Class" ShortDescription="The class to use to provide the Connector Capabilities" DefaultValue="com.metamatrix.connector.salesforce.SalesforceCapabilities" IsConstrainedToAllowedValues="false" IsExpert="true" />
- <PropertyDefinition Name="SetCriteriaBatchSize" DisplayName="SetCriteria Batch Size" ShortDescription="Max number of values in a SetCriteria before batching into multiple queries. A value <= 0 indicates batching is OFF." DefaultValue="0" Multiplicity="0..1" PropertyType="Integer" ValueDelimiter="," IsConstrainedToAllowedValues="false" IsExpert="true" IsHidden="false" IsMasked="false" IsModifiable="true" IsPreferred="false" />
</ComponentType>
\ No newline at end of file
Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/capabilities/SourceCapabilities.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/capabilities/SourceCapabilities.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/capabilities/SourceCapabilities.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -277,13 +277,8 @@
* @since 4.2
*/
BATCHED_UPDATES,
+ BULK_UPDATE,
/**
- * Support indicates connector can accept queries with searched CASE WHEN <criteria> ... END
- *
- * @since 4.2
- */
- BULK_INSERT,
- /**
* Support indicates connector can limit result rows
*
* @since 5.0 SP1
@@ -308,10 +303,6 @@
* @since 5.0.2
*/
CONNECTOR_ID,
- /** Support indicates connector support prepared statement batch update
- * @since 5.5.2
- */
- PREPARED_BATCH_UPDATE,
/**
* @since 6.0.0 indicates the source supports XA transactions
*/
@@ -320,6 +311,7 @@
* @since 6.0.0 indicates support for where all
*/
REQUIRES_CRITERIA,
+ INSERT_WITH_QUERYEXPRESSION
}
public enum Scope {
Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/PlanToProcessConverter.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/PlanToProcessConverter.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/PlanToProcessConverter.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -171,7 +171,7 @@
if (!metadata.isVirtualGroup(groupID) && !metadata.isTemporaryTable(groupID)) {
SourceCapabilities caps = capFinder.findCapabilities(modelName);
pinode.setDoBatching(caps.supportsCapability(Capability.BATCHED_UPDATES));
- pinode.setDoBulkInsert(caps.supportsCapability(Capability.BULK_INSERT));
+ pinode.setDoBulkInsert(caps.supportsCapability(Capability.BULK_UPDATE));
} else if (metadata.isTemporaryTable(groupID)) {
pinode.setDoBulkInsert(true);
}
Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleCollapseSource.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleCollapseSource.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleCollapseSource.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -41,6 +41,7 @@
import com.metamatrix.query.processor.ProcessorPlan;
import com.metamatrix.query.processor.relational.AccessNode;
import com.metamatrix.query.processor.relational.RelationalPlan;
+import com.metamatrix.query.resolver.util.ResolverUtil;
import com.metamatrix.query.rewriter.QueryRewriter;
import com.metamatrix.query.sql.lang.Command;
import com.metamatrix.query.sql.lang.CompoundCriteria;
@@ -48,6 +49,7 @@
import com.metamatrix.query.sql.lang.From;
import com.metamatrix.query.sql.lang.FromClause;
import com.metamatrix.query.sql.lang.GroupBy;
+import com.metamatrix.query.sql.lang.Insert;
import com.metamatrix.query.sql.lang.JoinPredicate;
import com.metamatrix.query.sql.lang.JoinType;
import com.metamatrix.query.sql.lang.Limit;
@@ -87,8 +89,19 @@
Command command = FrameUtil.getNonQueryCommand(accessNode);
if(command == null) {
- plan = removeUnnecessaryInlineView(plan, accessNode);
- command = createQuery(metadata, capFinder, accessNode, accessNode);
+ PlanNode commandRoot = accessNode;
+ GroupSymbol intoGroup = (GroupSymbol)accessNode.getFirstChild().getProperty(NodeConstants.Info.INTO_GROUP);
+ if (intoGroup != null) {
+ commandRoot = NodeEditor.findNodePreOrder(accessNode, NodeConstants.Types.SOURCE).getFirstChild();
+ }
+ plan = removeUnnecessaryInlineView(plan, commandRoot);
+ QueryCommand queryCommand = createQuery(metadata, capFinder, accessNode, commandRoot);
+ command = queryCommand;
+ if (intoGroup != null) {
+ Insert insertCommand = new Insert(intoGroup, ResolverUtil.resolveElementsInGroup(intoGroup, metadata), null);
+ insertCommand.setQueryExpression(queryCommand);
+ command = insertCommand;
+ }
}
accessNode.setProperty(NodeConstants.Info.ATOMIC_REQUEST, command);
}
Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleRaiseAccess.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleRaiseAccess.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleRaiseAccess.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -179,8 +179,17 @@
return null;
}
- if (!CapabilitiesUtil.supportsInlineView(modelID, metadata, capFinder)) {
+ //raise only if there is no intervening project into
+ PlanNode parentProject = NodeEditor.findParent(parentNode, NodeConstants.Types.PROJECT);
+ GroupSymbol intoGroup = (GroupSymbol)parentProject.getProperty(NodeConstants.Info.INTO_GROUP);
+ if (intoGroup != null && parentProject.getParent() == null) {
+ if (CapabilitiesUtil.supports(Capability.INSERT_WITH_QUERYEXPRESSION, modelID, metadata, capFinder) && CapabilitiesUtil.isSameConnector(modelID, metadata.getModelID(intoGroup.getMetadataID()), metadata, capFinder)) {
+ rootNode = performRaise(rootNode, accessNode, parentNode);
+ return performRaise(rootNode, accessNode, parentProject);
+ }
return null;
+ } else if (!CapabilitiesUtil.supportsInlineView(modelID, metadata, capFinder)) {
+ return null;
}
//is there another query that will be used with this source
@@ -188,12 +197,6 @@
return null;
}
- //raise only if there is no intervening project into
- PlanNode parentProject = NodeEditor.findParent(parentNode, NodeConstants.Types.PROJECT);
- if (parentProject.getProperty(NodeConstants.Info.INTO_GROUP) != null) {
- return null;
- }
-
//switch to inline view and change the group on the access to that of the source
parentNode.setProperty(NodeConstants.Info.INLINE_VIEW, Boolean.TRUE);
accessNode.getGroups().clear();
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/relational/ProjectIntoNode.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/relational/ProjectIntoNode.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/relational/ProjectIntoNode.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -35,12 +35,12 @@
import com.metamatrix.common.buffer.TupleBatch;
import com.metamatrix.common.buffer.TupleSource;
import com.metamatrix.query.sql.lang.BatchedUpdateCommand;
-import com.metamatrix.query.sql.lang.BulkInsert;
import com.metamatrix.query.sql.lang.Command;
import com.metamatrix.query.sql.lang.Insert;
import com.metamatrix.query.sql.symbol.Constant;
import com.metamatrix.query.sql.symbol.ElementSymbol;
import com.metamatrix.query.sql.symbol.GroupSymbol;
+import com.metamatrix.query.sql.symbol.Reference;
public class ProjectIntoNode extends RelationalNode {
@@ -115,7 +115,7 @@
currentBatch = getChildren()[0].nextBatch(); // can throw BlockedException
this.batchRow = currentBatch.getBeginRow();
- if(currentBatch.getRowCount() == 0 && !this.intoGroup.isImplicitTempGroupSymbol()) {
+ if(currentBatch.getRowCount() == 0) {
continue;
}
} else if (currentBatch.getTerminationFlag() && this.batchRow > currentBatch.getEndRow()) {
@@ -126,15 +126,22 @@
int batchSize = currentBatch.getRowCount();
if (doBulkInsert) {
+ //convert to multivalued parameter
+ List<Constant> parameters = new ArrayList<Constant>(intoElements.size());
+ for (int i = 0; i < intoElements.size(); i++) {
+ Constant value = new Constant(null, ((ElementSymbol)intoElements.get(i)).getType());
+ value.setMultiValued(new ArrayList<Object>(currentBatch.getAllTuples().length));
+ parameters.add(value);
+ }
+ for (List row : currentBatch.getAllTuples()) {
+ for (int i = 0; i < row.size(); i++) {
+ ((List<Object>)parameters.get(i).getValue()).add(row.get(i));
+ }
+ }
// Create a bulk insert command batching all rows in the current batch.
- BulkInsert insert = new BulkInsert(intoGroup, intoElements);
-
- List rows = Arrays.asList(currentBatch.getAllTuples());
- insert.setRows(rows);
-
+ Insert insert = new Insert(intoGroup, intoElements, parameters);
// Register insert command against source
registerRequest(insert);
-
} else if (doBatching) {
// Register batched update command against source
int endRow = currentBatch.getEndRow();
Modified: trunk/engine/src/main/java/com/metamatrix/query/sql/LanguageVisitor.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/sql/LanguageVisitor.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/sql/LanguageVisitor.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -60,7 +60,6 @@
public void visit(Insert obj) {
visit((ProcedureContainer)obj);
}
- public void visit(BulkInsert obj) {}
public void visit(IsNullCriteria obj) {}
public void visit(JoinPredicate obj) {}
public void visit(JoinType obj) {}
Deleted: trunk/engine/src/main/java/com/metamatrix/query/sql/lang/BulkInsert.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/sql/lang/BulkInsert.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/sql/lang/BulkInsert.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -1,162 +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 com.metamatrix.query.sql.lang;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import com.metamatrix.api.exception.MetaMatrixComponentException;
-import com.metamatrix.core.util.EquivalenceUtil;
-import com.metamatrix.query.metadata.QueryMetadataInterface;
-import com.metamatrix.query.sql.LanguageVisitor;
-import com.metamatrix.query.sql.symbol.ElementSymbol;
-import com.metamatrix.query.sql.symbol.Expression;
-import com.metamatrix.query.sql.symbol.GroupSymbol;
-
-/**
- * Bulk insert is variation of Insert command, where a single table is being
- * inserted with multiple values. The purpose of this class from Insert is to
- * minimize the memory footprint and avoid multiple planning and performace.
- */
-public class BulkInsert extends Insert {
- private List rowValues = null;
-
- /**
- * Default ctor
- * @param group - Group Name
- * @param variables - Column Names
- */
- public BulkInsert(GroupSymbol group, List variables, List rows){
- super(group,variables, null);
- this.rowValues = rows;
- }
-
- /**
- * Default ctor
- * @param group - Group Name
- * @param variables - Column Names
- */
- public BulkInsert(GroupSymbol group, List variables){
- super(group,variables, null);
- }
-
- /**
- * Get the list of rows of column values.
- * @return List(row)-->list of column values; never null
- */
- public List getRows() {
- if (rowValues == null) {
- return Collections.EMPTY_LIST;
- }
- return rowValues;
-
- }
-
- /**
- * Get the list of rows of column values.
- * (row)-->list of column values
- */
- public void setRows(List rows) {
- rowValues = rows;
- }
-
- /**
- * @see com.metamatrix.query.sql.lang.Insert#addValue(com.metamatrix.query.sql.symbol.Expression)
- */
- public void addValue(Expression value) {
- throw new UnsupportedOperationException("This operation not allowed in BulkInsert"); //$NON-NLS-1$
- }
- /**
- * @see com.metamatrix.query.sql.lang.Insert#getValues()
- */
- public List getValues() {
- throw new UnsupportedOperationException("This operation not allowed in BulkInsert"); //$NON-NLS-1$
- }
- /**
- * @see com.metamatrix.query.sql.lang.Insert#setValues(java.util.List)
- */
- public void setValues(List values) {
- throw new UnsupportedOperationException("This operation not allowed in BulkInsert"); //$NON-NLS-1$
- }
-
- /**
- * @see java.lang.Object#clone()
- */
- public Object clone() {
- GroupSymbol group = getGroup();
- GroupSymbol copyGroup = null;
- if(group != null) {
- copyGroup = (GroupSymbol) group.clone();
- }
-
- List copyVars = null;
- if(getVariables() != null) {
- copyVars = new ArrayList(getVariables().size());
- Iterator iter = getVariables().iterator();
- while(iter.hasNext()) {
- ElementSymbol element = (ElementSymbol) iter.next();
- copyVars.add( element.clone() );
- }
- }
-
- // now make a new copy of the original
- BulkInsert copy = new BulkInsert(copyGroup, copyVars);
- copy.rowValues = getRows();
- copyMetadataState(copy);
- return copy;
- }
-
- /**
- * @see java.lang.Object#equals(java.lang.Object)
- */
- public boolean equals(Object obj) {
- // Quick same object test
- if(this == obj) {
- return true;
- }
-
- // Quick fail tests
- if(!(obj instanceof BulkInsert)) {
- return false;
- }
-
- BulkInsert other = (BulkInsert) obj;
-
- return EquivalenceUtil.areEqual(getGroup(), other.getGroup()) &&
- EquivalenceUtil.areEqual(getVariables(), other.getVariables()) &&
- EquivalenceUtil.areEqual(getRows(), other.getRows());
- }
-
- public void acceptVisitor(LanguageVisitor visitor) {
- visitor.visit(this);
- }
-
- /**
- * @see com.metamatrix.query.sql.lang.PreparedBatchUpdate#updatingModelCount(com.metamatrix.query.metadata.QueryMetadataInterface)
- */
- public int updatingModelCount(QueryMetadataInterface metadata) throws MetaMatrixComponentException {
- return 2; // return 2 since we may be multibatch
- }
-}
Modified: trunk/engine/src/main/java/com/metamatrix/query/sql/lang/Insert.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/sql/lang/Insert.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/sql/lang/Insert.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -33,6 +33,7 @@
import com.metamatrix.core.util.HashCodeUtil;
import com.metamatrix.query.sql.LanguageVisitor;
import com.metamatrix.query.sql.ProcedureReservedWords;
+import com.metamatrix.query.sql.symbol.Constant;
import com.metamatrix.query.sql.symbol.ElementSymbol;
import com.metamatrix.query.sql.symbol.Expression;
import com.metamatrix.query.sql.symbol.GroupSymbol;
@@ -104,6 +105,16 @@
public void setGroup(GroupSymbol group) {
this.group = group;
}
+
+ public boolean isBulk() {
+ if (this.values == null) {
+ return false;
+ }
+ if (!(this.values.get(0) instanceof Constant)) {
+ return false;
+ }
+ return ((Constant)this.values.get(0)).isMultiValued();
+ }
/**
* Return an ordered List of variables, may be null if no columns were specified
@@ -260,6 +271,9 @@
}
Insert copy = new Insert(copyGroup, copyVars, copyVals);
+ if (this.queryExpression != null) {
+ copy.setQueryExpression((QueryCommand)this.queryExpression.clone());
+ }
this.copyMetadataState(copy);
return copy;
}
Modified: trunk/engine/src/main/java/com/metamatrix/query/sql/navigator/PreOrPostOrderNavigator.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/sql/navigator/PreOrPostOrderNavigator.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/sql/navigator/PreOrPostOrderNavigator.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -29,7 +29,6 @@
import com.metamatrix.query.sql.LanguageVisitor;
import com.metamatrix.query.sql.lang.BatchedUpdateCommand;
import com.metamatrix.query.sql.lang.BetweenCriteria;
-import com.metamatrix.query.sql.lang.BulkInsert;
import com.metamatrix.query.sql.lang.CompareCriteria;
import com.metamatrix.query.sql.lang.CompoundCriteria;
import com.metamatrix.query.sql.lang.Create;
@@ -300,15 +299,6 @@
visitNode(obj.getTable());
postVisitVisitor(obj);
}
- public void visit(BulkInsert obj) {
- preVisitVisitor(obj);
- visitNode(obj.getGroup());
- visitNodes(obj.getVariables());
- // No values neeed to be traversed for this.
- // visitNodes(obj.getValues());
- visitNode(obj.getOption());
- postVisitVisitor(obj);
- }
public void visit(Into obj) {
preVisitVisitor(obj);
visitNode(obj.getGroup());
Modified: trunk/engine/src/main/java/com/metamatrix/query/sql/symbol/Constant.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/sql/symbol/Constant.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/sql/symbol/Constant.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -22,6 +22,8 @@
package com.metamatrix.query.sql.symbol;
+import java.util.List;
+
import com.metamatrix.common.types.DataTypeManager;
import com.metamatrix.query.QueryPlugin;
import com.metamatrix.query.sql.LanguageVisitor;
@@ -34,10 +36,11 @@
* value, but that is not true if the value is null. In that case, the type is unknown
* and is set to the null type until the type is resolved at a later point.
*/
-public class Constant implements Expression, Comparable {
+public class Constant implements Expression {
private Object value;
private Class type;
+ private boolean multiValued;
/**
* Construct a typed constant. The specified value is not verified to be a value
@@ -103,11 +106,20 @@
public boolean isResolved() {
return true;
}
+
+ public void setMultiValued(List<?> value) {
+ this.multiValued = true;
+ this.value = value;
+ }
+
+ public boolean isMultiValued() {
+ return multiValued;
+ }
public void acceptVisitor(LanguageVisitor visitor) {
visitor.visit(this);
}
-
+
/**
* Compare this constant to another constant for equality.
* @param obj Other object
@@ -155,7 +167,9 @@
* @return Shallow copy of object
*/
public Object clone() {
- return new Constant(getValue(), getType());
+ Constant copy = new Constant(getValue(), getType());
+ copy.multiValued = multiValued;
+ return copy;
}
/**
@@ -165,26 +179,5 @@
public String toString() {
return SQLStringVisitor.getSQLString(this);
}
-
- /**
- * @see java.lang.Comparable#compareTo(java.lang.Object)
- * @since 4.2
- */
- public int compareTo(Object o) throws ClassCastException {
- if(o instanceof Constant) {
- Constant compare = (Constant)o;
- if(this.type.equals(compare.type)) {
- if(compare.value == null) {
- return 1;
- } else if(this.value == null) {
- return -1;
- } else if(compare.value instanceof Comparable) {
- return ((Comparable)this.value).compareTo(compare.value);
- }
- }
- }
- throw new ClassCastException();
- }
-
-
+
}
Modified: trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/EvaluatableVisitor.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/EvaluatableVisitor.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/EvaluatableVisitor.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -39,6 +39,7 @@
import com.metamatrix.query.sql.lang.SubquerySetCriteria;
import com.metamatrix.query.sql.navigator.PreOrderNavigator;
import com.metamatrix.query.sql.symbol.AggregateSymbol;
+import com.metamatrix.query.sql.symbol.Constant;
import com.metamatrix.query.sql.symbol.ElementSymbol;
import com.metamatrix.query.sql.symbol.ExpressionSymbol;
import com.metamatrix.query.sql.symbol.Function;
@@ -73,6 +74,13 @@
}
}
+ @Override
+ public void visit(Constant obj) {
+ if (obj.isMultiValued()) {
+ evaluationNotPossible(EvaluationLevel.PUSH_DOWN);
+ }
+ }
+
private void setDeterminismLevel(int value) {
determinismLevel = Math.max(determinismLevel, value);
}
Modified: trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/EvaluateExpressionVisitor.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/EvaluateExpressionVisitor.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/EvaluateExpressionVisitor.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -83,12 +83,12 @@
try {
value = new Evaluator(Collections.emptyMap(), dataMgr, context).evaluate(expr, Collections.emptyList());
} catch (MetaMatrixException err) {
- if (expr instanceof Reference) {
- return expr;
- }
throw new MetaMatrixRuntimeException(err);
}
- return new Constant(value, expr.getType());
+ if (value instanceof Constant) {
+ return (Constant)value; //multi valued substitution
+ }
+ return new Constant(value, expr.getType());
}
/**
Modified: trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/SQLStringVisitor.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/SQLStringVisitor.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/SQLStringVisitor.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -36,7 +36,6 @@
import com.metamatrix.query.sql.LanguageVisitor;
import com.metamatrix.query.sql.ReservedWords;
import com.metamatrix.query.sql.lang.BetweenCriteria;
-import com.metamatrix.query.sql.lang.BulkInsert;
import com.metamatrix.query.sql.lang.CompareCriteria;
import com.metamatrix.query.sql.lang.CompoundCriteria;
import com.metamatrix.query.sql.lang.Create;
@@ -468,26 +467,6 @@
}
}
- public void visit(BulkInsert obj) {
- formatBasicInsert(obj);
- int varCount = obj.getVariables().size();
- parts.add(ReservedWords.VALUES);
- parts.add(" ("); //$NON-NLS-1$
- for (int i=0; i<varCount; i++) {
- parts.add("?"); //$NON-NLS-1$
- if (i < varCount-1) {
- parts.add(","); //$NON-NLS-1$
- }
- }
- parts.add(")"); //$NON-NLS-1$
-
- // Option clause
- if(obj.getOption() != null) {
- parts.add(SPACE);
- parts.add(registerNode(obj.getOption()));
- }
- }
-
public void visit(IsNullCriteria obj) {
Expression expr = obj.getExpression();
Object exprPart = registerNode(expr);
@@ -1153,8 +1132,9 @@
public void visit(Constant obj) {
Object[] constantParts = null;
-
- if(obj.isNull()) {
+ if (obj.isMultiValued()) {
+ constantParts = new Object[] {"?"}; //$NON-NLS-1$
+ } else if(obj.isNull()) {
constantParts = new Object[] {"null"}; //$NON-NLS-1$
} else {
try {
Modified: trunk/engine/src/main/java/com/metamatrix/query/tempdata/TempTableStoreImpl.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/tempdata/TempTableStoreImpl.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/tempdata/TempTableStoreImpl.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -48,12 +48,12 @@
import com.metamatrix.query.metadata.TempMetadataStore;
import com.metamatrix.query.processor.proc.UpdateCountTupleSource;
import com.metamatrix.query.resolver.util.ResolverUtil;
-import com.metamatrix.query.sql.lang.BulkInsert;
import com.metamatrix.query.sql.lang.Command;
import com.metamatrix.query.sql.lang.Create;
import com.metamatrix.query.sql.lang.Drop;
import com.metamatrix.query.sql.lang.Insert;
import com.metamatrix.query.sql.lang.Query;
+import com.metamatrix.query.sql.symbol.Constant;
import com.metamatrix.query.sql.symbol.ElementSymbol;
import com.metamatrix.query.sql.symbol.Expression;
import com.metamatrix.query.sql.symbol.GroupSymbol;
@@ -178,7 +178,7 @@
return new UpdateCountTupleSource(0);
}
}
- throw new AssertionError("unhandled temp table reqest");
+ throw new AssertionError("unhandled temp table reqest"); //$NON-NLS-1$
}
public void removeTempTables() throws MetaMatrixComponentException{
@@ -225,8 +225,8 @@
TupleBatch tupleBatch;
List elements = ResolverUtil.resolveElementsInGroup(group, new TempMetadataAdapter(null, tempMetadataStore));
- if ( insert instanceof BulkInsert ) {
- List tuples = ((BulkInsert)insert).getRows();
+ if ( insert.isBulk() ) {
+ List<List<Object>> tuples = getBulkRows(insert);
tuplesAdded = tuples.size();
@@ -261,6 +261,23 @@
return new UpdateCountTupleSource(tuplesAdded);
}
+
+ public static List<List<Object>> getBulkRows(Insert insert) {
+ Constant c = (Constant)insert.getValues().get(0);
+ int bulkRowCount = ((List<?>)c.getValue()).size();
+
+ List<List<Object>> tuples = new ArrayList<List<Object>>(bulkRowCount);
+
+ for (int row = 0; row < bulkRowCount; row++) {
+ List<Object> currentRow = new ArrayList<Object>(insert.getValues().size());
+ for (int i = 0; i < insert.getValues().size(); i++) {
+ Constant multiValue = (Constant)insert.getValues().get(i);
+ currentRow.add(((List<?>)multiValue.getValue()).get(row));
+ }
+ tuples.add(currentRow);
+ }
+ return tuples;
+ }
public boolean hasTempTable(Command command){
switch (command.getType()) {
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/CapabilitiesConverter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/CapabilitiesConverter.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/CapabilitiesConverter.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -83,7 +83,7 @@
tgtCaps.setCapabilitySupport(Capability.QUERY_INTERSECT, srcCaps.supportsIntersect());
tgtCaps.setCapabilitySupport(Capability.QUERY_EXCEPT, srcCaps.supportsExcept());
tgtCaps.setCapabilitySupport(Capability.QUERY_SET_ORDER_BY, srcCaps.supportsSetQueryOrderBy());
- tgtCaps.setCapabilitySupport(Capability.BULK_INSERT , srcCaps.supportsBulkInsert());
+ tgtCaps.setCapabilitySupport(Capability.BULK_UPDATE , srcCaps.supportsBulkUpdate());
tgtCaps.setCapabilitySupport(Capability.BATCHED_UPDATES, srcCaps.supportsBatchedUpdates());
tgtCaps.setCapabilitySupport(Capability.QUERY_FUNCTIONS_IN_GROUP_BY, srcCaps.supportsFunctionsInGroupBy());
tgtCaps.setCapabilitySupport(Capability.ROW_LIMIT, srcCaps.supportsRowLimit());
@@ -92,6 +92,7 @@
tgtCaps.setCapabilitySupport(Capability.REQUIRES_CRITERIA, srcCaps.requiresCriteria());
tgtCaps.setCapabilitySupport(Capability.QUERY_GROUP_BY, srcCaps.supportsGroupBy());
tgtCaps.setCapabilitySupport(Capability.QUERY_HAVING, srcCaps.supportsHaving());
+ tgtCaps.setCapabilitySupport(Capability.INSERT_WITH_QUERYEXPRESSION, srcCaps.supportsInsertWithQueryExpression());
List functions = srcCaps.getSupportedFunctions();
if(functions != null && functions.size() > 0) {
Deleted: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/BulkInsertImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/BulkInsertImpl.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/BulkInsertImpl.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -1,87 +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.dqp.internal.datamgr.language;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.teiid.connector.language.IBulkInsert;
-import org.teiid.connector.language.IGroup;
-import org.teiid.connector.visitor.framework.LanguageObjectVisitor;
-
-
-
-/**
- * A simple variation of insert where multiple rows can be inserted as single
- * operation.
- */
-public class BulkInsertImpl extends InsertImpl implements IBulkInsert {
- List rowValues = null;
-
- public BulkInsertImpl(IGroup group, List elements) {
- super(group, elements, null);
- }
-
- public BulkInsertImpl(IGroup group, List elements, List rows) {
- super(group, elements, null);
- this.rowValues = rows;
- }
-
- /**
- * @see org.teiid.connector.language.IBulkInsert#getRows()
- */
- public List getRows() {
- if (rowValues == null) {
- return Collections.EMPTY_LIST;
- }
- return rowValues;
- }
-
- /**
- * Set the list of row values for this bulk insert
- * @return list; never null
- */
- public void setRows(List rows) {
- rowValues = rows;
- }
-
- /**
- * @see org.teiid.connector.language.IInsert#getValues()
- */
- public List getValues() {
- throw new UnsupportedOperationException("This operation is not supported"); //$NON-NLS-1$
- }
- /**
- * @see org.teiid.connector.language.IInsert#setValues(java.util.List)
- */
- public void setValues(List values) {
- throw new UnsupportedOperationException("This operation is not supported"); //$NON-NLS-1$
- }
-
- /**
- * @see org.teiid.connector.language.ILanguageObject#acceptVisitor(com.metamatrix.data.visitor.LanguageObjectVisitor)
- */
- public void acceptVisitor(LanguageObjectVisitor visitor) {
- visitor.visit(this);
- }
-}
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/InsertImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/InsertImpl.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/InsertImpl.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -26,19 +26,20 @@
import org.teiid.connector.language.IGroup;
import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertValueSource;
import org.teiid.connector.visitor.framework.LanguageObjectVisitor;
public class InsertImpl extends BaseLanguageObject implements IInsert {
- private IGroup group = null;
- private List elements = null;
- private List values = null;
+ private IGroup group;
+ private List elements;
+ private IInsertValueSource valueSource;
- public InsertImpl(IGroup group, List elements, List values) {
+ public InsertImpl(IGroup group, List elements, IInsertValueSource valueSource) {
this.group = group;
this.elements = elements;
- this.values = values;
+ this.valueSource = valueSource;
}
/**
* @see org.teiid.connector.language.IInsert#getGroup()
@@ -55,10 +56,10 @@
}
/**
- * @see org.teiid.connector.language.IInsert#getValues()
+ * @see org.teiid.connector.language.IInsert#getValueSource()
*/
- public List getValues() {
- return values;
+ public IInsertValueSource getValueSource() {
+ return valueSource;
}
/**
@@ -79,11 +80,10 @@
public void setElements(List elements) {
this.elements = elements;
}
- /*
- * @see com.metamatrix.data.language.IInsert#setValues(java.util.List)
- */
- public void setValues(List values) {
- this.values = values;
+
+ @Override
+ public void setValueSource(IInsertValueSource values) {
+ this.valueSource = values;
}
}
Added: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/InsertValueExpressionsImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/InsertValueExpressionsImpl.java (rev 0)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/InsertValueExpressionsImpl.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -0,0 +1,27 @@
+package org.teiid.dqp.internal.datamgr.language;
+
+import java.util.List;
+
+import org.teiid.connector.language.IExpression;
+import org.teiid.connector.language.IInsertExpressionValueSource;
+import org.teiid.connector.visitor.framework.LanguageObjectVisitor;
+
+public class InsertValueExpressionsImpl extends BaseLanguageObject implements IInsertExpressionValueSource {
+
+ private List<IExpression> values;
+
+ public InsertValueExpressionsImpl(List<IExpression> values) {
+ this.values = values;
+ }
+
+ @Override
+ public List<IExpression> getValues() {
+ return values;
+ }
+
+ @Override
+ public void acceptVisitor(LanguageObjectVisitor visitor) {
+ visitor.visit(this);
+ }
+
+}
Property changes on: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/InsertValueExpressionsImpl.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageBridgeFactory.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageBridgeFactory.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageBridgeFactory.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -44,6 +44,7 @@
import org.teiid.connector.language.IGroupBy;
import org.teiid.connector.language.IInCriteria;
import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertValueSource;
import org.teiid.connector.language.IIsNullCriteria;
import org.teiid.connector.language.IJoin;
import org.teiid.connector.language.ILikeCriteria;
@@ -79,7 +80,6 @@
import com.metamatrix.query.metadata.QueryMetadataInterface;
import com.metamatrix.query.metadata.TempMetadataID;
import com.metamatrix.query.sql.lang.BatchedUpdateCommand;
-import com.metamatrix.query.sql.lang.BulkInsert;
import com.metamatrix.query.sql.lang.Command;
import com.metamatrix.query.sql.lang.CompareCriteria;
import com.metamatrix.query.sql.lang.CompoundCriteria;
@@ -119,7 +119,6 @@
import com.metamatrix.query.sql.symbol.ExpressionSymbol;
import com.metamatrix.query.sql.symbol.Function;
import com.metamatrix.query.sql.symbol.GroupSymbol;
-import com.metamatrix.query.sql.symbol.Reference;
import com.metamatrix.query.sql.symbol.ScalarSubquery;
import com.metamatrix.query.sql.symbol.SearchedCaseExpression;
import com.metamatrix.query.sql.symbol.SingleElementSymbol;
@@ -468,8 +467,6 @@
return translate((Constant)expr);
} else if (expr instanceof Function) {
return translate((Function)expr);
- } else if (expr instanceof Reference) {
- return translate((Reference)expr);
} else if (expr instanceof ScalarSubquery) {
return translate((ScalarSubquery)expr);
} else if (expr instanceof SearchedCaseExpression) {
@@ -481,7 +478,10 @@
}
ILiteral translate(Constant constant) {
- return new LiteralImpl(constant.getValue(), constant.getType());
+ LiteralImpl result = new LiteralImpl(constant.getValue(), constant.getType());
+ result.setBindValue(constant.isMultiValued());
+ result.setMultiValued(constant.isMultiValued());
+ return result;
}
IFunction translate(Function function) throws MetaMatrixComponentException {
@@ -495,10 +495,6 @@
return new FunctionImpl(function.getName(), params, function.getType());
}
- IExpression translate(Reference ref) throws MetaMatrixComponentException {
- return translate(ref.getExpression());
- }
-
ISearchedCaseExpression translate(SearchedCaseExpression expr) throws MetaMatrixComponentException {
ArrayList whens = new ArrayList(), thens = new ArrayList();
for (int i = 0; i < expr.getWhenCount(); i++) {
@@ -570,32 +566,31 @@
translatedElements.add(translate((ElementSymbol)i.next()));
}
- // If the insert is bulk insert then translate the multiple values
- if (insert instanceof BulkInsert) {
- BulkInsert bulkInsert = (BulkInsert)insert;
- BulkInsertImpl translatedBulkInsert =
- new BulkInsertImpl(translate(insert.getGroup()),translatedElements);
- List rows = bulkInsert.getRows();
- translatedBulkInsert.setRows(rows);
- return translatedBulkInsert;
+ IInsertValueSource valueSource = null;
+ if (insert.getQueryExpression() != null) {
+ valueSource = translate(insert.getQueryExpression());
+ } else {
+ // This is for the simple one row insert.
+ List values = insert.getValues();
+ List translatedValues = new ArrayList();
+ for (Iterator i = values.iterator(); i.hasNext();) {
+ translatedValues.add(translate((Expression)i.next()));
+ }
+ valueSource = new InsertValueExpressionsImpl(translatedValues);
}
- // This is for the simple one row insert.
- List values = insert.getValues();
- List translatedValues = new ArrayList();
- for (Iterator i = values.iterator(); i.hasNext();) {
- translatedValues.add(translate((Expression)i.next()));
- }
- return new InsertImpl(translate(insert.getGroup()),
+ InsertImpl result = new InsertImpl(translate(insert.getGroup()),
translatedElements,
- translatedValues);
+ valueSource);
+ return result;
}
/* Update */
IUpdate translate(Update update) throws MetaMatrixComponentException {
- return new UpdateImpl(translate(update.getGroup()),
+ UpdateImpl updateImpl = new UpdateImpl(translate(update.getGroup()),
translate(update.getChangeList()),
translate(update.getCriteria()));
+ return updateImpl;
}
ISetClauseList translate(SetClauseList setClauseList) throws MetaMatrixComponentException {
@@ -612,8 +607,9 @@
/* Delete */
IDelete translate(Delete delete) throws MetaMatrixComponentException {
- return new DeleteImpl(translate(delete.getGroup()),
+ DeleteImpl deleteImpl = new DeleteImpl(translate(delete.getGroup()),
translate(delete.getCriteria()));
+ return deleteImpl;
}
/* Execute */
@@ -636,7 +632,7 @@
return new ProcedureImpl(sp.getProcedureName(), translatedParameters, proc);
}
- IParameter translate(SPParameter param, Procedure parent) throws MetaMatrixComponentException {
+ IParameter translate(SPParameter param, Procedure parent) {
Direction direction = Direction.IN;
switch(param.getParameterType()) {
case ParameterInfo.IN:
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageFactoryImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageFactoryImpl.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageFactoryImpl.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -26,7 +26,6 @@
import java.util.List;
import org.teiid.connector.language.IAggregate;
-import org.teiid.connector.language.IBulkInsert;
import org.teiid.connector.language.ICompareCriteria;
import org.teiid.connector.language.ICompoundCriteria;
import org.teiid.connector.language.ICriteria;
@@ -42,6 +41,8 @@
import org.teiid.connector.language.IInCriteria;
import org.teiid.connector.language.IInlineView;
import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertExpressionValueSource;
+import org.teiid.connector.language.IInsertValueSource;
import org.teiid.connector.language.IIsNullCriteria;
import org.teiid.connector.language.IJoin;
import org.teiid.connector.language.ILanguageFactory;
@@ -136,14 +137,15 @@
@Override
public IFunction createFunction(String functionName, IExpression[] args,
- Class type) {
+ Class<?> type) {
return new FunctionImpl(functionName, Arrays.asList(args), type);
}
/*
* @see com.metamatrix.data.language.ILanguageFactory#createFunction(java.lang.String, com.metamatrix.data.language.IExpression[], java.lang.Class)
*/
- public IFunction createFunction(String functionName, List<? extends IExpression> args, Class type) {
+ @Override
+ public IFunction createFunction(String functionName, List<? extends IExpression> args, Class<?> type) {
return new FunctionImpl(functionName, args, type);
}
@@ -167,19 +169,17 @@
public IInCriteria createInCriteria(IExpression leftExpression, List rightExpressions, boolean isNegated) {
return new InCriteriaImpl(leftExpression, rightExpressions, isNegated);
}
-
- /*
- * @see com.metamatrix.data.language.ILanguageFactory#createInsert(com.metamatrix.data.language.IGroup, java.util.List, java.util.List)
- */
- public IInsert createInsert(IGroup group, List columns, List values) {
- return new InsertImpl(group, columns, values);
+
+ @Override
+ public IInsert createInsert(IGroup group, List<IElement> columns,
+ IInsertValueSource valueSource) {
+ return new InsertImpl(group, columns, valueSource);
}
-
- /**
- * @see org.teiid.connector.language.ILanguageFactory#createBulkInsert(org.teiid.connector.language.IGroup, java.util.List, java.util.List)
- */
- public IBulkInsert createBulkInsert(IGroup group, List columns, List rows) {
- return new BulkInsertImpl(group, columns, rows);
+
+ @Override
+ public IInsertExpressionValueSource createInsertExpressionValueSource(
+ List<IExpression> values) {
+ return new InsertValueExpressionsImpl(values);
}
/*
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LiteralImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LiteralImpl.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LiteralImpl.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -27,11 +27,12 @@
public class LiteralImpl extends BaseLanguageObject implements ILiteral {
- Object value;
- Class type;
- private boolean bindValue = false;
+ private Object value;
+ private Class<?> type;
+ private boolean bindValue;
+ private boolean multiValued;
- public LiteralImpl(Object value, Class type) {
+ public LiteralImpl(Object value, Class<?> type) {
this.value = value;
this.type = type;
}
@@ -53,7 +54,7 @@
/*
* @see com.metamatrix.data.language.ILiteral#getType()
*/
- public Class getType() {
+ public Class<?> getType() {
return this.type;
}
@@ -64,13 +65,6 @@
this.value = value;
}
- /*
- * @see com.metamatrix.data.language.ILiteral#setType(java.lang.Class)
- */
- public void setType(Class type) {
- this.type = type;
- }
-
/**
* @see org.teiid.connector.language.ILiteral#isBindValue()
*/
@@ -85,4 +79,19 @@
this.bindValue = bindValue;
}
+ @Override
+ public boolean isMultiValued() {
+ return multiValued;
+ }
+
+ @Override
+ public void setMultiValued(boolean multiValued) {
+ this.multiValued = multiValued;
+ }
+
+ @Override
+ public void setType(Class<?> type) {
+ this.type = type;
+ }
+
}
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/ProcedureImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/ProcedureImpl.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/ProcedureImpl.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -22,7 +22,6 @@
package org.teiid.dqp.internal.datamgr.language;
-import java.util.Iterator;
import java.util.List;
import org.teiid.connector.api.ConnectorException;
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/SetClauseImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/SetClauseImpl.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/SetClauseImpl.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -27,7 +27,7 @@
import org.teiid.connector.language.ISetClause;
import org.teiid.connector.visitor.framework.LanguageObjectVisitor;
-public class SetClauseImpl implements ISetClause {
+public class SetClauseImpl extends BaseLanguageObject implements ISetClause {
private IElement symbol;
private IExpression value;
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/SetClauseListImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/SetClauseListImpl.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/SetClauseListImpl.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -30,7 +30,7 @@
import org.teiid.connector.visitor.framework.LanguageObjectVisitor;
-public class SetClauseListImpl implements ISetClauseList {
+public class SetClauseListImpl extends BaseLanguageObject implements ISetClauseList {
private List<ISetClause> clauses;
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -22,6 +22,7 @@
package org.teiid.dqp.internal.process;
+import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@@ -193,29 +194,38 @@
*/
private void handlePreparedBatchUpdate() throws QueryMetadataException,
MetaMatrixComponentException, QueryResolverException, QueryPlannerException, QueryValidatorException {
- ProcessorPlan plan = this.processPlan;
List<List<?>> paramValues = requestMsg.getParameterValues();
if (paramValues.isEmpty()) {
throw new QueryValidatorException("No batch values sent for prepared batch update"); //$NON-NLS-1$
}
boolean supportPreparedBatchUpdate = false;
- if (plan instanceof RelationalPlan) {
- RelationalPlan rPlan = (RelationalPlan)plan;
+ if (this.processPlan instanceof RelationalPlan && this.prepPlan.getRewritenCommand().getSubCommands().isEmpty()) {
+ RelationalPlan rPlan = (RelationalPlan)this.processPlan;
if (rPlan.getRootNode() instanceof AccessNode) {
AccessNode aNode = (AccessNode)rPlan.getRootNode();
- String modelName = aNode.getModelName();
+ String modelName = aNode.getModelName();
SourceCapabilities caps = capabilitiesFinder.findCapabilities(modelName);
- supportPreparedBatchUpdate = caps.supportsCapability(SourceCapabilities.Capability.PREPARED_BATCH_UPDATE);
+ supportPreparedBatchUpdate = caps.supportsCapability(SourceCapabilities.Capability.BULK_UPDATE);
}
}
CommandTreeNode ctn = new CommandTreeNode();
List<Command> commands = new LinkedList<Command>();
List<VariableContext> contexts = new LinkedList<VariableContext>();
+ List<List<Object>> multiValues = new ArrayList<List<Object>>(this.prepPlan.getReferences().size());
for (List<?> values : paramValues) {
resolveAndValidateParameters(this.userCommand, this.prepPlan.getReferences(), values);
contexts.add(this.context.getVariableContext());
if(supportPreparedBatchUpdate){
- continue; // -- TODO make this work
+ if (multiValues.isEmpty()) {
+ for (int i = 0; i < values.size(); i++) {
+ multiValues.add(new ArrayList<Object>(paramValues.size()));
+ }
+ }
+ for (int i = 0; i < values.size(); i++) {
+ List<Object> multiValue = multiValues.get(i);
+ multiValue.add(values.get(i));
+ }
+ continue;
}
Command c = (Command)this.prepPlan.getRewritenCommand().clone();
commands.add(c);
@@ -229,10 +239,19 @@
this.context.setVariableContext(new VariableContext());
}
- if (supportPreparedBatchUpdate || paramValues.size() == 1) {
- return; // just use the existing plan
+ if (paramValues.size() == 1) {
+ return; // just use the existing plan, and global reference evaluation
}
+ if (supportPreparedBatchUpdate) {
+ for (int i = 0; i < this.prepPlan.getReferences().size(); i++) {
+ Constant c = new Constant(null, this.prepPlan.getReferences().get(i).getType());
+ c.setMultiValued(multiValues.get(i));
+ this.context.getVariableContext().setGlobalValue(this.prepPlan.getReferences().get(i).getContextSymbol(), c);
+ }
+ return;
+ }
+
BatchedUpdateCommand buc = new BatchedUpdateCommand(commands);
ctn.setCommand(buc);
ctn.setProperty(RelationalPlanner.VARIABLE_CONTEXTS, contexts);
Added: trunk/engine/src/test/java/com/metamatrix/query/processor/TestInsertProcessing.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/processor/TestInsertProcessing.java (rev 0)
+++ trunk/engine/src/test/java/com/metamatrix/query/processor/TestInsertProcessing.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -0,0 +1,396 @@
+package com.metamatrix.query.processor;
+
+import static com.metamatrix.query.processor.TestProcessor.*;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.metamatrix.common.types.DataTypeManager;
+import com.metamatrix.query.optimizer.TestOptimizer;
+import com.metamatrix.query.optimizer.capabilities.BasicSourceCapabilities;
+import com.metamatrix.query.optimizer.capabilities.FakeCapabilitiesFinder;
+import com.metamatrix.query.optimizer.capabilities.SourceCapabilities.Capability;
+import com.metamatrix.query.sql.lang.BatchedUpdateCommand;
+import com.metamatrix.query.sql.lang.Command;
+import com.metamatrix.query.sql.lang.Insert;
+import com.metamatrix.query.sql.symbol.Constant;
+import com.metamatrix.query.unittest.FakeMetadataFacade;
+import com.metamatrix.query.unittest.FakeMetadataFactory;
+import com.metamatrix.query.unittest.FakeMetadataObject;
+import com.metamatrix.query.unittest.FakeMetadataStore;
+
+public class TestInsertProcessing {
+
+ @Test public void testSelectIntoWithTypeConversion() {
+ FakeMetadataObject pm1 = FakeMetadataFactory.createPhysicalModel("pm1"); //$NON-NLS-1$
+ FakeMetadataObject pm1g1 = FakeMetadataFactory.createPhysicalGroup("pm1.g1", pm1); //$NON-NLS-1$
+
+ FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
+ BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
+ caps.setCapabilitySupport(Capability.BATCHED_UPDATES, true);
+ capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
+
+ List pm1g1e = FakeMetadataFactory.createElements(pm1g1,
+ new String[] { "e1", "e2", "e3" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ new String[] { DataTypeManager.DefaultDataTypes.BIG_INTEGER, DataTypeManager.DefaultDataTypes.FLOAT, DataTypeManager.DefaultDataTypes.FLOAT});
+
+ FakeMetadataStore store = new FakeMetadataStore();
+ store.addObject(pm1);
+ store.addObject(pm1g1);
+ store.addObjects(pm1g1e);
+
+ FakeMetadataFacade metadata = new FakeMetadataFacade(store);
+
+ HardcodedDataManager dataManager = new HardcodedDataManager();
+ dataManager.addData("BatchedUpdate{I}", //$NON-NLS-1$
+ new List[] { Arrays.asList(new Object[] { new Integer(1) })});
+
+ String sql = "SELECT 1, 1, 1 INTO pm1.g1"; //$NON-NLS-1$
+
+ Command command = helpParse(sql);
+ ProcessorPlan plan = helpGetPlan(command, metadata, capFinder);
+
+ List[] expected = new List[] {
+ Arrays.asList(new Object[] { new Integer(1) }),
+ };
+
+ helpProcess(plan, dataManager, expected);
+
+ BatchedUpdateCommand buc = (BatchedUpdateCommand)dataManager.getCommandHistory().iterator().next();
+ Insert insert = (Insert)buc.getUpdateCommands().get(0);
+
+ Constant value0 = (Constant)insert.getValues().get(0);
+ Constant value1 = (Constant)insert.getValues().get(1);
+
+ assertEquals(DataTypeManager.DefaultDataClasses.BIG_INTEGER, value0.getValue().getClass());
+ assertEquals(DataTypeManager.DefaultDataClasses.FLOAT, value1.getValue().getClass());
+ }
+
+
+ @Test public void testSelectInto_Case5569a_BATCH_NO_BULK_NO() {
+ boolean doBatching = false;
+ boolean doBulkInsert = false;
+ helpSelectInto_Case5569Processor( doBatching, doBulkInsert );
+ }
+
+ @Test public void testSelectInto_Case5569b_BATCH_YES_BULK_NO() {
+ boolean doBatching = true;
+ boolean doBulkInsert = false;
+ helpSelectInto_Case5569Processor( doBatching, doBulkInsert );
+ }
+
+ @Test public void testSelectInto_Case5569c_BATCH_NO_BULK_YES() {
+ boolean doBatching = false;
+ boolean doBulkInsert = true;
+ helpSelectInto_Case5569Processor( doBatching, doBulkInsert );
+ }
+
+ public void helpSelectInto_Case5569Processor( boolean doBatching, boolean doBulkInsert ) {
+
+ FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
+ BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
+
+ caps.setCapabilitySupport(Capability.BATCHED_UPDATES, doBatching);
+ caps.setCapabilitySupport(Capability.BULK_UPDATE, doBulkInsert);
+ caps.setCapabilitySupport(Capability.QUERY_FROM_GROUP_ALIAS, false);
+
+ capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
+
+ FakeMetadataFacade metadata = FakeMetadataFactory.example1();
+
+ HardcodedDataManager dataManager = new HardcodedDataManager();
+
+ dataManager.addData("SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1", //$NON-NLS-1$
+ new List[] { Arrays.asList(new Object[] { "1", new Integer(1), Boolean.FALSE, new Double(1)}), //$NON-NLS-1$
+ Arrays.asList(new Object[] { "2", new Integer(2), Boolean.TRUE, new Double(2) })}); //$NON-NLS-1$
+
+ if (doBulkInsert) {
+ dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES (?, ?, ?, ?)", //$NON-NLS-1$
+ new List[] { Arrays.asList(new Object[] { new Integer(2)})});
+ }
+ else
+ if (doBatching) {
+ dataManager.addData("BatchedUpdate{I,I}", //$NON-NLS-1$
+ new List[] { Arrays.asList(new Object[] { new Integer(2)})});
+ } else {
+ dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)", //$NON-NLS-1$
+ new List[] { Arrays.asList(new Object[] { new Integer(1)})});
+ dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)", //$NON-NLS-1$
+ new List[] { Arrays.asList(new Object[] { new Integer(1)})});
+ }
+
+ String sql = "SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 INTO pm1.g2 from pm1.g1"; //$NON-NLS-1$
+
+ Command command = helpParse(sql);
+
+ ProcessorPlan plan = helpGetPlan(command, metadata, capFinder);
+
+ List[] expected = new List[] {
+ Arrays.asList(new Object[] { new Integer(2) }),
+ };
+
+ helpProcess(plan, dataManager, expected);
+
+ // if not doBulkInsert and is doBatching,
+ // check the command hist to ensure it contains the expected commands
+ if ( !doBulkInsert && doBatching ) {
+ BatchedUpdateCommand bu = (BatchedUpdateCommand)new ArrayList(dataManager.getCommandHistory()).get(1);
+ assertEquals(2, bu.getUpdateCommands().size());
+ assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)", bu.getUpdateCommands().get(0).toString() ); //$NON-NLS-1$
+ assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)", bu.getUpdateCommands().get(1).toString() ); //$NON-NLS-1$
+ }
+ }
+
+
+ @Test public void testSelectInto_Case5412a() {
+
+ // test setting BULK_INSERT capability to true
+ FakeMetadataObject pm1 = FakeMetadataFactory.createPhysicalModel("pm1"); //$NON-NLS-1$
+ FakeMetadataObject pm1g1 = FakeMetadataFactory.createPhysicalGroup("pm1.g1", pm1); //$NON-NLS-1$
+
+ FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
+ BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
+
+ caps.setCapabilitySupport(Capability.BULK_UPDATE, true);
+ capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
+
+ List pm1g1e = FakeMetadataFactory.createElements(pm1g1,
+ new String[] { "e1", "e2" }, //$NON-NLS-1$ //$NON-NLS-2$
+ new String[] { DataTypeManager.DefaultDataTypes.BIG_INTEGER, DataTypeManager.DefaultDataTypes.FLOAT});
+
+ FakeMetadataStore store = new FakeMetadataStore();
+ store.addObject(pm1);
+ store.addObject(pm1g1);
+ store.addObjects(pm1g1e);
+
+ FakeMetadataFacade metadata = new FakeMetadataFacade(store);
+
+ HardcodedDataManager dataManager = new HardcodedDataManager();
+ dataManager.addData("INSERT INTO pm1.g1 (pm1.g1.e1, pm1.g1.e2) VALUES (?, ?)", //$NON-NLS-1$
+ new List[] { Arrays.asList(new Object[] { new Integer(1) })});
+
+ String sql = "SELECT 1, 1 INTO pm1.g1"; //$NON-NLS-1$
+
+ Command command = helpParse(sql);
+ ProcessorPlan plan = helpGetPlan(command, metadata, capFinder);
+
+ List[] expected = new List[] {
+ Arrays.asList(new Object[] { new Integer(1) }),
+ };
+
+ helpProcess(plan, dataManager, expected);
+
+ Insert insert = (Insert)dataManager.getCommandHistory().iterator().next();
+ //List lst = (List)insert.getParameterValues().get(0);
+ //Object value0 = lst.get(0);
+ //Object value1 = lst.get(1);
+
+ //assertEquals(DataTypeManager.DefaultDataClasses.BIG_INTEGER, value0.getClass());
+ //assertEquals(DataTypeManager.DefaultDataClasses.FLOAT, value1.getClass());
+ }
+
+
+ @Test public void testSelectInto_Case5412b() {
+
+ // test setting BULK_INSERT capability to false
+ FakeMetadataObject pm1 = FakeMetadataFactory.createPhysicalModel("pm1"); //$NON-NLS-1$
+ FakeMetadataObject pm1g1 = FakeMetadataFactory.createPhysicalGroup("pm1.g1", pm1); //$NON-NLS-1$
+
+ FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
+ BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
+
+ caps.setCapabilitySupport(Capability.BULK_UPDATE, false);
+ capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
+
+ List pm1g1e = FakeMetadataFactory.createElements(pm1g1,
+ new String[] { "e1", "e2" }, //$NON-NLS-1$ //$NON-NLS-2$
+ new String[] { DataTypeManager.DefaultDataTypes.BIG_INTEGER, DataTypeManager.DefaultDataTypes.FLOAT});
+
+ FakeMetadataStore store = new FakeMetadataStore();
+ store.addObject(pm1);
+ store.addObject(pm1g1);
+ store.addObjects(pm1g1e);
+
+ FakeMetadataFacade metadata = new FakeMetadataFacade(store);
+
+ HardcodedDataManager dataManager = new HardcodedDataManager();
+ dataManager.addData("INSERT INTO pm1.g1 (pm1.g1.e1, pm1.g1.e2) VALUES (1, 1.0)", //$NON-NLS-1$
+ new List[] { Arrays.asList(new Object[] { new Integer(1) })});
+
+ String sql = "SELECT 1, 1 INTO pm1.g1"; //$NON-NLS-1$
+
+ Command command = helpParse(sql);
+ ProcessorPlan plan = helpGetPlan(command, metadata, capFinder);
+
+ List[] expected = new List[] {
+ Arrays.asList(new Object[] { new Integer(1) }),
+ };
+
+ helpProcess(plan, dataManager, expected);
+
+ Insert insert = (Insert)dataManager.getCommandHistory().iterator().next();
+
+ Constant value0 = (Constant)insert.getValues().get(0);
+ Constant value1 = (Constant)insert.getValues().get(1);
+
+ assertEquals(DataTypeManager.DefaultDataClasses.BIG_INTEGER, value0.getValue().getClass());
+ assertEquals(DataTypeManager.DefaultDataClasses.FLOAT, value1.getValue().getClass());
+ }
+
+ @Test public void testInsertIntoWithSubquery_None() {
+ helpInsertIntoWithSubquery( null );
+ }
+
+ @Test public void testInsertIntoWithSubquery_Batch() {
+ helpInsertIntoWithSubquery( Capability.BATCHED_UPDATES );
+ }
+
+ @Test public void testInsertIntoWithSubquery_Bulk() {
+ helpInsertIntoWithSubquery( Capability.BULK_UPDATE );
+ }
+
+ @Test public void testInsertIntoWithSubquery_Pushdown() {
+ helpInsertIntoWithSubquery( Capability.INSERT_WITH_QUERYEXPRESSION );
+ }
+
+ public void helpInsertIntoWithSubquery( Capability cap ) {
+
+ FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
+ BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
+
+ caps.setCapabilitySupport(cap, true);
+ caps.setCapabilitySupport(Capability.QUERY_FROM_GROUP_ALIAS, false);
+
+ capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
+
+ FakeMetadataFacade metadata = FakeMetadataFactory.example1();
+
+ HardcodedDataManager dataManager = new HardcodedDataManager();
+
+ dataManager.addData("SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1", //$NON-NLS-1$
+ new List[] { Arrays.asList(new Object[] { "1", new Integer(1), Boolean.FALSE, new Double(1)}), //$NON-NLS-1$
+ Arrays.asList(new Object[] { "2", new Integer(2), Boolean.TRUE, new Double(2) })}); //$NON-NLS-1$
+
+ if (cap != null) {
+ switch (cap) {
+ case BULK_UPDATE:
+ dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES (?, ?, ?, ?)", //$NON-NLS-1$
+ new List[] { Arrays.asList(new Object[] { new Integer(2)})});
+ break;
+ case BATCHED_UPDATES:
+ dataManager.addData("BatchedUpdate{I,I}", //$NON-NLS-1$
+ new List[] { Arrays.asList(new Object[] { new Integer(2)})});
+ break;
+ case INSERT_WITH_QUERYEXPRESSION:
+ dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1", //$NON-NLS-1$
+ new List[] { Arrays.asList(new Object[] { new Integer(2)})});
+ break;
+ }
+ } else {
+ dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)", //$NON-NLS-1$
+ new List[] { Arrays.asList(new Object[] { new Integer(1)})});
+ dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)", //$NON-NLS-1$
+ new List[] { Arrays.asList(new Object[] { new Integer(1)})});
+ }
+
+ String sql = "INSERT INTO pm1.g2 SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 from pm1.g1"; //$NON-NLS-1$
+
+ Command command = helpParse(sql);
+
+ ProcessorPlan plan = helpGetPlan(command, metadata, capFinder);
+
+ List[] expected = new List[] {
+ Arrays.asList(new Object[] { new Integer(2) }),
+ };
+
+ helpProcess(plan, dataManager, expected);
+
+ // if not doBulkInsert and is doBatching,
+ // check the command hist to ensure it contains the expected commands
+ if ( cap == Capability.BATCHED_UPDATES ) {
+ BatchedUpdateCommand bu = (BatchedUpdateCommand)new ArrayList(dataManager.getCommandHistory()).get(1);
+ assertEquals(2, bu.getUpdateCommands().size());
+ assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)", bu.getUpdateCommands().get(0).toString() ); //$NON-NLS-1$
+ assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)", bu.getUpdateCommands().get(1).toString() ); //$NON-NLS-1$
+ }
+ }
+
+ @Test public void testInsertIntoWithSubquery2_BATCH_NO_BULK_NO() {
+ boolean doBatching = false;
+ boolean doBulkInsert = false;
+ helpInsertIntoWithSubquery2( doBatching, doBulkInsert );
+ }
+
+ @Test public void testInsertIntoWithSubquery2_BATCH_YES_BULK_NO() {
+ boolean doBatching = true;
+ boolean doBulkInsert = false;
+ helpInsertIntoWithSubquery2( doBatching, doBulkInsert );
+ }
+
+ @Test public void testInsertIntoWithSubquery2_BATCH_NO_BULK_YES() {
+ boolean doBatching = false;
+ boolean doBulkInsert = true;
+ helpInsertIntoWithSubquery2( doBatching, doBulkInsert );
+ }
+
+ public void helpInsertIntoWithSubquery2( boolean doBatching, boolean doBulkInsert ) {
+
+ FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
+ BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
+
+ caps.setCapabilitySupport(Capability.BATCHED_UPDATES, doBatching);
+ caps.setCapabilitySupport(Capability.BULK_UPDATE, doBulkInsert);
+ caps.setCapabilitySupport(Capability.QUERY_FROM_GROUP_ALIAS, false);
+
+ capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
+
+ FakeMetadataFacade metadata = FakeMetadataFactory.example1();
+
+ HardcodedDataManager dataManager = new HardcodedDataManager();
+
+ dataManager.addData("SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1", //$NON-NLS-1$
+ new List[] { Arrays.asList(new Object[] { "1", new Integer(1), Boolean.FALSE, new Double(1)}), //$NON-NLS-1$
+ Arrays.asList(new Object[] { "2", new Integer(2), Boolean.TRUE, new Double(2) })}); //$NON-NLS-1$
+
+ if (doBulkInsert) {
+ dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES (?, ?, ?, ?)", //$NON-NLS-1$
+ new List[] { Arrays.asList(new Object[] { new Integer(2)})});
+ }
+ else
+ if (doBatching) {
+ dataManager.addData("BatchedUpdate{I,I}", //$NON-NLS-1$
+ new List[] { Arrays.asList(new Object[] { new Integer(2)})});
+ } else {
+ dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)", //$NON-NLS-1$
+ new List[] { Arrays.asList(new Object[] { new Integer(1)})});
+ dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)", //$NON-NLS-1$
+ new List[] { Arrays.asList(new Object[] { new Integer(1)})});
+ }
+
+ String sql = "INSERT INTO pm1.g2 SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 from pm1.g1 UNION ALL SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 from pm1.g1"; //$NON-NLS-1$
+// String sql = "SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 INTO pm1.g2 from pm1.g1"; //$NON-NLS-1$
+
+ Command command = helpParse(sql);
+
+ ProcessorPlan plan = helpGetPlan(command, metadata, capFinder);
+
+ List[] expected = new List[] {
+ Arrays.asList(new Object[] { new Integer(4) }),
+ };
+
+ helpProcess(plan, dataManager, expected);
+
+ // if not doBulkInsert and is doBatching,
+ // check the command hist to ensure it contains the expected commands
+ if ( !doBulkInsert && doBatching ) {
+ BatchedUpdateCommand bu = (BatchedUpdateCommand)new ArrayList(dataManager.getCommandHistory()).get(2);
+ assertEquals(2, bu.getUpdateCommands().size());
+ assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)", bu.getUpdateCommands().get(0).toString() ); //$NON-NLS-1$
+ assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)", bu.getUpdateCommands().get(1).toString() ); //$NON-NLS-1$
+ }
+ }
+
+}
Property changes on: trunk/engine/src/test/java/com/metamatrix/query/processor/TestInsertProcessing.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -75,7 +75,6 @@
import com.metamatrix.query.resolver.util.BindVariableVisitor;
import com.metamatrix.query.rewriter.QueryRewriter;
import com.metamatrix.query.sql.lang.BatchedUpdateCommand;
-import com.metamatrix.query.sql.lang.BulkInsert;
import com.metamatrix.query.sql.lang.Command;
import com.metamatrix.query.sql.lang.Insert;
import com.metamatrix.query.sql.lang.SPParameter;
@@ -241,7 +240,7 @@
}
}
- static void doProcess(ProcessorPlan plan, ProcessorDataManager dataManager, List[] expectedResults, CommandContext context) throws Exception {
+ public static void doProcess(ProcessorPlan plan, ProcessorDataManager dataManager, List[] expectedResults, CommandContext context) throws Exception {
BufferManagerImpl bufferMgr = (BufferManagerImpl)BufferManagerFactory.getStandaloneBufferManager();
bufferMgr.getConfig().setProcessorBatchSize(context.getProcessorBatchSize());
bufferMgr.getConfig().setConnectorBatchSize(context.getProcessorBatchSize());
@@ -6646,223 +6645,7 @@
Arrays.asList(new Object[] { new Integer(1), new Integer(1) })});
helpProcess(plan, dataManager, expected);
}
-
- public void testSelectIntoWithTypeConversion() {
- FakeMetadataObject pm1 = FakeMetadataFactory.createPhysicalModel("pm1"); //$NON-NLS-1$
- FakeMetadataObject pm1g1 = FakeMetadataFactory.createPhysicalGroup("pm1.g1", pm1); //$NON-NLS-1$
- FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
- BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
- caps.setCapabilitySupport(Capability.BATCHED_UPDATES, true);
- capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
-
- List pm1g1e = FakeMetadataFactory.createElements(pm1g1,
- new String[] { "e1", "e2", "e3" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- new String[] { DataTypeManager.DefaultDataTypes.BIG_INTEGER, DataTypeManager.DefaultDataTypes.FLOAT, DataTypeManager.DefaultDataTypes.FLOAT});
-
- FakeMetadataStore store = new FakeMetadataStore();
- store.addObject(pm1);
- store.addObject(pm1g1);
- store.addObjects(pm1g1e);
-
- FakeMetadataFacade metadata = new FakeMetadataFacade(store);
-
- HardcodedDataManager dataManager = new HardcodedDataManager();
- dataManager.addData("BatchedUpdate{I}", //$NON-NLS-1$
- new List[] { Arrays.asList(new Object[] { new Integer(1) })});
-
- String sql = "SELECT 1, 1, 1 INTO pm1.g1"; //$NON-NLS-1$
-
- Command command = helpParse(sql);
- ProcessorPlan plan = helpGetPlan(command, metadata, capFinder);
-
- List[] expected = new List[] {
- Arrays.asList(new Object[] { new Integer(1) }),
- };
-
- helpProcess(plan, dataManager, expected);
-
- BatchedUpdateCommand buc = (BatchedUpdateCommand)dataManager.getCommandHistory().iterator().next();
- Insert insert = (Insert)buc.getUpdateCommands().get(0);
-
- Constant value0 = (Constant)insert.getValues().get(0);
- Constant value1 = (Constant)insert.getValues().get(1);
-
- assertEquals(DataTypeManager.DefaultDataClasses.BIG_INTEGER, value0.getValue().getClass());
- assertEquals(DataTypeManager.DefaultDataClasses.FLOAT, value1.getValue().getClass());
- }
-
-
- public void testSelectInto_Case5569a_BATCH_NO_BULK_NO() {
- boolean doBatching = false;
- boolean doBulkInsert = false;
- helpSelectInto_Case5569Processor( doBatching, doBulkInsert );
- }
-
- public void testSelectInto_Case5569b_BATCH_YES_BULK_NO() {
- boolean doBatching = true;
- boolean doBulkInsert = false;
- helpSelectInto_Case5569Processor( doBatching, doBulkInsert );
- }
-
- public void testSelectInto_Case5569c_BATCH_NO_BULK_YES() {
- boolean doBatching = false;
- boolean doBulkInsert = true;
- helpSelectInto_Case5569Processor( doBatching, doBulkInsert );
- }
-
- public void helpSelectInto_Case5569Processor( boolean doBatching, boolean doBulkInsert ) {
-
- FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
- BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
-
- caps.setCapabilitySupport(Capability.BATCHED_UPDATES, doBatching);
- caps.setCapabilitySupport(Capability.BULK_INSERT, doBulkInsert);
- caps.setCapabilitySupport(Capability.QUERY_FROM_GROUP_ALIAS, false);
-
- capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
-
- FakeMetadataFacade metadata = FakeMetadataFactory.example1();
-
- HardcodedDataManager dataManager = new HardcodedDataManager();
-
- dataManager.addData("SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1", //$NON-NLS-1$
- new List[] { Arrays.asList(new Object[] { "1", new Integer(1), Boolean.FALSE, new Double(1)}), //$NON-NLS-1$
- Arrays.asList(new Object[] { "2", new Integer(2), Boolean.TRUE, new Double(2) })}); //$NON-NLS-1$
-
- if (doBulkInsert) {
- dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES (?,?,?,?)", //$NON-NLS-1$
- new List[] { Arrays.asList(new Object[] { new Integer(2)})});
- }
- else
- if (doBatching) {
- dataManager.addData("BatchedUpdate{I,I}", //$NON-NLS-1$
- new List[] { Arrays.asList(new Object[] { new Integer(2)})});
- } else {
- dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)", //$NON-NLS-1$
- new List[] { Arrays.asList(new Object[] { new Integer(1)})});
- dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)", //$NON-NLS-1$
- new List[] { Arrays.asList(new Object[] { new Integer(1)})});
- }
-
- String sql = "SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 INTO pm1.g2 from pm1.g1"; //$NON-NLS-1$
-
- Command command = helpParse(sql);
-
- ProcessorPlan plan = helpGetPlan(command, metadata, capFinder);
-
- List[] expected = new List[] {
- Arrays.asList(new Object[] { new Integer(2) }),
- };
-
- helpProcess(plan, dataManager, expected);
-
- // if not doBulkInsert and is doBatching,
- // check the command hist to ensure it contains the expected commands
- if ( !doBulkInsert && doBatching ) {
- BatchedUpdateCommand bu = (BatchedUpdateCommand)new ArrayList(dataManager.getCommandHistory()).get(1);
- assertEquals(2, bu.getUpdateCommands().size());
- assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)", bu.getUpdateCommands().get(0).toString() ); //$NON-NLS-1$
- assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)", bu.getUpdateCommands().get(1).toString() ); //$NON-NLS-1$
- }
- }
-
-
- public void testSelectInto_Case5412a() {
-
- // test setting BULK_INSERT capability to true
- FakeMetadataObject pm1 = FakeMetadataFactory.createPhysicalModel("pm1"); //$NON-NLS-1$
- FakeMetadataObject pm1g1 = FakeMetadataFactory.createPhysicalGroup("pm1.g1", pm1); //$NON-NLS-1$
-
- FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
- BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
-
- caps.setCapabilitySupport(Capability.BULK_INSERT, true);
- capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
-
- List pm1g1e = FakeMetadataFactory.createElements(pm1g1,
- new String[] { "e1", "e2" }, //$NON-NLS-1$ //$NON-NLS-2$
- new String[] { DataTypeManager.DefaultDataTypes.BIG_INTEGER, DataTypeManager.DefaultDataTypes.FLOAT});
-
- FakeMetadataStore store = new FakeMetadataStore();
- store.addObject(pm1);
- store.addObject(pm1g1);
- store.addObjects(pm1g1e);
-
- FakeMetadataFacade metadata = new FakeMetadataFacade(store);
-
- HardcodedDataManager dataManager = new HardcodedDataManager();
- dataManager.addData("INSERT INTO pm1.g1 (pm1.g1.e1, pm1.g1.e2) VALUES (?,?)", //$NON-NLS-1$
- new List[] { Arrays.asList(new Object[] { new Integer(1) })});
-
- String sql = "SELECT 1, 1 INTO pm1.g1"; //$NON-NLS-1$
-
- Command command = helpParse(sql);
- ProcessorPlan plan = helpGetPlan(command, metadata, capFinder);
-
- List[] expected = new List[] {
- Arrays.asList(new Object[] { new Integer(1) }),
- };
-
- helpProcess(plan, dataManager, expected);
-
- BulkInsert insert = (BulkInsert)dataManager.getCommandHistory().iterator().next();
- List lst = (List)insert.getRows().get(0);
- Object value0 = lst.get(0);
- Object value1 = lst.get(1);
-
- assertEquals(DataTypeManager.DefaultDataClasses.BIG_INTEGER, value0.getClass());
- assertEquals(DataTypeManager.DefaultDataClasses.FLOAT, value1.getClass());
- }
-
-
- public void testSelectInto_Case5412b() {
-
- // test setting BULK_INSERT capability to false
- FakeMetadataObject pm1 = FakeMetadataFactory.createPhysicalModel("pm1"); //$NON-NLS-1$
- FakeMetadataObject pm1g1 = FakeMetadataFactory.createPhysicalGroup("pm1.g1", pm1); //$NON-NLS-1$
-
- FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
- BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
-
- caps.setCapabilitySupport(Capability.BULK_INSERT, false);
- capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
-
- List pm1g1e = FakeMetadataFactory.createElements(pm1g1,
- new String[] { "e1", "e2" }, //$NON-NLS-1$ //$NON-NLS-2$
- new String[] { DataTypeManager.DefaultDataTypes.BIG_INTEGER, DataTypeManager.DefaultDataTypes.FLOAT});
-
- FakeMetadataStore store = new FakeMetadataStore();
- store.addObject(pm1);
- store.addObject(pm1g1);
- store.addObjects(pm1g1e);
-
- FakeMetadataFacade metadata = new FakeMetadataFacade(store);
-
- HardcodedDataManager dataManager = new HardcodedDataManager();
- dataManager.addData("INSERT INTO pm1.g1 (pm1.g1.e1, pm1.g1.e2) VALUES (1, 1.0)", //$NON-NLS-1$
- new List[] { Arrays.asList(new Object[] { new Integer(1) })});
-
- String sql = "SELECT 1, 1 INTO pm1.g1"; //$NON-NLS-1$
-
- Command command = helpParse(sql);
- ProcessorPlan plan = helpGetPlan(command, metadata, capFinder);
-
- List[] expected = new List[] {
- Arrays.asList(new Object[] { new Integer(1) }),
- };
-
- helpProcess(plan, dataManager, expected);
-
- Insert insert = (Insert)dataManager.getCommandHistory().iterator().next();
-
- Constant value0 = (Constant)insert.getValues().get(0);
- Constant value1 = (Constant)insert.getValues().get(1);
-
- assertEquals(DataTypeManager.DefaultDataClasses.BIG_INTEGER, value0.getValue().getClass());
- assertEquals(DataTypeManager.DefaultDataClasses.FLOAT, value1.getValue().getClass());
- }
-
private void sampleDataBQT2a(FakeDataManager dataMgr) throws QueryMetadataException, MetaMatrixComponentException {
FakeMetadataFacade metadata = FakeMetadataFactory.exampleBQT();
@@ -7754,160 +7537,8 @@
TestOptimizer.checkDependentJoinCount(plan, 1);
// Run query
helpProcess(plan, dataManager, expected);
- }
-
- public void testInsertIntoWithSubquery_BATCH_NO_BULK_NO() {
- boolean doBatching = false;
- boolean doBulkInsert = false;
- helpInsertIntoWithSubquery( doBatching, doBulkInsert );
- }
+ }
- public void testInsertIntoWithSubquery_BATCH_YES_BULK_NO() {
- boolean doBatching = true;
- boolean doBulkInsert = false;
- helpInsertIntoWithSubquery( doBatching, doBulkInsert );
- }
-
- public void testInsertIntoWithSubquery_BATCH_NO_BULK_YES() {
- boolean doBatching = false;
- boolean doBulkInsert = true;
- helpInsertIntoWithSubquery( doBatching, doBulkInsert );
- }
-
-
- public void helpInsertIntoWithSubquery( boolean doBatching, boolean doBulkInsert ) {
-
- FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
- BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
-
- caps.setCapabilitySupport(Capability.BATCHED_UPDATES, doBatching);
- caps.setCapabilitySupport(Capability.BULK_INSERT, doBulkInsert);
- caps.setCapabilitySupport(Capability.QUERY_FROM_GROUP_ALIAS, false);
-
- capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
-
- FakeMetadataFacade metadata = FakeMetadataFactory.example1();
-
- HardcodedDataManager dataManager = new HardcodedDataManager();
-
- dataManager.addData("SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1", //$NON-NLS-1$
- new List[] { Arrays.asList(new Object[] { "1", new Integer(1), Boolean.FALSE, new Double(1)}), //$NON-NLS-1$
- Arrays.asList(new Object[] { "2", new Integer(2), Boolean.TRUE, new Double(2) })}); //$NON-NLS-1$
-
- if (doBulkInsert) {
- dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES (?,?,?,?)", //$NON-NLS-1$
- new List[] { Arrays.asList(new Object[] { new Integer(2)})});
- }
- else
- if (doBatching) {
- dataManager.addData("BatchedUpdate{I,I}", //$NON-NLS-1$
- new List[] { Arrays.asList(new Object[] { new Integer(2)})});
- } else {
- dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)", //$NON-NLS-1$
- new List[] { Arrays.asList(new Object[] { new Integer(1)})});
- dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)", //$NON-NLS-1$
- new List[] { Arrays.asList(new Object[] { new Integer(1)})});
- }
-
- String sql = "INSERT INTO pm1.g2 SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 from pm1.g1"; //$NON-NLS-1$
-// String sql = "SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 INTO pm1.g2 from pm1.g1"; //$NON-NLS-1$
-
- Command command = helpParse(sql);
-
- ProcessorPlan plan = helpGetPlan(command, metadata, capFinder);
-
- List[] expected = new List[] {
- Arrays.asList(new Object[] { new Integer(2) }),
- };
-
- helpProcess(plan, dataManager, expected);
-
- // if not doBulkInsert and is doBatching,
- // check the command hist to ensure it contains the expected commands
- if ( !doBulkInsert && doBatching ) {
- BatchedUpdateCommand bu = (BatchedUpdateCommand)new ArrayList(dataManager.getCommandHistory()).get(1);
- assertEquals(2, bu.getUpdateCommands().size());
- assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)", bu.getUpdateCommands().get(0).toString() ); //$NON-NLS-1$
- assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)", bu.getUpdateCommands().get(1).toString() ); //$NON-NLS-1$
- }
- }
-
- public void testInsertIntoWithSubquery2_BATCH_NO_BULK_NO() {
- boolean doBatching = false;
- boolean doBulkInsert = false;
- helpInsertIntoWithSubquery2( doBatching, doBulkInsert );
- }
-
- public void testInsertIntoWithSubquery2_BATCH_YES_BULK_NO() {
- boolean doBatching = true;
- boolean doBulkInsert = false;
- helpInsertIntoWithSubquery2( doBatching, doBulkInsert );
- }
-
- public void testInsertIntoWithSubquery2_BATCH_NO_BULK_YES() {
- boolean doBatching = false;
- boolean doBulkInsert = true;
- helpInsertIntoWithSubquery2( doBatching, doBulkInsert );
- }
-
-
- public void helpInsertIntoWithSubquery2( boolean doBatching, boolean doBulkInsert ) {
-
- FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
- BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
-
- caps.setCapabilitySupport(Capability.BATCHED_UPDATES, doBatching);
- caps.setCapabilitySupport(Capability.BULK_INSERT, doBulkInsert);
- caps.setCapabilitySupport(Capability.QUERY_FROM_GROUP_ALIAS, false);
-
- capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
-
- FakeMetadataFacade metadata = FakeMetadataFactory.example1();
-
- HardcodedDataManager dataManager = new HardcodedDataManager();
-
- dataManager.addData("SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1", //$NON-NLS-1$
- new List[] { Arrays.asList(new Object[] { "1", new Integer(1), Boolean.FALSE, new Double(1)}), //$NON-NLS-1$
- Arrays.asList(new Object[] { "2", new Integer(2), Boolean.TRUE, new Double(2) })}); //$NON-NLS-1$
-
- if (doBulkInsert) {
- dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES (?,?,?,?)", //$NON-NLS-1$
- new List[] { Arrays.asList(new Object[] { new Integer(2)})});
- }
- else
- if (doBatching) {
- dataManager.addData("BatchedUpdate{I,I}", //$NON-NLS-1$
- new List[] { Arrays.asList(new Object[] { new Integer(2)})});
- } else {
- dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)", //$NON-NLS-1$
- new List[] { Arrays.asList(new Object[] { new Integer(1)})});
- dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)", //$NON-NLS-1$
- new List[] { Arrays.asList(new Object[] { new Integer(1)})});
- }
-
- String sql = "INSERT INTO pm1.g2 SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 from pm1.g1 UNION ALL SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 from pm1.g1"; //$NON-NLS-1$
-// String sql = "SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 INTO pm1.g2 from pm1.g1"; //$NON-NLS-1$
-
- Command command = helpParse(sql);
-
- ProcessorPlan plan = helpGetPlan(command, metadata, capFinder);
-
- List[] expected = new List[] {
- Arrays.asList(new Object[] { new Integer(4) }),
- };
-
- helpProcess(plan, dataManager, expected);
-
- // if not doBulkInsert and is doBatching,
- // check the command hist to ensure it contains the expected commands
- if ( !doBulkInsert && doBatching ) {
- BatchedUpdateCommand bu = (BatchedUpdateCommand)new ArrayList(dataManager.getCommandHistory()).get(2);
- assertEquals(2, bu.getUpdateCommands().size());
- assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)", bu.getUpdateCommands().get(0).toString() ); //$NON-NLS-1$
- assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)", bu.getUpdateCommands().get(1).toString() ); //$NON-NLS-1$
- }
- }
-
/**
* A control test to ensure that y will still exist for sorting
*/
Modified: trunk/engine/src/test/java/com/metamatrix/query/processor/relational/TestProjectIntoNode.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/processor/relational/TestProjectIntoNode.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/test/java/com/metamatrix/query/processor/relational/TestProjectIntoNode.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -37,12 +37,12 @@
import com.metamatrix.query.processor.ProcessorDataManager;
import com.metamatrix.query.processor.FakeTupleSource.FakeComponentException;
import com.metamatrix.query.sql.lang.BatchedUpdateCommand;
-import com.metamatrix.query.sql.lang.BulkInsert;
import com.metamatrix.query.sql.lang.Command;
import com.metamatrix.query.sql.lang.Insert;
import com.metamatrix.query.sql.symbol.Constant;
import com.metamatrix.query.sql.symbol.ElementSymbol;
import com.metamatrix.query.sql.symbol.GroupSymbol;
+import com.metamatrix.query.tempdata.TempTableStoreImpl;
import com.metamatrix.query.util.CommandContext;
@@ -152,17 +152,19 @@
int batchSize = 1;
// ensure that we have the right kind of insert, and that the data for this row is valid
- if (!(command instanceof BulkInsert) && (command instanceof Insert)) {
- ensureValue((Insert)command, 2, callCount);
- } else if ( command instanceof BulkInsert ){
- BulkInsert bulkInsert = (BulkInsert)command;
- List batch = bulkInsert.getRows();
- batchSize = batch.size();
- assertEquals("Unexpected batch on call " + callCount, expectedBatchSize, batchSize); //$NON-NLS-1$
-
- for (int i = 0; i < batchSize; i++) {
- ensureValue2((List)batch.get(i), 2, ((callCount-1) * batchSize) + i + 1);
- }
+ if (command instanceof Insert) {
+ Insert insert = (Insert)command;
+ if (insert.isBulk()) {
+ List batch = TempTableStoreImpl.getBulkRows(insert);
+ batchSize = batch.size();
+ assertEquals("Unexpected batch on call " + callCount, expectedBatchSize, batchSize); //$NON-NLS-1$
+
+ for (int i = 0; i < batchSize; i++) {
+ ensureValue2((List)batch.get(i), 2, ((callCount-1) * batchSize) + i + 1);
+ }
+ } else {
+ ensureValue((Insert)command, 2, callCount);
+ }
} else if ( command instanceof BatchedUpdateCommand ){
BatchedUpdateCommand bu = (BatchedUpdateCommand)command;
List batch = bu.getSubCommands();
Deleted: trunk/engine/src/test/java/com/metamatrix/query/sql/lang/TestBulkInsert.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/sql/lang/TestBulkInsert.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/test/java/com/metamatrix/query/sql/lang/TestBulkInsert.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -1,59 +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 com.metamatrix.query.sql.lang;
-
-import java.util.ArrayList;
-
-import junit.framework.TestCase;
-
-import com.metamatrix.query.sql.symbol.GroupSymbol;
-import com.metamatrix.query.unittest.FakeMetadataFacade;
-import com.metamatrix.query.unittest.FakeMetadataFactory;
-import com.metamatrix.query.unittest.FakeMetadataObject;
-import com.metamatrix.query.unittest.FakeMetadataStore;
-
-
-
-/**
- * @since 4.3
- */
-public class TestBulkInsert extends TestCase{
- public TestBulkInsert(String name) {
- super(name);
- }
-
-
- public void test1() throws Exception{
- FakeMetadataObject pm1 = FakeMetadataFactory.createPhysicalModel("pm1"); //$NON-NLS-1$
- FakeMetadataObject pm1g = FakeMetadataFactory.createPhysicalGroup("pm1.g", pm1); //$NON-NLS-1$
- FakeMetadataStore store = new FakeMetadataStore();
- store.addObject(pm1);
- store.addObject(pm1g);
- GroupSymbol g = new GroupSymbol("g");//$NON-NLS-1$
- g.setMetadataID(pm1g);
-
- BulkInsert bulkInsert = new BulkInsert(g, new ArrayList());
- assertEquals(2, bulkInsert.updatingModelCount(new FakeMetadataFacade(store)));
- }
-
-}
Modified: trunk/engine/src/test/java/com/metamatrix/query/sql/symbol/TestConstant.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/sql/symbol/TestConstant.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/test/java/com/metamatrix/query/sql/symbol/TestConstant.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -157,72 +157,4 @@
}
}
- public void testCompareToString1() {
- Constant a = new Constant(new String("a")); //$NON-NLS-1$
- Constant b = new Constant(new String("b")); //$NON-NLS-1$
- int compare = a.compareTo(b);
- assertTrue("The String Values for these constants were incorrectly compared.", compare < 0); //$NON-NLS-1$
- }
-
- public void testCompareToString2() {
- Constant a = new Constant(new String("a")); //$NON-NLS-1$
- Constant b = new Constant(new String("a")); //$NON-NLS-1$
- int compare = a.compareTo(b);
- assertTrue("The String Values for these constants were incorrectly compared.", compare == 0); //$NON-NLS-1$
- }
-
- public void testCompareToString3() {
- Constant a = new Constant(new String("b")); //$NON-NLS-1$
- Constant b = new Constant(new String("a")); //$NON-NLS-1$
- int compare = a.compareTo(b);
- assertTrue("The String Values for these constants were incorrectly compared.", compare > 0); //$NON-NLS-1$
- }
-
- public void testCompareToInt1() {
- Constant a = new Constant(new Integer(1));
- Constant b = new Constant(new Integer(2));
- int compare = a.compareTo(b);
- assertTrue("The String Values for these constants were incorrectly compared.", compare < 0); //$NON-NLS-1$
-
- }
-
- public void testCompareToInt2() {
- Constant a = new Constant(new Integer(2));
- Constant b = new Constant(new Integer(2));
- int compare = a.compareTo(b);
- assertTrue("The String Values for these constants were incorrectly compared.", compare == 0); //$NON-NLS-1$
-
- }
-
- public void testCompareToInt3() {
- Constant a = new Constant(new Integer(2));
- Constant b = new Constant(new Integer(1));
- int compare = a.compareTo(b);
- assertTrue("The String Values for these constants were incorrectly compared.", compare > 0); //$NON-NLS-1$
- }
-
- public void testCompareToDifferingTypes() {
- Constant a = new Constant(new Integer(2));
- Constant b = new Constant(null);
- try{
- a.compareTo(b);
- }catch(ClassCastException e) {
- //do nothing this should happen
- }
- }
-
- public void testCompareToNull1() {
- Constant a = new Constant(null, Integer.class);
- Constant b = new Constant(new Integer(1));
- int compare = a.compareTo(b);
- assertTrue("The String Values for these constants were incorrectly compared.", compare < 0); //$NON-NLS-1$
- }
-
- public void testCompareToNull2() {
- Constant a = new Constant(new Integer(1));
- Constant b = new Constant(null, Integer.class);
- int compare = a.compareTo(b);
- assertTrue("The String Values for these constants were incorrectly compared.", compare > 0); //$NON-NLS-1$
- }
-
}
Deleted: trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/language/TestBulkInsertImpl.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/language/TestBulkInsertImpl.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/language/TestBulkInsertImpl.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -1,100 +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.dqp.internal.datamgr.language;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.teiid.connector.language.IElement;
-import org.teiid.dqp.internal.datamgr.language.BulkInsertImpl;
-
-import junit.framework.TestCase;
-
-import com.metamatrix.query.sql.lang.BulkInsert;
-import com.metamatrix.query.sql.symbol.GroupSymbol;
-
-/**
- * A Testcase for Bulk Insert, this is a simple extension of regular insert
- */
-public class TestBulkInsertImpl extends TestCase {
-
- /**
- * Constructor for TestBulkInsert.
- * @param name
- */
- public TestBulkInsertImpl(String name) {
- super(name);
- }
-
- public static BulkInsert helpExample(String groupName) {
- GroupSymbol group = TestGroupImpl.helpExample(groupName);
- ArrayList elements = new ArrayList();
- elements.add(TestElementImpl.helpExample(groupName, "e1")); //$NON-NLS-1$
- elements.add(TestElementImpl.helpExample(groupName, "e2")); //$NON-NLS-1$
- elements.add(TestElementImpl.helpExample(groupName, "e3")); //$NON-NLS-1$
- elements.add(TestElementImpl.helpExample(groupName, "e4")); //$NON-NLS-1$
-
- ArrayList rows = new ArrayList();
- for (int i =0; i < 4; i++) {
- ArrayList values = new ArrayList();
- values.add(TestLiteralImpl.helpExample(1));
- values.add(TestLiteralImpl.helpExample(2));
- values.add(TestLiteralImpl.helpExample(3));
- values.add(TestLiteralImpl.helpExample(4));
- rows.add(values);
- }
-
- return new BulkInsert(group,elements,rows);
- }
-
-
- public static BulkInsertImpl example(String groupName) throws Exception {
- return (BulkInsertImpl)TstLanguageBridgeFactory.factory.translate(helpExample(groupName));
-
- }
-
- public void testGetGroup() throws Exception {
- assertNotNull(example("a.b").getGroup()); //$NON-NLS-1$
- }
-
- public void testGetElements() throws Exception {
- BulkInsertImpl insert = example("a.b"); //$NON-NLS-1$
- assertNotNull(insert.getElements());
- assertEquals(4, insert.getElements().size());
- for (Iterator i = insert.getElements().iterator(); i.hasNext();) {
- assertTrue(i.next() instanceof IElement);
- }
- }
-
- public void testGetRows() throws Exception {
- BulkInsertImpl insert = example("a.b"); //$NON-NLS-1$
- assertNotNull(insert.getRows());
- assertEquals(4, insert.getRows().size());
-// for (Iterator iterRow = insert.getRows().iterator(); iterRow.hasNext();) {
-// List row = (List) iterRow.next();
-// for (Iterator i = row.iterator(); i.hasNext();) {
-// assertTrue(i.next() instanceof IExpression);
-// }
-// }
- }
-}
Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/language/TestInsertImpl.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/language/TestInsertImpl.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/language/TestInsertImpl.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -27,6 +27,7 @@
import org.teiid.connector.language.IElement;
import org.teiid.connector.language.IExpression;
+import org.teiid.connector.language.IInsertExpressionValueSource;
import org.teiid.dqp.internal.datamgr.language.InsertImpl;
import com.metamatrix.query.sql.lang.Insert;
@@ -103,9 +104,9 @@
public void testGetValues() throws Exception {
InsertImpl insert = example("a.b"); //$NON-NLS-1$
- assertNotNull(insert.getValues());
- assertEquals(4, insert.getValues().size());
- for (Iterator i = insert.getValues().iterator(); i.hasNext();) {
+ assertNotNull(insert.getValueSource());
+ assertEquals(4, ((IInsertExpressionValueSource)insert.getValueSource()).getValues().size());
+ for (Iterator i = ((IInsertExpressionValueSource)insert.getValueSource()).getValues().iterator(); i.hasNext();) {
assertTrue(i.next() instanceof IExpression);
}
}
@@ -117,9 +118,9 @@
for (Iterator i = insert.getElements().iterator(); i.hasNext();) {
assertTrue(i.next() instanceof IElement);
}
- assertNotNull(insert.getValues());
- assertEquals(1, insert.getValues().size());
- for (Iterator i = insert.getValues().iterator(); i.hasNext();) {
+ assertNotNull(insert.getValueSource());
+ assertEquals(1, ((IInsertExpressionValueSource)insert.getValueSource()).getValues().size());
+ for (Iterator i = ((IInsertExpressionValueSource)insert.getValueSource()).getValues().iterator(); i.hasNext();) {
assertTrue(i.next() instanceof IExpression);
}
}
Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestCallableStatement.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestCallableStatement.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestCallableStatement.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -39,7 +39,7 @@
String sql = "{? = call pm4.spTest9()}"; //$NON-NLS-1$
try {
- TestPreparedStatement.helpTestProcessing(sql, Collections.EMPTY_LIST, null, FakeMetadataFactory.exampleBQTCached(), true);
+ TestPreparedStatement.helpTestProcessing(sql, Collections.EMPTY_LIST, null, new HardcodedDataManager(), FakeMetadataFactory.exampleBQTCached(), true);
fail();
} catch (QueryResolverException e) {
assertEquals("Required parameter 'PM4.SPTEST9.INKEY' has no value was set or is an invalid parameter.", e.getMessage()); //$NON-NLS-1$
Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -79,10 +79,6 @@
super(name);
}
- static void helpTestProcessing(String preparedSql, List values, List[] expected, QueryMetadataInterface metadata, boolean callableStatement) throws Exception {
- helpTestProcessing(preparedSql, values, expected, (ProcessorDataManager)null, metadata, callableStatement);
- }
-
static void helpTestProcessing(String preparedSql, List values, List[] expected, ProcessorDataManager dataManager, QueryMetadataInterface metadata, boolean callableStatement) throws Exception {
helpTestProcessing(preparedSql, values, expected, dataManager, metadata, callableStatement, false);
}
@@ -126,7 +122,7 @@
PreparedStatementRequest plan = TestPreparedStatement.helpGetProcessorPlan(preparedSql, values, cFinder, metadata, pPlanCache, SESSION_ID, callableStatement, false);
// Run query
- TestProcessor.helpProcess(plan.processPlan, plan.context, dManager, expected);
+ TestProcessor.doProcess(plan.processPlan, dataManager, expected, plan.context);
//test cached plan
plan = TestPreparedStatement.helpGetProcessorPlan(preparedSql, values, cFinder, metadata, pPlanCache, SESSION_ID, callableStatement, false);
@@ -135,7 +131,7 @@
assertEquals("should reuse the plan", exHitCount, pPlanCache.hitCount); //$NON-NLS-1$
// Run query again
- TestProcessor.helpProcess(plan.processPlan, plan.context, dManager, expected);
+ TestProcessor.doProcess(plan.processPlan, dataManager, expected, plan.context);
//get the plan again with a new connection
assertNotNull(TestPreparedStatement.helpGetProcessorPlan(preparedSql, values, cFinder, metadata, pPlanCache, 7, callableStatement, false));
@@ -162,8 +158,9 @@
List values = new ArrayList();
values.add(new Short((short)0));
-
- helpTestProcessing(preparedSql, values, expected, FakeMetadataFactory.example1Cached(), false);
+ FakeDataManager dataManager = new FakeDataManager();
+ TestProcessor.sampleData1(dataManager);
+ helpTestProcessing(preparedSql, values, expected, dataManager, FakeMetadataFactory.example1Cached(), false);
}
public void testSessionSpecificFunction() throws Exception {
Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatementBatchedUpdate.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatementBatchedUpdate.java 2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatementBatchedUpdate.java 2009-05-11 14:34:31 UTC (rev 903)
@@ -22,19 +22,23 @@
package org.teiid.dqp.internal.process;
+import static org.junit.Assert.*;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import junit.framework.TestCase;
-
+import org.junit.Test;
import org.teiid.dqp.internal.process.TestPreparedStatement.TestablePreparedPlanCache;
import com.metamatrix.query.optimizer.capabilities.BasicSourceCapabilities;
import com.metamatrix.query.optimizer.capabilities.FakeCapabilitiesFinder;
import com.metamatrix.query.optimizer.capabilities.SourceCapabilities.Capability;
import com.metamatrix.query.processor.FakeDataManager;
+import com.metamatrix.query.processor.HardcodedDataManager;
import com.metamatrix.query.processor.TestProcessor;
+import com.metamatrix.query.sql.lang.Update;
+import com.metamatrix.query.sql.symbol.Constant;
import com.metamatrix.query.unittest.FakeMetadataFactory;
/**
@@ -42,12 +46,8 @@
* plans that contain batched updates.
*
*/
-public class TestPreparedStatementBatchedUpdate extends TestCase {
+public class TestPreparedStatementBatchedUpdate {
- public TestPreparedStatementBatchedUpdate(String name) {
- super(name);
- }
-
/**
* Test prepared statements that use batched updates using the same prepared
* command with varying number of commands in the batch.
@@ -80,7 +80,7 @@
*
* @throws Exception
*/
- public void testPlanCache_VarNumCmds() throws Exception {
+ @Test public void testPlanCache_VarNumCmds() throws Exception {
// Create query
String preparedSql = "UPDATE pm1.g1 SET pm1.g1.e1=?, pm1.g1.e3=? WHERE pm1.g1.e2=?"; //$NON-NLS-1$
@@ -152,10 +152,10 @@
*
* @throws Exception
*/
- public void testProcessor_VarNumCmds() throws Exception {
+ @Test public void testProcessor_VarNumCmds() throws Exception {
// Create query
String preparedSql = "UPDATE pm1.g1 SET pm1.g1.e1=?, pm1.g1.e3=? WHERE pm1.g1.e2=?"; //$NON-NLS-1$
-
+ int executionsPerTest = 2;
// Create a testable prepared plan cache
TestablePreparedPlanCache prepPlanCache = new TestablePreparedPlanCache();
@@ -167,11 +167,10 @@
FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
BasicSourceCapabilities caps = new BasicSourceCapabilities();
caps.setCapabilitySupport(Capability.BATCHED_UPDATES, true);
- caps.setCapabilitySupport(Capability.PREPARED_BATCH_UPDATE, false);
capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
// Something to hold our final query list
- List<String> finalQueryList = new ArrayList<String>(42);
+ List<String> finalQueryList = new ArrayList<String>(13);
// Create expected results
// first command should result in 2 rows affected
@@ -187,7 +186,7 @@
values.add(new ArrayList<Object>(Arrays.asList(new Object[] { null, Boolean.FALSE, new Integer(1) })));
// Add our expected queries to the final query list
- for ( int i = 0; i < 6; i++ ) {
+ for ( int i = 0; i < executionsPerTest; i++ ) {
finalQueryList.add(new String("UPDATE pm1.g1 SET e1 = 'a', e3 = FALSE WHERE pm1.g1.e2 = 0")); //$NON-NLS-1$
finalQueryList.add(new String("UPDATE pm1.g1 SET e1 = null, e3 = FALSE WHERE pm1.g1.e2 = 1")); //$NON-NLS-1$
}
@@ -207,7 +206,7 @@
values.add(new ArrayList<Object>(Arrays.asList(new Object[] { "a", Boolean.FALSE, new Integer(0) }))); //$NON-NLS-1$
// Add our expected queries to the final query list
- for (int i = 0; i < 6; i++) {
+ for (int i = 0; i < executionsPerTest; i++) {
finalQueryList.add(new String("UPDATE pm1.g1 SET e1 = 'a', e3 = FALSE WHERE pm1.g1.e2 = 0")); //$NON-NLS-1$
}
@@ -235,7 +234,7 @@
values.add(new ArrayList<Object>(Arrays.asList(new Object[] { "b", Boolean.TRUE, new Integer(5)} ))); //$NON-NLS-1$
// Add our expected queries to the final query list
- for (int i = 0; i < 6; i++) {
+ for (int i = 0; i < executionsPerTest; i++) {
finalQueryList.add(new String("UPDATE pm1.g1 SET e1 = 'a', e3 = FALSE WHERE pm1.g1.e2 = 0")); //$NON-NLS-1$
finalQueryList.add(new String("UPDATE pm1.g1 SET e1 = null, e3 = FALSE WHERE pm1.g1.e2 = 1")); //$NON-NLS-1$
finalQueryList.add(new String("UPDATE pm1.g1 SET e1 = 'c', e3 = TRUE WHERE pm1.g1.e2 = 4")); //$NON-NLS-1$
@@ -245,8 +244,38 @@
TestPreparedStatement.helpTestProcessing(preparedSql, values, expected, dataManager, capFinder, FakeMetadataFactory.example1Cached(), prepPlanCache, false, false, true);
// Verify all the queries that were run
- assertNotNull(dataManager);
assertEquals("Unexpected queries executed -", finalQueryList, dataManager.getQueries()); //$NON-NLS-1$
}
-
+
+ @Test public void testBatchedUpdatePushdown() throws Exception {
+ // Create query
+ String preparedSql = "UPDATE pm1.g1 SET pm1.g1.e1=?, pm1.g1.e3=? WHERE pm1.g1.e2=?"; //$NON-NLS-1$
+
+ // Create a testable prepared plan cache
+ TestablePreparedPlanCache prepPlanCache = new TestablePreparedPlanCache();
+
+ // Construct data manager with data
+ HardcodedDataManager dataManager = new HardcodedDataManager();
+ dataManager.addData("UPDATE pm1.g1 SET e1 = ?, e3 = ? WHERE pm1.g1.e2 = ?", new List[] {Arrays.asList(4)}); //$NON-NLS-1$
+ // Source capabilities must support batched updates
+ FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
+ BasicSourceCapabilities caps = new BasicSourceCapabilities();
+ caps.setCapabilitySupport(Capability.BULK_UPDATE, true);
+ capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
+
+ // batch with two commands
+ ArrayList<ArrayList<Object>> values = new ArrayList<ArrayList<Object>>(2);
+ values.add(new ArrayList<Object>(Arrays.asList(new Object[] { "a", Boolean.FALSE, new Integer(0) }))); //$NON-NLS-1$
+ values.add(new ArrayList<Object>(Arrays.asList(new Object[] { null, Boolean.FALSE, new Integer(1) })));
+
+ List<?>[] expected = new List[] {
+ Arrays.asList(4)
+ };
+
+ // Create the plan and process the query
+ TestPreparedStatement.helpTestProcessing(preparedSql, values, expected, dataManager, capFinder, FakeMetadataFactory.example1Cached(), prepPlanCache, false, false, false);
+ Update update = (Update)dataManager.getCommandHistory().iterator().next();
+ assertTrue(((Constant)update.getChangeList().getClauses().get(0).getValue()).isMultiValued());
+ }
+
}
More information about the teiid-commits
mailing list