[teiid-commits] teiid SVN: r2401 - in trunk: build/kits/jboss-container and 5 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Tue Aug 3 12:19:16 EDT 2010


Author: shawkins
Date: 2010-08-03 12:19:15 -0400 (Tue, 03 Aug 2010)
New Revision: 2401

Removed:
   trunk/runtime/src/test/java/com/
Modified:
   trunk/build/kits/jboss-container/teiid-releasenotes.html
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
   trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java
   trunk/engine/src/test/java/org/teiid/query/optimizer/relational/TestMaterialization.java
   trunk/engine/src/test/java/org/teiid/query/unittest/RealMetadataFactory.java
   trunk/pom.xml
Log:
TEIID-168 changing the default mat view logic slightly and updating the parent pom

Modified: trunk/build/kits/jboss-container/teiid-releasenotes.html
===================================================================
--- trunk/build/kits/jboss-container/teiid-releasenotes.html	2010-08-03 04:32:09 UTC (rev 2400)
+++ trunk/build/kits/jboss-container/teiid-releasenotes.html	2010-08-03 16:19:15 UTC (rev 2401)
@@ -27,7 +27,8 @@
 <H2><A NAME="Highlights"></A>Highlights</H2>
 <UL>
     <LI><B>ODBC Support</B> - Support for ODBC access is now available through PostgreSQL ODBC driver clients.  See the Client Developer's Guide for more on how
-    to use Teiid's ODBC access. 
+    to use Teiid's ODBC access.
+    <LI><B>Native Materialized Tables</B> - views marked as materialized without a target table will be materialized internally by Teiid. 
     <LI><B>SQL Support</B>
         <ul> 
            <li>Added NULLS FIST/LAST handling - including pushdown support.  

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java	2010-08-03 04:32:09 UTC (rev 2400)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java	2010-08-03 16:19:15 UTC (rev 2401)
@@ -23,6 +23,7 @@
 package org.teiid.query.optimizer.relational;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -66,6 +67,7 @@
 import org.teiid.query.processor.relational.JoinNode.JoinStrategyType;
 import org.teiid.query.resolver.QueryResolver;
 import org.teiid.query.resolver.util.BindVariableVisitor;
+import org.teiid.query.resolver.util.ResolverUtil;
 import org.teiid.query.rewriter.QueryRewriter;
 import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.LanguageObject.Util;
@@ -91,6 +93,7 @@
 import org.teiid.query.sql.lang.TableFunctionReference;
 import org.teiid.query.sql.lang.UnaryFromClause;
 import org.teiid.query.sql.proc.CreateUpdateProcedureCommand;
+import org.teiid.query.sql.symbol.AllSymbol;
 import org.teiid.query.sql.symbol.GroupSymbol;
 import org.teiid.query.sql.symbol.Reference;
 import org.teiid.query.sql.symbol.SingleElementSymbol;
