[teiid-commits] teiid SVN: r1245 - in trunk/engine/src: main/java/com/metamatrix/query/processor/relational and 6 other directories.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Fri Aug 14 23:35:56 EDT 2009
Author: shawkins
Date: 2009-08-14 23:35:55 -0400 (Fri, 14 Aug 2009)
New Revision: 1245
Added:
trunk/engine/src/main/java/com/metamatrix/query/processor/relational/InsertPlanExecutionNode.java
Modified:
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/PlanToProcessConverter.java
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/RelationalPlanner.java
trunk/engine/src/main/java/com/metamatrix/query/processor/relational/DependentProcedureCriteriaProcessor.java
trunk/engine/src/main/java/com/metamatrix/query/processor/relational/PlanExecutionNode.java
trunk/engine/src/main/java/com/metamatrix/query/processor/relational/RelationalNode.java
trunk/engine/src/main/java/com/metamatrix/query/validator/ValidationVisitor.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/multisource/MultiSourcePlanToProcessConverter.java
trunk/engine/src/test/java/com/metamatrix/query/processor/FakeDataManager.java
trunk/engine/src/test/java/com/metamatrix/query/processor/TestInsertProcessing.java
trunk/engine/src/test/java/com/metamatrix/query/validator/TestValidator.java
trunk/engine/src/test/java/org/teiid/dqp/internal/process/multisource/TestMultiSourcePlanToProcessConverter.java
Log:
TEIID-500 adding support for insert into a virtual table with a query expression. this implementation should be simplified to use make insert planning rather than select into as the dominant abstraction.
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-08-15 03:23:38 UTC (rev 1244)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/PlanToProcessConverter.java 2009-08-15 03:35:55 UTC (rev 1245)
@@ -22,6 +22,7 @@
package com.metamatrix.query.optimizer.relational;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
@@ -29,6 +30,8 @@
import com.metamatrix.api.exception.MetaMatrixComponentException;
import com.metamatrix.api.exception.query.QueryMetadataException;
import com.metamatrix.api.exception.query.QueryPlannerException;
+import com.metamatrix.api.exception.query.QueryResolverException;
+import com.metamatrix.api.exception.query.QueryValidatorException;
import com.metamatrix.core.id.IDGenerator;
import com.metamatrix.core.id.IntegerID;
import com.metamatrix.core.id.IntegerIDFactory;
@@ -37,6 +40,7 @@
import com.metamatrix.query.execution.QueryExecPlugin;
import com.metamatrix.query.metadata.QueryMetadataInterface;
import com.metamatrix.query.metadata.TempMetadataID;
+import com.metamatrix.query.optimizer.QueryOptimizer;
import com.metamatrix.query.optimizer.capabilities.CapabilitiesFinder;
import com.metamatrix.query.optimizer.capabilities.SourceCapabilities;
import com.metamatrix.query.optimizer.capabilities.SourceCapabilities.Capability;
@@ -49,6 +53,7 @@
import com.metamatrix.query.processor.relational.DependentProcedureAccessNode;
import com.metamatrix.query.processor.relational.DependentProcedureExecutionNode;
import com.metamatrix.query.processor.relational.GroupingNode;
+import com.metamatrix.query.processor.relational.InsertPlanExecutionNode;
import com.metamatrix.query.processor.relational.JoinNode;
import com.metamatrix.query.processor.relational.LimitNode;
import com.metamatrix.query.processor.relational.MergeJoinStrategy;
@@ -66,18 +71,24 @@
import com.metamatrix.query.processor.relational.JoinNode.JoinStrategyType;
import com.metamatrix.query.processor.relational.MergeJoinStrategy.SortOption;
import com.metamatrix.query.processor.relational.SortUtility.Mode;
+import com.metamatrix.query.resolver.QueryResolver;
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.Criteria;
+import com.metamatrix.query.sql.lang.Insert;
import com.metamatrix.query.sql.lang.JoinType;
import com.metamatrix.query.sql.lang.Query;
import com.metamatrix.query.sql.lang.StoredProcedure;
import com.metamatrix.query.sql.lang.SetQuery.Operation;
+import com.metamatrix.query.sql.symbol.ElementSymbol;
import com.metamatrix.query.sql.symbol.Expression;
import com.metamatrix.query.sql.symbol.GroupSymbol;
+import com.metamatrix.query.sql.symbol.Reference;
import com.metamatrix.query.sql.util.SymbolMap;
import com.metamatrix.query.sql.visitor.EvaluatableVisitor;
import com.metamatrix.query.sql.visitor.GroupCollectorVisitor;
+import com.metamatrix.query.util.CommandContext;
import com.metamatrix.query.util.ErrorMessageKeys;
public class PlanToProcessConverter {
@@ -85,12 +96,14 @@
private IDGenerator idGenerator;
private AnalysisRecord analysisRecord;
private CapabilitiesFinder capFinder;
+ private CommandContext context;
- public PlanToProcessConverter(QueryMetadataInterface metadata, IDGenerator idGenerator, AnalysisRecord analysisRecord, CapabilitiesFinder capFinder) {
+ public PlanToProcessConverter(QueryMetadataInterface metadata, IDGenerator idGenerator, AnalysisRecord analysisRecord, CapabilitiesFinder capFinder, CommandContext context) {
this.metadata = metadata;
this.idGenerator = idGenerator;
this.analysisRecord = analysisRecord;
this.capFinder = capFinder;
+ this.context = context;
}
public RelationalPlan convert(PlanNode planNode)
@@ -155,32 +168,52 @@
case NodeConstants.Types.PROJECT:
GroupSymbol intoGroup = (GroupSymbol) node.getProperty(NodeConstants.Info.INTO_GROUP);
if(intoGroup != null) {
- ProjectIntoNode pinode = new ProjectIntoNode(getID());
- pinode.setIntoGroup(intoGroup);
try {
// Figure out what elements should be inserted based on what is being projected
// from child node
- List allIntoElements = ResolverUtil.resolveElementsInGroup(intoGroup, metadata);
+ List<ElementSymbol> allIntoElements = ResolverUtil.resolveElementsInGroup(intoGroup, metadata);
- pinode.setIntoElements(allIntoElements);
-
+
Object groupID = intoGroup.getMetadataID();
Object modelID = metadata.getModelID(groupID);
String modelName = metadata.getFullName(modelID);
- pinode.setModelName(modelName);
- 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_UPDATE));
- } else if (metadata.isTemporaryTable(groupID)) {
- pinode.setDoBulkInsert(true);
+ if (metadata.isVirtualGroup(groupID)) {
+ List<Reference> references = new ArrayList<Reference>(allIntoElements.size());
+ for (int i = 0; i < allIntoElements.size(); i++) {
+ Reference ref = new Reference(i);
+ ref.setType(allIntoElements.get(i).getType());
+ references.add(ref);
+ }
+ Insert insert = new Insert(intoGroup, allIntoElements, references);
+ QueryResolver.resolveCommand(insert, metadata, analysisRecord);
+ QueryRewriter.rewrite(insert, null, metadata, context);
+ ProcessorPlan plan = QueryOptimizer.optimizePlan(insert, metadata, idGenerator, capFinder, analysisRecord, context);
+ InsertPlanExecutionNode ipen = new InsertPlanExecutionNode(getID());
+ ipen.setProcessorPlan(plan);
+ ipen.setReferences(references);
+ processNode = ipen;
+ } else {
+ ProjectIntoNode pinode = new ProjectIntoNode(getID());
+ pinode.setIntoGroup(intoGroup);
+ pinode.setIntoElements(allIntoElements);
+ pinode.setModelName(modelName);
+ processNode = pinode;
+ if (!metadata.isTemporaryTable(groupID)) {
+ SourceCapabilities caps = capFinder.findCapabilities(modelName);
+ pinode.setDoBatching(caps.supportsCapability(Capability.BATCHED_UPDATES));
+ pinode.setDoBulkInsert(caps.supportsCapability(Capability.BULK_UPDATE));
+ } else {
+ pinode.setDoBulkInsert(true);
+ }
}
} catch(QueryMetadataException e) {
throw new MetaMatrixComponentException(e);
+ } catch(QueryResolverException e) {
+ throw new MetaMatrixComponentException(e);
+ } catch(QueryValidatorException e) {
+ throw new MetaMatrixComponentException(e);
}
- processNode = pinode;
-
} else {
List symbols = (List) node.getProperty(NodeConstants.Info.PROJECT_COLS);
Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/RelationalPlanner.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/RelationalPlanner.java 2009-08-15 03:23:38 UTC (rev 1244)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/RelationalPlanner.java 2009-08-15 03:35:55 UTC (rev 1245)
@@ -147,7 +147,7 @@
planToProcessConverter = context.getPlanToProcessConverter();
}
if (planToProcessConverter == null) {
- planToProcessConverter = new PlanToProcessConverter(metadata, idGenerator, analysisRecord, capFinder);
+ planToProcessConverter = new PlanToProcessConverter(metadata, idGenerator, analysisRecord, capFinder, context);
}
RelationalPlan result = planToProcessConverter.convert(plan);
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/relational/DependentProcedureCriteriaProcessor.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/relational/DependentProcedureCriteriaProcessor.java 2009-08-15 03:23:38 UTC (rev 1244)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/relational/DependentProcedureCriteriaProcessor.java 2009-08-15 03:35:55 UTC (rev 1245)
@@ -55,10 +55,6 @@
this.inputReferences = references;
}
- /**
- * @throws TupleSourceNotFoundException
- * @see com.metamatrix.query.processor.relational.PlanExecutionNode#prepareNextCommand()
- */
protected boolean prepareNextCommand(VariableContext context) throws BlockedException,
MetaMatrixComponentException, MetaMatrixProcessingException {
Added: trunk/engine/src/main/java/com/metamatrix/query/processor/relational/InsertPlanExecutionNode.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/relational/InsertPlanExecutionNode.java (rev 0)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/relational/InsertPlanExecutionNode.java 2009-08-15 03:35:55 UTC (rev 1245)
@@ -0,0 +1,115 @@
+/*
+ * 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.processor.relational;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.teiid.dqp.internal.process.PreparedStatementRequest;
+
+import com.metamatrix.api.exception.MetaMatrixComponentException;
+import com.metamatrix.api.exception.MetaMatrixProcessingException;
+import com.metamatrix.common.buffer.BlockedException;
+import com.metamatrix.common.buffer.TupleBatch;
+import com.metamatrix.query.sql.symbol.Reference;
+
+public class InsertPlanExecutionNode extends PlanExecutionNode {
+
+ private List<Reference> references;
+
+ private int batchRow = 1;
+ private int insertCount = 0;
+ private TupleBatch currentBatch;
+
+ public InsertPlanExecutionNode(int nodeID) {
+ super(nodeID);
+ }
+
+ public void setReferences(List<Reference> references) {
+ this.references = references;
+ }
+
+ @Override
+ protected void addBatchRow(List row) {
+ this.insertCount += ((Integer)row.get(0)).intValue();
+ }
+
+ @Override
+ protected TupleBatch pullBatch() {
+ if (isLastBatch()) {
+ super.addBatchRow(Arrays.asList(insertCount));
+ }
+ return super.pullBatch();
+ }
+
+ @Override
+ protected boolean hasNextCommand() {
+ return !this.currentBatch.getTerminationFlag() || batchRow <= this.currentBatch.getEndRow();
+ }
+
+ @Override
+ protected boolean openPlanImmediately() {
+ return false;
+ }
+
+ @Override
+ protected boolean prepareNextCommand() throws BlockedException,
+ MetaMatrixComponentException, MetaMatrixProcessingException {
+ if (this.currentBatch == null) {
+ this.currentBatch = this.getChildren()[0].nextBatch();
+ }
+ if (!hasNextCommand()) {
+ return false;
+ }
+ //assign the reference values.
+ PreparedStatementRequest.resolveParameterValues(this.references, this.currentBatch.getTuple(this.batchRow), getProcessorPlan().getContext());
+ this.batchRow++;
+ return true;
+ }
+
+ public Object clone(){
+ InsertPlanExecutionNode clonedNode = new InsertPlanExecutionNode(super.getID());
+ copy(this, clonedNode);
+ return clonedNode;
+ }
+
+ protected void copy(InsertPlanExecutionNode source, InsertPlanExecutionNode target) {
+ target.references = source.references;
+ super.copy(source, target);
+ }
+
+ @Override
+ public void close() throws MetaMatrixComponentException {
+ super.close();
+ this.currentBatch = null;
+ }
+
+ @Override
+ public void reset() {
+ super.reset();
+ this.currentBatch = null;
+ this.batchRow = 1;
+ this.insertCount = 0;
+ }
+
+}
Property changes on: trunk/engine/src/main/java/com/metamatrix/query/processor/relational/InsertPlanExecutionNode.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/relational/PlanExecutionNode.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/relational/PlanExecutionNode.java 2009-08-15 03:23:38 UTC (rev 1244)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/relational/PlanExecutionNode.java 2009-08-15 03:35:55 UTC (rev 1245)
@@ -63,19 +63,23 @@
public void open()
throws MetaMatrixComponentException, MetaMatrixProcessingException {
-
+ super.open();
// Initialize plan for execution
CommandContext subContext = (CommandContext) getContext().clone();
subContext.pushVariableContext(new VariableContext());
plan.initialize(subContext, getDataManager(), this.getBufferManager());
- if (prepareNextCommand()) {
+ if (openPlanImmediately() && prepareNextCommand()) {
needsProcessing = true;
plan.open();
isOpen = true;
}
}
+ protected boolean openPlanImmediately() {
+ return true;
+ }
+
public TupleBatch nextBatchDirect()
throws BlockedException, MetaMatrixComponentException, MetaMatrixProcessingException {
@@ -104,18 +108,20 @@
}
TupleBatch batch = plan.nextBatch();
- boolean lastBatch = batch.getTerminationFlag();
- if(lastBatch) {
- if (!hasNextCommand()) {
- terminateBatches();
- } else {
- lastBatch = false;
- resetPlan();
- }
+ for (List tuple : batch.getAllTuples()) {
+ addBatchRow(tuple);
+ }
+
+ if(batch.getTerminationFlag()) {
+ if (hasNextCommand()) {
+ resetPlan();
+ } else {
+ terminateBatches();
+ }
}
- batch.setTerminationFlag(lastBatch);
- return batch;
+
+ return pullBatch();
}
protected boolean prepareNextCommand() throws BlockedException,
Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/relational/RelationalNode.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/relational/RelationalNode.java 2009-08-15 03:23:38 UTC (rev 1244)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/relational/RelationalNode.java 2009-08-15 03:35:55 UTC (rev 1245)
@@ -89,6 +89,10 @@
this.nodeID = nodeID;
}
+ public boolean isLastBatch() {
+ return lastBatch;
+ }
+
public void setContext(CommandContext context) {
this.context = context;
}
@@ -247,14 +251,13 @@
public TupleBatch nextBatch() throws BlockedException, MetaMatrixComponentException, MetaMatrixProcessingException {
boolean recordStats = this.context != null && (this.context.getCollectNodeStatistics() || this.context.getProcessDebug());
- //start timer for this batch
- if(recordStats && this.context.getCollectNodeStatistics()) {
- this.nodeStatistics.startBatchTimer();
- }
-
TupleBatch batch = null;
try {
while (true) {
+ //start timer for this batch
+ if(recordStats && this.context.getCollectNodeStatistics()) {
+ this.nodeStatistics.startBatchTimer();
+ }
batch = nextBatchDirect();
if (recordStats) {
if(this.context.getCollectNodeStatistics()) {
@@ -271,7 +274,7 @@
//24663: only return non-zero batches.
//there have been several instances in the code that have not correctly accounted for non-terminal zero length batches
//this processing style however against the spirit of batch processing (but was already utilized by Sort and Grouping nodes)
- if (batch.getSize() != 0 || batch.getTerminationFlag()) {
+ if (batch.getRowCount() != 0 || batch.getTerminationFlag()) {
break;
}
}
Modified: trunk/engine/src/main/java/com/metamatrix/query/validator/ValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/validator/ValidationVisitor.java 2009-08-15 03:23:38 UTC (rev 1244)
+++ trunk/engine/src/main/java/com/metamatrix/query/validator/ValidationVisitor.java 2009-08-15 03:35:55 UTC (rev 1245)
@@ -119,7 +119,7 @@
@Override
public void validate(Object value) throws QueryValidatorException {
if (((Integer)value).intValue() < 0) {
- throw new QueryValidatorException(QueryPlugin.Util.getString(msgKey)); //$NON-NLS-1$
+ throw new QueryValidatorException(QueryPlugin.Util.getString(msgKey));
}
}
}
@@ -162,7 +162,7 @@
public void visit(Delete obj) {
validateNoXMLUpdates(obj);
validateHasProjectedSymbols(obj);
- validateGroupUpdatable(obj);
+ validateGroupSupportsUpdate(obj.getGroup());
if (obj.getGroup().isTempTable()) {
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.update_temp", obj.getGroup()), obj.getGroup()); //$NON-NLS-1$
}
@@ -201,7 +201,7 @@
public void visit(Insert obj) {
validateNoXMLUpdates(obj);
validateHasProjectedSymbols(obj);
- validateGroupUpdatable(obj);
+ validateGroupSupportsUpdate(obj.getGroup());
validateInsert(obj);
}
@@ -269,28 +269,15 @@
public void visit(Update obj) {
validateNoXMLUpdates(obj);
validateHasProjectedSymbols(obj);
- validateGroupUpdatable(obj);
+ validateGroupSupportsUpdate(obj.getGroup());
validateUpdate(obj);
}
public void visit(Into obj) {
GroupSymbol target = obj.getGroup();
- validateInsertGroup(obj, target);
+ validateGroupSupportsUpdate(target);
}
- private void validateInsertGroup(LanguageObject obj,
- GroupSymbol target) {
- try {
- if(!target.isTempGroupSymbol() && getMetadata().isVirtualGroup(target.getMetadataID())) {
- handleValidationError(QueryPlugin.Util.getString(ErrorMessageKeys.VALIDATOR_0070),obj);
- } else {
- validateGroupSupportsUpdate(target);
- }
- } catch (MetaMatrixComponentException e) {
- handleException(e, obj);
- }
- }
-
public void visit(Function obj) {
if(FunctionLibrary.LOOKUP.equalsIgnoreCase(obj.getName())) {
try {
@@ -658,25 +645,20 @@
handleValidationError(QueryPlugin.Util.getString(ErrorMessageKeys.VALIDATOR_0032), obj);
}
if(obj.getLimit() != null) {
- handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.limit_not_valid_for_xml"), obj);
+ handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.limit_not_valid_for_xml"), obj); //$NON-NLS-1$
}
}
- protected void validateGroupSupportsUpdate(GroupSymbol groupSymbol) throws QueryMetadataException, MetaMatrixComponentException {
- if(! getMetadata().groupSupports(groupSymbol.getMetadataID(), SupportConstants.Group.UPDATE)) {
- handleValidationError(QueryPlugin.Util.getString(ErrorMessageKeys.VALIDATOR_0033, SQLStringVisitor.getSQLString(groupSymbol)), groupSymbol);
- }
+ protected void validateGroupSupportsUpdate(GroupSymbol groupSymbol) {
+ try {
+ if(! getMetadata().groupSupports(groupSymbol.getMetadataID(), SupportConstants.Group.UPDATE)) {
+ handleValidationError(QueryPlugin.Util.getString(ErrorMessageKeys.VALIDATOR_0033, SQLStringVisitor.getSQLString(groupSymbol)), groupSymbol);
+ }
+ } catch (MetaMatrixComponentException e) {
+ handleException(e, groupSymbol);
+ }
}
- protected void validateGroupUpdatable(Command obj) {
- try {
- Collection groups = GroupCollectorVisitor.getGroups(obj, true);
- validateGroupSupportsUpdate((GroupSymbol) groups.iterator().next());
- } catch(MetaMatrixComponentException e) {
- handleException(e, obj);
- }
- }
-
protected void validateSetQuery(SetQuery query) {
// Walk through sub queries - validate each one separately and
// also check the columns of each for comparability
@@ -764,11 +746,6 @@
}
}
- if ( obj.getQueryExpression() != null) {
- validateInsertGroup(obj, obj.getGroup());
- return;
- }
-
//check to see if the elements support nulls in metadata,
// if any of the value present in the insert are null
while(valIter.hasNext() && varIter.hasNext()) {
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java 2009-08-15 03:23:38 UTC (rev 1244)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java 2009-08-15 03:35:55 UTC (rev 1245)
@@ -281,7 +281,7 @@
if (multiSourceModels != null) {
MultiSourcePlanToProcessConverter modifier = new MultiSourcePlanToProcessConverter(
metadata, idGenerator, analysisRecord, capabilitiesFinder,
- multiSourceModels, vdbName, vdbService, vdbVersion);
+ multiSourceModels, vdbName, vdbService, vdbVersion, context);
context.setPlanToProcessConverter(modifier);
}
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/multisource/MultiSourcePlanToProcessConverter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/multisource/MultiSourcePlanToProcessConverter.java 2009-08-15 03:23:38 UTC (rev 1244)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/multisource/MultiSourcePlanToProcessConverter.java 2009-08-15 03:35:55 UTC (rev 1245)
@@ -46,6 +46,7 @@
import com.metamatrix.query.rewriter.QueryRewriter;
import com.metamatrix.query.sql.lang.Command;
import com.metamatrix.query.sql.navigator.DeepPreOrderNavigator;
+import com.metamatrix.query.util.CommandContext;
public class MultiSourcePlanToProcessConverter extends PlanToProcessConverter {
@@ -57,8 +58,8 @@
public MultiSourcePlanToProcessConverter(QueryMetadataInterface metadata,
IDGenerator idGenerator, AnalysisRecord analysisRecord,
CapabilitiesFinder capFinder, Set<String> multiSourceModels,
- String vdbName, VDBService vdbService, String vdbVersion) {
- super(metadata, idGenerator, analysisRecord, capFinder);
+ String vdbName, VDBService vdbService, String vdbVersion, CommandContext context) {
+ super(metadata, idGenerator, analysisRecord, capFinder, context);
this.multiSourceModels = multiSourceModels;
this.vdbName = vdbName;
this.vdbService = vdbService;
Modified: trunk/engine/src/test/java/com/metamatrix/query/processor/FakeDataManager.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/processor/FakeDataManager.java 2009-08-15 03:23:38 UTC (rev 1244)
+++ trunk/engine/src/test/java/com/metamatrix/query/processor/FakeDataManager.java 2009-08-15 03:35:55 UTC (rev 1245)
@@ -23,6 +23,7 @@
package com.metamatrix.query.processor;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -38,7 +39,9 @@
import com.metamatrix.query.sql.lang.BatchedUpdateCommand;
import com.metamatrix.query.sql.lang.Command;
import com.metamatrix.query.sql.lang.CommandContainer;
+import com.metamatrix.query.sql.lang.Delete;
import com.metamatrix.query.sql.lang.From;
+import com.metamatrix.query.sql.lang.Insert;
import com.metamatrix.query.sql.lang.ProcedureContainer;
import com.metamatrix.query.sql.lang.Query;
import com.metamatrix.query.sql.lang.SetQuery;
@@ -146,7 +149,7 @@
* either came from a BatchedUpdateCommand or a signle
* command from an Update command.
*/
- List<TranslatableProcedureContainer> updateCommands = new ArrayList<TranslatableProcedureContainer>();
+ List<Command> updateCommands = new ArrayList<Command>();
// Apply query criteria to tuples
if(command instanceof Query){
@@ -177,48 +180,51 @@
tuples = new List[filteredTuples.size()];
filteredTuples.toArray(tuples);
}
- } else if ( command instanceof TranslatableProcedureContainer ) {
+ } else if ( command instanceof Insert || command instanceof Update || command instanceof Delete) {
// add single update command to a list to be executed
- updateCommands.add((TranslatableProcedureContainer)command);
+ updateCommands.add(command);
} else if ( command instanceof BatchedUpdateCommand ) {
- if ( ((CommandContainer) command).getContainedCommands() != null && ((CommandContainer) command).getContainedCommands().size() > 0 )
+ if ( ((CommandContainer) command).getContainedCommands() != null && ((CommandContainer) command).getContainedCommands().size() > 0 ) {
// add all update commands to a list to be executed
- for ( int i = 0; i < ((CommandContainer) command).getContainedCommands().size(); i++ )
- if ( ((CommandContainer) command).getContainedCommands().get(i) instanceof TranslatableProcedureContainer ) {
- updateCommands.add(((TranslatableProcedureContainer) ((CommandContainer) command).getContainedCommands().get(i)));
- }
+ updateCommands.addAll(((CommandContainer) command).getContainedCommands());
+ }
}
// if we had update commands added to the list, execute them now
if ( updateCommands.size() > 0 ) {
List<List<Integer>> filteredTuples = new ArrayList<List<Integer>>();
for ( int c = 0; c < updateCommands.size(); c++ ) {
- TranslatableProcedureContainer update = updateCommands.get(c);
- if ( update.getCriteria() != null ) {
- // Build lookupMap from BOTH all the elements and the projected symbols - both may be needed here
- Map<Object, Integer> lookupMap = new HashMap<Object, Integer>();
- for(int i=0; i<elements.size(); i++) {
- Object element = elements.get(i);
- mapElementToIndex(lookupMap, element, new Integer(i), group);
- }
- for(int i=0; i<projectedSymbols.size(); i++) {
- Object element = projectedSymbols.get(i);
- mapElementToIndex(lookupMap, element, new Integer(columnMap[i]), group);
- }
-
- int updated = 0;
- for(int i=0; i<tuples.length; i++) {
- try {
- if(new Evaluator(lookupMap, null, null).evaluate(update.getCriteria(), tuples[i])) {
- updated++;
- }
- } catch(CriteriaEvaluationException e) {
- throw new MetaMatrixComponentException(e, e.getMessage());
- }
- }
- List<Integer> updateTuple = new ArrayList<Integer>(1);
- updateTuple.add( new Integer(updated) );
- filteredTuples.add(updateTuple);
+ Command cmd = updateCommands.get(c);
+ if (cmd instanceof TranslatableProcedureContainer) {
+ TranslatableProcedureContainer update = (TranslatableProcedureContainer)cmd;
+ if ( update.getCriteria() != null ) {
+ // Build lookupMap from BOTH all the elements and the projected symbols - both may be needed here
+ Map<Object, Integer> lookupMap = new HashMap<Object, Integer>();
+ for(int i=0; i<elements.size(); i++) {
+ Object element = elements.get(i);
+ mapElementToIndex(lookupMap, element, new Integer(i), group);
+ }
+ for(int i=0; i<projectedSymbols.size(); i++) {
+ Object element = projectedSymbols.get(i);
+ mapElementToIndex(lookupMap, element, new Integer(columnMap[i]), group);
+ }
+
+ int updated = 0;
+ for(int i=0; i<tuples.length; i++) {
+ try {
+ if(new Evaluator(lookupMap, null, null).evaluate(update.getCriteria(), tuples[i])) {
+ updated++;
+ }
+ } catch(CriteriaEvaluationException e) {
+ throw new MetaMatrixComponentException(e, e.getMessage());
+ }
+ }
+ List<Integer> updateTuple = new ArrayList<Integer>(1);
+ updateTuple.add( new Integer(updated) );
+ filteredTuples.add(updateTuple);
+ }
+ } else {
+ filteredTuples.add(Arrays.asList(1)); //TODO: check for bulk
}
}
tuples = new List[filteredTuples.size()];
Modified: trunk/engine/src/test/java/com/metamatrix/query/processor/TestInsertProcessing.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/processor/TestInsertProcessing.java 2009-08-15 03:23:38 UTC (rev 1244)
+++ trunk/engine/src/test/java/com/metamatrix/query/processor/TestInsertProcessing.java 2009-08-15 03:35:55 UTC (rev 1245)
@@ -183,14 +183,6 @@
};
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());
}
@@ -393,5 +385,22 @@
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 testInsertIntoVirtualWithQueryExpression() {
+ String sql = "insert into vm1.g1 (e1, e2, e3, e4) select * from pm1.g1"; //$NON-NLS-1$
+
+ List[] expected = new List[] {
+ Arrays.asList(6),
+ };
+
+ FakeDataManager dataManager = new FakeDataManager();
+ sampleData1(dataManager);
+
+ // Plan query
+ ProcessorPlan plan = helpGetPlan(sql, FakeMetadataFactory.example1Cached());
+ // Run query
+ helpProcess(plan, dataManager, expected);
+ }
+
}
Modified: trunk/engine/src/test/java/com/metamatrix/query/validator/TestValidator.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/validator/TestValidator.java 2009-08-15 03:23:38 UTC (rev 1244)
+++ trunk/engine/src/test/java/com/metamatrix/query/validator/TestValidator.java 2009-08-15 03:35:55 UTC (rev 1245)
@@ -1631,8 +1631,8 @@
FakeMetadataObject.Props.UPDATE_PROCEDURE);
}
- public void testInvalidSelectIntoVirtualGroup() {
- helpValidate("SELECT e1, e2, e3, e4 INTO vm1.g1 FROM pm1.g2", new String[] {"vm1.g1"}, FakeMetadataFactory.example1Cached()); //$NON-NLS-1$ //$NON-NLS-2$
+ public void testSelectIntoVirtualGroup() {
+ helpValidate("SELECT e1, e2, e3, e4 INTO vm1.g1 FROM pm1.g2", new String[] {}, FakeMetadataFactory.example1Cached()); //$NON-NLS-1$
String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
@@ -1642,7 +1642,7 @@
String userQuery = "UPDATE vm1.g3 SET x='x' where y = 1"; //$NON-NLS-1$
- helpFailProcedure(procedure, userQuery,
+ helpValidateProcedure(procedure, userQuery,
FakeMetadataObject.Props.UPDATE_PROCEDURE);
}
@@ -1945,18 +1945,11 @@
helpValidate("update #temp set e1 = 1", new String[] {"#temp"}, metadata); //$NON-NLS-1$ //$NON-NLS-2$
}
- public void testSelectIntoVirtual() throws Exception {
- QueryMetadataInterface metadata = FakeMetadataFactory.example1Cached();
- Command command = helpResolve("select * into vm1.g1 from pm1.g1", metadata); //$NON-NLS-1$
- ValidatorReport report = Validator.validate(command, metadata);
- assertEquals("The target table for a SELECT INTO or an INSERT with a query expression can only be a physical table or a temporary table.", report.toString()); //$NON-NLS-1$
- }
-
public void testInsertIntoVirtualWithQuery() throws Exception {
QueryMetadataInterface metadata = FakeMetadataFactory.example1Cached();
Command command = helpResolve("insert into vm1.g1 select 1, 2, true, 3", metadata); //$NON-NLS-1$
ValidatorReport report = Validator.validate(command, metadata);
- assertEquals("The target table for a SELECT INTO or an INSERT with a query expression can only be a physical table or a temporary table.", report.toString()); //$NON-NLS-1$
+ assertTrue(report.getItems().isEmpty());
}
public void testDynamicIntoDeclaredTemp() throws Exception {
Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/multisource/TestMultiSourcePlanToProcessConverter.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/multisource/TestMultiSourcePlanToProcessConverter.java 2009-08-15 03:23:38 UTC (rev 1244)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/multisource/TestMultiSourcePlanToProcessConverter.java 2009-08-15 03:35:55 UTC (rev 1245)
@@ -123,7 +123,7 @@
Properties props = new Properties();
CommandContext context = new CommandContext("0", "test", "user", null, vdbName, vdbVersion, props, false, false); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- context.setPlanToProcessConverter(new MultiSourcePlanToProcessConverter(metadata, idGenerator, analysis, finder, multiSourceModels, vdbName, vdbService, vdbVersion));
+ context.setPlanToProcessConverter(new MultiSourcePlanToProcessConverter(metadata, idGenerator, analysis, finder, multiSourceModels, vdbName, vdbService, vdbVersion, context));
ProcessorPlan plan = QueryOptimizer.optimizePlan(command, wrapper, idGenerator, finder, analysis, context);
More information about the teiid-commits
mailing list