You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2016/02/15 08:52:10 UTC
[26/50] [abbrv] ignite git commit: ignite-split2 - better tests
ignite-split2 - better tests
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/084697b1
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/084697b1
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/084697b1
Branch: refs/heads/ignite-1232
Commit: 084697b14492375e11d005e786b5758317be7860
Parents: 6a9a61a
Author: S.Vladykin <sv...@gridgain.com>
Authored: Tue Dec 15 02:33:10 2015 +0300
Committer: S.Vladykin <sv...@gridgain.com>
Committed: Tue Dec 15 02:33:10 2015 +0300
----------------------------------------------------------------------
.../query/h2/opt/GridH2SpatialIndex.java | 2 +-
.../query/h2/opt/GridH2IndexBase.java | 11 ++-
.../query/h2/opt/GridH2TreeIndex.java | 34 ++++----
.../query/IgniteSqlSplitterSelfTest.java | 81 ++++++++++++++------
4 files changed, 79 insertions(+), 49 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/084697b1/modules/geospatial/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SpatialIndex.java
----------------------------------------------------------------------
diff --git a/modules/geospatial/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SpatialIndex.java b/modules/geospatial/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SpatialIndex.java
index bc700a9..a2dc7b3 100644
--- a/modules/geospatial/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SpatialIndex.java
+++ b/modules/geospatial/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SpatialIndex.java
@@ -299,7 +299,7 @@ public class GridH2SpatialIndex extends GridH2IndexBase implements SpatialIndex
}
while (i.hasNext());
- return filter(rows.iterator());
+ return filter(rows.iterator(), threadLocalFilter());
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/084697b1/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
index 20795bc..81359c5 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
@@ -203,17 +203,16 @@ public abstract class GridH2IndexBase extends BaseIndex {
* Filters rows from expired ones and using predicate.
*
* @param iter Iterator over rows.
+ * @param filter Optional filter.
* @return Filtered iterator.
*/
- protected Iterator<GridH2Row> filter(Iterator<GridH2Row> iter) {
+ protected Iterator<GridH2Row> filter(Iterator<GridH2Row> iter, IndexingQueryFilter filter) {
IgniteBiPredicate<Object, Object> p = null;
- IndexingQueryFilter f = filter();
-
- if (f != null) {
+ if (filter != null) {
String spaceName = getTable().spaceName();
- p = f.forSpace(spaceName);
+ p = filter.forSpace(spaceName);
}
return new FilteringIterator(iter, U.currentTimeMillis(), p);
@@ -222,7 +221,7 @@ public abstract class GridH2IndexBase extends BaseIndex {
/**
* @return Filter for currently running query or {@code null} if none.
*/
- protected IndexingQueryFilter filter() {
+ protected static IndexingQueryFilter threadLocalFilter() {
GridH2QueryContext qctx = GridH2QueryContext.get();
return qctx == null ? null : qctx.filter();
http://git-wip-us.apache.org/repos/asf/ignite/blob/084697b1/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java
index e21e6af..2677f07 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java
@@ -68,7 +68,7 @@ import org.h2.index.Cursor;
import org.h2.index.IndexCondition;
import org.h2.index.IndexLookupBatch;
import org.h2.index.IndexType;
-import org.h2.index.SingleRowCursor;
+import org.h2.message.DbException;
import org.h2.result.Row;
import org.h2.result.SearchRow;
import org.h2.result.SortOrder;
@@ -287,7 +287,7 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
assert !msg.bounds().isEmpty() : "empty bounds";
- src = new RangeSource(msg.bounds(), snapshot0);
+ src = new RangeSource(msg.bounds(), snapshot0, qctx.filter());
}
else {
// This is request to fetch next portion of data.
@@ -397,7 +397,7 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
/** {@inheritDoc} */
@Override public long getRowCount(@Nullable Session ses) {
- IndexingQueryFilter f = filter();
+ IndexingQueryFilter f = threadLocalFilter();
// Fast path if we don't need to perform any filtering.
if (f == null || f.forSpace((getTable()).spaceName()) == null)
@@ -495,7 +495,7 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
private Iterator<GridH2Row> doFind(@Nullable SearchRow first, boolean includeFirst, @Nullable SearchRow last) {
ConcurrentNavigableMap<GridSearchRowPointer, GridH2Row> t = treeForRead();
- return doFind0(t, first, includeFirst, last);
+ return doFind0(t, first, includeFirst, last, threadLocalFilter());
}
/**
@@ -503,13 +503,15 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
* @param first Lower bound.
* @param includeFirst Whether lower bound should be inclusive.
* @param last Upper bound always inclusive.
+ * @param filter Filter.
* @return Iterator over rows in given range.
*/
private Iterator<GridH2Row> doFind0(
ConcurrentNavigableMap<GridSearchRowPointer, GridH2Row> t,
@Nullable SearchRow first,
boolean includeFirst,
- @Nullable SearchRow last
+ @Nullable SearchRow last,
+ IndexingQueryFilter filter
) {
includeFirst &= first != null;
@@ -519,7 +521,7 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
if (range == null)
return new GridEmptyIterator<>();
- return filter(range.values().iterator());
+ return filter(range.values().iterator(), filter);
}
/**
@@ -584,16 +586,7 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
/** {@inheritDoc} */
@Override public Cursor findFirstOrLast(Session ses, boolean first) {
- ConcurrentNavigableMap<GridSearchRowPointer, GridH2Row> tree = treeForRead();
-
- Iterator<GridH2Row> iter = filter(first ? tree.values().iterator() : tree.descendingMap().values().iterator());
-
- GridSearchRowPointer res = null;
-
- if (iter.hasNext())
- res = iter.next();
-
- return new SingleRowCursor((Row)res);
+ throw DbException.throwInternalError();
}
/** {@inheritDoc} */
@@ -1537,14 +1530,19 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
/** */
final ConcurrentNavigableMap<GridSearchRowPointer, GridH2Row> tree;
+ /** */
+ final IndexingQueryFilter filter;
+
/**
* @param bounds Bounds.
* @param tree Snapshot.
*/
RangeSource(
Iterable<GridH2RowRangeBounds> bounds,
- ConcurrentNavigableMap<GridSearchRowPointer, GridH2Row> tree
+ ConcurrentNavigableMap<GridSearchRowPointer, GridH2Row> tree,
+ IndexingQueryFilter filter
) {
+ this.filter = filter;
this.tree = tree;
boundsIter = bounds.iterator();
}
@@ -1601,7 +1599,7 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
ConcurrentNavigableMap<GridSearchRowPointer,GridH2Row> t = tree != null ? tree : treeForRead();
- curRange = doFind0(t, first, true, last);
+ curRange = doFind0(t, first, true, last, filter);
if (!curRange.hasNext()) {
// We have to return empty range.
http://git-wip-us.apache.org/repos/asf/ignite/blob/084697b1/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSplitterSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSplitterSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSplitterSelfTest.java
index b7409c0..31eb421 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSplitterSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSplitterSelfTest.java
@@ -25,6 +25,7 @@ import java.util.Random;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.cache.CacheAtomicityMode;
import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.CachePeekMode;
import org.apache.ignite.cache.query.SqlFieldsQuery;
import org.apache.ignite.cache.query.annotations.QuerySqlField;
import org.apache.ignite.configuration.CacheConfiguration;
@@ -210,43 +211,76 @@ public class IgniteSqlSplitterSelfTest extends GridCommonAbstractTest {
/**
* @throws Exception If failed.
*/
- public void testNonCollocatedJoins() throws Exception {
- IgniteCache<Integer, Object> c = ignite(0).getOrCreateCache(cacheConfig("persOrg", true,
- Integer.class, Person.class, Integer.class, Organization.class));
+ public void testDistributedJoins() throws Exception {
+ CacheConfiguration ccfg = cacheConfig("persOrg", true,
+ Integer.class, Person.class, Integer.class, Organization.class);
+
+ IgniteCache<Integer, Object> c = ignite(0).getOrCreateCache(ccfg);
try {
awaitPartitionMapExchange();
- int key = 0;
+ doTestDistributedJoins(c, 30, 100, 1000, false);
+ doTestDistributedJoins(c, 30, 100, 1000, true);
+ }
+ finally {
+ c.destroy();
+ }
+ }
- for (int i = 0; i < 30; i++) {
- Organization o = new Organization();
+ /**
+ * @param c Cache.
+ * @param orgs Number of organizations.
+ * @param persons Number of persons.
+ * @param pageSize Page size.
+ * @param enforceJoinOrder Enforce join order.
+ */
+ private void doTestDistributedJoins(IgniteCache<Integer, Object> c, int orgs, int persons, int pageSize,
+ boolean enforceJoinOrder) {
+ assertEquals(0, c.size(CachePeekMode.ALL));
- o.name = "Org" + i;
+ int key = 0;
- c.put(key++, o);
- }
+ for (int i = 0; i < orgs; i++) {
+ Organization o = new Organization();
- Random rnd = new GridRandom();
+ o.name = "Org" + i;
- for (int i = 0; i < 100; i++) {
- Person p = new Person();
+ c.put(key++, o);
+ }
- p.name = "Person" + i;
- p.orgId = rnd.nextInt(30);
+ Random rnd = new GridRandom();
- c.put(key++, p);
- }
+ for (int i = 0; i < persons; i++) {
+ Person p = new Person();
- X.println("Plan : " + c.query(new SqlFieldsQuery("explain select count(*) from Person p, Organization o " +
- "where p.orgId = o._key").setDistributedJoins(true)).getAll());
+ p.name = "Person" + i;
+ p.orgId = rnd.nextInt(orgs);
- assertEquals(100L, c.query(new SqlFieldsQuery("select count(*) from Person p, Organization o " +
- "where p.orgId = o._key").setDistributedJoins(true)).getAll().get(0).get(0));
- }
- finally {
- c.destroy();
+ c.put(key++, p);
}
+
+ String select = "select count(*) from Organization o, Person p where p.orgId = o._key";
+
+ String plan = (String)c.query(new SqlFieldsQuery("explain " + select)
+ .setDistributedJoins(true).setEnforceJoinOrder(enforceJoinOrder).setPageSize(pageSize))
+ .getAll().get(0).get(0);
+
+ X.println("Plan : " + plan);
+
+ if (enforceJoinOrder)
+ assertTrue(plan, plan.contains("batched:broadcast"));
+ else
+ assertTrue(plan, plan.contains("batched:unicast"));
+
+ assertEquals(Long.valueOf(persons), c.query(new SqlFieldsQuery(select).setDistributedJoins(true)
+ .setEnforceJoinOrder(enforceJoinOrder).setPageSize(pageSize)).getAll().get(0).get(0));
+
+ c.clear();
+
+ assertEquals(0, c.size(CachePeekMode.ALL));
+ assertEquals(0L, c.query(new SqlFieldsQuery(select).setDistributedJoins(true)
+ .setEnforceJoinOrder(enforceJoinOrder).setPageSize(pageSize)).getAll().get(0).get(0));
}
/**
@@ -277,7 +311,6 @@ public class IgniteSqlSplitterSelfTest extends GridCommonAbstractTest {
*
*/
public void testFunctionNpe() {
- // TODO IGNITE-1886
IgniteCache<Integer, User> userCache = ignite(0).createCache(
cacheConfig("UserCache", true, Integer.class, User.class));
IgniteCache<Integer, UserOrder> userOrderCache = ignite(0).createCache(