@@ -904,15 +907,59 @@
         String groupName = metadata.getFullName(metadataID);
         
         if( isMaterializedGroup) {
+        	Object matMetadataId = metadata.getMaterialization(metadataID);
+        	String matTableName = null;
+        	boolean isGlobal = matMetadataId == null;
+            if (isGlobal) {
+        		matTableName = MAT_PREFIX + groupName;
+        		TempMetadataStore store = context.getGlobalTableStore().getMetadataStore();
+        		TempMetadataID id = store.getTempGroupID(matTableName);
+        		//define the table preserving the primary key
+        		if (id == null) {
+        			synchronized (store) {
+        				id = store.getTempGroupID(matTableName);
+        				if (id == null) {
+		        			//this is really just temporary and will be replaced by the real table
+							id = store.addTempGroup(matTableName, ResolverUtil.resolveElementsInGroup(virtualGroup, metadata), false, true);
+							
+							id.setCardinality(metadata.getCardinality(metadataID));
+							
+							Object pk = metadata.getPrimaryKey(virtualGroup.getMetadataID());
+							//primary key
+							if (pk != null) {
+								List cols = metadata.getElementIDsInKey(pk);
+								ArrayList<TempMetadataID> primaryKey = new ArrayList<TempMetadataID>(cols.size());
+								for (Object coldId : cols) {
+									int pos = metadata.getPosition(coldId) - 1;
+									primaryKey.add(id.getElements().get(pos));
+								}
+								id.setPrimaryKey(primaryKey);
+							}
+							//version column?
+							
+							//add timestamp?
+        				}
+        			}
+        		}
+				matMetadataId = id;
+            } else {
+            	matTableName = metadata.getFullName(matMetadataId);
+            }
+
         	if(noCache){
         		//not use cache
         		qnode = metadata.getVirtualPlan(metadataID);
-        		String matTableName = metadata.getFullName(metadata.getMaterialization(metadataID));
+        		//TODO: update the table for defaultMat
         		recordMaterializationTableAnnotation(virtualGroup, analysisRecord, matTableName, "SimpleQueryResolver.materialized_table_not_used"); //$NON-NLS-1$
         	}else{
-                // Default query for a materialized group - go to cached table
-                String matTableName = metadata.getFullName(metadata.getMaterialization(metadataID));
-                qnode = new QueryNode(groupName, "SELECT * FROM " + matTableName); //$NON-NLS-1$
+        		qnode = new QueryNode(groupName, null);
+        		Query query = new Query();
+        		query.setSelect(new Select(Arrays.asList(new AllSymbol())));
+        		GroupSymbol gs = new GroupSymbol(matTableName);
+        		gs.setGlobalTable(isGlobal);
+        		gs.setMetadataID(matMetadataId);
+        		query.setFrom(new From(Arrays.asList(new UnaryFromClause(gs))));
+        		qnode.setCommand(query);
                 cacheString = "matview"; //$NON-NLS-1$
                 recordMaterializationTableAnnotation(virtualGroup, analysisRecord, matTableName, "SimpleQueryResolver.Query_was_redirected_to_Mat_table"); //$NON-NLS-1$                
         	}
@@ -922,9 +969,6 @@
         }
 
         Command result = getCommand(virtualGroup, qnode, cacheString, metadata);   
-        if (!isMaterializedGroup && result.isCache()) {
-        	result = handleCacheHint(virtualGroup, groupName, noCache, result);
-        }
         return QueryRewriter.rewrite(result, metadata, context);
     }
 
@@ -936,8 +980,21 @@
         if (result != null) {
         	result = (Command)result.clone();
         } else {
-        	//parse, resolve, validate
-        	result = convertToSubquery(qnode, qmi);
+        	result = qnode.getCommand();
+            
+            if (result == null) {
+                try {
+                	result = QueryParser.getQueryParser().parseCommand(qnode.getQuery());
+                } catch(QueryParserException e) {
+                    throw new QueryResolverException(e, ErrorMessageKeys.RESOLVER_0011, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0011, qnode.getGroupName()));
+                }
+                
+                //Handle bindings and references
+                List bindings = qnode.getBindings();
+                if (bindings != null){
+                    BindVariableVisitor.bindReferences(result, bindings, metadata);
+                }
+            }
 	        QueryResolver.resolveCommand(result, Collections.EMPTY_MAP, qmi, analysisRecord);
 	        Request.validateWithVisitor(new ValidationVisitor(), qmi, result);
 	        qmi.addToMetadataCache(virtualGroup.getMetadataID(), "transformation/" + cacheString, result.clone()); //$NON-NLS-1$
@@ -945,49 +1002,6 @@
 		return result;
 	}
 
