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>