teiid SVN: r3335 - branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-07-26 16:13:42 -0400 (Tue, 26 Jul 2011)
New Revision: 3335
Modified:
branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java
Log:
removing invalid system out trace
Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java 2011-07-25 18:19:13 UTC (rev 3334)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java 2011-07-26 20:13:42 UTC (rev 3335)
@@ -266,9 +266,6 @@
public void processRow(NodeInfo row) {
this.item = row;
rowCount++;
- if (rowCount % 100 == 0) {
- System.out.println(System.currentTimeMillis() + " " + rowCount);
- }
try {
this.buffer.addTuple(processRow());
} catch (TeiidException e) {
14 years, 5 months
teiid SVN: r3334 - in branches/7.4.x/engine/src: main/java/org/teiid/query/optimizer/relational/rules and 2 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-07-25 14:19:13 -0400 (Mon, 25 Jul 2011)
New Revision: 3334
Modified:
branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanSorts.java
branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/GroupingNode.java
branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
Log:
TEIID-1682 preserving sort options
Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java 2011-07-25 17:39:32 UTC (rev 3333)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java 2011-07-25 18:19:13 UTC (rev 3334)
@@ -53,6 +53,7 @@
import org.teiid.query.processor.relational.DependentAccessNode;
import org.teiid.query.processor.relational.DependentProcedureAccessNode;
import org.teiid.query.processor.relational.DependentProcedureExecutionNode;
+import org.teiid.query.processor.relational.EnhancedSortMergeJoinStrategy;
import org.teiid.query.processor.relational.GroupingNode;
import org.teiid.query.processor.relational.InsertPlanExecutionNode;
import org.teiid.query.processor.relational.JoinNode;
@@ -61,7 +62,6 @@
import org.teiid.query.processor.relational.NestedLoopJoinStrategy;
import org.teiid.query.processor.relational.NestedTableJoinStrategy;
import org.teiid.query.processor.relational.NullNode;
-import org.teiid.query.processor.relational.EnhancedSortMergeJoinStrategy;
import org.teiid.query.processor.relational.PlanExecutionNode;
import org.teiid.query.processor.relational.ProjectIntoNode;
import org.teiid.query.processor.relational.ProjectNode;
@@ -93,6 +93,7 @@
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.SingleElementSymbol;
import org.teiid.query.sql.util.SymbolMap;
import org.teiid.query.sql.visitor.EvaluatableVisitor;
import org.teiid.query.sql.visitor.GroupCollectorVisitor;
@@ -377,8 +378,22 @@
break;
case NodeConstants.Types.GROUP:
GroupingNode gnode = new GroupingNode(getID());
- gnode.setGroupingElements( (List) node.getProperty(NodeConstants.Info.GROUP_COLS) );
+ List<SingleElementSymbol> gCols = (List) node.getProperty(NodeConstants.Info.GROUP_COLS);
+ gnode.setGroupingElements( gCols );
gnode.setRemoveDuplicates(node.hasBooleanProperty(NodeConstants.Info.IS_DUP_REMOVAL));
+ orderBy = (OrderBy) node.getProperty(Info.SORT_ORDER);
+ if (orderBy == null) {
+ if (gCols != null) {
+ orderBy = new OrderBy(gCols);
+ }
+ } else {
+ for (int i = orderBy.getOrderByItems().size(); i < gCols.size(); i++) {
+ orderBy.addVariable(gCols.get(i), OrderBy.ASC);
+ }
+ }
+ if (orderBy != null) {
+ gnode.setOrderBy(orderBy.getOrderByItems());
+ }
processNode = gnode;
break;
Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanSorts.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanSorts.java 2011-07-25 17:39:32 UTC (rev 3333)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanSorts.java 2011-07-25 18:19:13 UTC (rev 3334)
@@ -85,7 +85,8 @@
} else {
root = checkForProjectOptimization(node, root, metadata, capFinder, record);
}
- List<SingleElementSymbol> orderColumns = ((OrderBy)node.getProperty(NodeConstants.Info.SORT_ORDER)).getSortKeys();
+ OrderBy orderBy = (OrderBy)node.getProperty(NodeConstants.Info.SORT_ORDER);
+ List<SingleElementSymbol> orderColumns = orderBy.getSortKeys();
PlanNode possibleSort = NodeEditor.findNodePreOrder(node, NodeConstants.Types.GROUP, NodeConstants.Types.SOURCE | NodeConstants.Types.ACCESS);
if (possibleSort != null) {
List exprs = (List)possibleSort.getProperty(Info.GROUP_COLS);
@@ -102,6 +103,7 @@
NodeEditor.removeChildNode(node.getParent(), node);
node = nextNode;
}
+ possibleSort.setProperty(Info.SORT_ORDER, orderBy);
}
break;
}
Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/GroupingNode.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/GroupingNode.java 2011-07-25 17:39:32 UTC (rev 3333)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/GroupingNode.java 2011-07-25 18:19:13 UTC (rev 3334)
@@ -22,12 +22,10 @@
package org.teiid.query.processor.relational;
-import static org.teiid.query.analysis.AnalysisRecord.PROP_GROUP_COLS;
-import static org.teiid.query.analysis.AnalysisRecord.PROP_SORT_MODE;
+import static org.teiid.query.analysis.AnalysisRecord.*;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
@@ -42,6 +40,7 @@
import org.teiid.core.TeiidComponentException;
import org.teiid.core.TeiidProcessingException;
import org.teiid.language.SQLConstants.NonReserved;
+import org.teiid.query.analysis.AnalysisRecord;
import org.teiid.query.eval.Evaluator;
import org.teiid.query.function.aggregate.AggregateFunction;
import org.teiid.query.function.aggregate.ArrayAgg;
@@ -57,7 +56,6 @@
import org.teiid.query.processor.BatchCollector;
import org.teiid.query.processor.ProcessorDataManager;
import org.teiid.query.processor.relational.SortUtility.Mode;
-import org.teiid.query.sql.lang.OrderBy;
import org.teiid.query.sql.lang.OrderByItem;
import org.teiid.query.sql.symbol.AggregateSymbol;
import org.teiid.query.sql.symbol.ElementSymbol;
@@ -72,7 +70,7 @@
// Grouping columns set by the planner
private List sortElements;
- private List sortTypes;
+ private List<OrderByItem> orderBy;
private boolean removeDuplicates;
// Collection phase
@@ -129,10 +127,11 @@
*/
public void setGroupingElements(List groupingElements) {
this.sortElements = groupingElements;
- if(groupingElements != null) {
- sortTypes = Collections.nCopies(groupingElements.size(), Boolean.valueOf(OrderBy.ASC));
- }
}
+
+ public void setOrderBy(List<OrderByItem> orderBy) {
+ this.orderBy = orderBy;
+ }
@Override
public void initialize(CommandContext context, BufferManager bufferManager,
@@ -305,8 +304,7 @@
this.groupTupleSource = getCollectionTupleSource();
this.phase = GROUP;
} else {
- this.sortUtility = new SortUtility(getCollectionTupleSource(), sortElements,
- sortTypes, removeDuplicates?Mode.DUP_REMOVE_SORT:Mode.SORT, getBufferManager(),
+ this.sortUtility = new SortUtility(getCollectionTupleSource(), orderBy, removeDuplicates?Mode.DUP_REMOVE_SORT:Mode.SORT, getBufferManager(),
getConnectionID(), collectedExpressions);
this.phase = SORT;
}
@@ -421,8 +419,8 @@
GroupingNode clonedNode = new GroupingNode(super.getID());
super.copy(this, clonedNode);
clonedNode.sortElements = sortElements;
- clonedNode.sortTypes = sortTypes;
clonedNode.removeDuplicates = removeDuplicates;
+ clonedNode.orderBy = orderBy;
return clonedNode;
}
@@ -438,7 +436,9 @@
}
props.addProperty(PROP_GROUP_COLS, groupCols);
}
-
+ if (orderBy != null) {
+ props.addProperty(AnalysisRecord.PROP_SORT_COLS, orderBy.toString());
+ }
props.addProperty(PROP_SORT_MODE, String.valueOf(this.removeDuplicates));
return props;
Modified: branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
===================================================================
--- branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestProcessor.java 2011-07-25 17:39:32 UTC (rev 3333)
+++ branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestProcessor.java 2011-07-25 18:19:13 UTC (rev 3334)
@@ -7559,5 +7559,19 @@
helpProcess(plan, dataManager, new List[] {Arrays.asList("a")});
}
+ @Test public void testSortGroupCombination() throws Exception {
+ String sql = "select e2, max(e1) from pm1.g1 x group by e2 order by e2 desc"; //$NON-NLS-1$
+
+ FakeDataManager dataManager = new FakeDataManager();
+ sampleData1(dataManager);
+ ProcessorPlan plan = helpGetPlan(sql, RealMetadataFactory.example1Cached(), TestOptimizer.getGenericFinder());
+
+ helpProcess(plan, dataManager, new List[] {
+ Arrays.asList(3, "a"),
+ Arrays.asList(2, "b"),
+ Arrays.asList(1, "c"),
+ Arrays.asList(0, "a")});
+ }
+
private static final boolean DEBUG = false;
}
14 years, 5 months
teiid SVN: r3333 - in branches/7.4.x/engine/src: test/java/org/teiid/query/processor and 1 other directory.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-07-25 13:39:32 -0400 (Mon, 25 Jul 2011)
New Revision: 3333
Modified:
branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushLimit.java
branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
Log:
TEIID-1681 fix for pushing limits too far with procedure executions
Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushLimit.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushLimit.java 2011-07-25 15:46:41 UTC (rev 3332)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushLimit.java 2011-07-25 17:39:32 UTC (rev 3333)
@@ -51,6 +51,7 @@
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.symbol.Function;
+import org.teiid.query.sql.symbol.GroupSymbol;
import org.teiid.query.sql.symbol.SearchedCaseExpression;
import org.teiid.query.sql.visitor.EvaluatableVisitor;
import org.teiid.query.util.CommandContext;
@@ -168,6 +169,13 @@
}
case NodeConstants.Types.SOURCE:
{
+ GroupSymbol virtualGroup = child.getGroups().iterator().next();
+ if (virtualGroup.isProcedure()) {
+ return false;
+ }
+ if (FrameUtil.isProcedure(child.getFirstChild())) {
+ return false;
+ }
return true;
}
default:
Modified: branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
===================================================================
--- branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestProcessor.java 2011-07-25 15:46:41 UTC (rev 3332)
+++ branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestProcessor.java 2011-07-25 17:39:32 UTC (rev 3333)
@@ -7549,5 +7549,15 @@
helpProcess(plan, dataManager, new List[] {Arrays.asList(1, 1)});
}
+ @Test public void testUnorderedLimitWithProc() throws Exception {
+ String sql = "select e1 from (exec pm1.sq1()) x limit 1";
+
+ FakeDataManager dataManager = new FakeDataManager();
+ sampleData1(dataManager);
+ ProcessorPlan plan = helpGetPlan(sql, RealMetadataFactory.example1Cached(), TestOptimizer.getGenericFinder());
+
+ helpProcess(plan, dataManager, new List[] {Arrays.asList("a")});
+ }
+
private static final boolean DEBUG = false;
}
14 years, 5 months
teiid SVN: r3332 - in branches/7.1.1.CP3: engine/src/main/java/org/teiid/cache and 7 other directories.
by teiid-commits@lists.jboss.org
Author: rareddy
Date: 2011-07-25 11:46:41 -0400 (Mon, 25 Jul 2011)
New Revision: 3332
Modified:
branches/7.1.1.CP3/cache-jbosscache/src/main/java/org/teiid/cache/jboss/JBossCache.java
branches/7.1.1.CP3/cache-jbosscache/src/main/java/org/teiid/cache/jboss/JBossCacheListener.java
branches/7.1.1.CP3/cache-jbosscache/src/main/java/org/teiid/cache/jboss/TupleBatchCacheLoader.java
branches/7.1.1.CP3/engine/src/main/java/org/teiid/cache/Cache.java
branches/7.1.1.CP3/engine/src/main/java/org/teiid/cache/CacheListener.java
branches/7.1.1.CP3/engine/src/main/java/org/teiid/cache/DefaultCache.java
branches/7.1.1.CP3/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java
branches/7.1.1.CP3/engine/src/main/java/org/teiid/dqp/internal/process/CachedResults.java
branches/7.1.1.CP3/engine/src/main/java/org/teiid/dqp/internal/process/DQPCore.java
branches/7.1.1.CP3/engine/src/main/java/org/teiid/dqp/internal/process/SessionAwareCache.java
branches/7.1.1.CP3/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java
branches/7.1.1.CP3/engine/src/main/resources/org/teiid/query/i18n.properties
branches/7.1.1.CP3/engine/src/test/java/org/teiid/query/processor/TestMaterialization.java
branches/7.1.1.CP3/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
branches/7.1.1.CP3/engine/src/test/java/org/teiid/query/processor/TestTempTables.java
branches/7.1.1.CP3/jboss-integration/src/main/java/org/teiid/jboss/deployers/RuntimeEngineDeployer.java
branches/7.1.1.CP3/jboss-integration/src/main/resources/org/teiid/jboss/i18n.properties
Log:
TEIID-1657: Implemented distributed refreshMatView call based on the JBoss Cache Listener mechanism. When user issues a refreshMatView call on one node, then all the nodes gets notified about the change in the original node after load of the mat view table is finished. The proactive load on the passive nodes are done in a separate thread. Also fixed a memory leak with the TupleBufferCacheLoader in loading batches.
Modified: branches/7.1.1.CP3/cache-jbosscache/src/main/java/org/teiid/cache/jboss/JBossCache.java
===================================================================
--- branches/7.1.1.CP3/cache-jbosscache/src/main/java/org/teiid/cache/jboss/JBossCache.java 2011-07-23 11:41:47 UTC (rev 3331)
+++ branches/7.1.1.CP3/cache-jbosscache/src/main/java/org/teiid/cache/jboss/JBossCache.java 2011-07-25 15:46:41 UTC (rev 3332)
@@ -112,11 +112,13 @@
}
}
- public synchronized void addListener(CacheListener listener) {
- this.cacheListener = new JBossCacheListener(this.rootFqn, listener);
+ @Override
+ public synchronized void setListener(CacheListener listener) {
+ this.cacheListener = new JBossCacheListener(this.rootFqn, this.cacheStore, this, listener);
this.cacheStore.addCacheListener(this.cacheListener);
}
+ @Override
public synchronized void removeListener() {
this.cacheStore.removeCacheListener(this.cacheListener);
this.cacheListener = null;
Modified: branches/7.1.1.CP3/cache-jbosscache/src/main/java/org/teiid/cache/jboss/JBossCacheListener.java
===================================================================
--- branches/7.1.1.CP3/cache-jbosscache/src/main/java/org/teiid/cache/jboss/JBossCacheListener.java 2011-07-23 11:41:47 UTC (rev 3331)
+++ branches/7.1.1.CP3/cache-jbosscache/src/main/java/org/teiid/cache/jboss/JBossCacheListener.java 2011-07-25 15:46:41 UTC (rev 3332)
@@ -21,7 +21,11 @@
*/
package org.teiid.cache.jboss;
+import java.util.Set;
+
import org.jboss.cache.Fqn;
+import org.jboss.cache.Node;
+import org.jboss.cache.eviction.ExpirationAlgorithmConfig;
import org.jboss.cache.notifications.annotation.NodeCreated;
import org.jboss.cache.notifications.annotation.NodeEvicted;
import org.jboss.cache.notifications.annotation.NodeLoaded;
@@ -33,14 +37,18 @@
@org.jboss.cache.notifications.annotation.CacheListener
-public class JBossCacheListener {
+public class JBossCacheListener<K,V> {
private CacheListener listener;
private Fqn rootFqn;
+ private JBossCache cache;
+ private org.jboss.cache.Cache<K,V> cacheStore;
- public JBossCacheListener(Fqn fqn, CacheListener listener) {
+ public JBossCacheListener(Fqn fqn, org.jboss.cache.Cache cacheStore, JBossCache cache, CacheListener listener) {
this.rootFqn = fqn;
this.listener = listener;
+ this.cache = cache;
+ this.cacheStore = cacheStore;
}
@NodeCreated
@@ -55,4 +63,61 @@
listener.cacheChanged();
}
}
+
+ @NodeCreated
+ public synchronized void cacheCreated(NodeEvent ne) {
+ if (!ne.isPre() && !ne.isOriginLocal()) {
+ Fqn fqn = ne.getFqn();
+ if (fqn.isChildOrEquals(rootFqn)) {
+ Node<K,V> node = this.cacheStore.getNode(fqn);
+ if (node != null) {
+ Set<K> keys = node.getKeys();
+ for (K key:keys) {
+ if ((key instanceof String) && (key.equals(ExpirationAlgorithmConfig.EXPIRATION_KEY))) {
+ continue;
+ }
+ listener.cacheCreated(key, cache.get(key));
+ }
+ }
+ }
+ }
+ }
+
+ @NodeRemoved
+ public synchronized void cacheRemoved(NodeEvent ne) {
+ if (!ne.isPre() && !ne.isOriginLocal()) {
+ Fqn fqn = ne.getFqn();
+ if (fqn.isChildOrEquals(rootFqn)) {
+ Node<K,V> node = this.cacheStore.getNode(fqn);
+ if (node != null) {
+ Set<K> keys = node.getKeys();
+ for (K key:keys) {
+ if ((key instanceof String) && (key.equals(ExpirationAlgorithmConfig.EXPIRATION_KEY))) {
+ continue;
+ }
+ listener.cacheRemoved(key, cache.get(key));
+ }
+ }
+ }
+ }
+ }
+
+ @NodeModified
+ public synchronized void cacheModified(NodeEvent ne) {
+ Fqn fqn = ne.getFqn();
+ if (!ne.isPre() && !ne.isOriginLocal()) {
+ if (fqn.isChildOrEquals(rootFqn)) {
+ Node<K,V> node = this.cacheStore.getNode(fqn);
+ if (node != null) {
+ Set<K> keys = node.getKeys();
+ for (K key:keys) {
+ if ((key instanceof String) && (key.equals(ExpirationAlgorithmConfig.EXPIRATION_KEY))) {
+ continue;
+ }
+ listener.cacheModified(key, cache.get(key));
+ }
+ }
+ }
+ }
+ }
}
Modified: branches/7.1.1.CP3/cache-jbosscache/src/main/java/org/teiid/cache/jboss/TupleBatchCacheLoader.java
===================================================================
--- branches/7.1.1.CP3/cache-jbosscache/src/main/java/org/teiid/cache/jboss/TupleBatchCacheLoader.java 2011-07-23 11:41:47 UTC (rev 3331)
+++ branches/7.1.1.CP3/cache-jbosscache/src/main/java/org/teiid/cache/jboss/TupleBatchCacheLoader.java 2011-07-25 15:46:41 UTC (rev 3332)
@@ -62,9 +62,8 @@
map.put(id, b);
return map;
}
- return super.get(fqn);
}
- return null;
+ return super.get(fqn);
}
@Override
Modified: branches/7.1.1.CP3/engine/src/main/java/org/teiid/cache/Cache.java
===================================================================
--- branches/7.1.1.CP3/engine/src/main/java/org/teiid/cache/Cache.java 2011-07-23 11:41:47 UTC (rev 3331)
+++ branches/7.1.1.CP3/engine/src/main/java/org/teiid/cache/Cache.java 2011-07-25 15:46:41 UTC (rev 3332)
@@ -82,4 +82,14 @@
* @return
*/
Set<K> keys();
+
+ /**
+ * set cache listener
+ * @param listener
+ */
+ void setListener(CacheListener<K, V> listener);
+
+
+ void removeListener();
+
}
Modified: branches/7.1.1.CP3/engine/src/main/java/org/teiid/cache/CacheListener.java
===================================================================
--- branches/7.1.1.CP3/engine/src/main/java/org/teiid/cache/CacheListener.java 2011-07-23 11:41:47 UTC (rev 3331)
+++ branches/7.1.1.CP3/engine/src/main/java/org/teiid/cache/CacheListener.java 2011-07-25 15:46:41 UTC (rev 3332)
@@ -25,6 +25,9 @@
/**
* Listener for the cache events like add,update delete
*/
-public interface CacheListener {
+public interface CacheListener<K, V> {
void cacheChanged();
+ void cacheCreated(K key, V value);
+ void cacheRemoved(K key, V value);
+ void cacheModified(K key, V value);
}
Modified: branches/7.1.1.CP3/engine/src/main/java/org/teiid/cache/DefaultCache.java
===================================================================
--- branches/7.1.1.CP3/engine/src/main/java/org/teiid/cache/DefaultCache.java 2011-07-23 11:41:47 UTC (rev 3331)
+++ branches/7.1.1.CP3/engine/src/main/java/org/teiid/cache/DefaultCache.java 2011-07-25 15:46:41 UTC (rev 3332)
@@ -95,9 +95,11 @@
this.ttl = ttl;
}
- public void addListener(CacheListener listener) {
- throw new UnsupportedOperationException();
+ public void setListener(CacheListener listener) {
}
+
+ public void removeListener() {
+ }
public void clear() {
synchronized (map) {
Modified: branches/7.1.1.CP3/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java
===================================================================
--- branches/7.1.1.CP3/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java 2011-07-23 11:41:47 UTC (rev 3331)
+++ branches/7.1.1.CP3/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java 2011-07-25 15:46:41 UTC (rev 3332)
@@ -95,8 +95,12 @@
this.uuid = java.util.UUID.randomUUID().toString();
}
return this.uuid;
- }
+ }
+ public void setId(String uuid) {
+ this.uuid = uuid;
+ }
+
public boolean isLobs() {
return lobIndexes != null;
}
Modified: branches/7.1.1.CP3/engine/src/main/java/org/teiid/dqp/internal/process/CachedResults.java
===================================================================
--- branches/7.1.1.CP3/engine/src/main/java/org/teiid/dqp/internal/process/CachedResults.java 2011-07-23 11:41:47 UTC (rev 3331)
+++ branches/7.1.1.CP3/engine/src/main/java/org/teiid/dqp/internal/process/CachedResults.java 2011-07-25 15:46:41 UTC (rev 3332)
@@ -130,6 +130,7 @@
}
buffer = bufferManager.createTupleBuffer(schema, "cached", TupleSourceType.FINAL); //$NON-NLS-1$
buffer.setBatchSize(this.batchSize);
+ buffer.setId(this.uuid);
if (this.hint != null) {
buffer.setPrefersMemory(this.hint.getPrefersMemory());
}
@@ -142,6 +143,7 @@
return false;
}
buffer.addTupleBatch(batch, true);
+ cache.remove(uuid+","+row); //$NON-NLS-1$
}
this.results = buffer;
bufferManager.addTupleBuffer(this.results);
Modified: branches/7.1.1.CP3/engine/src/main/java/org/teiid/dqp/internal/process/DQPCore.java
===================================================================
--- branches/7.1.1.CP3/engine/src/main/java/org/teiid/dqp/internal/process/DQPCore.java 2011-07-23 11:41:47 UTC (rev 3331)
+++ branches/7.1.1.CP3/engine/src/main/java/org/teiid/dqp/internal/process/DQPCore.java 2011-07-25 15:46:41 UTC (rev 3332)
@@ -22,6 +22,10 @@
package org.teiid.dqp.internal.process;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -46,6 +50,7 @@
import org.teiid.adminapi.impl.WorkerPoolStatisticsMetadata;
import org.teiid.cache.CacheConfiguration;
import org.teiid.cache.CacheFactory;
+import org.teiid.cache.CacheListener;
import org.teiid.cache.CacheConfiguration.Policy;
import org.teiid.client.DQP;
import org.teiid.client.RequestMessage;
@@ -212,6 +217,7 @@
private CacheFactory cacheFactory;
private SessionAwareCache<CachedResults> matTables;
+ private CacheListener<TempTableDataManager.MatTableKey, TempTableDataManager.MatTableEntry> matTableListener;
/**
* perform a full shutdown and wait for 10 seconds for all threads to finish
@@ -711,11 +717,11 @@
}
if (cacheFactory.isReplicated()) {
- matTables = new SessionAwareCache<CachedResults>(this.cacheFactory, SessionAwareCache.Type.RESULTSET, new CacheConfiguration(Policy.EXPIRATION, -1, -1, "MaterilizationTables")); //$NON-NLS-1$
+ matTables = new SessionAwareCache<CachedResults>(this.cacheFactory, SessionAwareCache.Type.RESULTSET, new CacheConfiguration(Policy.EXPIRATION, -1, -1, "MaterializationTables")); //$NON-NLS-1$
matTables.setBufferManager(this.bufferManager);
}
- dataTierMgr = new TempTableDataManager(new DataTierManagerImpl(this,this.bufferService), this.bufferManager, this.processWorkerPool, this.rsCache, this.matTables, this.cacheFactory);
+ dataTierMgr = new TempTableDataManager(new DataTierManagerImpl(this,this.bufferService), this.bufferManager, this.processWorkerPool, this.rsCache, this.matTables, this.cacheFactory, this.matTableListener);
}
public void setBufferService(BufferService service) {
@@ -726,6 +732,29 @@
this.transactionService = service;
}
+ public void setMatTableListener(final CacheListener<TempTableDataManager.MatTableKey, TempTableDataManager.MatTableEntry> listener) {
+ this.matTableListener = (CacheListener<TempTableDataManager.MatTableKey, TempTableDataManager.MatTableEntry>)Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[] {CacheListener.class}, new InvocationHandler() {
+ @Override
+ public Object invoke(Object proxy, final Method method, final Object[] args) throws Throwable {
+ addWork(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ method.invoke(listener, args);
+ } catch (IllegalArgumentException e) {
+ LogManager.logDetail(LogConstants.CTX_DQP, e);
+ } catch (IllegalAccessException e) {
+ LogManager.logDetail(LogConstants.CTX_DQP, e);
+ } catch (InvocationTargetException e) {
+ LogManager.logDetail(LogConstants.CTX_DQP, e);
+ }
+ }
+ });
+ return null;
+ }
+ });
+ }
+
@Override
public boolean cancelRequest(long requestID)
throws TeiidProcessingException, TeiidComponentException {
Modified: branches/7.1.1.CP3/engine/src/main/java/org/teiid/dqp/internal/process/SessionAwareCache.java
===================================================================
--- branches/7.1.1.CP3/engine/src/main/java/org/teiid/dqp/internal/process/SessionAwareCache.java 2011-07-23 11:41:47 UTC (rev 3331)
+++ branches/7.1.1.CP3/engine/src/main/java/org/teiid/dqp/internal/process/SessionAwareCache.java 2011-07-25 15:46:41 UTC (rev 3332)
@@ -32,6 +32,7 @@
import org.teiid.cache.Cache;
import org.teiid.cache.CacheConfiguration;
import org.teiid.cache.CacheFactory;
+import org.teiid.cache.CacheListener;
import org.teiid.cache.DefaultCache;
import org.teiid.cache.DefaultCacheFactory;
import org.teiid.cache.CacheConfiguration.Policy;
@@ -307,4 +308,14 @@
public void setBufferManager(BufferManager bufferManager) {
this.bufferManager = bufferManager;
}
+
+ public void setListener(CacheListener<CacheID, T> listener) {
+ this.localCache.setListener(listener);
+ this.distributedCache.setListener(listener);
+ }
+
+ public void removeListener() {
+ this.localCache.removeListener();
+ this.distributedCache.removeListener();
+ }
}
Modified: branches/7.1.1.CP3/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java
===================================================================
--- branches/7.1.1.CP3/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java 2011-07-23 11:41:47 UTC (rev 3331)
+++ branches/7.1.1.CP3/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java 2011-07-25 15:46:41 UTC (rev 3332)
@@ -40,6 +40,7 @@
import org.teiid.cache.Cache;
import org.teiid.cache.CacheConfiguration;
import org.teiid.cache.CacheFactory;
+import org.teiid.cache.CacheListener;
import org.teiid.cache.CacheConfiguration.Policy;
import org.teiid.common.buffer.BlockedException;
import org.teiid.common.buffer.BufferManager;
@@ -113,7 +114,7 @@
private SessionAwareCache<CachedResults> cache;
private Executor executor;
- private static class MatTableKey implements Serializable {
+ public static class MatTableKey implements Serializable {
private static final long serialVersionUID = 5481692896572663992L;
String name;
VDBKey vdb;
@@ -134,19 +135,37 @@
MatTableKey other = (MatTableKey)obj;
return this.name.equals(other.name) && this.vdb.equals(other.vdb);
}
+
+ public String getVDBName() {
+ return vdb.getName();
+ }
+
+ public int getVDBVersion() {
+ return vdb.getVersion();
+ }
}
- private static class MatTableEntry implements Serializable {
+ public static class MatTableEntry implements Serializable {
private static final long serialVersionUID = 8559613701442751579L;
long lastUpdate = System.currentTimeMillis();
boolean valid;
+ String viewName;
+
+ public String getViewName() {
+ return viewName;
+ }
+
+ public boolean allowsUpdate() {
+ return valid && viewName != null;
+ }
}
private Cache<MatTableKey, MatTableEntry> tables;
+ private Cache<MatTableKey, MatTableEntry> refreshJob;
private SessionAwareCache<CachedResults> distributedCache;
public TempTableDataManager(ProcessorDataManager processorDataManager, BufferManager bufferManager,
- Executor executor, SessionAwareCache<CachedResults> cache, SessionAwareCache<CachedResults> distibutedCache, CacheFactory cacheFactory){
+ Executor executor, SessionAwareCache<CachedResults> cache, SessionAwareCache<CachedResults> distibutedCache, CacheFactory cacheFactory, CacheListener<MatTableKey, MatTableEntry> listener){
this.processorDataManager = processorDataManager;
this.bufferManager = bufferManager;
this.executor = executor;
@@ -155,6 +174,10 @@
if (distibutedCache != null) {
CacheConfiguration cc = new CacheConfiguration(Policy.LRU, -1, -1, "MaterializationUpdates"); //$NON-NLS-1$
tables = cacheFactory.get(cc.getLocation(), cc);
+
+ cc = new CacheConfiguration(Policy.LRU, -1, -1, "MaterializationRefresh"); //$NON-NLS-1$
+ refreshJob = cacheFactory.get(cc.getLocation(), cc);
+ refreshJob.setListener(listener);
}
}
@@ -289,7 +312,7 @@
context.setDeterminismLevel(determinismLevel);
return tb.createIndexedTupleSource();
}
-
+
private TupleSource handleSystemProcedures(CommandContext context, StoredProcedure proc)
throws TeiidComponentException, QueryMetadataException,
QueryProcessingException, QueryResolverException,
@@ -303,9 +326,23 @@
String matTableName = RelationalPlanner.MAT_PREFIX+matViewName.toUpperCase();
LogManager.logDetail(LogConstants.CTX_MATVIEWS, "processing refreshmatview for", matViewName); //$NON-NLS-1$
MatTableInfo info = globalStore.getMatTableInfo(matTableName);
+
+ Long loadTime = null;
+ boolean useCache = false;
+ if (this.distributedCache != null) {
+ MatTableKey key = new MatTableKey();
+ key.name = matTableName;
+ key.vdb = new VDBKey(context.getVdbName(), context.getVdbVersion());
+ MatTableEntry entry = this.tables.get(key);
+ useCache = (entry != null && entry.valid && entry.lastUpdate > info.getUpdateTime());
+ if (useCache) {
+ loadTime = entry.lastUpdate;
+ }
+ }
+
boolean invalidate = Boolean.TRUE.equals(((Constant)proc.getParameter(2).getExpression()).getValue());
if (invalidate) {
- touchTable(context, matTableName, false);
+ touchTable(context, matTableName, matViewName, false, System.currentTimeMillis());
}
MatState oldState = info.setState(MatState.NEEDS_LOADING, invalidate?Boolean.FALSE:null, null);
if (oldState == MatState.LOADING) {
@@ -316,7 +353,7 @@
Object matTableId = RelationalPlanner.getGlobalTempTableMetadataId(group, matTableName, context, metadata, AnalysisRecord.createNonRecordingRecord());
GroupSymbol matTable = new GroupSymbol(matTableName);
matTable.setMetadataID(matTableId);
- int rowCount = loadGlobalTable(context, matTable, matTableName, globalStore, info, null, false);
+ int rowCount = loadGlobalTable(context, matTable, matTableName, matViewName, globalStore, info, invalidate?null:loadTime, !invalidate && useCache);
return CollectionTupleSource.createUpdateCountTupleSource(rowCount);
} else if (StringUtil.endsWithIgnoreCase(proc.getProcedureCallableName(), REFRESHMATVIEWROW)) {
Object groupID = validateMatView(metadata, proc);
@@ -408,9 +445,9 @@
if (load) {
if (!info.isValid()) {
//blocking load
- loadGlobalTable(context, group, tableName, globalStore, info, loadTime, true);
+ loadGlobalTable(context, group, tableName, null, globalStore, info, loadTime, true);
} else {
- loadAsynch(context, group, tableName, globalStore, info, loadTime);
+ loadAsynch(context, group, tableName, null, globalStore, info, loadTime);
}
}
table = globalStore.getOrCreateTempTable(tableName, query, bufferManager, false);
@@ -435,13 +472,13 @@
}
private void loadAsynch(final CommandContext context,
- final GroupSymbol group, final String tableName,
+ final GroupSymbol group, final String tableName,final String viewName,
final TempTableStore globalStore, final MatTableInfo info,
final Long loadTime) {
Callable<Integer> toCall = new Callable<Integer>() {
@Override
public Integer call() throws Exception {
- return loadGlobalTable(context, group, tableName, globalStore, info, loadTime, true);
+ return loadGlobalTable(context, group, tableName, viewName, globalStore, info, loadTime, true);
}
};
FutureTask<Integer> task = new FutureTask<Integer>(toCall);
@@ -449,9 +486,9 @@
}
private int loadGlobalTable(CommandContext context,
- GroupSymbol group, final String tableName,
+ GroupSymbol group, final String tableName, final String viewName,
TempTableStore globalStore, MatTableInfo info, Long loadTime, boolean useCache)
- throws TeiidComponentException, TeiidProcessingException {
+ throws TeiidComponentException, TeiidProcessingException {
LogManager.logInfo(LogConstants.CTX_MATVIEWS, QueryPlugin.Util.getString("TempTableDataManager.loading", tableName)); //$NON-NLS-1$
QueryMetadataInterface metadata = context.getMetadata();
Create create = new Create();
@@ -477,9 +514,11 @@
}
}
int rowCount = -1;
+ boolean tableUpdated = false;
+ String fullName = null;
try {
- String fullName = metadata.getFullName(group.getMetadataID());
- TupleSource ts = null;
+ fullName = metadata.getFullName(group.getMetadataID());
+ TupleSource ts = null;
CacheID cid = null;
if (distributedCache != null) {
cid = new CacheID(new ParseInfo(), fullName, context.getVdbName(),
@@ -487,6 +526,7 @@
if (useCache) {
CachedResults cr = this.distributedCache.get(cid);
if (cr != null) {
+ LogManager.logInfo(LogConstants.CTX_MATVIEWS, QueryPlugin.Util.getString("TempTableDataManager.cache_load", tableName)); //$NON-NLS-1$
ts = cr.getResults().createIndexedTupleSource();
}
}
@@ -501,14 +541,15 @@
String transformation = metadata.getVirtualPlan(group.getMetadataID()).getQuery();
QueryProcessor qp = context.getQueryProcessorFactory().createQueryProcessor(transformation, fullName, context);
qp.setNonBlocking(true);
-
+
if (distributedCache != null) {
CachedResults cr = new CachedResults();
BatchCollector bc = qp.createBatchCollector();
TupleBuffer tb = bc.collectTuples();
cr.setResults(tb);
- touchTable(context, fullName, true);
- this.distributedCache.put(cid, FunctionMethod.VDB_DETERMINISTIC, cr, info.getTtl());
+ touchTable(context, fullName, viewName, true, info.getUpdateTime());
+ this.distributedCache.put(cid, FunctionMethod.VDB_DETERMINISTIC, cr, info.getTtl());
+ tableUpdated = true;
ts = tb.createIndexedTupleSource();
} else {
ts = new BatchCollector.BatchProducerTupleSource(qp);
@@ -541,19 +582,40 @@
globalStore.swapTempTable(tableName, table);
info.setState(MatState.LOADED, true, loadTime);
LogManager.logInfo(LogConstants.CTX_MATVIEWS, QueryPlugin.Util.getString("TempTableDataManager.loaded", tableName, rowCount)); //$NON-NLS-1$
+ if (tableUpdated) {
+ initiateRefreshAcrossCluster(context, fullName, viewName);
+ }
}
}
return rowCount;
}
- private void touchTable(CommandContext context, String fullName, boolean valid) {
+ private void touchTable(CommandContext context, String fullName, String viewName, boolean valid, long loadtime) {
MatTableKey key = new MatTableKey();
key.name = fullName;
key.vdb = new VDBKey(context.getVdbName(), context.getVdbVersion());
MatTableEntry matTableEntry = new MatTableEntry();
matTableEntry.valid = valid;
+ matTableEntry.viewName = viewName;
+ matTableEntry.lastUpdate = loadtime;
tables.put(key, matTableEntry, null);
}
+
+ private void initiateRefreshAcrossCluster(CommandContext context, String fullName, String viewName) {
+ MatTableKey key = new MatTableKey();
+ key.name = fullName;
+ key.vdb = new VDBKey(context.getVdbName(), context.getVdbVersion());
+ MatTableEntry matTableEntry = new MatTableEntry();
+ matTableEntry.valid = true;
+ matTableEntry.viewName = viewName;
+ matTableEntry.lastUpdate = System.currentTimeMillis();
+ MatTableEntry entry = refreshJob.put(key, matTableEntry, null);
+ if (entry == null) {
+ // in the case of refreshjob, cacheCreate are not being notified correctly due to nature of how Teiid uses the cache
+ // so, in order to get a cacheModified event insert again.
+ refreshJob.put(key, matTableEntry, null);
+ }
+ }
/**
* Return a list of ElementSymbols for the given index/key object
Modified: branches/7.1.1.CP3/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- branches/7.1.1.CP3/engine/src/main/resources/org/teiid/query/i18n.properties 2011-07-23 11:41:47 UTC (rev 3331)
+++ branches/7.1.1.CP3/engine/src/main/resources/org/teiid/query/i18n.properties 2011-07-25 15:46:41 UTC (rev 3332)
@@ -783,6 +783,7 @@
TempTableDataManager.failed_load=Failed to load materialized view table {0}.
TempTableDataManager.loaded=Loaded materialized view table {0} with row count {1}.
+TempTableDataManager.cache_load=Loaded materialized view table {0} from cached contents from another clustered node.
TempTableDataManager.loading=Loading materialized view table {0}
TempTableDataManager.not_implicit_matview={0} does not target an internal materialized view.
TempTableDataManager.row_refresh_pk=Materialized view {0} cannot have a row refreshed since there is no primary key.
Modified: branches/7.1.1.CP3/engine/src/test/java/org/teiid/query/processor/TestMaterialization.java
===================================================================
--- branches/7.1.1.CP3/engine/src/test/java/org/teiid/query/processor/TestMaterialization.java 2011-07-23 11:41:47 UTC (rev 3331)
+++ branches/7.1.1.CP3/engine/src/test/java/org/teiid/query/processor/TestMaterialization.java 2011-07-25 15:46:41 UTC (rev 3332)
@@ -74,7 +74,7 @@
command.run();
}
};
- dataManager = new TempTableDataManager(hdm, bm, executor, cache, cache, new DefaultCacheFactory());
+ dataManager = new TempTableDataManager(hdm, bm, executor, cache, cache, new DefaultCacheFactory(), null);
}
private void execute(String sql, List<?>... expectedResults) throws Exception {
Modified: branches/7.1.1.CP3/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
===================================================================
--- branches/7.1.1.CP3/engine/src/test/java/org/teiid/query/processor/TestProcessor.java 2011-07-23 11:41:47 UTC (rev 3331)
+++ branches/7.1.1.CP3/engine/src/test/java/org/teiid/query/processor/TestProcessor.java 2011-07-25 15:46:41 UTC (rev 3332)
@@ -245,7 +245,7 @@
command.run();
}
};
- dataManager = new TempTableDataManager(dataManager, bufferMgr, executor, cache, null, null);
+ dataManager = new TempTableDataManager(dataManager, bufferMgr, executor, cache, null, null, null);
}
if (context.getQueryProcessorFactory() == null) {
context.setQueryProcessorFactory(new QueryProcessorFactoryImpl(bufferMgr, dataManager, new DefaultCapabilitiesFinder(), null, context.getMetadata()));
Modified: branches/7.1.1.CP3/engine/src/test/java/org/teiid/query/processor/TestTempTables.java
===================================================================
--- branches/7.1.1.CP3/engine/src/test/java/org/teiid/query/processor/TestTempTables.java 2011-07-23 11:41:47 UTC (rev 3331)
+++ branches/7.1.1.CP3/engine/src/test/java/org/teiid/query/processor/TestTempTables.java 2011-07-25 15:46:41 UTC (rev 3332)
@@ -76,7 +76,7 @@
command.run();
}
};
- dataManager = new TempTableDataManager(fdm, bm, executor, cache, null, null);
+ dataManager = new TempTableDataManager(fdm, bm, executor, cache, null, null, null);
}
@Test public void testInsertWithQueryExpression() throws Exception {
Modified: branches/7.1.1.CP3/jboss-integration/src/main/java/org/teiid/jboss/deployers/RuntimeEngineDeployer.java
===================================================================
--- branches/7.1.1.CP3/jboss-integration/src/main/java/org/teiid/jboss/deployers/RuntimeEngineDeployer.java 2011-07-23 11:41:47 UTC (rev 3331)
+++ branches/7.1.1.CP3/jboss-integration/src/main/java/org/teiid/jboss/deployers/RuntimeEngineDeployer.java 2011-07-25 15:46:41 UTC (rev 3332)
@@ -70,6 +70,7 @@
import org.teiid.adminapi.impl.WorkerPoolStatisticsMetadata;
import org.teiid.adminapi.jboss.AdminProvider;
import org.teiid.cache.CacheFactory;
+import org.teiid.cache.CacheListener;
import org.teiid.client.DQP;
import org.teiid.client.RequestMessage;
import org.teiid.client.ResultsMessage;
@@ -97,6 +98,9 @@
import org.teiid.logging.LogManager;
import org.teiid.logging.MessageLevel;
import org.teiid.net.TeiidURL;
+import org.teiid.query.tempdata.TempTableDataManager;
+import org.teiid.query.tempdata.TempTableDataManager.MatTableEntry;
+import org.teiid.query.tempdata.TempTableDataManager.MatTableKey;
import org.teiid.security.SecurityHelper;
import org.teiid.transport.ClientServiceRegistry;
import org.teiid.transport.ClientServiceRegistryImpl;
@@ -147,7 +151,8 @@
public void start() {
dqpCore.setTransactionService((TransactionService)LogManager.createLoggingProxy(LogConstants.CTX_TXN_LOG, transactionServerImpl, new Class[] {TransactionService.class}, MessageLevel.DETAIL));
-
+ dqpCore.setMatTableListener(getMatTableListener());
+
// create the necessary services
createClientServices();
@@ -497,7 +502,7 @@
@Override
@ManagementOperation(description="Execute a sql query", params={@ManagementParameter(name="vdbName"),@ManagementParameter(name="vdbVersion"), @ManagementParameter(name="command"), @ManagementParameter(name="timoutInMilli")})
- public List<List> executeQuery(final String vdbName, final int version, final String command, final long timoutInMilli) throws AdminException {
+ public List<List> executeQuery(final String vdbName, final int version, final String command, final long timoutInMilli) throws AdminException {
Properties properties = new Properties();
properties.setProperty(TeiidURL.JDBC.VDB_NAME, vdbName);
properties.setProperty(TeiidURL.JDBC.VDB_VERSION, String.valueOf(version));
@@ -530,7 +535,14 @@
request.setExecutionId(0L);
request.setRowLimit(getMaxRowsFetchSize()); // this would limit the number of rows that are returned.
Future<ResultsMessage> message = dqpCore.executeRequest(requestID, request);
- ResultsMessage rm = message.get(timoutInMilli, TimeUnit.MILLISECONDS);
+
+ ResultsMessage rm = null;
+ if (timoutInMilli < 0) {
+ rm = message.get();
+ }
+ else {
+ rm = message.get(timoutInMilli, TimeUnit.MILLISECONDS);
+ }
if (rm.getException() != null) {
throw new AdminProcessingException(rm.getException());
@@ -607,4 +619,39 @@
}
return newResults;
}
+
+ private CacheListener<TempTableDataManager.MatTableKey, TempTableDataManager.MatTableEntry> getMatTableListener() {
+ return new CacheListener<TempTableDataManager.MatTableKey, TempTableDataManager.MatTableEntry>() {
+
+ @Override
+ public void cacheChanged() {
+ }
+
+ @Override
+ public void cacheCreated(MatTableKey key, MatTableEntry value) {
+ refreshMatView(key, value);
+ }
+
+ @Override
+ public void cacheModified(MatTableKey key, MatTableEntry value) {
+ refreshMatView(key, value);
+ }
+
+ private void refreshMatView(MatTableKey key, MatTableEntry value) {
+ if (value != null) {
+ try {
+ if (value.allowsUpdate()) {
+ executeQuery(key.getVDBName(), key.getVDBVersion(), "execute SYSADMIN.refreshmatview(viewname=>'"+value.getViewName()+"',invalidate=>false)", -1); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ } catch (AdminException e) {
+ LogManager.logWarning(LogConstants.CTX_RUNTIME, e, IntegrationPlugin.Util.getString("error_refresh", value.getViewName() )); //$NON-NLS-1$
+ }
+ }
+ }
+ @Override
+ public void cacheRemoved(MatTableKey key, MatTableEntry value) {
+
+ }
+ };
+ }
}
Modified: branches/7.1.1.CP3/jboss-integration/src/main/resources/org/teiid/jboss/i18n.properties
===================================================================
--- branches/7.1.1.CP3/jboss-integration/src/main/resources/org/teiid/jboss/i18n.properties 2011-07-23 11:41:47 UTC (rev 3331)
+++ branches/7.1.1.CP3/jboss-integration/src/main/resources/org/teiid/jboss/i18n.properties 2011-07-25 15:46:41 UTC (rev 3332)
@@ -46,3 +46,4 @@
distribute_failed=Deploy of the archive failed {0}
template_not_found=Template not found for {0}
admin_executing=JOPR admin {0} is executing command {1}
+error_refresh=error occurred during refreshing the materialized view entries for view {0}
\ No newline at end of file
14 years, 5 months
teiid SVN: r3331 - in trunk: api/src/main/java/org/teiid/language/visitor and 10 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-07-23 07:41:47 -0400 (Sat, 23 Jul 2011)
New Revision: 3331
Added:
trunk/api/src/main/java/org/teiid/language/WindowSpecification.java
trunk/engine/src/main/java/org/teiid/query/sql/symbol/WindowSpecification.java
Removed:
trunk/engine/src/test/java/org/teiid/query/optimizer/TestWindowFunctions.java
Modified:
trunk/api/src/main/java/org/teiid/language/WindowFunction.java
trunk/api/src/main/java/org/teiid/language/visitor/HierarchyVisitor.java
trunk/api/src/main/java/org/teiid/language/visitor/LanguageObjectVisitor.java
trunk/api/src/main/java/org/teiid/language/visitor/SQLStringVisitor.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java
trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java
trunk/engine/src/main/java/org/teiid/query/sql/lang/OrderByItem.java
trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java
trunk/engine/src/main/java/org/teiid/query/sql/symbol/WindowFunction.java
trunk/engine/src/main/java/org/teiid/query/sql/visitor/ExpressionMappingVisitor.java
trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
Log:
TEIID-1667 correcting unit tests and separating out a windowspecification class
Modified: trunk/api/src/main/java/org/teiid/language/WindowFunction.java
===================================================================
--- trunk/api/src/main/java/org/teiid/language/WindowFunction.java 2011-07-22 21:13:20 UTC (rev 3330)
+++ trunk/api/src/main/java/org/teiid/language/WindowFunction.java 2011-07-23 11:41:47 UTC (rev 3331)
@@ -22,8 +22,6 @@
package org.teiid.language;
-import java.util.List;
-
import org.teiid.core.util.EquivalenceUtil;
import org.teiid.core.util.HashCodeUtil;
import org.teiid.language.visitor.LanguageObjectVisitor;
@@ -31,8 +29,7 @@
public class WindowFunction extends BaseLanguageObject implements Expression {
private AggregateFunction function;
- private List<Expression> partition;
- private OrderBy orderBy;
+ private WindowSpecification windowSpecification;
public WindowFunction() {
@@ -46,21 +43,13 @@
this.function = expression;
}
- public List<Expression> getPartition() {
- return partition;
+ public WindowSpecification getWindowSpecification() {
+ return windowSpecification;
}
- public void setPartition(List<Expression> grouping) {
- this.partition = grouping;
+ public void setWindowSpecification(WindowSpecification windowSpecification) {
+ this.windowSpecification = windowSpecification;
}
-
- public OrderBy getOrderBy() {
- return orderBy;
- }
-
- public void setOrderBy(OrderBy orderBy) {
- this.orderBy = orderBy;
- }
@Override
public Class<?> getType() {
@@ -74,7 +63,7 @@
@Override
public int hashCode() {
- return HashCodeUtil.hashCode(function.hashCode(), partition, orderBy);
+ return HashCodeUtil.hashCode(function.hashCode(), windowSpecification);
}
public boolean equals(Object obj) {
@@ -86,8 +75,7 @@
}
WindowFunction other = (WindowFunction)obj;
return EquivalenceUtil.areEqual(this.function, other.function) &&
- EquivalenceUtil.areEqual(this.partition, other.partition) &&
- EquivalenceUtil.areEqual(this.orderBy, other.orderBy);
+ EquivalenceUtil.areEqual(this.windowSpecification, other.windowSpecification);
}
}
Added: trunk/api/src/main/java/org/teiid/language/WindowSpecification.java
===================================================================
--- trunk/api/src/main/java/org/teiid/language/WindowSpecification.java (rev 0)
+++ trunk/api/src/main/java/org/teiid/language/WindowSpecification.java 2011-07-23 11:41:47 UTC (rev 3331)
@@ -0,0 +1,78 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+ package org.teiid.language;
+
+import java.util.List;
+
+import org.teiid.core.util.EquivalenceUtil;
+import org.teiid.core.util.HashCodeUtil;
+import org.teiid.language.visitor.LanguageObjectVisitor;
+
+public class WindowSpecification extends BaseLanguageObject {
+
+ private List<Expression> partition;
+ private OrderBy orderBy;
+
+ public WindowSpecification() {
+
+ }
+
+ public List<Expression> getPartition() {
+ return partition;
+ }
+
+ public void setPartition(List<Expression> grouping) {
+ this.partition = grouping;
+ }
+
+ public OrderBy getOrderBy() {
+ return orderBy;
+ }
+
+ public void setOrderBy(OrderBy orderBy) {
+ this.orderBy = orderBy;
+ }
+
+ @Override
+ public void acceptVisitor(LanguageObjectVisitor visitor) {
+ visitor.visit(this);
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeUtil.hashCode(partition.hashCode(), orderBy);
+ }
+
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof WindowSpecification)) {
+ return false;
+ }
+ WindowSpecification other = (WindowSpecification)obj;
+ return EquivalenceUtil.areEqual(this.partition, other.partition) &&
+ EquivalenceUtil.areEqual(this.orderBy, other.orderBy);
+ }
+
+}
Property changes on: trunk/api/src/main/java/org/teiid/language/WindowSpecification.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/api/src/main/java/org/teiid/language/visitor/HierarchyVisitor.java
===================================================================
--- trunk/api/src/main/java/org/teiid/language/visitor/HierarchyVisitor.java 2011-07-22 21:13:20 UTC (rev 3330)
+++ trunk/api/src/main/java/org/teiid/language/visitor/HierarchyVisitor.java 2011-07-23 11:41:47 UTC (rev 3331)
@@ -52,6 +52,7 @@
import org.teiid.language.SubqueryIn;
import org.teiid.language.Update;
import org.teiid.language.WindowFunction;
+import org.teiid.language.WindowSpecification;
import org.teiid.language.With;
import org.teiid.language.WithItem;
@@ -253,8 +254,13 @@
@Override
public void visit(WindowFunction windowFunction) {
visitNode(windowFunction.getFunction());
- visitNodes(windowFunction.getPartition());
- visitNode(windowFunction.getOrderBy());
+ visitNode(windowFunction.getWindowSpecification());
}
+ @Override
+ public void visit(WindowSpecification windowSpecification) {
+ visitNodes(windowSpecification.getPartition());
+ visitNode(windowSpecification.getOrderBy());
+ }
+
}
Modified: trunk/api/src/main/java/org/teiid/language/visitor/LanguageObjectVisitor.java
===================================================================
--- trunk/api/src/main/java/org/teiid/language/visitor/LanguageObjectVisitor.java 2011-07-22 21:13:20 UTC (rev 3330)
+++ trunk/api/src/main/java/org/teiid/language/visitor/LanguageObjectVisitor.java 2011-07-23 11:41:47 UTC (rev 3331)
@@ -58,6 +58,7 @@
import org.teiid.language.SubqueryIn;
import org.teiid.language.Update;
import org.teiid.language.WindowFunction;
+import org.teiid.language.WindowSpecification;
import org.teiid.language.With;
import org.teiid.language.WithItem;
@@ -102,4 +103,5 @@
public void visit(With obj);
public void visit(WithItem obj);
public void visit(WindowFunction windowFunction);
+ public void visit(WindowSpecification windowSpecification);
}
Modified: trunk/api/src/main/java/org/teiid/language/visitor/SQLStringVisitor.java
===================================================================
--- trunk/api/src/main/java/org/teiid/language/visitor/SQLStringVisitor.java 2011-07-22 21:13:20 UTC (rev 3330)
+++ trunk/api/src/main/java/org/teiid/language/visitor/SQLStringVisitor.java 2011-07-23 11:41:47 UTC (rev 3331)
@@ -73,6 +73,7 @@
import org.teiid.language.TableReference;
import org.teiid.language.Update;
import org.teiid.language.WindowFunction;
+import org.teiid.language.WindowSpecification;
import org.teiid.language.With;
import org.teiid.language.WithItem;
import org.teiid.language.Argument.Direction;
@@ -924,23 +925,28 @@
buffer.append(Tokens.SPACE);
buffer.append(OVER);
buffer.append(Tokens.SPACE);
+ append(windowFunction.getWindowSpecification());
+ }
+
+ @Override
+ public void visit(WindowSpecification windowSpecification) {
buffer.append(Tokens.LPAREN);
boolean needsSpace = false;
- if (windowFunction.getPartition() != null) {
+ if (windowSpecification.getPartition() != null) {
buffer.append(PARTITION);
buffer.append(Tokens.SPACE);
buffer.append(BY);
buffer.append(Tokens.SPACE);
- append(windowFunction.getPartition());
+ append(windowSpecification.getPartition());
needsSpace = true;
}
- if (windowFunction.getOrderBy() != null) {
+ if (windowSpecification.getOrderBy() != null) {
if (needsSpace) {
buffer.append(Tokens.SPACE);
}
- append(windowFunction.getOrderBy());
+ append(windowSpecification.getOrderBy());
}
- buffer.append(Tokens.RPAREN);
+ buffer.append(Tokens.RPAREN);
}
/**
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java 2011-07-22 21:13:20 UTC (rev 3330)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java 2011-07-23 11:41:47 UTC (rev 3331)
@@ -63,6 +63,7 @@
import org.teiid.language.SubqueryComparison;
import org.teiid.language.SubqueryIn;
import org.teiid.language.TableReference;
+import org.teiid.language.WindowSpecification;
import org.teiid.language.With;
import org.teiid.language.WithItem;
import org.teiid.language.Argument.Direction;
@@ -461,7 +462,7 @@
Ordering direction = items.get(i).isAscending() ? Ordering.ASC: Ordering.DESC;
SortSpecification orderByItem = null;
- if(items.get(i).isUnrelated() || (!set && symbol instanceof ElementSymbol)){
+ if(!set && (items.get(i).isUnrelated() || symbol instanceof ElementSymbol)){
orderByItem = new SortSpecification(direction, translate(symbol));
} else {
orderByItem = new SortSpecification(direction, new ColumnReference(null, SingleElementSymbol.getShortName(symbol.getOutputName()), null, symbol.getType()));
@@ -497,14 +498,17 @@
org.teiid.language.WindowFunction translate(WindowFunction windowFunction) {
org.teiid.language.WindowFunction result = new org.teiid.language.WindowFunction();
result.setFunction(translate(windowFunction.getFunction()));
- result.setOrderBy(translate(windowFunction.getOrderBy(), false));
- if (windowFunction.getPartition() != null) {
- ArrayList<org.teiid.language.Expression> partition = new ArrayList<org.teiid.language.Expression>(windowFunction.getPartition().size());
- for (Expression ex : windowFunction.getPartition()) {
- partition.add(translate(ex));
+ WindowSpecification ws = new WindowSpecification();
+ ws.setOrderBy(translate(windowFunction.getWindowSpecification().getOrderBy(), false));
+ List<Expression> partition = windowFunction.getWindowSpecification().getPartition();
+ if (partition != null) {
+ ArrayList<org.teiid.language.Expression> partitionList = new ArrayList<org.teiid.language.Expression>(partition.size());
+ for (Expression ex : partition) {
+ partitionList.add(translate(ex));
}
- result.setPartition(partition);
+ ws.setPartition(partitionList);
}
+ result.setWindowSpecification(ws);
return result;
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java 2011-07-22 21:13:20 UTC (rev 3330)
+++ trunk/engine/src/main/java/org/teiid/query/sql/LanguageVisitor.java 2011-07-23 11:41:47 UTC (rev 3331)
@@ -97,6 +97,7 @@
import org.teiid.query.sql.symbol.SearchedCaseExpression;
import org.teiid.query.sql.symbol.TextLine;
import org.teiid.query.sql.symbol.WindowFunction;
+import org.teiid.query.sql.symbol.WindowSpecification;
import org.teiid.query.sql.symbol.XMLAttributes;
import org.teiid.query.sql.symbol.XMLElement;
import org.teiid.query.sql.symbol.XMLForest;
@@ -224,4 +225,5 @@
public void visit(AlterTrigger obj) {}
public void visit(WindowFunction windowFunction) {}
+ public void visit(WindowSpecification windowSpecification) {}
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/OrderByItem.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/OrderByItem.java 2011-07-22 21:13:20 UTC (rev 3330)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/OrderByItem.java 2011-07-23 11:41:47 UTC (rev 3331)
@@ -79,7 +79,7 @@
* @return true if the expression does not appear in the select clause
*/
public boolean isUnrelated() {
- return expressionPosition == null || expressionPosition == -1;
+ return getExpressionPosition() == -1;
}
@Override
Modified: trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java 2011-07-22 21:13:20 UTC (rev 3330)
+++ trunk/engine/src/main/java/org/teiid/query/sql/navigator/PreOrPostOrderNavigator.java 2011-07-23 11:41:47 UTC (rev 3331)
@@ -102,6 +102,7 @@
import org.teiid.query.sql.symbol.SearchedCaseExpression;
import org.teiid.query.sql.symbol.TextLine;
import org.teiid.query.sql.symbol.WindowFunction;
+import org.teiid.query.sql.symbol.WindowSpecification;
import org.teiid.query.sql.symbol.XMLAttributes;
import org.teiid.query.sql.symbol.XMLElement;
import org.teiid.query.sql.symbol.XMLForest;
@@ -700,7 +701,14 @@
public void visit(WindowFunction obj) {
preVisitVisitor(obj);
visitNode(obj.getFunction());
- visitNodes(obj.getPartition());
+ visitNode(obj.getWindowSpecification());
+ postVisitVisitor(obj);
+ }
+
+ @Override
+ public void visit(WindowSpecification obj) {
+ preVisitVisitor(obj);
+ visitNodes(obj.getPartition());
visitNode(obj.getOrderBy());
postVisitVisitor(obj);
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/symbol/WindowFunction.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/WindowFunction.java 2011-07-22 21:13:20 UTC (rev 3330)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/WindowFunction.java 2011-07-23 11:41:47 UTC (rev 3331)
@@ -22,20 +22,15 @@
package org.teiid.query.sql.symbol;
-import java.util.List;
-
import org.teiid.core.util.EquivalenceUtil;
import org.teiid.core.util.HashCodeUtil;
-import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.LanguageVisitor;
-import org.teiid.query.sql.lang.OrderBy;
import org.teiid.query.sql.visitor.SQLStringVisitor;
public class WindowFunction implements Expression {
private AggregateSymbol function;
- private List<Expression> partition;
- private OrderBy orderBy;
+ private WindowSpecification windowSpecification;
public WindowFunction() {
@@ -50,22 +45,14 @@
this.function.setWindowed(true);
}
- public List<Expression> getPartition() {
- return partition;
+ public WindowSpecification getWindowSpecification() {
+ return windowSpecification;
}
- public void setPartition(List<Expression> grouping) {
- this.partition = grouping;
+ public void setWindowSpecification(WindowSpecification windowSpecification) {
+ this.windowSpecification = windowSpecification;
}
- public OrderBy getOrderBy() {
- return orderBy;
- }
-
- public void setOrderBy(OrderBy orderBy) {
- this.orderBy = orderBy;
- }
-
@Override
public Class<?> getType() {
return function.getType();
@@ -83,7 +70,7 @@
@Override
public int hashCode() {
- return HashCodeUtil.hashCode(function.hashCode(), partition, orderBy);
+ return HashCodeUtil.hashCode(function.hashCode(), windowSpecification);
}
@Override
@@ -96,20 +83,14 @@
}
WindowFunction other = (WindowFunction)obj;
return EquivalenceUtil.areEqual(this.function, other.function) &&
- EquivalenceUtil.areEqual(this.partition, other.partition) &&
- EquivalenceUtil.areEqual(this.orderBy, other.orderBy);
+ EquivalenceUtil.areEqual(this.windowSpecification, other.windowSpecification);
}
@Override
public WindowFunction clone() {
WindowFunction clone = new WindowFunction();
clone.setFunction((AggregateSymbol) this.function.clone());
- if (this.partition != null) {
- clone.setPartition(LanguageObject.Util.deepClone(this.partition, Expression.class));
- }
- if (this.orderBy != null) {
- clone.setOrderBy(this.orderBy.clone());
- }
+ clone.setWindowSpecification(this.windowSpecification.clone());
return clone;
}
Added: trunk/engine/src/main/java/org/teiid/query/sql/symbol/WindowSpecification.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/WindowSpecification.java (rev 0)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/WindowSpecification.java 2011-07-23 11:41:47 UTC (rev 3331)
@@ -0,0 +1,99 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+ package org.teiid.query.sql.symbol;
+
+import java.util.List;
+
+import org.teiid.core.util.EquivalenceUtil;
+import org.teiid.core.util.HashCodeUtil;
+import org.teiid.query.sql.LanguageObject;
+import org.teiid.query.sql.LanguageVisitor;
+import org.teiid.query.sql.lang.OrderBy;
+import org.teiid.query.sql.visitor.SQLStringVisitor;
+
+public class WindowSpecification implements LanguageObject {
+
+ private List<Expression> partition;
+ private OrderBy orderBy;
+
+ public WindowSpecification() {
+
+ }
+
+ public List<Expression> getPartition() {
+ return partition;
+ }
+
+ public void setPartition(List<Expression> grouping) {
+ this.partition = grouping;
+ }
+
+ public OrderBy getOrderBy() {
+ return orderBy;
+ }
+
+ public void setOrderBy(OrderBy orderBy) {
+ this.orderBy = orderBy;
+ }
+
+ @Override
+ public void acceptVisitor(LanguageVisitor visitor) {
+ visitor.visit(this);
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeUtil.hashCode(0, partition, orderBy);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof WindowSpecification)) {
+ return false;
+ }
+ WindowSpecification other = (WindowSpecification)obj;
+ return EquivalenceUtil.areEqual(this.partition, other.partition) &&
+ EquivalenceUtil.areEqual(this.orderBy, other.orderBy);
+ }
+
+ @Override
+ public WindowSpecification clone() {
+ WindowSpecification clone = new WindowSpecification();
+ if (this.partition != null) {
+ clone.setPartition(LanguageObject.Util.deepClone(this.partition, Expression.class));
+ }
+ if (this.orderBy != null) {
+ clone.setOrderBy(this.orderBy.clone());
+ }
+ return clone;
+ }
+
+ @Override
+ public String toString() {
+ return SQLStringVisitor.getSQLString(this);
+ }
+
+}
Property changes on: trunk/engine/src/main/java/org/teiid/query/sql/symbol/WindowSpecification.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/ExpressionMappingVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/ExpressionMappingVisitor.java 2011-07-22 21:13:20 UTC (rev 3330)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/ExpressionMappingVisitor.java 2011-07-23 11:41:47 UTC (rev 3331)
@@ -67,7 +67,7 @@
import org.teiid.query.sql.symbol.QueryString;
import org.teiid.query.sql.symbol.SearchedCaseExpression;
import org.teiid.query.sql.symbol.SingleElementSymbol;
-import org.teiid.query.sql.symbol.WindowFunction;
+import org.teiid.query.sql.symbol.WindowSpecification;
import org.teiid.query.sql.symbol.XMLElement;
import org.teiid.query.sql.symbol.XMLParse;
import org.teiid.query.sql.symbol.XMLSerialize;
@@ -450,11 +450,11 @@
}
@Override
- public void visit(WindowFunction windowFunction) {
- if (windowFunction.getPartition() == null) {
+ public void visit(WindowSpecification windowSpecification) {
+ if (windowSpecification.getPartition() == null) {
return;
}
- List<Expression> partition = windowFunction.getPartition();
+ List<Expression> partition = windowSpecification.getPartition();
for (int i = 0; i < partition.size(); i++) {
partition.set(i, replaceExpression(partition.get(i)));
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2011-07-22 21:13:20 UTC (rev 3330)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2011-07-23 11:41:47 UTC (rev 3331)
@@ -126,6 +126,7 @@
import org.teiid.query.sql.symbol.SingleElementSymbol;
import org.teiid.query.sql.symbol.TextLine;
import org.teiid.query.sql.symbol.WindowFunction;
+import org.teiid.query.sql.symbol.WindowSpecification;
import org.teiid.query.sql.symbol.XMLAttributes;
import org.teiid.query.sql.symbol.XMLElement;
import org.teiid.query.sql.symbol.XMLForest;
@@ -2056,23 +2057,28 @@
append(SPACE);
append(OVER);
append(SPACE);
+ append(windowFunction.getWindowSpecification());
+ }
+
+ @Override
+ public void visit(WindowSpecification windowSpecification) {
append(Tokens.LPAREN);
boolean needsSpace = false;
- if (windowFunction.getPartition() != null) {
+ if (windowSpecification.getPartition() != null) {
append(PARTITION);
append(SPACE);
append(BY);
append(SPACE);
- registerNodes(windowFunction.getPartition(), 0);
+ registerNodes(windowSpecification.getPartition(), 0);
needsSpace = true;
}
- if (windowFunction.getOrderBy() != null) {
+ if (windowSpecification.getOrderBy() != null) {
if (needsSpace) {
append(SPACE);
}
- append(windowFunction.getOrderBy());
+ append(windowSpecification.getOrderBy());
}
- append(Tokens.RPAREN);
+ append(Tokens.RPAREN);
}
public static String escapeSinglePart( String part ) {
Modified: trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java 2011-07-22 21:13:20 UTC (rev 3330)
+++ trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java 2011-07-23 11:41:47 UTC (rev 3331)
@@ -1211,7 +1211,7 @@
case RANK:
case DENSE_RANK:
case ROW_NUMBER:
- if (windowFunction.getOrderBy() == null) {
+ if (windowFunction.getWindowSpecification().getOrderBy() == null) {
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.analytical_requires_order_by", windowFunction), windowFunction); //$NON-NLS-1$
}
}
Modified: trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
===================================================================
--- trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj 2011-07-22 21:13:20 UTC (rev 3330)
+++ trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj 2011-07-23 11:41:47 UTC (rev 3331)
@@ -3456,9 +3456,11 @@
<RPAREN>
{
WindowFunction result = new WindowFunction();
+ WindowSpecification ws = new WindowSpecification();
result.setFunction((AggregateSymbol)agg);
- result.setPartition(partitionList);
- result.setOrderBy(orderBy);
+ ws.setPartition(partitionList);
+ ws.setOrderBy(orderBy);
+ result.setWindowSpecification(ws);
return result;
}
}
Deleted: trunk/engine/src/test/java/org/teiid/query/optimizer/TestWindowFunctions.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestWindowFunctions.java 2011-07-22 21:13:20 UTC (rev 3330)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestWindowFunctions.java 2011-07-23 11:41:47 UTC (rev 3331)
@@ -1,49 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership. Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.query.optimizer;
-
-import static org.teiid.query.optimizer.TestOptimizer.*;
-
-import org.junit.Test;
-import org.teiid.query.optimizer.TestOptimizer.ComparisonMode;
-import org.teiid.query.optimizer.capabilities.BasicSourceCapabilities;
-import org.teiid.query.optimizer.capabilities.DefaultCapabilitiesFinder;
-import org.teiid.query.optimizer.capabilities.SourceCapabilities.Capability;
-import org.teiid.query.processor.ProcessorPlan;
-import org.teiid.query.unittest.RealMetadataFactory;
-
-public class TestWindowFunctions {
-
- @Test public void testViewNotRemoved() throws Exception {
- BasicSourceCapabilities caps = getTypicalCapabilities();
- caps.setCapabilitySupport(Capability.ELEMENTARY_OLAP, true);
- caps.setCapabilitySupport(Capability.QUERY_FROM_INLINE_VIEWS, true);
- ProcessorPlan plan = TestOptimizer.helpPlan("SELECT y FROM (select row_number() over (order by e1) as y from pm1.g1) as x where x.y = 10", //$NON-NLS-1$
- RealMetadataFactory.example1Cached(), null, new DefaultCapabilitiesFinder(caps),
- new String[] {
- "SELECT v_0.c_0 FROM (SELECT ROW_NUMBER() OVER (ORDER BY g_0.e1) AS c_0 FROM pm1.g1 AS g_0) AS v_0 WHERE v_0.c_0 = 10"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
-
- checkNodeTypes(plan, FULL_PUSHDOWN);
- }
-
-}
Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java 2011-07-22 21:13:20 UTC (rev 3330)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java 2011-07-23 11:41:47 UTC (rev 3331)
@@ -117,6 +117,7 @@
import org.teiid.query.sql.symbol.TestSearchedCaseExpression;
import org.teiid.query.sql.symbol.TextLine;
import org.teiid.query.sql.symbol.WindowFunction;
+import org.teiid.query.sql.symbol.WindowSpecification;
import org.teiid.query.sql.symbol.XMLAttributes;
import org.teiid.query.sql.symbol.XMLElement;
import org.teiid.query.sql.symbol.XMLForest;
@@ -6850,8 +6851,10 @@
Query query = new Query();
WindowFunction wf = new WindowFunction();
wf.setFunction(new AggregateSymbol("expr", "ROW_NUMBER", false, null));
- wf.setPartition(new ArrayList<Expression>(Arrays.asList(new ElementSymbol("x"))));
- wf.setOrderBy(new OrderBy(Arrays.asList(new ElementSymbol("y"))));
+ WindowSpecification ws = new WindowSpecification();
+ ws.setPartition(new ArrayList<Expression>(Arrays.asList(new ElementSymbol("x"))));
+ ws.setOrderBy(new OrderBy(Arrays.asList(new ElementSymbol("y"))));
+ wf.setWindowSpecification(ws);
query.setSelect(new Select(Arrays.asList(new ExpressionSymbol("x", wf))));
query.setFrom(new From(Arrays.asList(new UnaryFromClause(new GroupSymbol("g")))));
helpTest(sql, "SELECT ROW_NUMBER() OVER (PARTITION BY x ORDER BY y) FROM g", query);
14 years, 5 months
teiid SVN: r3330 - in trunk: api/src/main/java/org/teiid/language/visitor and 16 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-07-22 17:13:20 -0400 (Fri, 22 Jul 2011)
New Revision: 3330
Added:
trunk/api/src/main/java/org/teiid/language/WindowFunction.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestWindowFunctions.java
Modified:
trunk/api/src/main/java/org/teiid/language/visitor/CollectorVisitor.java
trunk/api/src/main/java/org/teiid/language/visitor/HierarchyVisitor.java
trunk/api/src/main/java/org/teiid/language/visitor/LanguageObjectVisitor.java
trunk/api/src/main/java/org/teiid/language/visitor/SQLStringVisitor.java
trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/postgresql/PostgreSQLExecutionFactory.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/plantree/NodeConstants.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CapabilitiesUtil.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CriteriaCapabilityValidatorVisitor.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeVirtual.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushSelectCriteria.java
trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
trunk/engine/src/main/java/org/teiid/query/sql/lang/OrderByItem.java
trunk/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java
trunk/engine/src/main/java/org/teiid/query/sql/visitor/AggregateSymbolCollectorVisitor.java
trunk/engine/src/main/java/org/teiid/query/sql/visitor/ExpressionMappingVisitor.java
trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
trunk/engine/src/main/resources/org/teiid/query/i18n.properties
trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
trunk/test-integration/common/src/test/java/org/teiid/connector/visitor/util/TestCollectorVisitor.java
trunk/test-integration/common/src/test/java/org/teiid/connector/visitor/util/TestSQLStringVisitor.java
Log:
TEIID-1667 refining aggregate validation and adding pushdown support for window functions
Added: trunk/api/src/main/java/org/teiid/language/WindowFunction.java
===================================================================
--- trunk/api/src/main/java/org/teiid/language/WindowFunction.java (rev 0)
+++ trunk/api/src/main/java/org/teiid/language/WindowFunction.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -0,0 +1,93 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+ package org.teiid.language;
+
+import java.util.List;
+
+import org.teiid.core.util.EquivalenceUtil;
+import org.teiid.core.util.HashCodeUtil;
+import org.teiid.language.visitor.LanguageObjectVisitor;
+
+public class WindowFunction extends BaseLanguageObject implements Expression {
+
+ private AggregateFunction function;
+ private List<Expression> partition;
+ private OrderBy orderBy;
+
+ public WindowFunction() {
+
+ }
+
+ public AggregateFunction getFunction() {
+ return function;
+ }
+
+ public void setFunction(AggregateFunction expression) {
+ this.function = expression;
+ }
+
+ public List<Expression> getPartition() {
+ return partition;
+ }
+
+ public void setPartition(List<Expression> grouping) {
+ this.partition = grouping;
+ }
+
+ public OrderBy getOrderBy() {
+ return orderBy;
+ }
+
+ public void setOrderBy(OrderBy orderBy) {
+ this.orderBy = orderBy;
+ }
+
+ @Override
+ public Class<?> getType() {
+ return function.getType();
+ }
+
+ @Override
+ public void acceptVisitor(LanguageObjectVisitor visitor) {
+ visitor.visit(this);
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeUtil.hashCode(function.hashCode(), partition, orderBy);
+ }
+
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof WindowFunction)) {
+ return false;
+ }
+ WindowFunction other = (WindowFunction)obj;
+ return EquivalenceUtil.areEqual(this.function, other.function) &&
+ EquivalenceUtil.areEqual(this.partition, other.partition) &&
+ EquivalenceUtil.areEqual(this.orderBy, other.orderBy);
+ }
+
+}
Property changes on: trunk/api/src/main/java/org/teiid/language/WindowFunction.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/api/src/main/java/org/teiid/language/visitor/CollectorVisitor.java
===================================================================
--- trunk/api/src/main/java/org/teiid/language/visitor/CollectorVisitor.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/api/src/main/java/org/teiid/language/visitor/CollectorVisitor.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -27,44 +27,9 @@
import java.util.HashSet;
import java.util.Set;
-import org.teiid.language.AggregateFunction;
-import org.teiid.language.AndOr;
-import org.teiid.language.Argument;
-import org.teiid.language.BatchedUpdates;
-import org.teiid.language.Call;
import org.teiid.language.ColumnReference;
-import org.teiid.language.Comparison;
-import org.teiid.language.Delete;
-import org.teiid.language.DerivedColumn;
-import org.teiid.language.DerivedTable;
-import org.teiid.language.Exists;
-import org.teiid.language.ExpressionValueSource;
-import org.teiid.language.Function;
-import org.teiid.language.GroupBy;
-import org.teiid.language.In;
-import org.teiid.language.Insert;
-import org.teiid.language.IsNull;
-import org.teiid.language.IteratorValueSource;
-import org.teiid.language.Join;
import org.teiid.language.LanguageObject;
-import org.teiid.language.Like;
-import org.teiid.language.Limit;
-import org.teiid.language.Literal;
import org.teiid.language.NamedTable;
-import org.teiid.language.Not;
-import org.teiid.language.OrderBy;
-import org.teiid.language.ScalarSubquery;
-import org.teiid.language.SearchedCase;
-import org.teiid.language.SearchedWhenClause;
-import org.teiid.language.Select;
-import org.teiid.language.SetClause;
-import org.teiid.language.SetQuery;
-import org.teiid.language.SortSpecification;
-import org.teiid.language.SubqueryComparison;
-import org.teiid.language.SubqueryIn;
-import org.teiid.language.Update;
-import org.teiid.language.With;
-import org.teiid.language.WithItem;
/**
@@ -72,7 +37,7 @@
* tree. Each visit method does an instanceof method to check whether the object
* is of the expected type.
*/
-public class CollectorVisitor<T> implements LanguageObjectVisitor {
+public class CollectorVisitor<T> extends HierarchyVisitor {
private Class<T> type;
private Collection<T> objects = new ArrayList<T>();
@@ -80,171 +45,20 @@
public CollectorVisitor(Class<T> type) {
this.type = type;
}
-
+
@SuppressWarnings("unchecked")
- private void checkInstance(LanguageObject obj) {
+ @Override
+ public void visitNode(LanguageObject obj) {
if(type.isInstance(obj)) {
this.objects.add((T)obj);
}
+ super.visitNode(obj);
}
-
+
public Collection<T> getCollectedObjects() {
return this.objects;
}
- public void visit(AggregateFunction obj) {
- checkInstance(obj);
- }
-
- public void visit(BatchedUpdates obj) {
- checkInstance(obj);
- }
-
- public void visit(Comparison obj) {
- checkInstance(obj);
- }
-
- public void visit(AndOr obj) {
- checkInstance(obj);
- }
-
- public void visit(Delete obj) {
- checkInstance(obj);
- }
-
- public void visit(ColumnReference obj) {
- checkInstance(obj);
- }
-
- public void visit(Exists obj) {
- checkInstance(obj);
- }
-
- public void visit(Function obj) {
- checkInstance(obj);
- }
-
- public void visit(NamedTable obj) {
- checkInstance(obj);
- }
-
- public void visit(GroupBy obj) {
- checkInstance(obj);
- }
-
- public void visit(In obj) {
- checkInstance(obj);
- }
-
- public void visit(DerivedTable obj) {
- checkInstance(obj);
- }
-
- public void visit(Insert obj) {
- checkInstance(obj);
- }
-
- public void visit(ExpressionValueSource obj) {
- checkInstance(obj);
- }
-
- public void visit(IsNull obj) {
- checkInstance(obj);
- }
-
- public void visit(Join obj) {
- checkInstance(obj);
- }
-
- public void visit(Like obj) {
- checkInstance(obj);
- }
-
- public void visit(Limit obj) {
- checkInstance(obj);
- }
-
- public void visit(Literal obj) {
- checkInstance(obj);
- }
-
- public void visit(Not obj) {
- checkInstance(obj);
- }
-
- public void visit(OrderBy obj) {
- checkInstance(obj);
- }
-
- public void visit(SortSpecification obj) {
- checkInstance(obj);
- }
-
- public void visit(Argument obj) {
- checkInstance(obj);
- }
-
- public void visit(Call obj) {
- checkInstance(obj);
- }
-
- public void visit(Select obj) {
- checkInstance(obj);
- }
-
- public void visit(ScalarSubquery obj) {
- checkInstance(obj);
- }
-
- public void visit(SearchedCase obj) {
- checkInstance(obj);
- }
-
- public void visit(DerivedColumn obj) {
- checkInstance(obj);
- }
-
- public void visit(SubqueryComparison obj) {
- checkInstance(obj);
- }
-
- public void visit(SubqueryIn obj) {
- checkInstance(obj);
- }
-
- public void visit(Update obj) {
- checkInstance(obj);
- }
-
- public void visit(SetQuery obj) {
- checkInstance(obj);
- }
-
- @Override
- public void visit(SetClause obj) {
- checkInstance(obj);
- }
-
- @Override
- public void visit(SearchedWhenClause obj) {
- checkInstance(obj);
- }
-
- @Override
- public void visit(IteratorValueSource obj) {
- checkInstance(obj);
- }
-
- @Override
- public void visit(With obj) {
- checkInstance(obj);
- }
-
- @Override
- public void visit(WithItem obj) {
- checkInstance(obj);
- }
-
/**
* This is a utility method to instantiate and run the visitor in conjunction
* with a HierarchyVisitor to collect all objects of the specified type
@@ -255,8 +69,7 @@
*/
public static <T> Collection<T> collectObjects(Class<T> type, LanguageObject object) {
CollectorVisitor<T> visitor = new CollectorVisitor<T>(type);
- DelegatingHierarchyVisitor hierarchyVisitor = new DelegatingHierarchyVisitor(visitor, null);
- hierarchyVisitor.visitNode(object);
+ visitor.visitNode(object);
return visitor.getCollectedObjects();
}
Modified: trunk/api/src/main/java/org/teiid/language/visitor/HierarchyVisitor.java
===================================================================
--- trunk/api/src/main/java/org/teiid/language/visitor/HierarchyVisitor.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/api/src/main/java/org/teiid/language/visitor/HierarchyVisitor.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -51,6 +51,7 @@
import org.teiid.language.SubqueryComparison;
import org.teiid.language.SubqueryIn;
import org.teiid.language.Update;
+import org.teiid.language.WindowFunction;
import org.teiid.language.With;
import org.teiid.language.WithItem;
@@ -249,5 +250,11 @@
}
}
-
+ @Override
+ public void visit(WindowFunction windowFunction) {
+ visitNode(windowFunction.getFunction());
+ visitNodes(windowFunction.getPartition());
+ visitNode(windowFunction.getOrderBy());
+ }
+
}
Modified: trunk/api/src/main/java/org/teiid/language/visitor/LanguageObjectVisitor.java
===================================================================
--- trunk/api/src/main/java/org/teiid/language/visitor/LanguageObjectVisitor.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/api/src/main/java/org/teiid/language/visitor/LanguageObjectVisitor.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -22,7 +22,44 @@
package org.teiid.language.visitor;
-import org.teiid.language.*;
+import org.teiid.language.AggregateFunction;
+import org.teiid.language.AndOr;
+import org.teiid.language.Argument;
+import org.teiid.language.BatchedUpdates;
+import org.teiid.language.Call;
+import org.teiid.language.ColumnReference;
+import org.teiid.language.Comparison;
+import org.teiid.language.Delete;
+import org.teiid.language.DerivedColumn;
+import org.teiid.language.DerivedTable;
+import org.teiid.language.Exists;
+import org.teiid.language.ExpressionValueSource;
+import org.teiid.language.Function;
+import org.teiid.language.GroupBy;
+import org.teiid.language.In;
+import org.teiid.language.Insert;
+import org.teiid.language.IsNull;
+import org.teiid.language.IteratorValueSource;
+import org.teiid.language.Join;
+import org.teiid.language.Like;
+import org.teiid.language.Limit;
+import org.teiid.language.Literal;
+import org.teiid.language.NamedTable;
+import org.teiid.language.Not;
+import org.teiid.language.OrderBy;
+import org.teiid.language.ScalarSubquery;
+import org.teiid.language.SearchedCase;
+import org.teiid.language.SearchedWhenClause;
+import org.teiid.language.Select;
+import org.teiid.language.SetClause;
+import org.teiid.language.SetQuery;
+import org.teiid.language.SortSpecification;
+import org.teiid.language.SubqueryComparison;
+import org.teiid.language.SubqueryIn;
+import org.teiid.language.Update;
+import org.teiid.language.WindowFunction;
+import org.teiid.language.With;
+import org.teiid.language.WithItem;
/**
*/
@@ -64,4 +101,5 @@
public void visit(IteratorValueSource obj);
public void visit(With obj);
public void visit(WithItem obj);
+ public void visit(WindowFunction windowFunction);
}
Modified: trunk/api/src/main/java/org/teiid/language/visitor/SQLStringVisitor.java
===================================================================
--- trunk/api/src/main/java/org/teiid/language/visitor/SQLStringVisitor.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/api/src/main/java/org/teiid/language/visitor/SQLStringVisitor.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -72,6 +72,7 @@
import org.teiid.language.SubqueryIn;
import org.teiid.language.TableReference;
import org.teiid.language.Update;
+import org.teiid.language.WindowFunction;
import org.teiid.language.With;
import org.teiid.language.WithItem;
import org.teiid.language.Argument.Direction;
@@ -916,6 +917,31 @@
append(obj.getSubquery());
buffer.append(Tokens.RPAREN);
}
+
+ @Override
+ public void visit(WindowFunction windowFunction) {
+ append(windowFunction.getFunction());
+ buffer.append(Tokens.SPACE);
+ buffer.append(OVER);
+ buffer.append(Tokens.SPACE);
+ buffer.append(Tokens.LPAREN);
+ boolean needsSpace = false;
+ if (windowFunction.getPartition() != null) {
+ buffer.append(PARTITION);
+ buffer.append(Tokens.SPACE);
+ buffer.append(BY);
+ buffer.append(Tokens.SPACE);
+ append(windowFunction.getPartition());
+ needsSpace = true;
+ }
+ if (windowFunction.getOrderBy() != null) {
+ if (needsSpace) {
+ buffer.append(Tokens.SPACE);
+ }
+ append(windowFunction.getOrderBy());
+ }
+ buffer.append(Tokens.RPAREN);
+ }
/**
* Gets the SQL string representation for a given ILanguageObject.
Modified: trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java
===================================================================
--- trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -860,7 +860,7 @@
}
/**
- * @return true if Advanced OLAP operations are supporting
+ * @return true if Advanced OLAP operations are supported
* including the aggregate function filter clause.
* @since 7.5
*/
@@ -869,8 +869,9 @@
}
/**
- * @return true if Elementary OLAP operations are supporting
- * including window functions
+ * @return true if Elementary OLAP operations are supported
+ * including window functions and inline window specifications that include
+ * simple expressions in partitioning and ordering
* @since 7.5
*/
public boolean supportsElementaryOlapOperations() {
Modified: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/postgresql/PostgreSQLExecutionFactory.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/postgresql/PostgreSQLExecutionFactory.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/postgresql/PostgreSQLExecutionFactory.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -487,4 +487,14 @@
return getDatabaseVersion().compareTo(EIGHT_4) >= 0;
}
+ @Override
+ public boolean supportsArrayAgg() {
+ return getDatabaseVersion().compareTo(EIGHT_4) >= 0;
+ }
+
+ @Override
+ public boolean supportsElementaryOlapOperations() {
+ return getDatabaseVersion().compareTo(EIGHT_4) >= 0;
+ }
+
}
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -117,6 +117,7 @@
import org.teiid.query.sql.symbol.SearchedCaseExpression;
import org.teiid.query.sql.symbol.SelectSymbol;
import org.teiid.query.sql.symbol.SingleElementSymbol;
+import org.teiid.query.sql.symbol.WindowFunction;
import org.teiid.translator.TranslatorException;
@@ -487,9 +488,25 @@
return translate((SingleElementSymbol)expr);
} else if (expr instanceof Criteria) {
return translate((Criteria)expr);
+ } else if (expr instanceof WindowFunction) {
+ return translate((WindowFunction)expr);
}
throw new AssertionError();
}
+
+ org.teiid.language.WindowFunction translate(WindowFunction windowFunction) {
+ org.teiid.language.WindowFunction result = new org.teiid.language.WindowFunction();
+ result.setFunction(translate(windowFunction.getFunction()));
+ result.setOrderBy(translate(windowFunction.getOrderBy(), false));
+ if (windowFunction.getPartition() != null) {
+ ArrayList<org.teiid.language.Expression> partition = new ArrayList<org.teiid.language.Expression>(windowFunction.getPartition().size());
+ for (Expression ex : windowFunction.getPartition()) {
+ partition.add(translate(ex));
+ }
+ result.setPartition(partition);
+ }
+ return result;
+ }
Literal translate(Constant constant) {
Literal result = new Literal(constant.getValue(), constant.getType());
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 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -28,6 +28,7 @@
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -112,16 +113,17 @@
import org.teiid.query.sql.proc.TriggerAction;
import org.teiid.query.sql.symbol.AggregateSymbol;
import org.teiid.query.sql.symbol.AliasSymbol;
-import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.symbol.ExpressionSymbol;
import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.Reference;
import org.teiid.query.sql.symbol.ScalarSubquery;
import org.teiid.query.sql.symbol.SelectSymbol;
import org.teiid.query.sql.symbol.SingleElementSymbol;
+import org.teiid.query.sql.symbol.WindowFunction;
import org.teiid.query.sql.util.SymbolMap;
import org.teiid.query.sql.visitor.AggregateSymbolCollectorVisitor;
import org.teiid.query.sql.visitor.CorrelatedReferenceCollectorVisitor;
@@ -723,6 +725,8 @@
PlanNode plan = null;
+ LinkedHashSet<WindowFunction> windowFunctions = new LinkedHashSet<WindowFunction>();
+
if(query.getFrom() != null){
FromClause fromClause = mergeClauseTrees(query.getFrom());
@@ -741,7 +745,8 @@
}
// Attach grouping node on top
- Collection<AggregateSymbol> aggs = AggregateSymbolCollectorVisitor.getAggregates(query.getSelect(), true);
+ LinkedHashSet<AggregateSymbol> aggs = new LinkedHashSet<AggregateSymbol>();
+ AggregateSymbolCollectorVisitor.getAggregates(query.getSelect(), aggs, null, null, windowFunctions, null);
boolean hasGrouping = !aggs.isEmpty();
if (query.getHaving() != null) {
aggs.addAll(AggregateSymbolCollectorVisitor.getAggregates(query.getHaving(), true));
@@ -764,6 +769,12 @@
// Attach project on top
plan = attachProject(plan, query.getSelect());
+ if (query.getOrderBy() != null) {
+ AggregateSymbolCollectorVisitor.getAggregates(query.getOrderBy(), null, null, null, windowFunctions, null);
+ }
+ if (!windowFunctions.isEmpty()) {
+ plan.setProperty(Info.HAS_WINDOW_FUNCTIONS, true);
+ }
// Attach dup removal on top
if(query.getSelect().isDistinct()) {
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/plantree/NodeConstants.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/plantree/NodeConstants.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/plantree/NodeConstants.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -98,6 +98,7 @@
// Project node properties
PROJECT_COLS, // List <SingleElementSymbol>
INTO_GROUP, // GroupSymbol
+ HAS_WINDOW_FUNCTIONS, // Boolean
// Select node properties
SELECT_CRITERIA, // Criteria
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CapabilitiesUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CapabilitiesUtil.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CapabilitiesUtil.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -185,6 +185,13 @@
return false;
}
break;
+ case RANK:
+ case DENSE_RANK:
+ case ROW_NUMBER:
+ if (!caps.supportsCapability(Capability.ELEMENTARY_OLAP)) {
+ return false;
+ }
+ break;
default:
if (aggregate.isEnhancedNumeric()) {
if (!caps.supportsCapability(Capability.QUERY_AGGREGATES_ENHANCED_NUMERIC)) {
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CriteriaCapabilityValidatorVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CriteriaCapabilityValidatorVisitor.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/CriteriaCapabilityValidatorVisitor.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -60,13 +60,12 @@
import org.teiid.query.sql.navigator.PostOrderNavigator;
import org.teiid.query.sql.symbol.AggregateSymbol;
import org.teiid.query.sql.symbol.CaseExpression;
-import org.teiid.query.sql.symbol.Constant;
-import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.symbol.Function;
import org.teiid.query.sql.symbol.QueryString;
import org.teiid.query.sql.symbol.ScalarSubquery;
import org.teiid.query.sql.symbol.SearchedCaseExpression;
import org.teiid.query.sql.symbol.TextLine;
+import org.teiid.query.sql.symbol.WindowFunction;
import org.teiid.query.sql.symbol.XMLAttributes;
import org.teiid.query.sql.symbol.XMLElement;
import org.teiid.query.sql.symbol.XMLForest;
@@ -165,6 +164,13 @@
}
}
+ @Override
+ public void visit(WindowFunction windowFunction) {
+ if(! this.caps.supportsCapability(Capability.ELEMENTARY_OLAP)) {
+ markInvalid(windowFunction, "Window function not supported by source"); //$NON-NLS-1$
+ }
+ }
+
public void visit(CaseExpression obj) {
if(! this.caps.supportsCapability(Capability.QUERY_CASE)) {
markInvalid(obj, "CaseExpression pushdown not supported by source"); //$NON-NLS-1$
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeVirtual.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeVirtual.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeVirtual.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -319,6 +319,10 @@
GroupSymbol virtualGroup,
PlanNode parentJoin,
QueryMetadataInterface metadata) {
+ if (projectNode.hasBooleanProperty(Info.HAS_WINDOW_FUNCTIONS)) {
+ return false;
+ }
+
List<SingleElementSymbol> selectSymbols = (List<SingleElementSymbol>)projectNode.getProperty(NodeConstants.Info.PROJECT_COLS);
HashSet<GroupSymbol> groups = new HashSet<GroupSymbol>();
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushSelectCriteria.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushSelectCriteria.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushSelectCriteria.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -52,7 +52,9 @@
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.symbol.GroupSymbol;
+import org.teiid.query.sql.symbol.WindowFunction;
import org.teiid.query.sql.util.SymbolMap;
+import org.teiid.query.sql.visitor.AggregateSymbolCollectorVisitor;
import org.teiid.query.sql.visitor.ElementCollectorVisitor;
import org.teiid.query.sql.visitor.ValueIteratorProviderCollectorVisitor;
import org.teiid.query.util.CommandContext;
@@ -560,17 +562,21 @@
if(projectNode.getChildCount() == 0) {
return false;
}
+ List<WindowFunction> windowFunctions = null;
+ if (projectNode.hasBooleanProperty(Info.HAS_WINDOW_FUNCTIONS)) {
+ windowFunctions = new LinkedList<WindowFunction>();
+ }
Criteria crit = (Criteria) critNode.getProperty(NodeConstants.Info.SELECT_CRITERIA);
- Boolean conversionResult = checkConversion(symbolMap, ElementCollectorVisitor.getElements(crit, true));
+ Boolean conversionResult = checkConversion(symbolMap, ElementCollectorVisitor.getElements(crit, true), windowFunctions);
if (conversionResult == Boolean.FALSE) {
return false; //not convertable
}
if (!critNode.getSubqueryContainers().isEmpty()
- && checkConversion(symbolMap, critNode.getCorrelatedReferenceElements()) != null) {
+ && checkConversion(symbolMap, critNode.getCorrelatedReferenceElements(), windowFunctions) != null) {
return false; //not convertable, or has an aggregate for a correlated reference
}
@@ -591,7 +597,7 @@
}
private Boolean checkConversion(SymbolMap symbolMap,
- Collection<ElementSymbol> elements) {
+ Collection<ElementSymbol> elements, List<WindowFunction> windowFunctions) {
Boolean result = null;
for (ElementSymbol element : elements) {
@@ -609,6 +615,13 @@
if (!ElementCollectorVisitor.getAggregates(converted, false).isEmpty()) {
result = Boolean.TRUE;
}
+
+ if (windowFunctions != null) {
+ AggregateSymbolCollectorVisitor.getAggregates(converted, null, null, null, windowFunctions, null);
+ if (!windowFunctions.isEmpty()) {
+ return false;
+ }
+ }
}
return result;
}
Modified: trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -2250,7 +2250,8 @@
expression.setAggregateFunction(Type.MAX);
}
}
- if (rewriteAggs && expression.getExpression() != null && EvaluatableVisitor.willBecomeConstant(expression.getExpression())) {
+ if ((expression.getAggregateFunction() == Type.MAX || expression.getAggregateFunction() == Type.MIN)
+ && rewriteAggs && expression.getExpression() != null && EvaluatableVisitor.willBecomeConstant(expression.getExpression())) {
return expression.getExpression();
}
if (expression.getExpression() != null && expression.getCondition() != null && !expression.respectsNulls()) {
Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/OrderByItem.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/OrderByItem.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/OrderByItem.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -79,7 +79,7 @@
* @return true if the expression does not appear in the select clause
*/
public boolean isUnrelated() {
- return expressionPosition != null && expressionPosition == -1;
+ return expressionPosition == null || expressionPosition == -1;
}
@Override
Modified: trunk/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -260,17 +260,14 @@
return false;
}
switch (getAggregateFunction()) {
- case COUNT:
- case AVG:
- case STDDEV_POP:
- case STDDEV_SAMP:
- case VAR_POP:
- case VAR_SAMP:
- case SUM:
- case ARRAY_AGG:
- return true;
+ case MAX:
+ case MIN:
+ case ANY:
+ case SOME:
+ case EVERY:
+ return false;
}
- return false;
+ return true;
}
public Expression getCondition() {
@@ -291,13 +288,17 @@
}
public boolean respectsNulls() {
- return this.aggregate == Type.ARRAY_AGG;
+ switch (this.aggregate) {
+ case TEXTAGG:
+ case ARRAY_AGG:
+ return true;
+ }
+ return false;
}
public boolean canStage() {
switch (this.aggregate) {
case TEXTAGG:
- return false;
case ARRAY_AGG:
return false;
case XMLAGG:
Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/AggregateSymbolCollectorVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/AggregateSymbolCollectorVisitor.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/AggregateSymbolCollectorVisitor.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -25,7 +25,7 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
-import java.util.HashSet;
+import java.util.LinkedHashSet;
import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.LanguageVisitor;
@@ -99,7 +99,7 @@
Collection<? super AggregateSymbol> aggregates,
Collection<? super ElementSymbol> otherElements,
Collection<? super Expression> groupingColsUsed,
- Collection<? super Expression> windowFunctions,
+ Collection<? super WindowFunction> windowFunctions,
Collection<? extends Expression> groupingCols) {
AggregateSymbolCollectorVisitor visitor = new AggregateSymbolCollectorVisitor(aggregates, otherElements);
visitor.windowFunctions = windowFunctions;
@@ -113,7 +113,7 @@
}
Collection<AggregateSymbol> aggregates = null;
if (removeDuplicates) {
- aggregates = new HashSet<AggregateSymbol>();
+ aggregates = new LinkedHashSet<AggregateSymbol>();
} else {
aggregates = new ArrayList<AggregateSymbol>();
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/ExpressionMappingVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/ExpressionMappingVisitor.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/ExpressionMappingVisitor.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -67,6 +67,7 @@
import org.teiid.query.sql.symbol.QueryString;
import org.teiid.query.sql.symbol.SearchedCaseExpression;
import org.teiid.query.sql.symbol.SingleElementSymbol;
+import org.teiid.query.sql.symbol.WindowFunction;
import org.teiid.query.sql.symbol.XMLElement;
import org.teiid.query.sql.symbol.XMLParse;
import org.teiid.query.sql.symbol.XMLSerialize;
@@ -448,4 +449,15 @@
}
}
+ @Override
+ public void visit(WindowFunction windowFunction) {
+ if (windowFunction.getPartition() == null) {
+ return;
+ }
+ List<Expression> partition = windowFunction.getPartition();
+ for (int i = 0; i < partition.size(); i++) {
+ partition.set(i, replaceExpression(partition.get(i)));
+ }
+ }
+
}
Modified: trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -165,6 +165,8 @@
// State during validation
private boolean isXML = false; // only used for Query commands
+ private boolean inQuery;
+
// update procedure being validated
private CreateUpdateProcedureCommand updateProc;
@@ -265,6 +267,7 @@
this.isXML = true;
validateXMLQuery(obj);
} else {
+ this.inQuery = true;
validateAggregates(obj);
//if it is select with no from, should not have ScalarSubQuery
@@ -1217,6 +1220,10 @@
@Override
public void visit(AggregateSymbol obj) {
+ if (!inQuery) {
+ handleValidationError(QueryPlugin.Util.getString("SQLParser.Aggregate_only_top_level", obj), obj); //$NON-NLS-1$
+ return;
+ }
if (obj.getCondition() != null) {
Expression condition = obj.getCondition();
validateNoSubqueriesOrOuterReferences(condition);
Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2011-07-22 21:13:20 UTC (rev 3330)
@@ -259,7 +259,7 @@
SQLParser.Unknown_join_type=Unknown join type: {0}
-SQLParser.Aggregate_only_top_level=Aggregate and window functions are not allowed in the FROM/WHERE/GROUP BY clauses: {0}
+SQLParser.Aggregate_only_top_level=Aggregate functions are only allowed HAVING/SELECT/ORDER BY clauses. Window functions are only allowed in the SELECT/ORDER BY clauses: {0}
SQLParser.window_only_top_level=Window functions are not allowed in the HAVING clause: {0}
SQLParser.Unknown_agg_func=Unknown aggregate function: {0}
SQLParser.Invalid_func=Invalid function name: [{0}]
Added: trunk/engine/src/test/java/org/teiid/query/optimizer/TestWindowFunctions.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestWindowFunctions.java (rev 0)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestWindowFunctions.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.query.optimizer;
+
+import static org.teiid.query.optimizer.TestOptimizer.*;
+
+import org.junit.Test;
+import org.teiid.query.optimizer.TestOptimizer.ComparisonMode;
+import org.teiid.query.optimizer.capabilities.BasicSourceCapabilities;
+import org.teiid.query.optimizer.capabilities.DefaultCapabilitiesFinder;
+import org.teiid.query.optimizer.capabilities.SourceCapabilities.Capability;
+import org.teiid.query.processor.ProcessorPlan;
+import org.teiid.query.unittest.RealMetadataFactory;
+
+public class TestWindowFunctions {
+
+ @Test public void testViewNotRemoved() throws Exception {
+ BasicSourceCapabilities caps = getTypicalCapabilities();
+ caps.setCapabilitySupport(Capability.ELEMENTARY_OLAP, true);
+ caps.setCapabilitySupport(Capability.QUERY_FROM_INLINE_VIEWS, true);
+ ProcessorPlan plan = TestOptimizer.helpPlan("SELECT y FROM (select row_number() over (order by e1) as y from pm1.g1) as x where x.y = 10", //$NON-NLS-1$
+ RealMetadataFactory.example1Cached(), null, new DefaultCapabilitiesFinder(caps),
+ new String[] {
+ "SELECT v_0.c_0 FROM (SELECT ROW_NUMBER() OVER (ORDER BY g_0.e1) AS c_0 FROM pm1.g1 AS g_0) AS v_0 WHERE v_0.c_0 = 10"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
+
+ checkNodeTypes(plan, FULL_PUSHDOWN);
+ }
+
+}
Property changes on: trunk/engine/src/test/java/org/teiid/query/optimizer/TestWindowFunctions.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -1709,6 +1709,9 @@
helpTestRewriteCriteria("case when 0 = pm1.g1.e2 then null else null end IS NULL", TRUE_STR); //$NON-NLS-1$
}
+ @Test public void testRewriteConstantAgg2() throws Exception {
+ helpTestRewriteCommand("select count(2) from pm1.g1 group by e1", "SELECT COUNT(2) FROM pm1.g1 GROUP BY e1");
+ }
@Test public void testRewriteCaseExprForCase5413a() {
helpTestRewriteCriteria("pm1.g2.e1 = case when 0 = pm1.g1.e2 then 2 else 2 end", "pm1.g2.e1 = '2'"); //$NON-NLS-1$ //$NON-NLS-2$
Modified: trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -1515,6 +1515,16 @@
ValidatorReport report = helpValidateInModeler("pm1.vsp42", sql, metadata); //$NON-NLS-1$
assertEquals("Expected report to have no validation failures", false, report.hasItems()); //$NON-NLS-1$
}
+
+ @Test public void testNonQueryAgg() throws Exception{
+ String sql = "CREATE VIRTUAL PROCEDURE BEGIN IF (max(pm1.vsp42.param1) > 0) SELECT 1 AS x; ELSE SELECT 0 AS x; END"; //$NON-NLS-1$
+
+ QueryMetadataInterface metadata = RealMetadataFactory.example1Cached();
+
+ // Validate
+ ValidatorReport report = helpValidateInModeler("pm1.vsp42", sql, metadata); //$NON-NLS-1$
+ examineReport(sql, new String[] {"MAX(pm1.vsp42.param1)"}, report);
+ }
@Test public void testDefect14886() throws Exception{
String sql = "CREATE VIRTUAL PROCEDURE BEGIN END"; //$NON-NLS-1$
@@ -1888,5 +1898,13 @@
@Test public void testWindowFunctionWithNestedOrdering() {
helpValidate("SELECT xmlagg(xmlelement(name x, e1) order by e2) over () from pm1.g1", new String[] {"XMLAGG(XMLELEMENT(NAME x, e1) ORDER BY e2)"}, RealMetadataFactory.example1Cached());
}
+
+ @Test public void testWindowFunctionWithNestedaggAllowed() {
+ helpValidate("SELECT max(e1) over (order by max(e2)) from pm1.g1 group by e1", new String[] {}, RealMetadataFactory.example1Cached());
+ }
+ @Test public void testWindowFunctionWithNestedaggAllowed1() {
+ helpValidate("SELECT max(min(e1)) over (order by max(e2)) from pm1.g1 group by e1", new String[] {"MIN(e1)"}, RealMetadataFactory.example1Cached());
+ }
+
}
Modified: trunk/test-integration/common/src/test/java/org/teiid/connector/visitor/util/TestCollectorVisitor.java
===================================================================
--- trunk/test-integration/common/src/test/java/org/teiid/connector/visitor/util/TestCollectorVisitor.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/test-integration/common/src/test/java/org/teiid/connector/visitor/util/TestCollectorVisitor.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -22,16 +22,16 @@
package org.teiid.connector.visitor.util;
+import static org.junit.Assert.*;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.List;
import java.util.Set;
-import junit.framework.TestCase;
-
+import org.junit.Test;
import org.teiid.language.ColumnReference;
import org.teiid.language.Comparison;
import org.teiid.language.Expression;
@@ -41,25 +41,14 @@
import org.teiid.language.Select;
import org.teiid.language.Comparison.Operator;
import org.teiid.language.visitor.CollectorVisitor;
-
/**
*/
-public class TestCollectorVisitor extends TestCase {
+public class TestCollectorVisitor {
- /**
- * Constructor for TestElementCollectorVisitor.
- * @param name
- */
- public TestCollectorVisitor(String name) {
- super(name);
- }
-
- public Set getStringSet(Collection objs) {
- Set strings = new HashSet();
+ public Set<String> getStringSet(Collection<? extends Object> objs) {
+ Set<String> strings = new HashSet<String>();
- Iterator iter = objs.iterator();
- while(iter.hasNext()) {
- Object obj = iter.next();
+ for (Object obj : objs) {
if(obj == null) {
strings.add(null);
} else {
@@ -90,38 +79,38 @@
return q;
}
- public void testCollection1() {
+ @Test public void testCollection1() {
helpTestCollection(example1(), ColumnReference.class, new String[] {"g1.e1", "g1.e2" }); //$NON-NLS-1$ //$NON-NLS-2$
}
- public void testCollection2() {
+ @Test public void testCollection2() {
helpTestCollection(example1(), Function.class, new String[] {"length(g1.e2)" }); //$NON-NLS-1$
}
- public void testCollection3() {
+ @Test public void testCollection3() {
helpTestCollection(example1(), Expression.class, new String[] {"g1.e1", "g1.e2", "length(g1.e2)" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
public void helpTestElementsUsedByGroups(LanguageObject obj, String[] elements, String[] groups) {
- Set actualElements = getStringSet(CollectorVisitor.collectElements(obj));
- Set actualGroups = getStringSet(CollectorVisitor.collectGroupsUsedByElements(obj));
+ Set<String> actualElements = getStringSet(CollectorVisitor.collectElements(obj));
+ Set<String> actualGroups = getStringSet(CollectorVisitor.collectGroupsUsedByElements(obj));
- Set expectedElements = new HashSet(Arrays.asList(elements));
- Set expectedGroups = new HashSet(Arrays.asList(groups));
+ Set<String> expectedElements = new HashSet<String>(Arrays.asList(elements));
+ Set<String> expectedGroups = new HashSet<String>(Arrays.asList(groups));
assertEquals("Did not get expected elements", expectedElements, actualElements); //$NON-NLS-1$
assertEquals("Did not get expected groups", expectedGroups, actualGroups); //$NON-NLS-1$
}
- public void test1() {
+ @Test public void test1() {
NamedTable g1 = new NamedTable("g1", null, null); //$NON-NLS-1$
ColumnReference e1 = new ColumnReference(g1, "e1", null, String.class); //$NON-NLS-1$
helpTestElementsUsedByGroups(e1, new String[] {"g1.e1"}, new String[] {"g1"}); //$NON-NLS-1$ //$NON-NLS-2$
}
- public void test2() {
+ @Test public void test2() {
NamedTable g1 = new NamedTable("g1", null, null); //$NON-NLS-1$
ColumnReference e1 = new ColumnReference(g1, "e1", null, String.class); //$NON-NLS-1$
ColumnReference e2 = new ColumnReference(g1, "e2", null, String.class); //$NON-NLS-1$
Modified: trunk/test-integration/common/src/test/java/org/teiid/connector/visitor/util/TestSQLStringVisitor.java
===================================================================
--- trunk/test-integration/common/src/test/java/org/teiid/connector/visitor/util/TestSQLStringVisitor.java 2011-07-22 19:03:28 UTC (rev 3329)
+++ trunk/test-integration/common/src/test/java/org/teiid/connector/visitor/util/TestSQLStringVisitor.java 2011-07-22 21:13:20 UTC (rev 3330)
@@ -73,7 +73,7 @@
import org.teiid.query.sql.lang.CompareCriteria;
import org.teiid.query.sql.lang.JoinType;
-
+@SuppressWarnings("nls")
public class TestSQLStringVisitor {
public static final RuntimeMetadata metadata = TstLanguageBridgeFactory.metadataFactory;
@@ -425,5 +425,12 @@
Command command = FakeTranslationFactory.getInstance().getBQTTranslationUtility().parseCommand(sql, true, true);
assertEquals("SELECT g_0.IntKey AS c_0 FROM SmallA AS g_0 ORDER BY c_0 NULLS FIRST", command.toString()); //$NON-NLS-1$
}
+
+ @Test public void testWindowFunction() throws Exception {
+ String sql = "select max(intnum) over (order by intkey nulls first) from bqt1.smalla";
+
+ Command command = FakeTranslationFactory.getInstance().getBQTTranslationUtility().parseCommand(sql, true, true);
+ assertEquals("SELECT MAX(g_0.IntNum) OVER (ORDER BY g_0.IntKey NULLS FIRST) FROM SmallA AS g_0", command.toString()); //$NON-NLS-1$
+ }
}
14 years, 5 months
teiid SVN: r3329 - in branches/7.4.x/engine/src: main/java/org/teiid/query/sql/symbol and 1 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-07-22 15:03:28 -0400 (Fri, 22 Jul 2011)
New Revision: 3329
Modified:
branches/7.4.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
branches/7.4.x/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java
branches/7.4.x/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
Log:
TEIID-1645 re-enabling agg rewrite optimization
Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2011-07-22 18:50:01 UTC (rev 3328)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2011-07-22 19:03:28 UTC (rev 3329)
@@ -2362,7 +2362,8 @@
expression.setAggregateFunction(Type.MAX);
}
}
- if (rewriteAggs && expression.getExpression() != null && EvaluatableVisitor.willBecomeConstant(expression.getExpression())) {
+ if ((expression.getAggregateFunction() == Type.MAX || expression.getAggregateFunction() == Type.MIN)
+ && rewriteAggs && expression.getExpression() != null && EvaluatableVisitor.willBecomeConstant(expression.getExpression())) {
return expression.getExpression();
}
return expression;
Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java 2011-07-22 18:50:01 UTC (rev 3328)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/sql/symbol/AggregateSymbol.java 2011-07-22 19:03:28 UTC (rev 3329)
@@ -254,16 +254,14 @@
return false;
}
switch (getAggregateFunction()) {
- case COUNT:
- case AVG:
- case STDDEV_POP:
- case STDDEV_SAMP:
- case VAR_POP:
- case VAR_SAMP:
- case SUM:
- return true;
+ case MAX:
+ case MIN:
+ case ANY:
+ case SOME:
+ case EVERY:
+ return false;
}
- return false;
+ return true;
}
public static boolean areAggregatesCardinalityDependent(Collection<AggregateSymbol> aggs) {
Modified: branches/7.4.x/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
===================================================================
--- branches/7.4.x/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java 2011-07-22 18:50:01 UTC (rev 3328)
+++ branches/7.4.x/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java 2011-07-22 19:03:28 UTC (rev 3329)
@@ -2465,5 +2465,8 @@
helpTestRewriteCommand("select max(1) from pm1.g1 group by e1", "SELECT 1 FROM pm1.g1 GROUP BY e1");
}
+ @Test public void testRewriteConstantAgg2() throws Exception {
+ helpTestRewriteCommand("select count(2) from pm1.g1 group by e1", "SELECT COUNT(2) FROM pm1.g1 GROUP BY e1");
+ }
}
14 years, 5 months
teiid SVN: r3328 - in trunk/engine/src: test/java/org/teiid/query/optimizer and 1 other directory.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2011-07-22 14:50:01 -0400 (Fri, 22 Jul 2011)
New Revision: 3328
Modified:
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleAssignOutputElements.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
Log:
TEIID-1665 optimizing grouping of all constants
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleAssignOutputElements.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleAssignOutputElements.java 2011-07-22 16:26:08 UTC (rev 3327)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleAssignOutputElements.java 2011-07-22 18:50:01 UTC (rev 3328)
@@ -165,14 +165,6 @@
assignOutputElements(root.getLastChild(), outputElements, metadata, capFinder, rules, analysisRecord, context);
break;
case NodeConstants.Types.SOURCE: {
- if (outputElements.isEmpty()) {
- //we cannot completely filter an implicit grouping (this is a corner case)
- PlanNode grouping = NodeEditor.findNodePreOrder(root.getFirstChild(), NodeConstants.Types.GROUP, NodeConstants.Types.SOURCE | NodeConstants.Types.JOIN);
- if (grouping != null && !grouping.hasCollectionProperty(NodeConstants.Info.GROUP_COLS)) {
- SymbolMap symbolMap = (SymbolMap) root.getProperty(NodeConstants.Info.SYMBOL_MAP);
- outputElements.add(symbolMap.getKeys().get(0).clone());
- }
- }
outputElements = (List<SingleElementSymbol>)determineSourceOutput(root, outputElements, metadata, capFinder);
root.setProperty(NodeConstants.Info.OUTPUT_COLS, outputElements);
List<SingleElementSymbol> childElements = filterVirtualElements(root, outputElements, metadata);
@@ -227,24 +219,27 @@
PlanNode next = root.getFirstChild();
NodeEditor.removeChildNode(root.getParent(), root);
- if (old.hasCollectionProperty(Info.GROUP_COLS)) {
- SymbolMap symbolMap = (SymbolMap) old.getProperty(NodeConstants.Info.SYMBOL_MAP);
- FrameUtil.convertFrame(next.getParent(), symbolMap.asMap().keySet().iterator().next().getGroupSymbol(), null, symbolMap.asMap(), metadata);
- PlanNode limit = NodeFactory.getNewNode(NodeConstants.Types.TUPLE_LIMIT);
- limit.setProperty(Info.MAX_TUPLE_LIMIT, new Constant(1));
- PlanNode parent = next.getParent();
- while (parent.getParent() != null && parent.getParent().getType() != NodeConstants.Types.SOURCE) {
- parent = parent.getParent();
- }
+ SymbolMap symbolMap = (SymbolMap) old.getProperty(NodeConstants.Info.SYMBOL_MAP);
+ FrameUtil.convertFrame(next.getParent(), symbolMap.asMap().keySet().iterator().next().getGroupSymbol(), null, symbolMap.asMap(), metadata);
+ PlanNode parent = next.getParent();
+ while (parent.getParent() != null && parent.getParent().getType() != NodeConstants.Types.SOURCE) {
+ parent = parent.getParent();
+ }
+ if (!old.hasCollectionProperty(Info.GROUP_COLS)) {
+ //just lob off everything under the projection
+ PlanNode project = NodeEditor.findNodePreOrder(parent, NodeConstants.Types.PROJECT);
+ project.removeAllChildren();
+ } else {
+ PlanNode limit = NodeFactory.getNewNode(NodeConstants.Types.TUPLE_LIMIT);
+ limit.setProperty(Info.MAX_TUPLE_LIMIT, new Constant(1));
if (!rules.contains(RuleConstants.PUSH_LIMIT)) {
rules.push(RuleConstants.PUSH_LIMIT);
}
- parent.getFirstChild().addAsParent(limit);
- execute(parent, metadata, capFinder, rules, analysisRecord, context);
- return;
- }
- root = next;
- }
+ parent.getFirstChild().addAsParent(limit);
+ }
+ execute(parent, metadata, capFinder, rules, analysisRecord, context);
+ return;
+ }
// Call children recursively
if(root.getChildCount() == 1) {
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java 2011-07-22 16:26:08 UTC (rev 3327)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java 2011-07-22 18:50:01 UTC (rev 3328)
@@ -984,7 +984,7 @@
@Test public void testDefect5282_2() {
helpPlan("select count(*) FROM vm1.a4", example1(), //$NON-NLS-1$
- new String[] { "SELECT 1 FROM pm1.g1" } ); //$NON-NLS-1$
+ new String[] { } ); //$NON-NLS-1$
}
@Test public void testDefect5282_3() {
@@ -6604,10 +6604,9 @@
bac.setCapabilitySupport(Capability.QUERY_FROM_INLINE_VIEWS, true);
bac.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT_STAR, true);
bac.setCapabilitySupport(Capability.QUERY_GROUP_BY, true);
- helpPlan("select count(*) from agg3", metadata, new String[] {"SELECT COUNT(*) FROM (SELECT COUNT(*) AS c_0 FROM BQT1.SmallA AS g_0) AS v_0"}, new DefaultCapabilitiesFinder(bac), ComparisonMode.EXACT_COMMAND_STRING);
+ helpPlan("select count(*) from agg3", metadata, new String[] {}, new DefaultCapabilitiesFinder(bac), ComparisonMode.EXACT_COMMAND_STRING);
}
-
@Test public void testMergeGroupBy1() throws Exception {
BasicSourceCapabilities caps = new BasicSourceCapabilities();
caps.setCapabilitySupport(Capability.ROW_LIMIT, true);
14 years, 5 months