IGNITE-5010: DDL: additional tests for spatial dynamic indexes.

Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/f923bc91
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/f923bc91
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/f923bc91

Branch: refs/heads/ignite-4535
Commit: f923bc91fec38ad4e024ae1b395c5bf9a0a50e12
Parents: b1822da
Author: devozerov <voze...@gridgain.com>
Authored: Wed Apr 19 17:54:53 2017 +0300
Committer: devozerov <voze...@gridgain.com>
Committed: Wed Apr 19 17:54:53 2017 +0300

----------------------------------------------------------------------
 .../h2/GridBinaryH2IndexingGeoSelfTest.java     |  35 -
 .../query/h2/GridH2IndexingGeoSelfTest.java     | 470 -------------
 .../h2/GridH2IndexingSegmentedGeoSelfTest.java  |  37 -
 .../query/h2/H2IndexingAbstractGeoSelfTest.java | 673 +++++++++++++++++++
 .../query/h2/H2IndexingBinaryGeoSelfTest.java   |  30 +
 .../H2IndexingBinarySegmentedGeoSelfTest.java   |  30 +
 .../query/h2/H2IndexingGeoSelfTest.java         |  30 +
 .../h2/H2IndexingSegmentedGeoSelfTest.java      |  30 +
 .../testsuites/GeoSpatialIndexingTestSuite.java |  16 +-
 9 files changed, 802 insertions(+), 549 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/f923bc91/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridBinaryH2IndexingGeoSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridBinaryH2IndexingGeoSelfTest.java
 
