http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/df488d08/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractQuerySelfTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractQuerySelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractQuerySelfTest.java deleted file mode 100644 index a485ff7..0000000 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractQuerySelfTest.java +++ /dev/null @@ -1,2092 +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.cache; - -import org.apache.ignite.*; -import org.apache.ignite.cache.*; -import org.apache.ignite.cache.GridCache; -import org.apache.ignite.cache.query.*; -import org.apache.ignite.cache.store.*; -import org.apache.ignite.configuration.*; -import org.apache.ignite.events.*; -import org.apache.ignite.internal.*; -import org.apache.ignite.lang.*; -import org.apache.ignite.marshaller.optimized.*; -import org.apache.ignite.spi.discovery.tcp.*; -import org.apache.ignite.spi.discovery.tcp.ipfinder.*; -import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.*; -import org.apache.ignite.spi.swapspace.file.*; -import org.apache.ignite.internal.processors.cache.query.*; -import org.apache.ignite.internal.util.tostring.*; -import org.apache.ignite.internal.util.typedef.*; -import org.apache.ignite.internal.util.typedef.internal.*; -import org.apache.ignite.testframework.*; -import org.apache.ignite.testframework.junits.common.*; -import org.jdk8.backport.*; -import org.jetbrains.annotations.*; - -import javax.cache.Cache; -import javax.cache.CacheException; -import javax.cache.configuration.*; -import javax.cache.expiry.*; -import java.io.*; -import java.util.*; -import java.util.concurrent.*; - -import static java.util.concurrent.TimeUnit.*; -import static org.apache.ignite.cache.query.CacheQueryType.*; -import static org.apache.ignite.events.IgniteEventType.*; -import static org.apache.ignite.cache.CacheAtomicityMode.*; -import static org.apache.ignite.cache.CacheDistributionMode.*; -import static org.apache.ignite.cache.CacheMode.*; -import static org.apache.ignite.cache.CachePreloadMode.*; -import static org.apache.ignite.cache.CacheWriteSynchronizationMode.*; -import static org.junit.Assert.*; - -/** - * Various tests for cache queries. - */ -public abstract class GridCacheAbstractQuerySelfTest extends GridCommonAbstractTest { - /** Cache store. */ - private static TestStore store = new TestStore(); - - /** */ - private static final TcpDiscoveryIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true); - - /** */ - private static final UUID subjId = UUID.fromString("8EB3B06D-0885-4B4A-9A54-02C93EF09B65"); - - /** */ - protected Ignite ignite; - - /** - * @return Grid count. - */ - protected abstract int gridCount(); - - /** - * @return Cache mode. - */ - protected abstract CacheMode cacheMode(); - - /** - * @return Atomicity mode. - */ - protected CacheAtomicityMode atomicityMode() { - return TRANSACTIONAL; - } - - /** - * @return Distribution. - */ - protected CacheDistributionMode distributionMode() { - return NEAR_PARTITIONED; - } - - /** {@inheritDoc} */ - @SuppressWarnings("unchecked") - @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception { - IgniteConfiguration c = super.getConfiguration(gridName); - - TcpDiscoverySpi disco = new TcpDiscoverySpi(); - - disco.setIpFinder(ipFinder); - - c.setDiscoverySpi(disco); - - GridQueryConfiguration idxCfg = new GridQueryConfiguration(); - - idxCfg.setIndexCustomFunctionClasses(SqlFunctions.class); - - c.setQueryConfiguration(idxCfg); - - // Otherwise noop swap space will be chosen on Windows. - c.setSwapSpaceSpi(new FileSwapSpaceSpi()); - - c.setMarshaller(new IgniteOptimizedMarshaller(false)); - - CacheConfiguration[] ccs = new CacheConfiguration[2]; - - for (int i = 0; i < ccs.length; i++) { - CacheConfiguration cc = defaultCacheConfiguration(); - - if (i > 0) - cc.setName("c" + i); - - cc.setCacheMode(cacheMode()); - cc.setAtomicityMode(atomicityMode()); - cc.setDistributionMode(gridName.startsWith("client") ? CLIENT_ONLY : distributionMode()); - cc.setWriteSynchronizationMode(FULL_SYNC); - cc.setCacheStoreFactory(new FactoryBuilder.SingletonFactory(store)); - cc.setReadThrough(true); - cc.setWriteThrough(true); - cc.setLoadPreviousValue(true); - cc.setPreloadMode(SYNC); - cc.setSwapEnabled(true); - cc.setEvictNearSynchronized(false); - - CacheQueryConfiguration qcfg = new CacheQueryConfiguration(); - - qcfg.setIndexPrimitiveKey(true); - qcfg.setIndexFixedTyping(true); - - cc.setQueryConfiguration(qcfg); - - // Explicitly set number of backups equal to number of grids. - if (cacheMode() == CacheMode.PARTITIONED) - cc.setBackups(gridCount()); - - ccs[i] = cc; - } - - c.setCacheConfiguration(ccs); - - return c; - } - - /** {@inheritDoc} */ - @Override protected void beforeTest() throws Exception { - ignite = startGridsMultiThreaded(gridCount()); - } - - /** {@inheritDoc} */ - @Override protected void afterTest() throws Exception { - stopAllGrids(); - - store.reset(); - - ignite = null; - } - - /** - * JUnit. - * - * @throws Exception In case of error. - */ - public void testDifferentKeyTypes() throws Exception { - GridCache<Object, Object> cache = ignite.cache(null); - - cache.putx("key", "value"); - - // Put the same value but for other key type. - // Operation should succeed but with warning log message. - cache.putx(1, "value"); - } - - /** - * JUnit. - * - * @throws Exception In case of error. - */ - public void testDifferentValueTypes() throws Exception { - GridCache<Object, Object> cache = ignite.cache(null); - - cache.putx("key", "value"); - - // Put value of different type but for the same key type. - // Operation should succeed but with warning log message. - cache.putx("key", 1); - } - - /** - * JUnit. - * - * @throws Exception In case of error. - */ - public void testStringType() throws Exception { - IgniteCache<String, String> cache = ignite.jcache(null); - - cache.put("tst", "test"); - - QueryCursor<Cache.Entry<String, String>> qry = cache.query(new QuerySqlPredicate<String, String>("_val='test'")); - - Cache.Entry<String, String> entry = F.first(qry.getAll()); - - assert entry != null; - } - - /** - * JUnit. - * - * @throws Exception In case of error. - */ - public void testIntegerType() throws Exception { - IgniteCache<String, Integer> cache = ignite.jcache(null); - - String key = "k"; - - int val = 2; - - cache.put(key, val); - - QueryCursor<Cache.Entry<String, Integer>> qry = - cache.query(new QuerySqlPredicate<String, Integer>("select * from Integer where _key = 'k' and _val > 1")); - - Cache.Entry<String, Integer> entry = F.first(qry.getAll()); - - assert entry != null; - - assertEquals(Integer.valueOf(val), entry.getValue()); - } - - /** - * Tests UDFs. - * - * @throws IgniteCheckedException If failed. - */ - public void testUserDefinedFunction() throws IgniteCheckedException { - // Without alias. - IgniteCache<Object, Object> cache = ignite.jcache(null); - - QueryCursor<List<?>> qry = cache.queryFields(new QuerySqlPredicate<>("select square(1), square(2)")); - - Collection<List<?>> res = qry.getAll(); - - assertEquals(gridCount(), res.size()); - - List<?> row = res.iterator().next(); - - assertEquals(1, row.get(0)); - assertEquals(4, row.get(1)); - - // With alias. - qry = cache.queryFields(new QuerySqlPredicate<>("select _cube_(1), _cube_(2)")); - - res = qry.getAll(); - - assertEquals(gridCount(), res.size()); - - row = res.iterator().next(); - - assertEquals(1, row.get(0)); - assertEquals(8, row.get(1)); - - // Not registered. - final QueryCursor<List<?>> qry3 = cache.queryFields(new QuerySqlPredicate<>("select no()")); - - GridTestUtils.assertThrows( - log, - new Callable<Object>() { - @Override public Object call() throws Exception { - qry3.getAll(); - - return null; - } - }, - CacheException.class, - null - ); - } - - /** - * Expired entries are not included to result. - * - * @throws Exception If failed. - */ - public void testExpiration() throws Exception { - ignite.jcache(null). - withExpiryPolicy(new TouchedExpiryPolicy(new Duration(MILLISECONDS, 1000))).put("key1", 1); - - IgniteCache<String, Integer> cache = ignite.jcache(null); - - QueryCursor<Cache.Entry<String, Integer>> qry = cache.query(new QuerySqlPredicate<String, Integer>("1=1")); - - Cache.Entry<String, Integer> res = F.first(qry.getAll()); - - assertEquals(1, res.getValue().intValue()); - - U.sleep(1020); - - res = F.first(qry.getAll()); - - assertNull(res); - } - - /** - * @throws Exception If failed. - */ - public void testIllegalBounds() throws Exception { - IgniteCache<Integer, Integer> cache = ignite.jcache(null); - - cache.put(1, 1); - cache.put(2, 2); - - QueryCursor<List<?>> qry = cache.queryFields(new QuerySqlPredicate<Integer, Integer>("_key between 2 and 1")); - - assertTrue(qry.getAll().isEmpty()); - } - - /** - * JUnit. - * - * @throws Exception In case of error. - */ - public void testComplexType() throws Exception { - IgniteCache<Key, GridCacheQueryTestValue> cache = ignite.jcache(null); - - GridCacheQueryTestValue val1 = new GridCacheQueryTestValue(); - - val1.setField1("field1"); - val1.setField2(1); - val1.setField3(1L); - - GridCacheQueryTestValue val2 = new GridCacheQueryTestValue(); - - val2.setField1("field2"); - val2.setField2(2); - val2.setField3(2L); - val2.setField6(null); - - cache.put(new Key(100500), val1); - cache.put(new Key(100501), val2); - - QueryCursor<Cache.Entry<Key, GridCacheQueryTestValue>> qry = cache - .query(new QuerySqlPredicate<Key, GridCacheQueryTestValue>( - "fieldName='field1' and field2=1 and field3=1 and id=100500 and embeddedField2=11 and x=3")); - - Cache.Entry<Key, GridCacheQueryTestValue> entry = F.first(qry.getAll()); - - assertNotNull(entry); - assertEquals(100500, entry.getKey().id); - assertEquals(val1, entry.getValue()); - } - - /** - * Complex key type. - */ - private static class Key { - /** */ - @CacheQuerySqlField - private final long id; - - /** - * @param id Id. - */ - private Key(long id) { - this.id = id; - } - - /** {@inheritDoc} */ - @Override public boolean equals(Object o) { - if (this == o) - return true; - - if (o == null || getClass() != o.getClass()) - return false; - - Key key = (Key)o; - - return id == key.id; - - } - - /** {@inheritDoc} */ - @Override public int hashCode() { - return (int)(id ^ (id >>> 32)); - } - } - - /** - * JUnit. - * - * @throws Exception In case of error. - */ - public void testSelectQuery() throws Exception { - GridCache<String, String> cache = ignite.cache(null); - - cache.putx("key", "value"); - - CacheQuery<Map.Entry<String, String>> qry = cache.queries().createSqlQuery(String.class, - "select * from String"); - - CacheQueryFuture<Map.Entry<String, String>> iter = qry.execute(); - - assert iter != null; - assert iter.next() != null; - } - - /** - * JUnit. - * - * @throws Exception In case of error. - */ - public void testObjectQuery() throws Exception { - GridCache<Integer, ObjectValue> cache = ignite.cache(null); - - ObjectValue val = new ObjectValue("test", 0); - - cache.putx(1, val); - - CacheQuery<Map.Entry<Integer, ObjectValue>> qry = - cache.queries().createSqlQuery(ObjectValue.class, "_val=?"); - - CacheQueryFuture<Map.Entry<Integer, ObjectValue>> iter = qry.execute(val); - - assert iter != null; - - int expCnt = 1; - - for (int i = 0; i < expCnt; i++) - assert iter.next() != null; - - assert iter.next() == null; - - qry = cache.queries().createFullTextQuery(ObjectValue.class, "test"); - - iter = qry.execute(); - - assert iter != null; - - for (int i = 0; i < expCnt; i++) - assert iter.next() != null; - - assert iter.next() == null; - } - - /** - * JUnit. - * - * @throws Exception In case of error. - */ - public void testTextQueryOnProjection() throws Exception { - GridCache<Integer, ObjectValue> cache = ignite.cache(null); - - cache.putx(1, new ObjectValue("test", 1)); - cache.putx(2, new ObjectValue("test", 2)); - - P2<Integer, ObjectValue> p = new P2<Integer, ObjectValue>() { - @Override public boolean apply(Integer key, ObjectValue val) { - return val.intVal == 1; - } - }; - - CacheProjection<Integer, ObjectValue> cachePrj = grid(0).<Integer, ObjectValue>cache(null).projection(p); - - CacheQuery<Map.Entry<Integer, ObjectValue>> qry = - cachePrj.queries().createFullTextQuery(ObjectValue.class, "test"); - - CacheQueryFuture<Map.Entry<Integer, ObjectValue>> iter = qry.execute(); - - assert iter != null; - - int expCnt = 1; - - for (int i = 0; i < expCnt; i++) - assert iter.next() != null; - - assert iter.next() == null; - } - - /** - * JUnit. - * - * @throws Exception In case of error. - */ - public void testObjectQueryWithSwap() throws Exception { - GridCache<Integer, ObjectValue> cache = ignite.cache(null); - - boolean partitioned = cache.configuration().getCacheMode() == PARTITIONED; - - int cnt = 10; - - for (int i = 0; i < cnt; i++) - cache.putx(i, new ObjectValue("test" + i, i)); - - for (Ignite g : G.allGrids()) { - GridCache<Integer, ObjectValue> c = g.cache(null); - - for (int i = 0; i < cnt; i++) { - if (i % 2 == 0) { - assertNotNull(c.peek(i)); - - c.evict(i); // Swap. - - if (!partitioned || c.affinity().mapKeyToNode(i).isLocal()) { - ObjectValue peekVal = c.peek(i); - - assertNull("Non-null value for peek [key=" + i + ", val=" + peekVal + ']', peekVal); - } - } - } - } - - CacheQuery<Map.Entry<Integer, ObjectValue>> qry = - cache.queries().createSqlQuery(ObjectValue.class, "intVal >= ? order by intVal"); - - qry.enableDedup(true); - - CacheQueryFuture<Map.Entry<Integer, ObjectValue>> iter = qry.execute(0); - - assert iter != null; - - Collection<Integer> set = new HashSet<>(cnt); - - Map.Entry<Integer, ObjectValue> next; - - while ((next = iter.next()) != null) { - ObjectValue v = next.getValue(); - - assert !set.contains(v.intValue()); - - set.add(v.intValue()); - } - - assert iter.next() == null; - - assertEquals(cnt, set.size()); - - for (int i = 0; i < cnt; i++) - assert set.contains(i); - - qry = cache.queries().createSqlQuery(ObjectValue.class, "MOD(intVal, 2) = ? order by intVal"); - - qry.enableDedup(true); - - iter = qry.execute(0); - - assert iter != null; - - set.clear(); - - while ((next = iter.next()) != null) { - ObjectValue v = next.getValue(); - - assert !set.contains(v.intValue()); - - set.add(v.intValue()); - } - - assert iter.next() == null; - - assertEquals(cnt / 2, set.size()); - - for (int i = 0; i < cnt; i++) - if (i % 2 == 0) - assert set.contains(i); - else - assert !set.contains(i); - } - - /** - * JUnit. - * - * @throws Exception In case of error. - */ - public void testFullTextSearch() throws Exception { - GridCache<Integer, ObjectValue> cache = ignite.cache(null); - - // Try to execute on empty cache first. - CacheQuery<Map.Entry<Integer, ObjectValue>> qry = cache.queries().createFullTextQuery(ObjectValue.class, - "full"); - - assert qry.execute().get().isEmpty(); - - qry = cache.queries().createFullTextQuery(ObjectValue.class, "full"); - - assert qry.execute().get().isEmpty(); - - // Now put indexed values into cache. - int key1 = 1; - - ObjectValue val1 = new ObjectValue("test full text", 0); - - cache.putx(key1, val1); - - int key2 = 2; - - ObjectValue val2 = new ObjectValue("test full text more", 0); - - cache.putx(key2, val2); - - qry = cache.queries().createFullTextQuery(ObjectValue.class, "full"); - - Collection<Map.Entry<Integer, ObjectValue>> res = qry.execute().get(); - - assert res != null; - - assert res.size() == 2; - - qry = cache.queries().createFullTextQuery(ObjectValue.class, "full"); - - res = qry.execute().get(); - - assert res != null; - assert res.size() == 2; - } - - /** - * JUnit. - * - * @throws Exception In case of error. - */ - public void testRemoveIndex() throws Exception { - GridCache<Integer, ObjectValue> cache = ignite.cache(null); - GridCache<Integer, ObjectValue> cache1 = ignite.cache("c1"); - - ObjectValue val = new ObjectValue("test full text", 0); - - int key = 1; - - cache.putx(key, val); - cache1.putx(key, val); - - GridCacheQueryManager<Object, Object> qryMgr = ((GridKernal) ignite).internalCache().context().queries(); - GridCacheQueryManager<Object, Object> qryMgr1 = ((GridKernal) ignite).internalCache("c1").context().queries(); - - assert hasIndexTable(ObjectValue.class, qryMgr); - assert hasIndexTable(ObjectValue.class, qryMgr1); - - assert qryMgr != null; - - qryMgr.onUndeploy(ObjectValue.class.getClassLoader()); - - assert !hasIndexTable(ObjectValue.class, qryMgr); - assert hasIndexTable(ObjectValue.class, qryMgr1); - - // Put again. - cache.putx(key, val); - - assert hasIndexTable(ObjectValue.class, qryMgr); - assert hasIndexTable(ObjectValue.class, qryMgr1); - } - - /** - * JUnit. - * - * @throws Exception In case of error. - */ - public void testScanQuery() throws Exception { - GridCache<String, String> c1 = ignite.cache(null); - - c1.putx("key", "value"); - - CacheQuery<Map.Entry<String, String>> qry1 = c1.queries().createScanQuery(null); - - CacheQueryFuture<Map.Entry<String, String>> iter = qry1.execute(); - - assert iter != null; - - int expCnt = 1; - - for (int i = 0; i < expCnt; i++) { - Map.Entry<String, String> e1 = iter.next(); - - assertEquals("key", e1.getKey()); - assertEquals("value", e1.getValue()); - } - - assert iter.next() == null; - } - - /** - * JUnit. - * - * @throws Exception In case of error. - */ - public void testTwoObjectsTextSearch() throws Exception { - GridCache<Object, Object> c = ignite.cache(null); - - c.put(1, new ObjectValue("ObjectValue str", 1)); - c.put("key", new ObjectValueOther("ObjectValueOther str")); - - Collection<Map.Entry<Object, Object>> res = - c.queries().createFullTextQuery(ObjectValue.class, "str").execute().get(); - - assert res != null; - int expCnt = 1; - assert res.size() == expCnt; - assert F.first(res).getValue().getClass() == ObjectValue.class; - - res = c.queries().createFullTextQuery(ObjectValueOther.class, "str").execute().get(); - - assert res != null; - assert res.size() == expCnt; - assert F.first(res).getValue().getClass() == ObjectValueOther.class; - - res = c.queries().createFullTextQuery(ObjectValue.class, "str").execute().get(); - - assert res != null; - assert res.size() == expCnt; - assert F.first(res).getValue().getClass() == ObjectValue.class; - - res = c.queries().createFullTextQuery(ObjectValueOther.class, "str").execute().get(); - - assert res != null; - assert res.size() == expCnt; - assert F.first(res).getValue().getClass() == ObjectValueOther.class; - } - - /** - * JUnit. - * @throws Exception In case of error. - */ - public void testTransformQuery() throws Exception { - GridCache<UUID, Person> c = ignite.cache(null); - - final Person p1 = new Person("Bob", 100); - final Person p2 = new Person("Tom", 200); - - c.put(p1.id, p1); - c.put(p2.id, p2); - - CacheQuery<Map.Entry<UUID, Person>> q = c.queries().createScanQuery(null); - - Collection<Map.Entry<UUID, String>> res = q.execute(new C1<Map.Entry<UUID, Person>, Map.Entry<UUID, String>>() { - @Override public Map.Entry<UUID, String> apply(Map.Entry<UUID, Person> p) { - return F.t(p.getKey(), p.getValue().name); - } - }).get(); - - assert res != null; - assert res.size() == 2; - - F.forEach(res, new CI1<Map.Entry<UUID, String>>() { - @Override public void apply(Map.Entry<UUID, String> e) { - if (p1.id.equals(e.getKey())) - assert "Bob".equals(e.getValue()); - else if (p2.id.equals(e.getKey())) - assert "Tom".equals(e.getValue()); - else - assert false : "Unexpected entry."; - } - }); - - q = c.queries().createSqlQuery(Person.class, "id = ?"); - - res = q.execute(new C1<Map.Entry<UUID, Person>, Map.Entry<UUID, String>>() { - @Override public Map.Entry<UUID, String> apply(Map.Entry<UUID, Person> p) { - return F.t(p.getKey(), p.getValue().name); - } - }, p1.id).get(); - - assert res != null; - assert res.size() == 1; - - F.forEach(res, new CI1<Map.Entry<UUID, String>>() { - @Override public void apply(Map.Entry<UUID, String> e) { - assert p1.id.equals(e.getKey()); - assert "Bob".equals(e.getValue()); - } - }); - - q = c.queries().createFullTextQuery(Person.class, "Bob"); - - res = q.execute(new C1<Map.Entry<UUID, Person>, Map.Entry<UUID, String>>() { - @Override public Map.Entry<UUID, String> apply(Map.Entry<UUID, Person> p) { - return F.t(p.getKey(), p.getValue().name); - } - }).get(); - - assertNotNull(res); - - assertEquals(1, res.size()); - - F.forEach(res, new CI1<Map.Entry<UUID, String>>() { - @Override public void apply(Map.Entry<UUID, String> e) { - assert p1.id.equals(e.getKey()); - assert "Bob".equals(e.getValue()); - } - }); - - q = c.queries().createFullTextQuery(Person.class, "Bob"); - - res = q.execute(new C1<Map.Entry<UUID, Person>, Map.Entry<UUID, String>>() { - @Override public Map.Entry<UUID, String> apply(Map.Entry<UUID, Person> p) { - return F.t(p.getKey(), p.getValue().name); - } - }).get(); - - assert res != null; - assert res.size() == 1; - - F.forEach(res, new CI1<Map.Entry<UUID, String>>() { - @Override public void apply(Map.Entry<UUID, String> e) { - assert p1.id.equals(e.getKey()); - assert "Bob".equals(e.getValue()); - } - }); - } - - /** - * @throws Exception If failed. - */ - public void testReduceQuery() throws Exception { - GridCache<String, Integer> c = ignite.cache(null); - - assert c.putx("key1", 1); - assert c.putx("key2", 2); - assert c.putx("key3", 3); - assert c.putx("key4", 4); - assert c.putx("key5", 5); - - CacheQuery<Map.Entry<String, Integer>> qry = c.queries().createSqlQuery(Integer.class, "_val > 2"); - - Collection<Integer> res1 = qry.execute(new SumRemoteReducer()).get(); - - assert res1 != null; - assert res1.size() == gridCount(); - assert F.sumInt(res1) == (cacheMode() == REPLICATED ? 12 * gridCount() : 12); - } - - /** - * @throws Exception If failed. - */ - public void testReduceQueryOnProjection() throws Exception { - CacheProjection<String, Integer> c = ignite.cache(null); - - assert c.putx("key1", 1); - assert c.putx("key2", 2); - assert c.putx("key3", 3); - assert c.putx("key4", 4); - assert c.putx("key5", 5); - - // Filter values less than 3. - P2<String, Integer> p = new P2<String, Integer>() { - @Override public boolean apply(String key, Integer val) { - return val > 3; - } - }; - - CacheProjection<String, Integer> cachePrj = ignite.<String, Integer>cache(null).projection(p); - - CacheQuery<Map.Entry<String, Integer>> q = cachePrj.queries().createSqlQuery(Integer.class, "_val > 2"); - - Collection<Integer> res = q.execute(new SumRemoteReducer()).get(); - - assertEquals(9, F.sumInt(res)); - } - - /** - * @throws Exception If failed. - */ - public void testEmptyObject() throws Exception { - GridCache<EmptyObject, EmptyObject> cache = ignite.cache(null); - - cache.putx(new EmptyObject(1), new EmptyObject(2)); - - for (int i = 0; i < gridCount(); i++) { - GridCacheQueryManager<Object, Object> qryMgr = - ((GridKernal)grid(i)).internalCache().context().queries(); - - assert !hasIndexTable(EmptyObject.class, qryMgr); - } - } - - /** - * @throws Exception If failed. - */ - public void testPrimitiveType() throws Exception { - GridCache<Integer, Integer> cache = ignite.cache(null); - - assert cache.putx(1, 1); - assert cache.putx(2, 2); - - CacheQuery<Map.Entry<Integer, Integer>> q = cache.queries().createSqlQuery(int.class, "_val > 1"); - - Collection<Map.Entry<Integer, Integer>> res = q.execute().get(); - - assertEquals(1, res.size()); - - for (Map.Entry<Integer, Integer> e : res) { - assertEquals(2, (int)e.getKey()); - assertEquals(2, (int)e.getValue()); - } - } - - /** - * @throws Exception If failed. - */ - public void testPaginationIteratorDefaultCache() throws Exception { - testPaginationIterator(null); - } - - /** - * @throws Exception If failed. - */ - public void testPaginationIteratorNamedCache() throws Exception { - testPaginationIterator("c1"); - } - - /** - * @param cacheName Cache name. - * @throws Exception If failed. - */ - private void testPaginationIterator(@Nullable String cacheName) throws Exception { - GridCache<Integer, Integer> cache = ignite.cache(cacheName); - - for (int i = 0; i < 50; i++) - assertTrue(cache.putx(i, i)); - - CacheQuery<Map.Entry<Integer, Integer>> q = cache.queries().createSqlQuery(Integer.class, - "_key >= 0").projection(ignite.cluster()); - - q.pageSize(10); - q.enableDedup(true); - q.keepAll(false); - - CacheQueryFuture<Map.Entry<Integer, Integer>> f = q.execute(); - - int cnt = 0; - - Map.Entry<Integer, Integer> e; - - while ((e = f.next()) != null) { - assertTrue(e.getKey() >= 0 && e.getKey() < 50); - assertTrue(e.getValue() >= 0 && e.getValue() < 50); - - cnt++; - } - - assertEquals(50, cnt); - - assertTrue(f.isDone()); - - if (cacheMode() != LOCAL) - assertTrue(f.get().size() < 50); - } - - /** - * @throws Exception If failed. - */ - public void testPaginationIteratorKeepAll() throws Exception { - GridCache<Integer, Integer> cache = ignite.cache(null); - - for (int i = 0; i < 50; i++) - assertTrue(cache.putx(i, i)); - - CacheQuery<Map.Entry<Integer, Integer>> q = cache.queries().createSqlQuery(Integer.class, "_key >= 0"); - - q.pageSize(10); - q.enableDedup(true); - q.keepAll(true); - - CacheQueryFuture<Map.Entry<Integer, Integer>> f = q.execute(); - - int cnt = 0; - - Map.Entry<Integer, Integer> e; - - while ((e = f.next()) != null) { - assertTrue(e.getKey() >= 0 && e.getKey() < 50); - assertTrue(e.getValue() >= 0 && e.getValue() < 50); - - cnt++; - } - - assertEquals(50, cnt); - - assertTrue(f.isDone()); - - List<Map.Entry<Integer, Integer>> list = new ArrayList<>(f.get()); - - Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() { - @Override public int compare(Map.Entry<Integer, Integer> e1, Map.Entry<Integer, Integer> e2) { - return e1.getKey().compareTo(e2.getKey()); - } - }); - - for (int i = 0; i < 50; i++) { - Map.Entry<Integer, Integer> e0 = list.get(i); - - assertEquals(i, (int)e0.getKey()); - assertEquals(i, (int)e0.getValue()); - } - } - - /** - * @throws Exception If failed. - */ - public void testPaginationGetDefaultCache() throws Exception { - testPaginationGet(null); - } - - /** - * @throws Exception If failed. - */ - public void testPaginationGetNamedCache() throws Exception { - testPaginationGet("c1"); - } - - /** - * @param cacheName Cache name. - * @throws Exception If failed. - */ - private void testPaginationGet(@Nullable String cacheName) throws Exception { - GridCache<Integer, Integer> cache = ignite.cache(cacheName); - - for (int i = 0; i < 50; i++) - assertTrue(cache.putx(i, i)); - - CacheQuery<Map.Entry<Integer, Integer>> q = cache.queries().createSqlQuery(Integer.class, "_key >= 0"); - - q.pageSize(10); - q.enableDedup(true); - - List<Map.Entry<Integer, Integer>> list = new ArrayList<>(q.execute().get()); - - Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() { - @Override public int compare(Map.Entry<Integer, Integer> e1, Map.Entry<Integer, Integer> e2) { - return e1.getKey().compareTo(e2.getKey()); - } - }); - - for (int i = 0; i < 50; i++) { - Map.Entry<Integer, Integer> e = list.get(i); - - assertEquals(i, (int)e.getKey()); - assertEquals(i, (int)e.getValue()); - } - } - - /** - * @throws Exception If failed. - */ - public void testScanFilters() throws Exception { - GridCache<Integer, Integer> cache = ignite.cache(null); - - for (int i = 0; i < 50; i++) - assertTrue(cache.putx(i, i)); - - CacheQuery<Map.Entry<Integer, Integer>> q = cache.queries().createScanQuery( - new P2<Integer, Integer>() { - @Override public boolean apply(Integer k, Integer v) { - assertNotNull(k); - assertNotNull(v); - - return k >= 20 && v < 40; - } - }); - - q.enableDedup(true); - - List<Map.Entry<Integer, Integer>> list = new ArrayList<>(q.execute().get()); - - Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() { - @Override public int compare(Map.Entry<Integer, Integer> e1, Map.Entry<Integer, Integer> e2) { - return e1.getKey().compareTo(e2.getKey()); - } - }); - - assertEquals(20, list.size()); - - for (int i = 20; i < 40; i++) { - Map.Entry<Integer, Integer> e = list.get(i - 20); - - assertEquals(i, (int)e.getKey()); - assertEquals(i, (int)e.getValue()); - } - } - - /** - * @throws Exception If failed. - */ - public void testEmptyGrid() throws Exception { - GridCache<String, Integer> cache = ignite.cache(null); - - String key = "k"; - - int val = 2; - - cache.putx(key, val); - - CacheQuery<Map.Entry<String, Integer>> qry = cache.queries().createSqlQuery(Integer.class, - "select * from Integer where _key = 'k' and _val > 1"); - - Map.Entry<String, Integer> entry = F.first(qry.execute().get()); - - assert entry != null; - - assertEquals(Integer.valueOf(val), entry.getValue()); - } - - /** - * @throws IgniteCheckedException if failed. - */ - public void testBadHashObjectKey() throws IgniteCheckedException { - GridCache<BadHashKeyObject, Integer> cache = ignite.cache(null); - - cache.put(new BadHashKeyObject("test_key1"), 9); - cache.put(new BadHashKeyObject("test_key0"), 1005001); - cache.put(new BadHashKeyObject("test_key1"), 7); - - assertEquals(1005001, cache.queries().createSqlQuery(Integer.class, "_key = ?").execute(new BadHashKeyObject( - "test_key0")).get().iterator().next().getValue().intValue()); - } - - /** - * @throws IgniteCheckedException if failed. - */ - public void testTextIndexedKey() throws IgniteCheckedException { - GridCache<ObjectValue, Integer> cache = ignite.cache(null); - - cache.put(new ObjectValue("test_key1", 10), 19); - cache.put(new ObjectValue("test_key0", 11), 11005); - cache.put(new ObjectValue("test_key1", 12), 17); - - assertEquals(11005, - cache.queries().createFullTextQuery(Integer.class, "test_key0").execute().get().iterator().next() - .getValue().intValue()); - } - - /** - * @throws Exception If failed. - */ - public void testAnonymousClasses() throws Exception { - GridCache<Integer, Object> cache = ignite.cache(null); - - Object val = new Object() { - @CacheQuerySqlField - private int field1 = 10; - - @Override public String toString() { - return "Test anonymous object."; - } - }; - - assertTrue(val.getClass().getName().endsWith("GridCacheAbstractQuerySelfTest$16")); - - assertTrue(cache.putx(1, val)); - - CacheQuery<Map.Entry<Integer, Object>> q = cache.queries().createSqlQuery(val.getClass(), "_key >= 0"); - - q.enableDedup(true); - - Collection<Map.Entry<Integer, Object>> res = q.execute().get(); - - assertEquals(1, res.size()); - - CacheQuery<List<?>> fieldsQry = cache.queries().createSqlFieldsQuery( - "select field1 from GridCacheAbstractQuerySelfTest_16"); - - fieldsQry.enableDedup(true); - - Collection<List<?>> fieldsRes = fieldsQry.execute().get(); - - assertEquals(1, fieldsRes.size()); - - List<?> fields = F.first(fieldsRes); - - assertEquals(1, fields.size()); - assertEquals(10, fields.get(0)); - } - - /** - * @throws Exception If failed. - */ - public void testTwoAnonymousClasses() throws Exception { - GridCache<Integer, Object> cache = ignite.cache(null); - - Object val1 = new Object() { - @Override public String toString() { - return "Test anonymous object1."; - } - }; - - Object val2 = new Object() { - @Override public String toString() { - return "Test anonymous object2."; - } - }; - - assertTrue(cache.putx(1, val1)); - assertTrue(cache.putx(2, val2)); - - CacheQuery<Map.Entry<Integer, Object>> q = cache.queries().createSqlQuery(val1.getClass(), "_key >= 0"); - - q.enableDedup(true); - - Collection<Map.Entry<Integer, Object>> res = q.execute().get(); - - assertEquals(1, res.size()); - } - - /** - * @throws Exception If failed. - */ - public void testOrderByOnly() throws Exception { - GridCache<Integer, Integer> cache = ignite.cache(null); - - for (int i = 0; i < 10; i++) - assertTrue(cache.putx(i, i)); - - CacheQuery<Map.Entry<Integer, Integer>> q = cache.queries().createSqlQuery(Integer.class, "order by _val"); - - q.enableDedup(true); - - Collection<Map.Entry<Integer, Integer>> res = q.execute().get(); - - assertEquals(10, res.size()); - - if (cacheMode() != PARTITIONED) { - Iterator<Map.Entry<Integer, Integer>> it = res.iterator(); - - for (Integer i = 0; i < 10; i++) { - assertTrue(it.hasNext()); - - Map.Entry<Integer, Integer> e = it.next(); - - assertEquals(i, e.getKey()); - assertEquals(i, e.getValue()); - } - } - } - - /** - * @throws Exception If failed. - */ - public void testLimitOnly() throws Exception { - GridCache<Integer, Integer> cache = ignite.cache(null); - - for (int i = 0; i < 10; i++) - assertTrue(cache.putx(i, i)); - - CacheQuery<Map.Entry<Integer, Integer>> q = cache.queries().createSqlQuery(Integer.class, "limit 5"); - - q.enableDedup(true); - - Collection<Map.Entry<Integer, Integer>> res = q.execute().get(); - - if (cacheMode() != PARTITIONED) { - assertEquals(5, res.size()); - - Iterator<Map.Entry<Integer, Integer>> it = res.iterator(); - - for (Integer i = 0; i < 5; i++) { - assertTrue(it.hasNext()); - - Map.Entry<Integer, Integer> e = it.next(); - - assertEquals(i, e.getKey()); - assertEquals(i, e.getValue()); - } - } - } - - /** - * @throws Exception If failed. - */ - public void testArray() throws Exception { - GridCache<Integer, ArrayObject> cache = ignite.cache(null); - - assertTrue(cache.putx(1, new ArrayObject(new Long[] {1L, null, 3L}))); - assertTrue(cache.putx(2, new ArrayObject(new Long[] {4L, 5L, 6L}))); - - CacheQuery<Map.Entry<Integer, ArrayObject>> q = - cache.queries().createSqlQuery(ArrayObject.class, "array_contains(arr, cast(4 as long))"); - - q.enableDedup(true); - - Collection<Map.Entry<Integer, ArrayObject>> res = q.execute().get(); - - assertEquals(1, res.size()); - - Map.Entry<Integer, ArrayObject> e = F.first(res); - - assertEquals(2, (int)e.getKey()); - assertArrayEquals(new Long[] {4L, 5L, 6L}, e.getValue().arr); - } - - /** - * @throws Exception If failed. - */ - public void testSqlQueryEvents() throws Exception { - testSqlQueryEvents(false); - } - - /** - * @throws Exception If failed. - */ - public void testSqlQueryEventsSubjectId() throws Exception { - testSqlQueryEvents(true); - } - - /** - * @param customSubjId Use custom subject ID. - * @throws Exception If failed. - */ - private void testSqlQueryEvents(final boolean customSubjId) throws Exception { - final Map<Integer, Integer> map = new ConcurrentHashMap8<>(); - final CountDownLatch latch = new CountDownLatch(10); - final CountDownLatch execLatch = new CountDownLatch(cacheMode() == REPLICATED ? 1 : gridCount()); - - for (int i = 0; i < gridCount(); i++) { - grid(i).events().localListen(new IgnitePredicate<IgniteEvent>() { - @Override public boolean apply(IgniteEvent evt) { - assert evt instanceof IgniteCacheQueryReadEvent; - - IgniteCacheQueryReadEvent<Integer, Integer> qe = (IgniteCacheQueryReadEvent<Integer, Integer>)evt; - - assertEquals(SQL, qe.queryType()); - assertNull(qe.cacheName()); - - assertEquals(customSubjId ? subjId : grid(0).localNode().id(), qe.subjectId()); - - assertEquals("Integer", qe.className()); - assertEquals("_key >= ?", qe.clause()); - assertNull(qe.scanQueryFilter()); - assertNull(qe.continuousQueryFilter()); - assertArrayEquals(new Integer[] { 10 }, qe.arguments()); - - map.put(qe.key(), qe.value()); - - latch.countDown(); - - return true; - } - }, EVT_CACHE_QUERY_OBJECT_READ); - - grid(i).events().localListen(new IgnitePredicate<IgniteEvent>() { - @Override public boolean apply(IgniteEvent evt) { - assert evt instanceof IgniteCacheQueryExecutedEvent; - - IgniteCacheQueryExecutedEvent qe = (IgniteCacheQueryExecutedEvent)evt; - - assertEquals(SQL, qe.queryType()); - assertNull(qe.cacheName()); - - assertEquals(customSubjId ? subjId : grid(0).localNode().id(), qe.subjectId()); - - assertEquals("Integer", qe.className()); - assertEquals("_key >= ?", qe.clause()); - assertNull(qe.scanQueryFilter()); - assertNull(qe.continuousQueryFilter()); - assertArrayEquals(new Integer[] { 10 }, qe.arguments()); - - execLatch.countDown(); - - return true; - } - }, EVT_CACHE_QUERY_EXECUTED); - } - - GridCache<Integer, Integer> cache = ignite.cache(null); - - for (int i = 0; i < 20; i++) - assertTrue(cache.putx(i, i)); - - CacheQuery<Map.Entry<Integer, Integer>> q = cache.queries().createSqlQuery(Integer.class, "_key >= ?"); - - if (customSubjId) - ((GridCacheQueryAdapter)q).subjectId(subjId); - - q.execute(10).get(); - - assert latch.await(1000, MILLISECONDS); - assert execLatch.await(1000, MILLISECONDS); - - assertEquals(10, map.size()); - - for (int i = 10; i < 20; i++) - assertEquals(i, map.get(i).intValue()); - } - - /** - * @throws Exception If failed. - */ - public void testScanQueryEvents() throws Exception { - testScanQueryEvents(false); - } - - /** - * @throws Exception If failed. - */ - public void testScanQueryEventsSubjectId() throws Exception { - testScanQueryEvents(true); - } - - /** - * @param customSubjId Use custom subject ID. - * @throws Exception If failed. - */ - private void testScanQueryEvents(final boolean customSubjId) throws Exception { - final Map<Integer, Integer> map = new ConcurrentHashMap8<>(); - final CountDownLatch latch = new CountDownLatch(10); - final CountDownLatch execLatch = new CountDownLatch(cacheMode() == REPLICATED ? 1 : gridCount()); - - for (int i = 0; i < gridCount(); i++) { - grid(i).events().localListen(new IgnitePredicate<IgniteEvent>() { - @Override public boolean apply(IgniteEvent evt) { - assert evt instanceof IgniteCacheQueryReadEvent; - - IgniteCacheQueryReadEvent<Integer, Integer> qe = (IgniteCacheQueryReadEvent<Integer, Integer>)evt; - - assertEquals(SCAN, qe.queryType()); - assertNull(qe.cacheName()); - - assertEquals(customSubjId ? subjId : grid(0).localNode().id(), qe.subjectId()); - - assertNull(qe.className()); - assertNull(null, qe.clause()); - assertNotNull(qe.scanQueryFilter()); - assertNull(qe.continuousQueryFilter()); - assertNull(qe.arguments()); - - map.put(qe.key(), qe.value()); - - latch.countDown(); - - return true; - } - }, EVT_CACHE_QUERY_OBJECT_READ); - - grid(i).events().localListen(new IgnitePredicate<IgniteEvent>() { - @Override public boolean apply(IgniteEvent evt) { - assert evt instanceof IgniteCacheQueryExecutedEvent; - - IgniteCacheQueryExecutedEvent qe = (IgniteCacheQueryExecutedEvent)evt; - - assertEquals(SCAN, qe.queryType()); - assertNull(qe.cacheName()); - - assertEquals(customSubjId ? subjId : grid(0).localNode().id(), qe.subjectId()); - - assertNull(qe.className()); - assertNull(null, qe.clause()); - assertNotNull(qe.scanQueryFilter()); - assertNull(qe.continuousQueryFilter()); - assertNull(qe.arguments()); - - execLatch.countDown(); - - return true; - } - }, EVT_CACHE_QUERY_EXECUTED); - } - - GridCache<Integer, Integer> cache = ignite.cache(null); - - for (int i = 0; i < 20; i++) - assertTrue(cache.putx(i, i)); - - CacheQuery<Map.Entry<Integer, Integer>> q = cache.queries().createScanQuery( - new IgniteBiPredicate<Integer, Integer>() { - @Override public boolean apply(Integer key, Integer val) { - return key >= 10; - } - }); - - if (customSubjId) - ((GridCacheQueryAdapter)q).subjectId(subjId); - - q.execute().get(); - - assert latch.await(1000, MILLISECONDS); - assert execLatch.await(1000, MILLISECONDS); - - assertEquals(10, map.size()); - - for (int i = 10; i < 20; i++) - assertEquals(i, map.get(i).intValue()); - } - - /** - * @throws Exception If failed. - */ - public void testTextQueryEvents() throws Exception { - testTextQueryEvents(false); - } - - /** - * @throws Exception If failed. - */ - public void testTextQueryEventsSubjectId() throws Exception { - testTextQueryEvents(true); - } - - /** - * @throws Exception If failed. - */ - private void testTextQueryEvents(final boolean customSubjId) throws Exception { - final Map<Integer, Person> map = new ConcurrentHashMap8<>(); - final CountDownLatch latch = new CountDownLatch(2); - final CountDownLatch execLatch = new CountDownLatch(cacheMode() == REPLICATED ? 1 : gridCount()); - - for (int i = 0; i < gridCount(); i++) { - grid(i).events().localListen(new IgnitePredicate<IgniteEvent>() { - @Override public boolean apply(IgniteEvent evt) { - assert evt instanceof IgniteCacheQueryReadEvent; - - IgniteCacheQueryReadEvent<Integer, Person> qe = (IgniteCacheQueryReadEvent<Integer, Person>)evt; - - assertEquals(FULL_TEXT, qe.queryType()); - assertNull(qe.cacheName()); - - assertEquals(customSubjId ? subjId : grid(0).localNode().id(), qe.subjectId()); - - assertEquals("Person", qe.className()); - assertEquals("White", qe.clause()); - assertNull(qe.scanQueryFilter()); - assertNull(qe.continuousQueryFilter()); - assertNull(qe.arguments()); - - map.put(qe.key(), qe.value()); - - latch.countDown(); - - return true; - } - }, EVT_CACHE_QUERY_OBJECT_READ); - - grid(i).events().localListen(new IgnitePredicate<IgniteEvent>() { - @Override public boolean apply(IgniteEvent evt) { - assert evt instanceof IgniteCacheQueryExecutedEvent; - - IgniteCacheQueryExecutedEvent qe = (IgniteCacheQueryExecutedEvent)evt; - - assertEquals(FULL_TEXT, qe.queryType()); - assertNull(qe.cacheName()); - - assertEquals(customSubjId ? subjId : grid(0).localNode().id(), qe.subjectId()); - - assertEquals("Person", qe.className()); - assertEquals("White", qe.clause()); - assertNull(qe.scanQueryFilter()); - assertNull(qe.continuousQueryFilter()); - assertNull(qe.arguments()); - - execLatch.countDown(); - - return true; - } - }, EVT_CACHE_QUERY_EXECUTED); - } - - GridCache<Integer, Person> cache = ignite.cache(null); - - assertTrue(cache.putx(1, new Person("Bob White", 1000))); - assertTrue(cache.putx(2, new Person("Tom White", 1000))); - assertTrue(cache.putx(3, new Person("Mike Green", 1000))); - - CacheQuery<Map.Entry<Integer, Person>> q = cache.queries().createFullTextQuery(Person.class, "White"); - - if (customSubjId) - ((GridCacheQueryAdapter)q).subjectId(subjId); - - q.execute().get(); - - assert latch.await(1000, MILLISECONDS); - assert execLatch.await(1000, MILLISECONDS); - - assertEquals(2, map.size()); - - assertEquals("Bob White", map.get(1).name()); - assertEquals("Tom White", map.get(2).name()); - } - - /** - * @throws Exception If failed. - */ - public void testFieldsQueryEvents() throws Exception { - testFieldsQueryEvents(false); - } - - /** - * @throws Exception If failed. - */ - public void testFieldsQueryEventsSubjectId() throws Exception { - testFieldsQueryEvents(true); - } - - /** - * @throws Exception If failed. - */ - private void testFieldsQueryEvents(final boolean customSubjId) throws Exception { - final Map<Integer, String> map = new ConcurrentHashMap8<>(); - final CountDownLatch latch = new CountDownLatch(10); - final CountDownLatch execLatch = new CountDownLatch(cacheMode() == REPLICATED ? 1 : gridCount()); - - for (int i = 0; i < gridCount(); i++) { - grid(i).events().localListen(new IgnitePredicate<IgniteEvent>() { - @Override public boolean apply(IgniteEvent evt) { - assert evt instanceof IgniteCacheQueryReadEvent; - - IgniteCacheQueryReadEvent qe = (IgniteCacheQueryReadEvent)evt; - - assertEquals(SQL_FIELDS, qe.queryType()); - assertNull(qe.cacheName()); - - assertEquals(customSubjId ? subjId : grid(0).localNode().id(), qe.subjectId()); - - assertNull(qe.className()); - assertEquals("select _key, name from Person where salary > ?", qe.clause()); - assertNull(qe.scanQueryFilter()); - assertNull(qe.continuousQueryFilter()); - assertArrayEquals(new Integer[] { 10 }, qe.arguments()); - - List<?> row = (List<?>)qe.row(); - - map.put((Integer)row.get(0), (String)row.get(1)); - - latch.countDown(); - - return true; - } - }, EVT_CACHE_QUERY_OBJECT_READ); - - grid(i).events().localListen(new IgnitePredicate<IgniteEvent>() { - @Override public boolean apply(IgniteEvent evt) { - assert evt instanceof IgniteCacheQueryExecutedEvent; - - IgniteCacheQueryExecutedEvent qe = (IgniteCacheQueryExecutedEvent)evt; - - assertEquals(SQL_FIELDS, qe.queryType()); - assertNull(qe.cacheName()); - - assertEquals(customSubjId ? subjId : grid(0).localNode().id(), qe.subjectId()); - - assertNull(qe.className()); - assertEquals("select _key, name from Person where salary > ?", qe.clause()); - assertNull(qe.scanQueryFilter()); - assertNull(qe.continuousQueryFilter()); - assertArrayEquals(new Integer[] { 10 }, qe.arguments()); - - execLatch.countDown(); - - return true; - } - }, EVT_CACHE_QUERY_EXECUTED); - } - - GridCache<Integer, Person> cache = ignite.cache(null); - - for (int i = 1; i <= 20; i++) - assertTrue(cache.putx(i, new Person("Person " + i, i))); - - CacheQuery<List<?>> q = cache.queries().createSqlFieldsQuery( - "select _key, name from Person where salary > ?"); - - if (customSubjId) - ((GridCacheQueryAdapter)q).subjectId(subjId); - - q.execute(10).get(); - - assert latch.await(1000, MILLISECONDS); - assert execLatch.await(1000, MILLISECONDS); - - assertEquals(10, map.size()); - - for (int i = 11; i <= 20; i++) - assertEquals("Person " + i, map.get(i)); - } - - /** - * @param cls Class to check index table for. - * @param qryMgr Query manager. - * @return {@code true} if index has a table for given class. - * @throws IgniteCheckedException If failed. - */ - private boolean hasIndexTable(Class<?> cls, GridCacheQueryManager<Object, Object> qryMgr) throws IgniteCheckedException { - return qryMgr.size(cls) != -1; - } - - /** - * - */ - private static class ArrayObject implements Serializable { - /** */ - @CacheQuerySqlField - private Long[] arr; - - /** - * @param arr Array. - */ - private ArrayObject(Long[] arr) { - this.arr = arr; - } - } - - /** - * - */ - public static class Person implements Externalizable { - /** */ - @GridToStringExclude - @CacheQuerySqlField - private UUID id = UUID.randomUUID(); - - /** */ - @CacheQuerySqlField - @CacheQueryTextField - private String name; - - /** */ - @CacheQuerySqlField - private int salary; - - /** */ - @CacheQuerySqlField(index = true) - private int fake$Field; - - /** - * Required by {@link Externalizable}. - */ - public Person() { - // No-op. - } - - /** - * @param name Name. - * @param salary Salary. - */ - public Person(String name, int salary) { - assert name != null; - assert salary > 0; - - this.name = name; - this.salary = salary; - } - - /** - * @return Id. - */ - public UUID id() { - return id; - } - - /** - * @return Name. - */ - public String name() { - return name; - } - - /** - * @return Salary. - */ - public double salary() { - return salary; - } - - /** {@inheritDoc} */ - @Override public void writeExternal(ObjectOutput out) throws IOException { - U.writeUuid(out, id); - U.writeString(out, name); - out.writeInt(salary); - } - - /** {@inheritDoc} */ - @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { - id = U.readUuid(in); - name = U.readString(in); - salary = in.readInt(); - } - - /** {@inheritDoc} */ - @Override public int hashCode() { - return id.hashCode() + 31 * name.hashCode() + 31 * 31 * salary; - } - - /** {@inheritDoc} */ - @Override public boolean equals(Object obj) { - if (obj == this) - return true; - - if (!(obj instanceof Person)) - return false; - - Person that = (Person)obj; - - return that.id.equals(id) && that.name.equals(name) && that.salary == salary; - } - - /** {@inheritDoc} */ - @Override public String toString() { - return S.toString(Person.class, this); - } - } - - /** - * Test value object. - */ - @SuppressWarnings("PublicInnerClass") - public static class ObjectValue implements Serializable { - /** String value. */ - @CacheQueryTextField - private String strVal; - - /** Integer value. */ - @CacheQuerySqlField - private int intVal; - - /** - * Constructor. - * - * @param strVal String value. - * @param intVal Integer value. - */ - ObjectValue(String strVal, int intVal) { - this.strVal = strVal; - this.intVal = intVal; - } - - /** - * Gets value. - * - * @return Value. - */ - public String getStringValue() { - return strVal; - } - - /** - * @return Integer value. - */ - public int intValue() { - return intVal; - } - - /** {@inheritDoc} */ - @Override public boolean equals(Object o) { - if (this == o) - return true; - - if (o == null || getClass() != o.getClass()) - return false; - - ObjectValue other = (ObjectValue)o; - - return strVal == null ? other.strVal == null : strVal.equals(other.strVal); - - } - - /** {@inheritDoc} */ - @Override public int hashCode() { - return strVal != null ? strVal.hashCode() : 0; - } - - /** {@inheritDoc} */ - @Override public String toString() { - return S.toString(ObjectValue.class, this); - } - } - - /** - * Another test value object. - */ - private static class ObjectValueOther { - /** Value. */ - @CacheQueryTextField - private String val; - - /** - * @param val String value. - */ - ObjectValueOther(String val) { - this.val = val; - } - - /** - * Gets value. - * - * @return Value. - */ - public String value() { - return val; - } - - /** {@inheritDoc} */ - @Override public boolean equals(Object o) { - if (this == o) - return true; - - if (o == null || getClass() != o.getClass()) - return false; - - ObjectValueOther other = (ObjectValueOther)o; - - return val == null ? other.val == null : val.equals(other.val); - - } - - /** {@inheritDoc} */ - @Override public int hashCode() { - return val != null ? val.hashCode() : 0; - } - - /** {@inheritDoc} */ - @Override public String toString() { - return S.toString(ObjectValueOther.class, this); - } - } - - /** - * Empty test object. - */ - @SuppressWarnings("UnusedDeclaration") - private static class EmptyObject { - /** */ - private int val; - - /** - * @param val Value. - */ - private EmptyObject(int val) { - this.val = val; - } - - /** {@inheritDoc} */ - @Override public int hashCode() { - return val; - } - - /** {@inheritDoc} */ - @Override public boolean equals(Object o) { - if (this == o) - return true; - - if (!(o instanceof EmptyObject)) - return false; - - EmptyObject that = (EmptyObject)o; - - return val == that.val; - } - } - - /** - * - */ - private static class BadHashKeyObject implements Serializable { - /** */ - @CacheQuerySqlField(index = false) - private final String str; - - /** - * @param str String. - */ - private BadHashKeyObject(String str) { - this.str = str; - } - - /** {@inheritDoc} */ - @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - BadHashKeyObject keyObj = (BadHashKeyObject) o; - - return str.equals(keyObj.str); - } - - /** {@inheritDoc} */ - @Override public int hashCode() { - return 10; - } - - /** {@inheritDoc} */ - @Override public String toString() { - return S.toString(BadHashKeyObject.class, this); - } - } - - /** - * Test store. - */ - private static class TestStore extends CacheStoreAdapter<Object, Object> { - /** */ - private Map<Object, Object> map = new ConcurrentHashMap<>(); - - /** */ - void reset() { - map.clear(); - } - - /** {@inheritDoc} */ - @Override public Object load(Object key) { - return map.get(key); - } - - /** {@inheritDoc} */ - @Override public void write(javax.cache.Cache.Entry<? extends Object, ? extends Object> e) { - map.put(e.getKey(), e.getValue()); - } - - /** {@inheritDoc} */ - @Override public void delete(Object key) { - map.remove(key); - } - } - - /** - * Functions for test. - */ - @SuppressWarnings("PublicInnerClass") - public static class SqlFunctions { - /** - * @param x Argument. - * @return Square of given value. - */ - @CacheQuerySqlFunction - public static int square(int x) { - return x * x; - } - - /** - * @param x Argument. - * @return Cube of given value. - */ - @CacheQuerySqlFunction(alias = "_cube_") - public static int cube(int x) { - return x * x * x; - } - - /** - * Method which should not be registered. - * @return Nothing. - */ - public static int no() { - throw new IllegalStateException(); - } - } - - /** - * Sum remote reducer factory. - */ - private static class SumRemoteReducer implements IgniteReducer<Map.Entry<String, Integer>, Integer> { - /** */ - private int sum; - - @Override public boolean collect(Map.Entry<String, Integer> e) { - sum += e.getValue(); - - return true; - } - - @Override public Integer reduce() { - return sum; - } - } - - /** - * Sum local reducer factory. - */ - private static class SumLocalReducer implements IgniteReducer<Integer, Integer> { - /** */ - private int sum; - - @Override public boolean collect(Integer e) { - sum += e; - - return true; - } - - @Override public Integer reduce() { - return sum; - } - } -}
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/df488d08/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheQueryEvictsMultiThreadedSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheQueryEvictsMultiThreadedSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheQueryEvictsMultiThreadedSelfTest.java deleted file mode 100644 index d433052..0000000 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheQueryEvictsMultiThreadedSelfTest.java +++ /dev/null @@ -1,28 +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.cache; - -/** - * Multi-threaded tests for cache queries. - */ -public class GridCacheQueryEvictsMultiThreadedSelfTest extends GridCacheQueryMultiThreadedSelfTest { - /** {@inheritDoc} */ - @Override protected boolean evictsEnabled() { - return true; - } -} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/df488d08/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheQueryLoadSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheQueryLoadSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheQueryLoadSelfTest.java deleted file mode 100644 index 7c93844..0000000 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheQueryLoadSelfTest.java +++ /dev/null @@ -1,458 +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.cache; - -import org.apache.ignite.*; -import org.apache.ignite.cache.*; -import org.apache.ignite.cache.GridCache; -import org.apache.ignite.cache.query.*; -import org.apache.ignite.cache.store.*; -import org.apache.ignite.configuration.*; -import org.apache.ignite.internal.*; -import org.apache.ignite.lang.*; -import org.apache.ignite.spi.discovery.tcp.*; -import org.apache.ignite.spi.discovery.tcp.ipfinder.*; -import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.*; -import org.apache.ignite.internal.processors.cache.query.*; -import org.apache.ignite.internal.util.typedef.*; -import org.apache.ignite.internal.util.typedef.internal.*; -import org.apache.ignite.testframework.junits.common.*; -import org.jetbrains.annotations.*; - -import javax.cache.configuration.*; -import java.util.*; - -import static org.apache.ignite.cache.CacheMode.*; -import static org.apache.ignite.cache.CacheWriteSynchronizationMode.*; - -/** - * Test that entries are indexed on load/reload methods. - */ -public class GridCacheQueryLoadSelfTest extends GridCommonAbstractTest { - /** IP finder. */ - private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true); - - /** Puts count. */ - private static final int PUT_CNT = 10; - - /** Store map. */ - private static final Map<Integer, ValueObject> STORE_MAP = new HashMap<>(); - - /** */ - public GridCacheQueryLoadSelfTest() { - super(true); - } - - /** {@inheritDoc} */ - @SuppressWarnings("unchecked") - @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception { - IgniteConfiguration cfg = super.getConfiguration(gridName); - - CacheConfiguration ccfg = defaultCacheConfiguration(); - - ccfg.setCacheMode(REPLICATED); - ccfg.setCacheStoreFactory(new FactoryBuilder.SingletonFactory(new TestStore())); - ccfg.setReadThrough(true); - ccfg.setWriteThrough(true); - ccfg.setLoadPreviousValue(true); - ccfg.setWriteSynchronizationMode(FULL_SYNC); - - cfg.setCacheConfiguration(ccfg); - - TcpDiscoverySpi disco = new TcpDiscoverySpi(); - - disco.setIpFinder(IP_FINDER); - - cfg.setDiscoverySpi(disco); - - return cfg; - } - - /** {@inheritDoc} */ - @Override protected void afterTest() throws Exception { - cache().removeAll(); - - assert cache().isEmpty(); - assert size(ValueObject.class) == 0; - - STORE_MAP.clear(); - } - - /** - * Number of objects of given type in index. - * - * @param cls Value type. - * @return Objects number. - * @throws IgniteCheckedException If failed. - */ - private long size(Class<?> cls) throws IgniteCheckedException { - GridCacheQueryManager<Object, Object> qryMgr = ((GridKernal)grid()).internalCache().context().queries(); - - assert qryMgr != null; - - return qryMgr.size(cls); - } - - /** - * @throws Exception If failed. - */ - public void testLoadCache() throws Exception { - GridCache<Integer, ValueObject> cache = cache(); - - cache.loadCache(null, 0); - - assert cache.size() == PUT_CNT; - - Collection<Map.Entry<Integer, ValueObject>> res = - cache.queries().createSqlQuery(ValueObject.class, "val >= 0").execute().get(); - - assertNotNull(res); - assertEquals(PUT_CNT, res.size()); - assertEquals(PUT_CNT, size(ValueObject.class)); - } - - /** - * @throws Exception If failed. - */ - public void testLoadCacheAsync() throws Exception { - GridCache<Integer, ValueObject> cache = cache(); - - cache.loadCacheAsync(null, 0).get(); - - assert cache.size() == PUT_CNT; - - Collection<Map.Entry<Integer, ValueObject>> res = - cache.queries().createSqlQuery(ValueObject.class, "val >= 0").execute().get(); - - assert res != null; - assert res.size() == PUT_CNT; - assert size(ValueObject.class) == PUT_CNT; - } - - /** - * @throws Exception If failed. - */ - public void testLoadCacheFiltered() throws Exception { - GridCache<Integer, ValueObject> cache = cache(); - - cache.loadCache(new P2<Integer, ValueObject>() { - @Override public boolean apply(Integer key, ValueObject val) { - return key >= 5; - } - }, 0); - - assert cache.size() == PUT_CNT - 5; - - Collection<Map.Entry<Integer, ValueObject>> res = - cache.queries().createSqlQuery(ValueObject.class, "val >= 0").execute().get(); - - assert res != null; - assert res.size() == PUT_CNT - 5; - assert size(ValueObject.class) == PUT_CNT - 5; - } - - /** - * @throws Exception If failed. - */ - public void testLoadCacheAsyncFiltered() throws Exception { - GridCache<Integer, ValueObject> cache = cache(); - - cache.loadCacheAsync(new P2<Integer, ValueObject>() { - @Override public boolean apply(Integer key, ValueObject val) { - return key >= 5; - } - }, 0).get(); - - assert cache.size() == PUT_CNT - 5; - - Collection<Map.Entry<Integer, ValueObject>> res = - cache.queries().createSqlQuery(ValueObject.class, "val >= 0").execute().get(); - - assert res != null; - assert res.size() == PUT_CNT - 5; - assert size(ValueObject.class) == PUT_CNT - 5; - } - - /** - * @throws Exception If failed. - */ - public void testReload() throws Exception { - STORE_MAP.put(1, new ValueObject(1)); - - GridCache<Integer, ValueObject> cache = cache(); - - ValueObject vo = cache.reload(1); - - assertNotNull(vo); - - assertEquals(1, vo.value()); - assertEquals(1, cache.size()); - - Collection<Map.Entry<Integer, ValueObject>> res = - cache.queries().createSqlQuery(ValueObject.class, "val >= 0").execute().get(); - - assert res != null; - assert res.size() == 1; - assert size(ValueObject.class) == 1; - } - - /** - * @throws Exception If failed. - */ - public void testReloadAsync() throws Exception { - STORE_MAP.put(1, new ValueObject(1)); - - GridCache<Integer, ValueObject> cache = cache(); - - assert cache.reloadAsync(1).get().value() == 1; - - assert cache.size() == 1; - - Collection<Map.Entry<Integer, ValueObject>> res = - cache.queries().createSqlQuery(ValueObject.class, "val >= 0").execute().get(); - - assert res != null; - assert res.size() == 1; - assert size(ValueObject.class) == 1; - } - - /** - * @throws Exception If failed. - */ - public void testReloadAll() throws Exception { - for (int i = 0; i < PUT_CNT; i++) - STORE_MAP.put(i, new ValueObject(i)); - - GridCache<Integer, ValueObject> cache = cache(); - - Integer[] keys = new Integer[PUT_CNT - 5]; - - for (int i = 0; i < PUT_CNT - 5; i++) - keys[i] = i + 5; - - cache.reloadAll(F.asList(keys)); - - assert cache.size() == PUT_CNT - 5; - - Collection<Map.Entry<Integer, ValueObject>> res = - cache.queries().createSqlQuery(ValueObject.class, "val >= 0").execute().get(); - - assert res != null; - assert res.size() == PUT_CNT - 5; - assert size(ValueObject.class) == PUT_CNT - 5; - - for (Integer key : keys) - cache.clear(key); - - assert cache.isEmpty(); - assertEquals(0, cache.size()); - - cache.reloadAll(Arrays.asList(keys)); - - assertEquals(PUT_CNT - 5, cache.size()); - - res = cache.queries().createSqlQuery(ValueObject.class, "val >= 0").execute().get(); - - assert res != null; - assert res.size() == PUT_CNT - 5; - assert size(ValueObject.class) == PUT_CNT - 5; - } - - /** - * @throws Exception If failed. - */ - public void testReloadAllAsync() throws Exception { - for (int i = 0; i < PUT_CNT; i++) - STORE_MAP.put(i, new ValueObject(i)); - - GridCache<Integer, ValueObject> cache = cache(); - - Integer[] keys = new Integer[PUT_CNT - 5]; - - for (int i = 0; i < PUT_CNT - 5; i++) - keys[i] = i + 5; - - cache.reloadAllAsync(F.asList(keys)).get(); - - assert cache.size() == PUT_CNT - 5; - - Collection<Map.Entry<Integer, ValueObject>> res = - cache.queries().createSqlQuery(ValueObject.class, "val >= 0").execute().get(); - - assert res != null; - assert res.size() == PUT_CNT - 5; - assert size(ValueObject.class) == PUT_CNT - 5; - - // Invalidate will remove entries. - for (Integer key : keys) - cache.clear(key); - - assert cache.isEmpty(); - assertEquals(0, cache.size()); - - cache.reloadAllAsync(Arrays.asList(keys)).get(); - - assertEquals(PUT_CNT - 5, cache.size()); - - res = cache.queries().createSqlQuery(ValueObject.class, "val >= 0").execute().get(); - - assert res != null; - assert res.size() == PUT_CNT - 5; - assert size(ValueObject.class) == PUT_CNT - 5; - } - - /** - * @throws Exception If failed. - */ - public void testReloadAllFiltered() throws Exception { - GridCache<Integer, ValueObject> cache = cache(); - - for (int i = 0; i < PUT_CNT; i++) - assert cache.putx(i, new ValueObject(i)); - - assert cache.size() == PUT_CNT; - - Integer[] keys = new Integer[PUT_CNT]; - - for (int i = 0; i < PUT_CNT; i++) - keys[i] = i; - - for (Integer key : keys) - cache.clear(key); - - assert cache.isEmpty(); - assertEquals(0, cache.size()); - - cache.projection(new P1<CacheEntry<Integer, ValueObject>>() { - @Override public boolean apply(CacheEntry<Integer, ValueObject> e) { - return e.getKey() >= 5; - } - }).reloadAll(Arrays.asList(keys)); - - assert cache.size() == PUT_CNT - 5; - - Collection<Map.Entry<Integer, ValueObject>> res = - cache.queries().createSqlQuery(ValueObject.class, "val >= 0").execute().get(); - - assert res != null; - assert res.size() == PUT_CNT - 5; - assert size(ValueObject.class) == PUT_CNT - 5; - } - - /** - * @throws Exception If failed. - */ - public void testReloadAllAsyncFiltered() throws Exception { - GridCache<Integer, ValueObject> cache = cache(); - - for (int i = 0; i < PUT_CNT; i++) - assert cache.putx(i, new ValueObject(i)); - - assert cache.size() == PUT_CNT; - - Integer[] keys = new Integer[PUT_CNT]; - - for (int i = 0; i < PUT_CNT; i++) - keys[i] = i; - - for (Integer key : keys) - cache.clear(key); - - assert cache.isEmpty(); - assertEquals(0, cache.size()); - - cache.projection(new P1<CacheEntry<Integer, ValueObject>>() { - @Override public boolean apply(CacheEntry<Integer, ValueObject> e) { - return e.getKey() >= 5; - } - }).reloadAllAsync(Arrays.asList(keys)).get(); - - assertEquals(5, cache.size()); - - Collection<Map.Entry<Integer, ValueObject>> res = - cache.queries().createSqlQuery(ValueObject.class, "val >= 0").execute().get(); - - assert res != null; - assert res.size() == PUT_CNT - 5; - assert size(ValueObject.class) == PUT_CNT - 5; - } - - /** - * Test store. - */ - private static class TestStore extends CacheStoreAdapter<Integer, ValueObject> { - /** {@inheritDoc} */ - @Override public void loadCache(IgniteBiInClosure<Integer, ValueObject> clo, @Nullable Object... args) { - assert clo != null; - - for (int i = 0; i < PUT_CNT; i++) - clo.apply(i, new ValueObject(i)); - } - - /** {@inheritDoc} */ - @Override public ValueObject load(Integer key) { - assert key != null; - - return STORE_MAP.get(key); - } - - /** {@inheritDoc} */ - @Override public void write(javax.cache.Cache.Entry<? extends Integer, ? extends ValueObject> e) { - assert e != null; - assert e.getKey() != null; - assert e.getValue() != null; - - STORE_MAP.put(e.getKey(), e.getValue()); - } - - /** {@inheritDoc} */ - @Override public void delete(Object key) { - assert key != null; - - STORE_MAP.remove(key); - } - } - - /** - * Value object class. - */ - private static class ValueObject { - /** Value. */ - @CacheQuerySqlField - private final int val; - - /** - * @param val Value. - */ - ValueObject(int val) { - this.val = val; - } - - /** - * @return Value. - */ - int value() { - return val; - } - - /** {@inheritDoc} */ - @Override public String toString() { - return S.toString(ValueObject.class, this); - } - } -}