-	private Command handleCacheHint(GroupSymbol virtualGroup, String name, boolean noCache, Command result)
-			throws TeiidComponentException, QueryMetadataException, QueryResolverException, QueryValidatorException {
-		TempMetadataStore store = context.getGlobalTableStore().getMetadataStore();
-		String matTableName = MAT_PREFIX + name; 
-		TempMetadataID id = store.getTempGroupID(matTableName);
-		//define the table preserving the primary key
-		if (id == null) {
-			synchronized (store) {
-				id = store.getTempGroupID(matTableName);
-				if (id == null) {
-					//TODO: this could be done with a generated create
-					id = store.addTempGroup(matTableName, result.getProjectedSymbols(), false, true);
-					
-					Object pk = metadata.getPrimaryKey(virtualGroup.getMetadataID());
-					//primary key
-					if (pk != null) {
-						List cols = metadata.getElementIDsInKey(pk);
-						ArrayList<TempMetadataID> primaryKey = new ArrayList<TempMetadataID>(cols.size());
-						for (Object coldId : cols) {
-							int pos = metadata.getPosition(coldId) - 1;
-							primaryKey.add(id.getElements().get(pos));
-						}
-						id.setPrimaryKey(primaryKey);
-					}
-					//version column?
-					
-					//add timestamp?
-				}
-			}
-		}
-		if (noCache) {
-    		recordMaterializationTableAnnotation(virtualGroup, analysisRecord, matTableName, "SimpleQueryResolver.materialized_table_not_used"); //$NON-NLS-1$
-			//TODO: update the table
-			return result;
-		} 
-		QueryMetadataInterface qmi = new TempMetadataAdapter(metadata, context.getGlobalTableStore().getMetadataStore());
-		QueryNode qn = new QueryNode(virtualGroup.getName(), "select * from " + matTableName); //$NON-NLS-1$
-		Query query = (Query)getCommand(virtualGroup, qn, "matview", qmi); //$NON-NLS-1$
-		query.getFrom().getGroups().get(0).setGlobalTable(true);
-        recordMaterializationTableAnnotation(virtualGroup, analysisRecord, matTableName, "SimpleQueryResolver.Query_was_redirected_to_Mat_table"); //$NON-NLS-1$                
-		return query;
-	}
-
     public static boolean isNoCacheGroup(QueryMetadataInterface metadata,
                                           Object metadataID,
                                           Option option) throws QueryMetadataException,
@@ -1026,27 +1040,4 @@
         }
     }
 
-    private static Command convertToSubquery(QueryNode qnode, QueryMetadataInterface metadata)
-    throws QueryResolverException, TeiidComponentException {
-
-        // Parse this node's command
-        Command command = qnode.getCommand();
-        
-        if (command == null) {
-            try {
-                command = QueryParser.getQueryParser().parseCommand(qnode.getQuery());
-            } catch(QueryParserException e) {
-                throw new QueryResolverException(e, ErrorMessageKeys.RESOLVER_0011, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0011, qnode.getGroupName()));
-            }
-            
-            //Handle bindings and references
-            List bindings = qnode.getBindings();
-            if (bindings != null){
-                BindVariableVisitor.bindReferences(command, bindings, metadata);
-            }
-        }
-
-        return command;
-    }
-
 }
\ No newline at end of file