b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridBinaryH2IndexingGeoSelfTest.java
deleted file mode 100644
index e271712..0000000
--- 
a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridBinaryH2IndexingGeoSelfTest.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.processors.query.h2;
-
-import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.internal.binary.BinaryMarshaller;
-
-/**
- * Geo-indexing test for binary mode.
- */
-public class GridBinaryH2IndexingGeoSelfTest extends GridH2IndexingGeoSelfTest 
{
-    /** {@inheritDoc} */
-    @Override protected IgniteConfiguration getConfiguration(String 
igniteInstanceName) throws Exception {
-        IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
-
-        cfg.setMarshaller(new BinaryMarshaller());
-
-        return cfg;
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/f923bc91/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridH2IndexingGeoSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridH2IndexingGeoSelfTest.java
 
b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridH2IndexingGeoSelfTest.java
deleted file mode 100644
index 4404e9c..0000000
--- 
a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridH2IndexingGeoSelfTest.java
+++ /dev/null
@@ -1,470 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.processors.query.h2;
-
-import com.vividsolutions.jts.geom.Geometry;
-import com.vividsolutions.jts.io.ParseException;
-import com.vividsolutions.jts.io.WKTReader;
-import java.io.Serializable;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ThreadLocalRandom;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
-import javax.cache.Cache;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.cache.CacheAtomicityMode;
-import org.apache.ignite.cache.CacheMode;
-import org.apache.ignite.cache.query.SqlFieldsQuery;
-import org.apache.ignite.cache.query.SqlQuery;
-import org.apache.ignite.cache.query.annotations.QuerySqlField;
-import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.internal.IgniteInternalFuture;
-import org.apache.ignite.internal.processors.cache.GridCacheAbstractSelfTest;
-import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.internal.util.typedef.internal.U;
-import org.apache.ignite.testframework.GridTestUtils;
-
-/**
- * Geo-indexing test.
- */
-public class GridH2IndexingGeoSelfTest extends GridCacheAbstractSelfTest {
-    /** */
-    private static final int CNT = 100;
-
-    /** */
-    private static final long DUR = 60000L;
-
-    /** Number of generated samples. */
-    public static final int ENEMYCAMP_SAMPLES_COUNT = 500;
-
-    /** Number of generated samples. */
-    public static final int ENEMY_SAMPLES_COUNT = 1000;
-
-    /** {@inheritDoc} */
-    @Override protected int gridCount() {
-        return 3;
-    }
-
-    /** {@inheritDoc} */
-    @Override protected long getTestTimeout() {
-        return DUR * 3;
-    }
-
-    /**
-     * @param name Cache name.
-     * @param partitioned Partition or replicated cache.
-     * @param idxTypes Indexed types.
-     * @return Cache configuration.
-     */
-    protected <K, V> CacheConfiguration<K, V> cacheConfig(String name, boolean 
partitioned,
-        Class<?>... idxTypes) throws Exception {
-        return new CacheConfiguration<K, V>(name)
-            .setName(name)
-            .setCacheMode(partitioned ? CacheMode.PARTITIONED : 
CacheMode.REPLICATED)
-            .setAtomicityMode(CacheAtomicityMode.ATOMIC)
-            .setIndexedTypes(idxTypes);
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testPrimitiveGeometry() throws Exception {
-        IgniteCache<Long, Geometry> cache = grid(0).getOrCreateCache(
-            this.<Long, Geometry>cacheConfig("geom", true, Long.class, 
Geometry.class));
-
-        try {
-            WKTReader r = new WKTReader();
-
-            for (long i = 0; i < 100; i++)
-                cache.put(i, r.read("POINT(" + i + " " + i + ")"));
-
-            List<List<?>> res = cache.query(new SqlFieldsQuery("explain select 
_key from Geometry where _val && ?")
-                .setArgs(r.read("POLYGON((5 70, 5 80, 30 80, 30 70, 5 
70))")).setLocal(true)).getAll();
-
-            assertTrue("__ explain: " + res, 
res.get(0).get(0).toString().toLowerCase().contains("_val_idx"));
-        }
-        finally {
-            cache.destroy();
-        }
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    @SuppressWarnings("unchecked")
-    public void testGeo() throws Exception {
-        IgniteCache<Integer, EnemyCamp> cache = grid(0).getOrCreateCache(
-            this.<Integer, EnemyCamp>cacheConfig("camp", true, Integer.class, 
EnemyCamp.class));
-
-        try {
-            WKTReader r = new WKTReader();
-
-            cache.getAndPut(0, new EnemyCamp(r.read("POINT(25 75)"), "A"));
-            cache.getAndPut(1, new EnemyCamp(r.read("POINT(70 70)"), "B"));
-            cache.getAndPut(2, new EnemyCamp(r.read("POINT(70 30)"), "C"));
-            cache.getAndPut(3, new EnemyCamp(r.read("POINT(75 25)"), "D"));
-
-            SqlQuery<Integer, EnemyCamp> qry = new SqlQuery(EnemyCamp.class, 
"coords && ?");
-
-            Collection<Cache.Entry<Integer, EnemyCamp>> res = cache.query(
-                qry.setArgs(r.read("POLYGON((5 70, 5 80, 30 80, 30 70, 5 
70))"))).getAll();
-
-            checkPoints(res, "A");
-
-            res = cache.query(
-                qry.setArgs(r.read("POLYGON((10 5, 10 35, 70 30, 75 25, 10 
5))"))).getAll();
-
-            checkPoints(res, "C", "D");
-
-            // Move B to the first polygon.
-            cache.getAndPut(1, new EnemyCamp(r.read("POINT(20 75)"), "B"));
-
-            res = cache.query(
-                qry.setArgs(r.read("POLYGON((5 70, 5 80, 30 80, 30 70, 5 
70))"))).getAll();
-
-            checkPoints(res, "A", "B");
-
-            // Move B to the second polygon.
-            cache.getAndPut(1, new EnemyCamp(r.read("POINT(30 30)"), "B"));
-
-            res = cache.query(
-                qry.setArgs(r.read("POLYGON((10 5, 10 35, 70 30, 75 25, 10 
5))"))).getAll();
-
-            checkPoints(res, "B", "C", "D");
-
-            // Remove B.
-            cache.getAndRemove(1);
-
-            res = cache.query(
-                qry.setArgs(r.read("POLYGON((5 70, 5 80, 30 80, 30 70, 5 
70))"))).getAll();
-
-            checkPoints(res, "A");
-
-            res = cache.query(
-                qry.setArgs(r.read("POLYGON((10 5, 10 35, 70 30, 75 25, 10 
5))"))).getAll();
-
-            checkPoints(res, "C", "D");
-
-            // Check explaint request.
-            assertTrue(F.first(cache.query(new SqlFieldsQuery("explain select 
* from EnemyCamp " +
-                "where coords && 'POINT(25 
75)'")).getAll()).get(0).toString().toLowerCase().contains("coords_idx"));
-        }
-        finally {
-            cache.destroy();
-        }
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    @SuppressWarnings("unchecked")
-    public void testGeoMultithreaded() throws Exception {
-        final CacheConfiguration<Integer, EnemyCamp> ccfg = 
cacheConfig("camp", true, Integer.class, EnemyCamp.class);
-
-        final IgniteCache<Integer, EnemyCamp> cache1 = 
grid(0).getOrCreateCache(ccfg);
-        final IgniteCache<Integer, EnemyCamp> cache2 = grid(1).cache("camp");
-        final IgniteCache<Integer, EnemyCamp> cache3 = grid(2).cache("camp");
-
-        try {
-            final String[] points = new String[CNT];
-
-            WKTReader r = new WKTReader();
-
-            ThreadLocalRandom rnd = ThreadLocalRandom.current();
-
-            for (int idx = 0; idx < CNT; idx++) {
-                int x = rnd.nextInt(1, 100);
-                int y = rnd.nextInt(1, 100);
-
-                cache1.getAndPut(idx, new EnemyCamp(r.read("POINT(" + x + " " 
+ y + ")"), Integer.toString(idx)));
-
-                points[idx] = Integer.toString(idx);
-            }
-
-            Thread.sleep(200);
-
-            final AtomicBoolean stop = new AtomicBoolean();
-            final AtomicReference<Exception> err = new AtomicReference<>();
-
-            IgniteInternalFuture<?> putFut = 
GridTestUtils.runMultiThreadedAsync(new Callable<Void>() {
-                @Override public Void call() throws Exception {
-                    WKTReader r = new WKTReader();
-
-                    ThreadLocalRandom rnd = ThreadLocalRandom.current();
-
-                    while (!stop.get()) {
-                        int cacheIdx = rnd.nextInt(0, 3);
-
-                        IgniteCache<Integer, EnemyCamp> cache = cacheIdx == 0 
? cache1 : cacheIdx == 1 ? cache2 : cache3;
-
-                        int idx = rnd.nextInt(CNT);
-                        int x = rnd.nextInt(1, 100);
-                        int y = rnd.nextInt(1, 100);
-
-                        cache.getAndPut(idx, new EnemyCamp(r.read("POINT(" + x 
+ " " + y + ")"), Integer.toString(idx)));
-
-                        U.sleep(50);
-                    }
-
-                    return null;
-                }
-            }, Runtime.getRuntime().availableProcessors(), "put-thread");
-
-            IgniteInternalFuture<?> qryFut = 
GridTestUtils.runMultiThreadedAsync(new Callable<Void>() {
-                @Override public Void call() throws Exception {
-                    WKTReader r = new WKTReader();
-
-                    ThreadLocalRandom rnd = ThreadLocalRandom.current();
-
-                    while (!stop.get()) {
-                        try {
-                            int cacheIdx = rnd.nextInt(0, 3);
-
-                            IgniteCache<Integer, EnemyCamp> cache = cacheIdx 
== 0 ? cache1 : cacheIdx == 1 ? cache2 : cache3;
-
-                            SqlQuery<Integer, EnemyCamp> qry = new SqlQuery<>(
-                                EnemyCamp.class, "coords && ?");
-
-                            Collection<Cache.Entry<Integer, EnemyCamp>> res = 
cache.query(qry.setArgs(
-                                r.read("POLYGON((0 0, 0 100, 100 100, 100 0, 0 
0))"))).getAll();
-
-                            checkPoints(res, points);
-
-                            U.sleep(5);
-                        }
-                        catch (Exception e) {
-                            err.set(e);
-
-                            stop.set(true);
-
-                            break;
-                        }
-                    }
-
-                    return null;
-                }
-            }, 4, "qry-thread");
-
-            U.sleep(6000L);
-
-            stop.set(true);
-
-            putFut.get();
-            qryFut.get();
-
-            Exception err0 = err.get();
-
-            if (err0 != null)
-                throw err0;
-        }
-        finally {
-            cache1.destroy();
-        }
-    }
-
-    /**
-     * Check whether result contains all required points.
-     *
-     * @param res Result.
-     * @param points Expected points.
-     */
-    private void checkPoints(Collection<Cache.Entry<Integer, EnemyCamp>> res, 
String... points) {
-        Set<String> set = new HashSet<>(Arrays.asList(points));
-
-        assertEquals(set.size(), res.size());
-
-        for (Cache.Entry<Integer, EnemyCamp> e : res)
-            assertTrue(set.remove(e.getValue().name));
-    }
-
-    /**
-     * @throws Exception if fails.
-     */
-    public void testSegmentedGeoIndexJoin() throws Exception {
-        IgniteCache<Integer, Enemy> c1 = ignite(0).getOrCreateCache(
-            this.<Integer, Enemy>cacheConfig("enemy", true, Integer.class, 
Enemy.class));
-        IgniteCache<Integer, EnemyCamp> c2 = ignite(0).getOrCreateCache(
-            this.<Integer, EnemyCamp>cacheConfig("camp", true, Integer.class, 
EnemyCamp.class));
-
-        try {
-            fillCache();
-
-            checkDistributedQuery();
-
-            checkLocalQuery();
-        }
-        finally {
-            c1.destroy();
-            c2.destroy();
-        }
-    }
-
-    /**
-     * @throws Exception if fails.
-     */
-    public void testSegmentedGeoIndexJoin2() throws Exception {
-        IgniteCache<Integer, Enemy> c1 = ignite(0).getOrCreateCache(
-            this.<Integer, Enemy>cacheConfig("enemy", true, Integer.class, 
Enemy.class));
-        IgniteCache<Integer, EnemyCamp> c2 = ignite(0).getOrCreateCache(
-            this.<Integer, EnemyCamp>cacheConfig("camp", false, Integer.class, 
EnemyCamp.class));
-
-        try {
-            fillCache();
-
-            checkDistributedQuery();
-
-            checkLocalQuery();
-        }
-        finally {
-            c1.destroy();
-            c2.destroy();
-        }
-    }
-
-    /** */
-    private void checkDistributedQuery() throws ParseException {
-        IgniteCache<Integer, Enemy> c1 = ignite(0).cache("enemy");
-        IgniteCache<Integer, EnemyCamp> c2 = ignite(0).cache("camp");
-
-        final Geometry lethalArea = new WKTReader().read("POLYGON((30 30, 30 
70, 70 70, 70 30, 30 30))");
-
-        int expectedEnemies = 0;
-
-        for (Cache.Entry<Integer, Enemy> e : c1) {
-            final Integer campID = e.getValue().campId;
-
-            if (30 <= campID && campID < ENEMYCAMP_SAMPLES_COUNT) {
-                final EnemyCamp camp = c2.get(campID);
-
-                if (lethalArea.covers(camp.coords))
-                    expectedEnemies++;
-            }
-        }
-
-        final SqlFieldsQuery query = new SqlFieldsQuery("select e._val, c._val 
from \"enemy\".Enemy e, \"camp\".EnemyCamp c " +
-            "where e.campId = c._key and c.coords && ?").setArgs(lethalArea);
-
-        List<List<?>> result = 
c1.query(query.setDistributedJoins(true)).getAll();
-
-        assertEquals(expectedEnemies, result.size());
-    }
-
-    /** */
-    private void checkLocalQuery() throws ParseException {
-        IgniteCache<Integer, Enemy> c1 = ignite(0).cache("enemy");
-        IgniteCache<Integer, EnemyCamp> c2 = ignite(0).cache("camp");
-
-        final Geometry lethalArea = new WKTReader().read("POLYGON((30 30, 30 
70, 70 70, 70 30, 30 30))");
-
-        Set<Integer> localCampsIDs = new HashSet<>();
-
-        for(Cache.Entry<Integer, EnemyCamp> e : c2.localEntries())
-            localCampsIDs.add(e.getKey());
-
-        int expectedEnemies = 0;
-
-        for (Cache.Entry<Integer, Enemy> e : c1.localEntries()) {
-            final Integer campID = e.getValue().campId;
-
-            if (localCampsIDs.contains(campID)) {
-                final EnemyCamp camp = c2.get(campID);
-
-                if (lethalArea.covers(camp.coords))
-                    expectedEnemies++;
-            }
-        }
-
-        final SqlFieldsQuery query = new SqlFieldsQuery("select e._val, c._val 
from \"enemy\".Enemy e, \"camp\".EnemyCamp c " +
-            "where e.campId = c._key and c.coords && ?").setArgs(lethalArea);
-
-        List<List<?>> result = c1.query(query.setLocal(true)).getAll();
-
-        assertEquals(expectedEnemies, result.size());
-    }
-
-    /** */
-    private void fillCache() throws ParseException {
-        IgniteCache<Integer, Enemy> c1 = ignite(0).cache("enemy");
-        IgniteCache<Integer, EnemyCamp> c2 = ignite(0).cache("camp");
-
-        final ThreadLocalRandom rnd = ThreadLocalRandom.current();
-
-        WKTReader r = new WKTReader();
-
-        for (int i = 0; i < ENEMYCAMP_SAMPLES_COUNT; i++) {
-            final String point = String.format("POINT(%d %d)", 
rnd.nextInt(100), rnd.nextInt(100));
-
-            c2.put(i, new EnemyCamp(r.read(point), "camp-" + i));
-        }
-
-        for (int i = 0; i < ENEMY_SAMPLES_COUNT; i++) {
-            int campID = 30 + rnd.nextInt(ENEMYCAMP_SAMPLES_COUNT + 10);
-
-            c1.put(i, new Enemy(campID, "enemy-" + i));
-        }
-    }
-
-    /**
-     *
-     */
-    private static class Enemy {
-        /** */
-        @QuerySqlField
-        int campId;
-
-        /** */
-        @QuerySqlField
-        String name;
-
-        /**
-         * @param campId Camp ID.
-         * @param name Name.
-         */
-        public Enemy(int campId, String name) {
-            this.campId = campId;
-            this.name = name;
-        }
-    }
-
-    /**
-     *
-     */
-    protected static class EnemyCamp implements Serializable {
-        /** */
-        @QuerySqlField(index = true)
-        Geometry coords;
-
-        /** */
-        @QuerySqlField
-        private String name;
-
-        /**
-         * @param coords Coordinates.
-         * @param name Name.
-         */
-        EnemyCamp(Geometry coords, String name) {
-            this.coords = coords;
-            this.name = name;
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/f923bc91/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridH2IndexingSegmentedGeoSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridH2IndexingSegmentedGeoSelfTest.java
 
b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridH2IndexingSegmentedGeoSelfTest.java
deleted file mode 100644
index eb0fd0f..0000000
--- 
a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridH2IndexingSegmentedGeoSelfTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.processors.query.h2;
-
-import org.apache.ignite.configuration.CacheConfiguration;
-
-/**
- * Test for segmented geo index.
- */
-public class GridH2IndexingSegmentedGeoSelfTest extends 
GridH2IndexingGeoSelfTest {
-    /** */
-    private static int QRY_PARALLELISM_LVL = 7;
-
-    /** {@inheritDoc} */
-    @Override
-    protected <K, V> CacheConfiguration<K, V> cacheConfig(String name, boolean 
partitioned,
-        Class<?>... idxTypes) throws Exception {
-        final CacheConfiguration<K, V> ccfg = super.cacheConfig(name, 
partitioned, idxTypes);
-
-        return ccfg.setQueryParallelism(partitioned ? QRY_PARALLELISM_LVL : 1);
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/f923bc91/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingAbstractGeoSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingAbstractGeoSelfTest.java
 
b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingAbstractGeoSelfTest.java
new file mode 100644
index 0000000..914bb62
--- /dev/null
+++ 
b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingAbstractGeoSelfTest.java
@@ -0,0 +1,673 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query.h2;
+
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.io.ParseException;
+import com.vividsolutions.jts.io.WKTReader;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.QueryEntity;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.cache.QueryIndexType;
+import org.apache.ignite.cache.query.SqlFieldsQuery;
+import org.apache.ignite.cache.query.SqlQuery;
+import org.apache.ignite.cache.query.annotations.QuerySqlField;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.binary.BinaryMarshaller;
+import org.apache.ignite.internal.processors.cache.GridCacheAbstractSelfTest;
+import org.apache.ignite.internal.processors.query.QueryUtils;
+import org.apache.ignite.internal.util.GridStringBuilder;
+import org.apache.ignite.internal.util.typedef.internal.SB;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.testframework.GridTestUtils;
+
+import javax.cache.Cache;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * Geo-indexing test.
+ */
+public abstract class H2IndexingAbstractGeoSelfTest extends 
GridCacheAbstractSelfTest {
+    /** */
+    private static final int CNT = 100;
+
+    /** */
+    private static final long DUR = 60000L;
+
+    /** Number of generated samples. */
+    public static final int ENEMYCAMP_SAMPLES_COUNT = 500;
+
+    /** Number of generated samples. */
+    public static final int ENEMY_SAMPLES_COUNT = 1000;
+
+    /** */
+    private static final int QRY_PARALLELISM_LVL = 7;
+
+    /** Binary marshaller flag. */
+    private final boolean binary;
+
+    /** Segmented index flag. */
+    private final boolean segmented;
+
+    /**
+     * Constructor.
+     *
+     * @param binary Binary marshaller flag.
+     * @param segmented Segmented index flag.
+     */
+    protected H2IndexingAbstractGeoSelfTest(boolean binary, boolean segmented) 
{
+        this.binary = binary;
+        this.segmented = segmented;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected int gridCount() {
+        return 3;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected long getTestTimeout() {
+        return DUR * 3;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String 
igniteInstanceName) throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
+
+        if (binary)
+            cfg.setMarshaller(new BinaryMarshaller());
+
+        return cfg;
+    }
+
+    /**
+     * Create cache.
+     *
+     * @param name Name.
+     * @param partitioned Partitioned flag.
+     * @param keyCls Key class.
+     * @param valCls Value class.
+     * @return Cache.
+     * @throws Exception If failed.
+     */
+    @SuppressWarnings("unchecked")
+    protected <K, V> IgniteCache<K, V> createCache(String name, boolean 
partitioned, Class<?> keyCls, Class<?> valCls)
+        throws Exception {
+        return createCache(name, partitioned, keyCls, valCls, false);
+    }
+
+    /**
+     * Create cache.
+     *
+     * @param name Name.
+     * @param partitioned Partitioned flag.
+     * @param keyCls Key class.
+     * @param valCls Value class.
+     * @param dynamicIdx Whether index should be created dynamically.
+     * @return Cache.
+     * @throws Exception If failed.
+     */
+    @SuppressWarnings("unchecked")
+    protected <K, V> IgniteCache<K, V> createCache(String name, boolean 
partitioned, Class<?> keyCls, Class<?> valCls,
+        boolean dynamicIdx) throws Exception {
+        CacheConfiguration<K, V> ccfg = cacheConfig(name, partitioned, keyCls, 
valCls);
+
+        if (dynamicIdx) {
+            Collection<QueryEntity> entities = ccfg.getQueryEntities();
+
+            assertEquals(1, entities.size());
+
+            QueryEntity entity = entities.iterator().next();
+
+            Collection<QueryIndex> idxs = new ArrayList<>(entity.getIndexes());
+
+            entity.clearIndexes();
+
+            IgniteCache<K, V> cache = grid(0).getOrCreateCache(ccfg);
+
+            // Process indexes dynamically.
+            for (QueryIndex idx : idxs)
+                createDynamicIndex(cache, entity, idx);
+
+            return cache;
+        }
+        else
+            return grid(0).getOrCreateCache(ccfg);
+    }
+
+    /**
+     * Create dynamic index.
+     *
+     * @param cache Cache.
+     * @param entity Entity.
+     * @param idx Index.
+     * @throws Exception If failed.
+     */
+    private void createDynamicIndex(IgniteCache cache, QueryEntity entity, 
QueryIndex idx) throws Exception {
+        boolean spatial = idx.getIndexType() == QueryIndexType.GEOSPATIAL;
+
+        GridStringBuilder sb = new SB("CREATE ")
+            .a(spatial ? "SPATIAL " : "")
+            .a("INDEX ")
+            .a(idx.getName())
+            .a(" ON ")
+            .a(QueryUtils.tableName(entity))
+            .a(" (");
+
+        boolean first = true;
+
+        for (Map.Entry<String, Boolean> fieldEntry : 
idx.getFields().entrySet()) {
+            if (first)
+                first = false;
+            else
+                sb.a(", ");
+
+            String name = fieldEntry.getKey();
+            boolean asc = fieldEntry.getValue();
+
+            sb.a("\"" + name + "\"").a(" ").a(asc ? "ASC" : "DESC");
+        }
+
+        sb.a(')');
+
+        String sql = sb.toString();
+
+        cache.query(new SqlFieldsQuery(sql)).getAll();
+    }
+
+    /**
+     * @param name Cache name.
+     * @param partitioned Partition or replicated cache.
+     * @param keyCls Key class.
+     * @param valCls Value class.
+     * @return Cache configuration.
+     */
+    private <K, V> CacheConfiguration<K, V> cacheConfig(String name, boolean 
partitioned, Class<?> keyCls,
+        Class<?> valCls) throws Exception {
+        CacheConfiguration<K, V> ccfg = new CacheConfiguration<K, V>(name)
+            .setName(name)
+            .setCacheMode(partitioned ? CacheMode.PARTITIONED : 
CacheMode.REPLICATED)
+            .setAtomicityMode(CacheAtomicityMode.ATOMIC)
+            .setIndexedTypes(keyCls, valCls);
+
+        if (segmented)
+            ccfg.setQueryParallelism(partitioned ? QRY_PARALLELISM_LVL : 1);
+
+        return ccfg;
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testPrimitiveGeometry() throws Exception {
+        IgniteCache<Long, Geometry> cache = createCache("geom", true, 
Long.class, Geometry.class);
+
+        try {
+            WKTReader r = new WKTReader();
+
+            for (long i = 0; i < 100; i++)
+                cache.put(i, r.read("POINT(" + i + " " + i + ")"));
+
+            String plan = cache.query(new SqlFieldsQuery("explain select _key 
from Geometry where _val && ?")
+                .setArgs(r.read("POLYGON((5 70, 5 80, 30 80, 30 70, 5 
70))")).setLocal(true))
+                .getAll().get(0).get(0).toString().toLowerCase();
+
+            assertTrue("__ explain: " + plan, plan.contains("_val_idx"));
+        }
+        finally {
+            cache.destroy();
+        }
+    }
+
+    /**
+     * Test geo-index (static).
+     *
+     * @throws Exception If failed.
+     */
+    public void testGeo() throws Exception {
+        checkGeo(false);
+    }
+
+    /**
+     * Test geo-index (dynamic).
+     *
+     * @throws Exception If failed.
+     */
+    public void testGeoDynamic() throws Exception {
+        checkGeo(true);
+    }
+
+    /**
+     * Check geo-index (dynamic).
+     *
+     * @param dynamic Whether index should be created dynamically.
+     * @throws Exception If failed.
+     */
+    @SuppressWarnings({"unchecked", "ConstantConditions"})
+    private void checkGeo(boolean dynamic) throws Exception {
+        IgniteCache<Integer, EnemyCamp> cache = createCache("camp", true, 
Integer.class, EnemyCamp.class, dynamic);
+
+        try {
+            WKTReader r = new WKTReader();
+
+            cache.getAndPut(0, new EnemyCamp(r.read("POINT(25 75)"), "A"));
+            cache.getAndPut(1, new EnemyCamp(r.read("POINT(70 70)"), "B"));
+            cache.getAndPut(2, new EnemyCamp(r.read("POINT(70 30)"), "C"));
+            cache.getAndPut(3, new EnemyCamp(r.read("POINT(75 25)"), "D"));
+
+            SqlQuery<Integer, EnemyCamp> qry = new SqlQuery(EnemyCamp.class, 
"coords && ?");
+
+            Collection<Cache.Entry<Integer, EnemyCamp>> res = cache.query(
+                qry.setArgs(r.read("POLYGON((5 70, 5 80, 30 80, 30 70, 5 
70))"))).getAll();
+
+            checkPoints(res, "A");
+
+            res = cache.query(
+                qry.setArgs(r.read("POLYGON((10 5, 10 35, 70 30, 75 25, 10 
5))"))).getAll();
+
+            checkPoints(res, "C", "D");
+
+            // Move B to the first polygon.
+            cache.getAndPut(1, new EnemyCamp(r.read("POINT(20 75)"), "B"));
+
+            res = cache.query(
+                qry.setArgs(r.read("POLYGON((5 70, 5 80, 30 80, 30 70, 5 
70))"))).getAll();
+
+            checkPoints(res, "A", "B");
+
+            // Move B to the second polygon.
+            cache.getAndPut(1, new EnemyCamp(r.read("POINT(30 30)"), "B"));
+
+            res = cache.query(
+                qry.setArgs(r.read("POLYGON((10 5, 10 35, 70 30, 75 25, 10 
5))"))).getAll();
+
+            checkPoints(res, "B", "C", "D");
+
+            // Remove B.
+            cache.getAndRemove(1);
+
+            res = cache.query(
+                qry.setArgs(r.read("POLYGON((5 70, 5 80, 30 80, 30 70, 5 
70))"))).getAll();
+
+            checkPoints(res, "A");
+
+            res = cache.query(
+                qry.setArgs(r.read("POLYGON((10 5, 10 35, 70 30, 75 25, 10 
5))"))).getAll();
+
+            checkPoints(res, "C", "D");
+
+            // Check explain request.
+            String plan = cache.query(new SqlFieldsQuery("explain select * 
from EnemyCamp " +
+                "where coords && 'POINT(25 
75)'")).getAll().get(0).get(0).toString().toLowerCase();
+
+            assertTrue("__ explain: " + plan, plan.contains("coords_idx"));
+
+            if (dynamic)
+                cache.query(new SqlFieldsQuery("DROP INDEX 
coords_idx")).getAll();
+        }
+        finally {
+            cache.destroy();
+        }
+    }
+
+    /**
+     * Test geo indexing multithreaded.
+     *
+     * @throws Exception If failed.
+     */
+    public void testGeoMultithreaded() throws Exception {
+        checkGeoMultithreaded(false);
+    }
+
+    /**
+     * Test geo indexing multithreaded with dynamic index creation.
+     *
+     * @throws Exception If failed.
+     */
+    public void testGeoMultithreadedDynamic() throws Exception {
+        checkGeoMultithreaded(true);
+    }
+
+    /**
+     * Check geo indexing multithreaded with dynamic index creation.
+     *
+     * @param dynamic Whether index should be created dynamically.
+     * @throws Exception If failed.
+     */
+    @SuppressWarnings("unchecked")
+    private void checkGeoMultithreaded(boolean dynamic) throws Exception {
+        final IgniteCache<Integer, EnemyCamp> cache1 =
+            createCache("camp", true, Integer.class, EnemyCamp.class, dynamic);
+
+        final IgniteCache<Integer, EnemyCamp> cache2 = grid(1).cache("camp");
+        final IgniteCache<Integer, EnemyCamp> cache3 = grid(2).cache("camp");
+
+        try {
+            final String[] points = new String[CNT];
+
+            WKTReader r = new WKTReader();
+
+            ThreadLocalRandom rnd = ThreadLocalRandom.current();
+
+            for (int idx = 0; idx < CNT; idx++) {
+                int x = rnd.nextInt(1, 100);
+                int y = rnd.nextInt(1, 100);
+
+                cache1.getAndPut(idx, new EnemyCamp(r.read("POINT(" + x + " " 
+ y + ")"), Integer.toString(idx)));
+
+                points[idx] = Integer.toString(idx);
+            }
+
+            Thread.sleep(200);
+
+            final AtomicBoolean stop = new AtomicBoolean();
+            final AtomicReference<Exception> err = new AtomicReference<>();
+
+            IgniteInternalFuture<?> putFut = 
GridTestUtils.runMultiThreadedAsync(new Callable<Void>() {
+                @Override public Void call() throws Exception {
+                    WKTReader r = new WKTReader();
+
+                    ThreadLocalRandom rnd = ThreadLocalRandom.current();
+
+                    while (!stop.get()) {
+                        int cacheIdx = rnd.nextInt(0, 3);
+
+                        IgniteCache<Integer, EnemyCamp> cache = cacheIdx == 0 
? cache1 : cacheIdx == 1 ? cache2 : cache3;
+
+                        int idx = rnd.nextInt(CNT);
+                        int x = rnd.nextInt(1, 100);
+                        int y = rnd.nextInt(1, 100);
+
+                        cache.getAndPut(idx, new EnemyCamp(r.read("POINT(" + x 
+ " " + y + ")"), Integer.toString(idx)));
+
+                        U.sleep(50);
+                    }
+
+                    return null;
+                }
+            }, Runtime.getRuntime().availableProcessors(), "put-thread");
+
+            IgniteInternalFuture<?> qryFut = 
GridTestUtils.runMultiThreadedAsync(new Callable<Void>() {
+                @Override public Void call() throws Exception {
+                    WKTReader r = new WKTReader();
+
+                    ThreadLocalRandom rnd = ThreadLocalRandom.current();
+
+                    while (!stop.get()) {
+                        try {
+                            int cacheIdx = rnd.nextInt(0, 3);
+
+                            IgniteCache<Integer, EnemyCamp> cache = cacheIdx 
== 0 ? cache1 : cacheIdx == 1 ? cache2 : cache3;
+
+                            SqlQuery<Integer, EnemyCamp> qry = new SqlQuery<>(
+                                EnemyCamp.class, "coords && ?");
+
+                            Collection<Cache.Entry<Integer, EnemyCamp>> res = 
cache.query(qry.setArgs(
+                                r.read("POLYGON((0 0, 0 100, 100 100, 100 0, 0 
0))"))).getAll();
+
+                            checkPoints(res, points);
+
+                            U.sleep(5);
+                        }
+                        catch (Exception e) {
+                            err.set(e);
+
+                            stop.set(true);
+
+                            break;
+                        }
+                    }
+
+                    return null;
+                }
+            }, 4, "qry-thread");
+
+            U.sleep(6000L);
+
+            stop.set(true);
+
+            putFut.get();
+            qryFut.get();
+
+            Exception err0 = err.get();
+
+            if (err0 != null)
+                throw err0;
+        }
+        finally {
+            cache1.destroy();
+        }
+    }
+
+    /**
+     * Check whether result contains all required points.
+     *
+     * @param res Result.
+     * @param points Expected points.
+     */
+    private void checkPoints(Collection<Cache.Entry<Integer, EnemyCamp>> res, 
String... points) {
+        Set<String> set = new HashSet<>(Arrays.asList(points));
+
+        assertEquals(set.size(), res.size());
+
+        for (Cache.Entry<Integer, EnemyCamp> e : res)
+            assertTrue(set.remove(e.getValue().name));
+    }
+
+    /**
+     * Test segmented geo-index join on PARTITIONED cache.
+     *
+     * @throws Exception if fails.
+     */
+    public void testSegmentedGeoIndexJoinPartitioned() throws Exception {
+        checkSegmentedGeoIndexJoin(true, false);
+    }
+
+    /**
+     * Test segmented geo-index join on PARTITIONED cache with dynamically 
created index.
+     *
+     * @throws Exception if fails.
+     */
+    public void testSegmentedGeoIndexJoinPartitionedDynamic() throws Exception 
{
+        checkSegmentedGeoIndexJoin(true, true);
+    }
+
+    /**
+     * Test segmented geo-index join on REPLICATED cache.
+     *
+     * @throws Exception if fails.
+     */
+    public void testSegmentedGeoIndexJoinReplicated() throws Exception {
+        checkSegmentedGeoIndexJoin(false, false);
+    }
+
+    /**
+     * Test segmented geo-index join on REPLICATED cache with dynamically 
created index.
+     *
+     * @throws Exception if fails.
+     */
+    public void testSegmentedGeoIndexJoinReplicatedDynamic() throws Exception {
+        checkSegmentedGeoIndexJoin(false, true);
+    }
+
+    /**
+     * Check segmented geo-index join.
+     *
+     * @param partitioned Partitioned flag.
+     * @param dynamic Whether index should be created dynamically.
+     * @throws Exception If failed.
+     */
+    private void checkSegmentedGeoIndexJoin(boolean partitioned, boolean 
dynamic) throws Exception {
+        IgniteCache<Integer, Enemy> c1 = createCache("enemy", true, 
Integer.class, Enemy.class);
+        IgniteCache<Integer, EnemyCamp> c2 = createCache("camp", partitioned, 
Integer.class, EnemyCamp.class, dynamic);
+
+        try {
+            final ThreadLocalRandom rnd = ThreadLocalRandom.current();
+
+            WKTReader r = new WKTReader();
+
+            for (int i = 0; i < ENEMYCAMP_SAMPLES_COUNT; i++) {
+                final String point = String.format("POINT(%d %d)", 
rnd.nextInt(100), rnd.nextInt(100));
+
+                c2.put(i, new EnemyCamp(r.read(point), "camp-" + i));
+            }
+
+            for (int i = 0; i < ENEMY_SAMPLES_COUNT; i++) {
+                int campID = 30 + rnd.nextInt(ENEMYCAMP_SAMPLES_COUNT + 10);
+
+                c1.put(i, new Enemy(campID, "enemy-" + i));
+            }
+
+            checkDistributedQuery();
+
+            checkLocalQuery();
+        }
+        finally {
+            c1.destroy();
+            c2.destroy();
+        }
+    }
+
+    /**
+     * Check distributed query.
+     *
+     * @throws ParseException If failed.
+     */
+    private void checkDistributedQuery() throws ParseException {
+        IgniteCache<Integer, Enemy> c1 = grid(0).cache("enemy");
+        IgniteCache<Integer, EnemyCamp> c2 = grid(0).cache("camp");
+
+        final Geometry lethalArea = new WKTReader().read("POLYGON((30 30, 30 
70, 70 70, 70 30, 30 30))");
+
+        int expectedEnemies = 0;
+
+        for (Cache.Entry<Integer, Enemy> e : c1) {
+            final Integer campID = e.getValue().campId;
+
+            if (30 <= campID && campID < ENEMYCAMP_SAMPLES_COUNT) {
+                final EnemyCamp camp = c2.get(campID);
+
+                if (lethalArea.covers(camp.coords))
+                    expectedEnemies++;
+            }
+        }
+
+        final SqlFieldsQuery query = new SqlFieldsQuery("select e._val, c._val 
from \"enemy\".Enemy e, \"camp\".EnemyCamp c " +
+            "where e.campId = c._key and c.coords && ?").setArgs(lethalArea);
+
+        List<List<?>> result = 
c1.query(query.setDistributedJoins(true)).getAll();
+
+        assertEquals(expectedEnemies, result.size());
+    }
+
+    /**
+     * Check local query.
+     *
+     * @throws ParseException If failed.
+     */
+    private void checkLocalQuery() throws ParseException {
+        IgniteCache<Integer, Enemy> c1 = grid(0).cache("enemy");
+        IgniteCache<Integer, EnemyCamp> c2 = grid(0).cache("camp");
+
+        final Geometry lethalArea = new WKTReader().read("POLYGON((30 30, 30 
70, 70 70, 70 30, 30 30))");
+
+        Set<Integer> localCampsIDs = new HashSet<>();
+
+        for(Cache.Entry<Integer, EnemyCamp> e : c2.localEntries())
+            localCampsIDs.add(e.getKey());
+
+        int expectedEnemies = 0;
+
+        for (Cache.Entry<Integer, Enemy> e : c1.localEntries()) {
+            final Integer campID = e.getValue().campId;
+
+            if (localCampsIDs.contains(campID)) {
+                final EnemyCamp camp = c2.get(campID);
+
+                if (lethalArea.covers(camp.coords))
+                    expectedEnemies++;
+            }
+        }
+
+        final SqlFieldsQuery query = new SqlFieldsQuery("select e._val, c._val 
from \"enemy\".Enemy e, " +
+            "\"camp\".EnemyCamp c where e.campId = c._key and c.coords && 
?").setArgs(lethalArea);
+
+        List<List<?>> result = c1.query(query.setLocal(true)).getAll();
+
+        assertEquals(expectedEnemies, result.size());
+    }
+
+    /**
+     *
+     */
+    private static class Enemy {
+        /** */
+        @QuerySqlField
+        int campId;
+
+        /** */
+        @QuerySqlField
+        String name;
+
+        /**
+         * @param campId Camp ID.
+         * @param name Name.
+         */
+        public Enemy(int campId, String name) {
+            this.campId = campId;
+            this.name = name;
+        }
+    }
+
+    /**
+     *
+     */
+    protected static class EnemyCamp implements Serializable {
+        /** */
+        @QuerySqlField(index = true)
+        Geometry coords;
+
+        /** */
+        @QuerySqlField
+        private String name;
+
+        /**
+         * @param coords Coordinates.
+         * @param name Name.
+         */
+        EnemyCamp(Geometry coords, String name) {
+            this.coords = coords;
+            this.name = name;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/f923bc91/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingBinaryGeoSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingBinaryGeoSelfTest.java
 
b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingBinaryGeoSelfTest.java
new file mode 100644
index 0000000..eb3ec6e
--- /dev/null
+++ 
b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingBinaryGeoSelfTest.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query.h2;
+
+/**
+ * Geo-indexing test for binary mode.
+ */
+public class H2IndexingBinaryGeoSelfTest extends H2IndexingAbstractGeoSelfTest 
{
+    /**
+     * Constructor.
+     */
+    public H2IndexingBinaryGeoSelfTest() {
+        super(true, false);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/f923bc91/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingBinarySegmentedGeoSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingBinarySegmentedGeoSelfTest.java
 
b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingBinarySegmentedGeoSelfTest.java
new file mode 100644
index 0000000..fe94a3d
--- /dev/null
+++ 
b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingBinarySegmentedGeoSelfTest.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query.h2;
+
+/**
+ * Geo-indexing test for binary mode and segmented cache.
+ */
+public class H2IndexingBinarySegmentedGeoSelfTest extends 
H2IndexingAbstractGeoSelfTest {
+    /**
+     * Constructor.
+     */
+    public H2IndexingBinarySegmentedGeoSelfTest() {
+        super(true, true);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/f923bc91/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingGeoSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingGeoSelfTest.java
 
b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingGeoSelfTest.java
new file mode 100644
index 0000000..280c946
--- /dev/null
+++ 
b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingGeoSelfTest.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query.h2;
+
+/**
+ * Geo-indexing test.
+ */
+public class H2IndexingGeoSelfTest extends H2IndexingAbstractGeoSelfTest {
+    /**
+     * Constructor.
+     */
+    public H2IndexingGeoSelfTest() {
+        super(false, false);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/f923bc91/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingSegmentedGeoSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingSegmentedGeoSelfTest.java
 
b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingSegmentedGeoSelfTest.java
new file mode 100644
index 0000000..b2cf781
--- /dev/null
+++ 
b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingSegmentedGeoSelfTest.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query.h2;
+
+/**
+ * Test for segmented geo index.
+ */
+public class H2IndexingSegmentedGeoSelfTest extends 
H2IndexingAbstractGeoSelfTest {
+    /**
+     * Constructor.
+     */
+    public H2IndexingSegmentedGeoSelfTest() {
+        super(false, true);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/f923bc91/modules/geospatial/src/test/java/org/apache/ignite/testsuites/GeoSpatialIndexingTestSuite.java
----------------------------------------------------------------------
diff --git 
a/modules/geospatial/src/test/java/org/apache/ignite/testsuites/GeoSpatialIndexingTestSuite.java
 
b/modules/geospatial/src/test/java/org/apache/ignite/testsuites/GeoSpatialIndexingTestSuite.java
index 3907b9e..2395b93 100644
--- 
a/modules/geospatial/src/test/java/org/apache/ignite/testsuites/GeoSpatialIndexingTestSuite.java
+++ 
b/modules/geospatial/src/test/java/org/apache/ignite/testsuites/GeoSpatialIndexingTestSuite.java
@@ -18,9 +18,10 @@
 package org.apache.ignite.testsuites;
 
 import junit.framework.TestSuite;
-import 
org.apache.ignite.internal.processors.query.h2.GridBinaryH2IndexingGeoSelfTest;
-import 
org.apache.ignite.internal.processors.query.h2.GridH2IndexingGeoSelfTest;
-import 
org.apache.ignite.internal.processors.query.h2.GridH2IndexingSegmentedGeoSelfTest;
+import 
org.apache.ignite.internal.processors.query.h2.H2IndexingBinaryGeoSelfTest;
+import 
org.apache.ignite.internal.processors.query.h2.H2IndexingBinarySegmentedGeoSelfTest;
+import org.apache.ignite.internal.processors.query.h2.H2IndexingGeoSelfTest;
+import 
org.apache.ignite.internal.processors.query.h2.H2IndexingSegmentedGeoSelfTest;
 
 /**
  * Geospatial indexing tests.
@@ -33,10 +34,11 @@ public class GeoSpatialIndexingTestSuite extends TestSuite {
     public static TestSuite suite() throws Exception {
         TestSuite suite = new TestSuite("H2 Geospatial Indexing Test Suite");
 
-        // Geo.
-        suite.addTestSuite(GridH2IndexingGeoSelfTest.class);
-        suite.addTestSuite(GridBinaryH2IndexingGeoSelfTest.class);
-        suite.addTestSuite(GridH2IndexingSegmentedGeoSelfTest.class);
+        suite.addTestSuite(H2IndexingGeoSelfTest.class);
+        suite.addTestSuite(H2IndexingSegmentedGeoSelfTest.class);
+
+        suite.addTestSuite(H2IndexingBinaryGeoSelfTest.class);
+        suite.addTestSuite(H2IndexingBinarySegmentedGeoSelfTest.class);
 
         return suite;
     }

Reply via email to