[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