Modified: trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java	2010-08-03 04:32:09 UTC (rev 2400)
+++ trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java	2010-08-03 16:19:15 UTC (rev 2401)
@@ -189,6 +189,7 @@
 				try {
 					String actualViewName = tableName.substring(RelationalPlanner.MAT_PREFIX.length());
 					Object id = metadata.getGroupID(actualViewName);
+					//TODO: order by primary key nulls first - then have an insert ordered optimization
 					String transformation = metadata.getVirtualPlan(id).getQuery();
 		    		QueryProcessor qp = context.getQueryProcessorFactory().createQueryProcessor(transformation, actualViewName, context);
 		    		qp.setNonBlocking(true);

Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/relational/TestMaterialization.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/relational/TestMaterialization.java	2010-08-03 04:32:09 UTC (rev 2400)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/relational/TestMaterialization.java	2010-08-03 16:19:15 UTC (rev 2401)
@@ -153,7 +153,7 @@
         CommandContext cc = new CommandContext();
         cc.setGlobalTableStore(new TempTableStore("SYSTEM"));
         ProcessorPlan plan = TestOptimizer.getPlan(command, metadata, getGenericFinder(), analysis, true, cc);
-        TestOptimizer.checkAtomicQueries(new String[] {"SELECT #MAT_MatView.VGroup2.X FROM #MAT_MatView.VGroup2"}, plan);
+        TestOptimizer.checkAtomicQueries(new String[] {"SELECT #MAT_MatView.VGroup2.x FROM #MAT_MatView.VGroup2"}, plan);
         Collection<Annotation> annotations = analysis.getAnnotations();
         assertNotNull("Expected annotations but got none", annotations); //$NON-NLS-1$
         assertTrue("Expected one annotation", annotations.size() == 1); //$NON-NLS-1$
@@ -171,7 +171,7 @@
         cc.setGlobalTableStore(new TempTableStore("SYSTEM"));
         RelationalPlan plan = (RelationalPlan)TestOptimizer.getPlan(command, metadata, getGenericFinder(), analysis, true, cc);
         assertEquals(1f, plan.getRootNode().getEstimateNodeCardinality());
-        TestOptimizer.checkAtomicQueries(new String[] {"SELECT #MAT_MatView.VGroup3.X, #MAT_MatView.VGroup3.y FROM #MAT_MatView.VGroup3 WHERE #MAT_MatView.VGroup3.X = 'foo'"}, plan);
+        TestOptimizer.checkAtomicQueries(new String[] {"SELECT #MAT_MatView.VGroup3.x, #MAT_MatView.VGroup3.y FROM #MAT_MatView.VGroup3 WHERE #MAT_MatView.VGroup3.x = 'foo'"}, plan);
         Collection<Annotation> annotations = analysis.getAnnotations();
         assertNotNull("Expected annotations but got none", annotations); //$NON-NLS-1$
         assertTrue("Expected one annotation", annotations.size() == 1); //$NON-NLS-1$

Modified: trunk/engine/src/test/java/org/teiid/query/unittest/RealMetadataFactory.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/unittest/RealMetadataFactory.java	2010-08-03 04:32:09 UTC (rev 2400)
+++ trunk/engine/src/test/java/org/teiid/query/unittest/RealMetadataFactory.java	2010-08-03 16:19:15 UTC (rev 2401)
@@ -331,14 +331,16 @@
         virtGroup1.setMaterializedTable(physGroup1);
         virtGroup1.setMaterializedStageTable(physGroupStage1);
 
-        QueryNode vTrans2 = new QueryNode("VGroup2", "/* cache */ SELECT x FROM matsrc");         //$NON-NLS-1$ //$NON-NLS-2$
+        QueryNode vTrans2 = new QueryNode("VGroup2", "SELECT x FROM matsrc");         //$NON-NLS-1$ //$NON-NLS-2$
         Table vGroup2 = createVirtualGroup("VGroup2", virtModel, vTrans2); //$NON-NLS-1$
+        vGroup2.setMaterialized(true);
         createElements(vGroup2,
                                       new String[] { "x" }, //$NON-NLS-1$
                                       new String[] { DataTypeManager.DefaultDataTypes.STRING});
         
-        QueryNode vTrans3 = new QueryNode("VGroup3", "/* cache */ SELECT x, 'z' || substring(x, 2) as y FROM matsrc");         //$NON-NLS-1$ //$NON-NLS-2$
+        QueryNode vTrans3 = new QueryNode("VGroup3", "SELECT x, 'z' || substring(x, 2) as y FROM matsrc");         //$NON-NLS-1$ //$NON-NLS-2$
         Table vGroup3 = createVirtualGroup("VGroup3", virtModel, vTrans3); //$NON-NLS-1$
+        vGroup3.setMaterialized(true);
         List<Column> vElements3 = createElements(vGroup3,
                                       new String[] { "x", "y" }, //$NON-NLS-1$
                                       new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.STRING});

Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml	2010-08-03 04:32:09 UTC (rev 2400)
+++ trunk/pom.xml	2010-08-03 16:19:15 UTC (rev 2401)
@@ -226,7 +226,7 @@
 				<configuration>
 					<aggregate>true</aggregate>
 					<maxmemory>512m</maxmemory>
-					<excludePackageNames>*.internal:com.arjuna.*:*.connector.object:*.connector.sysadmin:*.connector.yahoo:*.connector.exec</excludePackageNames>
+					<excludePackageNames>*.internal</excludePackageNames>
 				</configuration>
 			</plugin>
 		</plugins>



More information about the teiid-commits mailing list