You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ma...@apache.org on 2016/09/20 18:06:09 UTC
[46/47] phoenix git commit: PHOENIX-3279
QueryPlan.iterator(ParallelScanGrouper scanGrouper) should pass null
('unknown') as scan parameter when calling this.iterator(ParallelScanGrouper
scanGrouper, Scan scan)
PHOENIX-3279 QueryPlan.iterator(ParallelScanGrouper scanGrouper) should pass null ('unknown') as scan parameter when calling this.iterator(ParallelScanGrouper scanGrouper, Scan scan)
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/7601d594
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/7601d594
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/7601d594
Branch: refs/heads/calcite
Commit: 7601d5942fdeb55c114295292e2100aafb84e861
Parents: 0a05d67
Author: maryannxue <ma...@gmail.com>
Authored: Tue Sep 20 09:19:06 2016 -0700
Committer: maryannxue <ma...@gmail.com>
Committed: Tue Sep 20 09:19:06 2016 -0700
----------------------------------------------------------------------
.../apache/phoenix/end2end/DerivedTableIT.java | 11 ++++++++++
.../apache/phoenix/execute/BaseQueryPlan.java | 16 +++++++++------
.../phoenix/execute/ClientAggregatePlan.java | 7 +------
.../phoenix/execute/ClientProcessingPlan.java | 9 ---------
.../apache/phoenix/execute/ClientScanPlan.java | 4 ----
.../apache/phoenix/execute/CorrelatePlan.java | 15 ++------------
.../phoenix/execute/DelegateQueryPlan.java | 13 ++++++++++++
.../apache/phoenix/execute/HashJoinPlan.java | 15 ++++----------
.../phoenix/execute/TupleProjectionPlan.java | 11 ----------
.../org/apache/phoenix/execute/UnionPlan.java | 21 ++++++++------------
.../apache/phoenix/execute/UnnestArrayPlan.java | 11 ----------
.../phoenix/iterate/UnionResultIterators.java | 4 +---
12 files changed, 50 insertions(+), 87 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/phoenix/blob/7601d594/phoenix-core/src/it/java/org/apache/phoenix/end2end/DerivedTableIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/DerivedTableIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DerivedTableIT.java
index 862416b..67be132 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/DerivedTableIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DerivedTableIT.java
@@ -225,6 +225,17 @@ public class DerivedTableIT extends BaseClientManagedTimeIT {
assertEquals(ROW2,rs.getString(1));
assertFalse(rs.next());
+
+ // ((where limit) where limit) limit
+ query = "SELECT u.eid FROM (SELECT t.eid FROM (SELECT entity_id eid, b_string b FROM aTable WHERE a_string = '" + B_VALUE + "' LIMIT 5) AS t WHERE t.b = '" + C_VALUE + "' LIMIT 4) AS u WHERE u.eid >= '" + ROW1 + "' LIMIT 3";
+ statement = conn.prepareStatement(query);
+ rs = statement.executeQuery();
+ assertTrue (rs.next());
+ assertEquals(ROW5,rs.getString(1));
+ assertTrue (rs.next());
+ assertEquals(ROW8,rs.getString(1));
+
+ assertFalse(rs.next());
// (count) where
query = "SELECT t.c FROM (SELECT count(*) c FROM aTable) AS t WHERE t.c > 0";
http://git-wip-us.apache.org/repos/asf/phoenix/blob/7601d594/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java
index 1e09079..76dec2f 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java
@@ -200,10 +200,15 @@ public abstract class BaseQueryPlan implements QueryPlan {
// byte[] producer = Bytes.toBytes(UUID.randomUUID().toString());
// scan.setAttribute(HBaseServer.CALL_QUEUE_PRODUCER_ATTRIB_NAME, producer);
// }
+
+ @Override
+ public final ResultIterator iterator() throws SQLException {
+ return iterator(Collections.<SQLCloseable>emptyList(), DefaultParallelScanGrouper.getInstance(), null);
+ }
@Override
public final ResultIterator iterator(ParallelScanGrouper scanGrouper) throws SQLException {
- return iterator(Collections.<SQLCloseable>emptyList(), scanGrouper, this.context.getScan());
+ return iterator(Collections.<SQLCloseable>emptyList(), scanGrouper, null);
}
@Override
@@ -211,12 +216,11 @@ public abstract class BaseQueryPlan implements QueryPlan {
return iterator(Collections.<SQLCloseable>emptyList(), scanGrouper, scan);
}
- @Override
- public final ResultIterator iterator() throws SQLException {
- return iterator(Collections.<SQLCloseable>emptyList(), DefaultParallelScanGrouper.getInstance(), this.context.getScan());
- }
-
public final ResultIterator iterator(final List<? extends SQLCloseable> dependencies, ParallelScanGrouper scanGrouper, Scan scan) throws SQLException {
+ if (scan == null) {
+ scan = context.getScan();
+ }
+
/*
* For aggregate queries, we still need to let the AggregationPlan to
* proceed so that we can give proper aggregates even if there are no
http://git-wip-us.apache.org/repos/asf/phoenix/blob/7601d594/phoenix-core/src/main/java/org/apache/phoenix/execute/ClientAggregatePlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/ClientAggregatePlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/ClientAggregatePlan.java
index eb048f4..9251724 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/ClientAggregatePlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/ClientAggregatePlan.java
@@ -83,13 +83,8 @@ public class ClientAggregatePlan extends ClientProcessingPlan {
}
@Override
- public ResultIterator iterator(ParallelScanGrouper scanGrouper) throws SQLException {
- return iterator(scanGrouper, null);
- }
-
- @Override
public ResultIterator iterator(ParallelScanGrouper scanGrouper, Scan scan) throws SQLException {
- ResultIterator iterator = delegate.iterator(scanGrouper);
+ ResultIterator iterator = delegate.iterator(scanGrouper, scan);
if (where != null) {
iterator = new FilterResultIterator(iterator, where);
}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/7601d594/phoenix-core/src/main/java/org/apache/phoenix/execute/ClientProcessingPlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/ClientProcessingPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/ClientProcessingPlan.java
index 2cd5237..ac43919 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/ClientProcessingPlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/ClientProcessingPlan.java
@@ -17,15 +17,11 @@
*/
package org.apache.phoenix.execute;
-import java.sql.SQLException;
-
import org.apache.phoenix.compile.QueryPlan;
import org.apache.phoenix.compile.RowProjector;
import org.apache.phoenix.compile.StatementContext;
import org.apache.phoenix.compile.OrderByCompiler.OrderBy;
import org.apache.phoenix.expression.Expression;
-import org.apache.phoenix.iterate.DefaultParallelScanGrouper;
-import org.apache.phoenix.iterate.ResultIterator;
import org.apache.phoenix.parse.FilterableStatement;
import org.apache.phoenix.schema.TableRef;
@@ -89,9 +85,4 @@ public abstract class ClientProcessingPlan extends DelegateQueryPlan {
public FilterableStatement getStatement() {
return statement;
}
-
- @Override
- public ResultIterator iterator() throws SQLException {
- return iterator(DefaultParallelScanGrouper.getInstance());
- }
}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/7601d594/phoenix-core/src/main/java/org/apache/phoenix/execute/ClientScanPlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/ClientScanPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/ClientScanPlan.java
index 4e43225..6bbc545 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/ClientScanPlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/ClientScanPlan.java
@@ -50,10 +50,6 @@ public class ClientScanPlan extends ClientProcessingPlan {
}
@Override
- public ResultIterator iterator(ParallelScanGrouper scanGrouper) throws SQLException {
- return iterator(scanGrouper, delegate.getContext().getScan());
- }
- @Override
public ResultIterator iterator(ParallelScanGrouper scanGrouper, Scan scan) throws SQLException {
ResultIterator iterator = delegate.iterator(scanGrouper, scan);
if (where != null) {
http://git-wip-us.apache.org/repos/asf/phoenix/blob/7601d594/phoenix-core/src/main/java/org/apache/phoenix/execute/CorrelatePlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/CorrelatePlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/CorrelatePlan.java
index fc5a04d..b1d00ab 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/CorrelatePlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/CorrelatePlan.java
@@ -28,7 +28,6 @@ import org.apache.phoenix.compile.QueryPlan;
import org.apache.phoenix.exception.SQLExceptionCode;
import org.apache.phoenix.exception.SQLExceptionInfo;
import org.apache.phoenix.execute.TupleProjector.ProjectedValueTuple;
-import org.apache.phoenix.iterate.DefaultParallelScanGrouper;
import org.apache.phoenix.iterate.ParallelScanGrouper;
import org.apache.phoenix.iterate.ResultIterator;
import org.apache.phoenix.parse.JoinTableNode.JoinType;
@@ -99,17 +98,7 @@ public class CorrelatePlan extends DelegateQueryPlan {
}
@Override
- public ResultIterator iterator() throws SQLException {
- return iterator(DefaultParallelScanGrouper.getInstance());
- }
-
- @Override
- public ResultIterator iterator(ParallelScanGrouper scanGrouper)
- throws SQLException {
- return iterator(scanGrouper, null);
- }
- @Override
- public ResultIterator iterator(ParallelScanGrouper scanGrouper, Scan scan)
+ public ResultIterator iterator(final ParallelScanGrouper scanGrouper, final Scan scan)
throws SQLException {
return new ResultIterator() {
private final ValueBitSet destBitSet = ValueBitSet.newInstance(joinedSchema);
@@ -118,7 +107,7 @@ public class CorrelatePlan extends DelegateQueryPlan {
(joinType == JoinType.Semi || joinType == JoinType.Anti) ?
ValueBitSet.EMPTY_VALUE_BITSET
: ValueBitSet.newInstance(rhsSchema);
- private final ResultIterator iter = delegate.iterator();
+ private final ResultIterator iter = delegate.iterator(scanGrouper, scan);
private ResultIterator rhsIter = null;
private Tuple current = null;
private boolean closed = false;
http://git-wip-us.apache.org/repos/asf/phoenix/blob/7601d594/phoenix-core/src/main/java/org/apache/phoenix/execute/DelegateQueryPlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/DelegateQueryPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/DelegateQueryPlan.java
index 8f0d224..46eec91 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/DelegateQueryPlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/DelegateQueryPlan.java
@@ -25,6 +25,9 @@ import java.util.Set;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.phoenix.compile.GroupByCompiler.GroupBy;
import org.apache.phoenix.compile.OrderByCompiler.OrderBy;
+import org.apache.phoenix.iterate.DefaultParallelScanGrouper;
+import org.apache.phoenix.iterate.ParallelScanGrouper;
+import org.apache.phoenix.iterate.ResultIterator;
import org.apache.phoenix.compile.QueryPlan;
import org.apache.phoenix.compile.RowProjector;
import org.apache.phoenix.compile.StatementContext;
@@ -124,4 +127,14 @@ public abstract class DelegateQueryPlan implements QueryPlan {
public Integer getOffset() {
return delegate.getOffset();
}
+
+ @Override
+ public ResultIterator iterator() throws SQLException {
+ return iterator(DefaultParallelScanGrouper.getInstance());
+ }
+
+ @Override
+ public ResultIterator iterator(ParallelScanGrouper scanGrouper) throws SQLException {
+ return iterator(scanGrouper, null);
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/phoenix/blob/7601d594/phoenix-core/src/main/java/org/apache/phoenix/execute/HashJoinPlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/HashJoinPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/HashJoinPlan.java
index d332f68..dce797d 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/HashJoinPlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/HashJoinPlan.java
@@ -50,7 +50,6 @@ import org.apache.phoenix.expression.Expression;
import org.apache.phoenix.expression.InListExpression;
import org.apache.phoenix.expression.LiteralExpression;
import org.apache.phoenix.expression.RowValueConstructorExpression;
-import org.apache.phoenix.iterate.DefaultParallelScanGrouper;
import org.apache.phoenix.iterate.FilterResultIterator;
import org.apache.phoenix.iterate.ParallelScanGrouper;
import org.apache.phoenix.iterate.ResultIterator;
@@ -132,19 +131,13 @@ public class HashJoinPlan extends DelegateQueryPlan {
public Set<TableRef> getSourceRefs() {
return tableRefs;
}
-
- @Override
- public ResultIterator iterator() throws SQLException {
- return iterator(DefaultParallelScanGrouper.getInstance());
- }
-
- @Override
- public ResultIterator iterator(ParallelScanGrouper scanGrouper) throws SQLException {
- return iterator(scanGrouper, this.delegate.getContext().getScan());
- }
@Override
public ResultIterator iterator(ParallelScanGrouper scanGrouper, Scan scan) throws SQLException {
+ if (scan == null) {
+ scan = delegate.getContext().getScan();
+ }
+
int count = subPlans.length;
PhoenixConnection connection = getContext().getConnection();
ConnectionQueryServices services = connection.getQueryServices();
http://git-wip-us.apache.org/repos/asf/phoenix/blob/7601d594/phoenix-core/src/main/java/org/apache/phoenix/execute/TupleProjectionPlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/TupleProjectionPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/TupleProjectionPlan.java
index 0ba0cc1..f42af56 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/TupleProjectionPlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/TupleProjectionPlan.java
@@ -24,7 +24,6 @@ import org.apache.hadoop.hbase.client.Scan;
import org.apache.phoenix.compile.ExplainPlan;
import org.apache.phoenix.compile.QueryPlan;
import org.apache.phoenix.expression.Expression;
-import org.apache.phoenix.iterate.DefaultParallelScanGrouper;
import org.apache.phoenix.iterate.DelegateResultIterator;
import org.apache.phoenix.iterate.FilterResultIterator;
import org.apache.phoenix.iterate.ParallelScanGrouper;
@@ -53,16 +52,6 @@ public class TupleProjectionPlan extends DelegateQueryPlan {
return new ExplainPlan(planSteps);
}
-
- @Override
- public ResultIterator iterator() throws SQLException {
- return iterator(DefaultParallelScanGrouper.getInstance());
- }
-
- @Override
- public ResultIterator iterator(ParallelScanGrouper scanGrouper) throws SQLException {
- return iterator(scanGrouper, delegate.getContext().getScan());
- }
@Override
public ResultIterator iterator(ParallelScanGrouper scanGrouper, Scan scan) throws SQLException {
http://git-wip-us.apache.org/repos/asf/phoenix/blob/7601d594/phoenix-core/src/main/java/org/apache/phoenix/execute/UnionPlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/UnionPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/UnionPlan.java
index cf95b5b..e2c18b1 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/UnionPlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/UnionPlan.java
@@ -20,7 +20,6 @@ package org.apache.phoenix.execute;
import java.sql.ParameterMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import java.util.Set;
@@ -33,6 +32,7 @@ import org.apache.phoenix.compile.RowProjector;
import org.apache.phoenix.compile.ScanRanges;
import org.apache.phoenix.compile.StatementContext;
import org.apache.phoenix.iterate.ConcatResultIterator;
+import org.apache.phoenix.iterate.DefaultParallelScanGrouper;
import org.apache.phoenix.iterate.LimitingResultIterator;
import org.apache.phoenix.iterate.MergeSortTopNResultIterator;
import org.apache.phoenix.iterate.OffsetResultIterator;
@@ -43,8 +43,6 @@ import org.apache.phoenix.jdbc.PhoenixStatement.Operation;
import org.apache.phoenix.parse.FilterableStatement;
import org.apache.phoenix.query.KeyRange;
import org.apache.phoenix.schema.TableRef;
-import org.apache.phoenix.util.SQLCloseable;
-
import com.google.common.collect.Sets;
@@ -134,22 +132,19 @@ public class UnionPlan implements QueryPlan {
public RowProjector getProjector() {
return projector;
}
-
+
@Override
- public final ResultIterator iterator(ParallelScanGrouper scanGrouper) throws SQLException {
- return iterator(Collections.<SQLCloseable>emptyList());
+ public ResultIterator iterator() throws SQLException {
+ return iterator(DefaultParallelScanGrouper.getInstance());
}
@Override
- public final ResultIterator iterator(ParallelScanGrouper scanGrouper, Scan scan) throws SQLException {
- return iterator(Collections.<SQLCloseable>emptyList());
- }
- @Override
- public final ResultIterator iterator() throws SQLException {
- return iterator(Collections.<SQLCloseable>emptyList());
+ public ResultIterator iterator(ParallelScanGrouper scanGrouper) throws SQLException {
+ return iterator(scanGrouper, null);
}
- public final ResultIterator iterator(final List<? extends SQLCloseable> dependencies) throws SQLException {
+ @Override
+ public final ResultIterator iterator(ParallelScanGrouper scanGrouper, Scan scan) throws SQLException {
this.iterators = new UnionResultIterators(plans, parentContext);
ResultIterator scanner;
boolean isOrdered = !orderBy.getOrderByExpressions().isEmpty();
http://git-wip-us.apache.org/repos/asf/phoenix/blob/7601d594/phoenix-core/src/main/java/org/apache/phoenix/execute/UnnestArrayPlan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/UnnestArrayPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/UnnestArrayPlan.java
index 94c59df..bda1b96 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/UnnestArrayPlan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/UnnestArrayPlan.java
@@ -28,7 +28,6 @@ import org.apache.phoenix.expression.BaseSingleExpression;
import org.apache.phoenix.expression.BaseTerminalExpression;
import org.apache.phoenix.expression.Expression;
import org.apache.phoenix.expression.visitor.ExpressionVisitor;
-import org.apache.phoenix.iterate.DefaultParallelScanGrouper;
import org.apache.phoenix.iterate.DelegateResultIterator;
import org.apache.phoenix.iterate.ParallelScanGrouper;
import org.apache.phoenix.iterate.ResultIterator;
@@ -48,16 +47,6 @@ public class UnnestArrayPlan extends DelegateQueryPlan {
}
@Override
- public ResultIterator iterator() throws SQLException {
- return iterator(DefaultParallelScanGrouper.getInstance());
- }
-
- @Override
- public ResultIterator iterator(ParallelScanGrouper scanGrouper) throws SQLException {
- return new UnnestArrayResultIterator(delegate.iterator(scanGrouper, delegate.getContext().getScan()));
- }
-
- @Override
public ResultIterator iterator(ParallelScanGrouper scanGrouper, Scan scan) throws SQLException {
return new UnnestArrayResultIterator(delegate.iterator(scanGrouper, scan));
}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/7601d594/phoenix-core/src/main/java/org/apache/phoenix/iterate/UnionResultIterators.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/iterate/UnionResultIterators.java b/phoenix-core/src/main/java/org/apache/phoenix/iterate/UnionResultIterators.java
index 5018dad..910a514 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/iterate/UnionResultIterators.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/iterate/UnionResultIterators.java
@@ -42,21 +42,19 @@ public class UnionResultIterators implements ResultIterators {
private final List<KeyRange> splits;
private final List<List<Scan>> scans;
private final List<PeekingResultIterator> iterators;
- private final List<QueryPlan> plans;
private final List<ReadMetricQueue> readMetricsList;
private final List<OverAllQueryMetrics> overAllQueryMetricsList;
private boolean closed;
private final StatementContext parentStmtCtx;
public UnionResultIterators(List<QueryPlan> plans, StatementContext parentStmtCtx) throws SQLException {
this.parentStmtCtx = parentStmtCtx;
- this.plans = plans;
int nPlans = plans.size();
iterators = Lists.newArrayListWithExpectedSize(nPlans);
splits = Lists.newArrayListWithExpectedSize(nPlans * 30);
scans = Lists.newArrayListWithExpectedSize(nPlans * 10);
readMetricsList = Lists.newArrayListWithCapacity(nPlans);
overAllQueryMetricsList = Lists.newArrayListWithCapacity(nPlans);
- for (QueryPlan plan : this.plans) {
+ for (QueryPlan plan : plans) {
readMetricsList.add(plan.getContext().getReadMetricsQueue());
overAllQueryMetricsList.add(plan.getContext().getOverallQueryMetrics());
iterators.add(LookAheadResultIterator.wrap(plan.iterator()));