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(