Return-Path: X-Original-To: apmail-ignite-commits-archive@minotaur.apache.org Delivered-To: apmail-ignite-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 43805194AD for ; Wed, 23 Mar 2016 16:15:52 +0000 (UTC) Received: (qmail 99847 invoked by uid 500); 23 Mar 2016 16:15:52 -0000 Delivered-To: apmail-ignite-commits-archive@ignite.apache.org Received: (qmail 99765 invoked by uid 500); 23 Mar 2016 16:15:52 -0000 Mailing-List: contact commits-help@ignite.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ignite.apache.org Delivered-To: mailing list commits@ignite.apache.org Received: (qmail 99748 invoked by uid 99); 23 Mar 2016 16:15:51 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 23 Mar 2016 16:15:51 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id C9821DFCDD; Wed, 23 Mar 2016 16:15:51 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: sboikov@apache.org To: commits@ignite.apache.org Date: Wed, 23 Mar 2016 16:15:52 -0000 Message-Id: <038ac0558e2d422691d4f9a145af3166@git.apache.org> In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [2/2] ignite git commit: IGNITE-1232: IgniteCrossCachesJoinsQueryTest IGNITE-1232: IgniteCrossCachesJoinsQueryTest Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/1c19f729 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/1c19f729 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/1c19f729 Branch: refs/heads/ignite-1232 Commit: 1c19f729320d9fcd8491386fbc34a9a3a1ec3f61 Parents: ca2dbc2 Author: ashutak Authored: Wed Mar 23 19:08:39 2016 +0300 Committer: ashutak Committed: Wed Mar 23 19:08:39 2016 +0300 ---------------------------------------------------------------------- ...niteCrossCachesDistributedJoinQueryTest.java | 1423 ---------------- .../cache/IgniteCrossCachesJoinsQueryTest.java | 1530 ++++++++++++++++++ .../IgniteCacheQuerySelfTestSuite.java | 4 +- 3 files changed, 1532 insertions(+), 1425 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/1c19f729/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCrossCachesDistributedJoinQueryTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCrossCachesDistributedJoinQueryTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCrossCachesDistributedJoinQueryTest.java deleted file mode 100644 index 9461db0..0000000 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCrossCachesDistributedJoinQueryTest.java +++ /dev/null @@ -1,1423 +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 java.io.Serializable; -import java.sql.PreparedStatement; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.Callable; -import java.util.concurrent.ThreadLocalRandom; -import javax.cache.CacheException; -import org.apache.ignite.IgniteCache; -import org.apache.ignite.cache.CacheMode; -import org.apache.ignite.cache.QueryEntity; -import org.apache.ignite.cache.query.Query; -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.processors.query.h2.sql.AbstractH2CompareQueryTest; -import org.apache.ignite.internal.util.typedef.T4; -import org.apache.ignite.internal.util.typedef.internal.SB; -import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi; -import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder; -import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder; -import org.apache.ignite.testframework.GridTestUtils; - -import static org.apache.ignite.cache.CacheMode.PARTITIONED; -import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC; - -/** - * - */ -@SuppressWarnings({"unchecked", "PackageVisibleField", "serial"}) -public class IgniteCrossCachesDistributedJoinQueryTest extends AbstractH2CompareQueryTest { - /** */ - private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true); - - /** */ - private static final int NODES = 5; - - /** */ - private boolean client; - - /** */ - private Data data; - - /** */ - private String dataAsStr; - - /** */ - private String personCacheName; - - /** */ - private String orgCacheName; - - /** */ - private String accCacheName; - - /** {@inheritDoc} */ - @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception { - IgniteConfiguration cfg = super.getConfiguration(gridName); - - ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(IP_FINDER); - - cfg.setClientMode(client); - - return cfg; - } - - /** {@inheritDoc} */ - @Override protected CacheConfiguration[] cacheConfigurations() { - return null; - } - - /** {@inheritDoc} */ - @Override protected void setIndexedTypes(CacheConfiguration cc, CacheMode mode) { - throw new UnsupportedOperationException(); - } - - /** {@inheritDoc} */ - @Override protected void beforeTestsStarted() throws Exception { - startGridsMultiThreaded(NODES - 1); - - client = true; - - startGrid(NODES - 1); - - conn = openH2Connection(false); - - initializeH2Schema(); - } - - /** {@inheritDoc} */ - @Override protected void initCacheAndDbData() throws SQLException { - Statement st = conn.createStatement(); - - st.execute("create table \"" + accCacheName + "\".Account" + - " (" + - " _key int not null," + - " _val other not null," + - " id int unique," + - " personId int," + - " personDateId TIMESTAMP," + - " personStrId varchar(255)" + - " )"); - - st.execute("create table \"" + personCacheName + "\".Person" + - " (" + - " _key int not null," + - " _val other not null," + - " id int unique," + - " strId varchar(255) ," + - " dateId TIMESTAMP ," + - " orgId int," + - " orgDateId TIMESTAMP," + - " orgStrId varchar(255), " + - " name varchar(255), " + - " salary int" + - " )"); - - st.execute("create table \"" + orgCacheName + "\".Organization" + - " (" + - " _key int not null," + - " _val other not null," + - " id int unique," + - " strId varchar(255) ," + - " dateId TIMESTAMP ," + - " name varchar(255) " + - " )"); - - conn.commit(); - - st.close(); - - for (Account account : data.accounts) { - ignite(0).cache(accCacheName).put(account.id, account); - - insertInDb(account); - } - - for (Person person : data.persons) { - ignite(0).cache(personCacheName).put(person.id, person); - - insertInDb(person); - } - - for (Organization org : data.orgs) { - ignite(0).cache(orgCacheName).put(org.id, org); - - insertInDb(org); - } - } - - /** - * @param acc Account. - * @throws SQLException If failed. - */ - private void insertInDb(Account acc) throws SQLException { - try (PreparedStatement st = conn.prepareStatement( - "insert into \"" + accCacheName + "\".Account (_key, _val, id, personId, personDateId, personStrId) " + - "values(?, ?, ?, ?, ?, ?)")) { - int i = 0; - - st.setObject(++i, acc.id); - st.setObject(++i, acc); - st.setObject(++i, acc.id); - st.setObject(++i, acc.personId); - st.setObject(++i, acc.personDateId); - st.setObject(++i, acc.personStrId); - - st.executeUpdate(); - } - } - - /** - * @param p Person. - * @throws SQLException If failed. - */ - private void insertInDb(Person p) throws SQLException { - try (PreparedStatement st = conn.prepareStatement( - "insert into \"" + personCacheName + "\".Person (_key, _val, id, strId, dateId, name, orgId, orgDateId, " + - "orgStrId, salary) " + - "values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")) { - int i = 0; - - st.setObject(++i, p.id); - st.setObject(++i, p); - st.setObject(++i, p.id); - st.setObject(++i, p.strId); - st.setObject(++i, p.dateId); - st.setObject(++i, p.name); - st.setObject(++i, p.orgId); - st.setObject(++i, p.orgDateId); - st.setObject(++i, p.orgStrId); - st.setObject(++i, p.salary); - - st.executeUpdate(); - } - } - - /** - * @param o Organization. - * @throws SQLException If failed. - */ - private void insertInDb(Organization o) throws SQLException { - try (PreparedStatement st = conn.prepareStatement( - "insert into \"" + orgCacheName + "\".Organization (_key, _val, id, strId, dateId, name) " + - "values(?, ?, ?, ?, ?, ?)")) { - int i = 0; - - st.setObject(++i, o.id); - st.setObject(++i, o); - st.setObject(++i, o.id); - st.setObject(++i, o.strId); - st.setObject(++i, o.dateId); - st.setObject(++i, o.name); - - st.executeUpdate(); - } - } - - /** {@inheritDoc} */ - @Override protected void checkAllDataEquals() throws Exception { - compareQueryRes0(ignite(0).cache(accCacheName), "select _key, _val, id, personId, personDateId, personStrId " + - "from \"" + accCacheName + "\".Account"); - - compareQueryRes0(ignite(0).cache(personCacheName), "select _key, _val, id, strId, dateId, name, orgId, " + - "orgDateId, orgStrId, salary from \"" + personCacheName + "\".Person"); - - compareQueryRes0(ignite(0).cache(orgCacheName), "select _key, _val, id, strId, dateId, name " + - "from \"" + orgCacheName + "\".Organization"); - } - - /** {@inheritDoc} */ - @Override protected Statement initializeH2Schema() throws SQLException { - Statement st = conn.createStatement(); - - st.execute("CREATE SCHEMA \"" + TestCacheType.REPLICATED_1.cacheName + "\""); - st.execute("CREATE SCHEMA \"" + TestCacheType.REPLICATED_2.cacheName + "\""); - st.execute("CREATE SCHEMA \"" + TestCacheType.REPLICATED_3.cacheName + "\""); - - st.execute("CREATE SCHEMA \"" + TestCacheType.PARTITIONED_b0_1.cacheName + "\""); - st.execute("CREATE SCHEMA \"" + TestCacheType.PARTITIONED_b0_2.cacheName + "\""); - st.execute("CREATE SCHEMA \"" + TestCacheType.PARTITIONED_b0_3.cacheName + "\""); - - st.execute("CREATE SCHEMA \"" + TestCacheType.PARTITIONED_b1_1.cacheName + "\""); - st.execute("CREATE SCHEMA \"" + TestCacheType.PARTITIONED_b1_2.cacheName + "\""); - st.execute("CREATE SCHEMA \"" + TestCacheType.PARTITIONED_b1_3.cacheName + "\""); - - return st; - } - - /** {@inheritDoc} */ - @Override protected long getTestTimeout() { - return 30 * 60 * 1000; - } - - /** - * @throws Exception If failed. - */ - public void testCrossCacheDistributedJoin1() throws Exception { - final Set personCacheTypes = new LinkedHashSet() {{ - add(TestCacheType.REPLICATED_1); - }}; - - final Set accCacheTypes = new LinkedHashSet() {{ - add(TestCacheType.REPLICATED_1); - add(TestCacheType.PARTITIONED_b0_1); - add(TestCacheType.PARTITIONED_b1_1); - add(TestCacheType.REPLICATED_2); - add(TestCacheType.PARTITIONED_b0_2); - add(TestCacheType.PARTITIONED_b1_2); - }}; - - Set orgCacheTypes = new LinkedHashSet() {{ - addAll(accCacheTypes); - add(TestCacheType.REPLICATED_3); - add(TestCacheType.PARTITIONED_b0_3); - add(TestCacheType.PARTITIONED_b1_3); - }}; - - checkCrossCacheDistributedJoin(accCacheTypes, personCacheTypes, orgCacheTypes); - } - - /** - * @throws Exception If failed. - */ - public void testCrossCacheDistributedJoin2() throws Exception { - final Set personCacheTypes = new LinkedHashSet() {{ - add(TestCacheType.PARTITIONED_b0_1); - }}; - - final Set accCacheTypes = new LinkedHashSet() {{ - add(TestCacheType.REPLICATED_1); - add(TestCacheType.PARTITIONED_b0_1); - add(TestCacheType.PARTITIONED_b1_1); - add(TestCacheType.REPLICATED_2); - add(TestCacheType.PARTITIONED_b0_2); - add(TestCacheType.PARTITIONED_b1_2); - }}; - - Set orgCacheTypes = new LinkedHashSet() {{ - addAll(accCacheTypes); - add(TestCacheType.REPLICATED_3); - add(TestCacheType.PARTITIONED_b0_3); - add(TestCacheType.PARTITIONED_b1_3); - }}; - - checkCrossCacheDistributedJoin(accCacheTypes, personCacheTypes, orgCacheTypes); - } - - /** - * @throws Exception If failed. - */ - public void testCrossCacheDistributedJoin3() throws Exception { - final Set personCacheTypes = new LinkedHashSet() {{ - add(TestCacheType.PARTITIONED_b0_1); - }}; - - final Set accCacheTypes = new LinkedHashSet() {{ - add(TestCacheType.REPLICATED_1); - add(TestCacheType.PARTITIONED_b0_1); - add(TestCacheType.PARTITIONED_b1_1); - add(TestCacheType.REPLICATED_2); - add(TestCacheType.PARTITIONED_b0_2); - add(TestCacheType.PARTITIONED_b1_2); - }}; - - Set orgCacheTypes = new LinkedHashSet() {{ - addAll(accCacheTypes); - add(TestCacheType.REPLICATED_3); - add(TestCacheType.PARTITIONED_b0_3); - add(TestCacheType.PARTITIONED_b1_3); - }}; - - checkCrossCacheDistributedJoin(accCacheTypes, personCacheTypes, orgCacheTypes); - } - - /** - * @throws Exception If failed. - * @param accCacheTypes Account cache types. - * @param personCacheTypes Person cache types. - * @param orgCacheTypes Organization cache types. - */ - private void checkCrossCacheDistributedJoin( - Set accCacheTypes, Set personCacheTypes, - Set orgCacheTypes) throws Exception { - Map, Throwable> errors = new LinkedHashMap<>(); - List> success = new ArrayList<>(); - - int cfgIdx = 0; - - for (TestCacheType personCacheType : personCacheTypes) { - for (TestCacheType accCacheType : accCacheTypes) { - for (TestCacheType orgCacheType : orgCacheTypes) { - try { - checkDistributedCrossCacheJoin(personCacheType, accCacheType, orgCacheType); - - success.add(new T4<>(cfgIdx, personCacheType, accCacheType, orgCacheType)); - } - catch (Throwable e) { - error("Failed to make distributed cross cache select.", e); - - errors.put(new T4<>(cfgIdx, personCacheType, accCacheType, orgCacheType), e); - } - - cfgIdx++; - } - } - } - - if (!errors.isEmpty()) { - int total = personCacheTypes.size() * accCacheTypes.size() * orgCacheTypes.size(); - - SB sb = new SB("Test failed for the following " + errors.size() + " combination(s) (" + total + " total):\n"); - - for (Map.Entry, Throwable> e : errors.entrySet()) { - T4 t = e.getKey(); - - sb.a("[cfgIdx=" + t.get1() + ", personCache=" + t.get2() + ", accCache=" + t.get3() - + ", orgCache=" + t.get4() + ", exception=" + e.getValue() + "]").a("\n"); - } - - sb.a("Successfully finished combinations:\n"); - - for (T4 t : success) { - sb.a("[cfgIdx=" + t.get1() + ", personCache=" + t.get2() + ", accCache=" + t.get3() - + ", orgCache=" + t.get4() + "]").a("\n"); - } - - sb.a("The following data has beed used for test:\n " + dataAsString()); - - fail(sb.toString()); - } - } - - /** - * @param personCacheType Person cache type. - * @param accCacheType Account cache type. - * @param orgCacheType Organization cache type. - * @throws Exception If failed. - */ - private void checkDistributedCrossCacheJoin(final TestCacheType personCacheType, - final TestCacheType accCacheType, - final TestCacheType orgCacheType) throws Exception { - info("Checking distributed cross cache join [personCache=" + personCacheType + - ", accCache=" + accCacheType + - ", orgCache=" + orgCacheType + "]"); - - Collection cacheTypes = new ArrayList() {{ - add(personCacheType); - add(accCacheType); - add(orgCacheType); - }}; - - for (TestCacheType type : cacheTypes) { - CacheConfiguration cc = cacheConfiguration(type.cacheName, - type.cacheMode, - type.backups, - type == accCacheType, - type == personCacheType, - type == orgCacheType - ); - - ignite(0).getOrCreateCache(cc); - - info("Created cache [name=" + type.cacheName + ", mode=" + type.cacheMode + "]"); - } - - awaitPartitionMapExchange(); - - try { - dataAsStr = null; - data = prepareData(); - - personCacheName = personCacheType.cacheName; - accCacheName = accCacheType.cacheName; - orgCacheName = orgCacheType.cacheName; - - initCacheAndDbData(); - - checkAllDataEquals(); - - List cacheNames = new ArrayList<>(); - - cacheNames.add(personCacheType.cacheName); - cacheNames.add(orgCacheType.cacheName); - cacheNames.add(accCacheType.cacheName); - - for (int i = 0; i < NODES; i++) { - log.info("Test node: " + i); - - for (String cacheName : cacheNames) { - final IgniteCache cache = ignite(i).cache(cacheName); - - log.info("Use cache: " + cache.getName()); - - if (((IgniteCacheProxy)cache).context().isReplicated() && !ignite(i).configuration().isClientMode()) - assertProperException(cache); - else { - boolean isClientNodeAndCacheIsReplicated = ((IgniteCacheProxy)cache).context().isReplicated() - && ignite(i).configuration().isClientMode(); - - boolean all3CachesAreReplicated = - ((IgniteCacheProxy)ignite(0).cache(accCacheName)).context().isReplicated() - && ((IgniteCacheProxy)ignite(0).cache(personCacheName)).context().isReplicated() - && ((IgniteCacheProxy)ignite(0).cache(orgCacheName)).context().isReplicated(); - - // Queries running on replicated cache should not contain JOINs with partitioned tables. - if (!isClientNodeAndCacheIsReplicated || all3CachesAreReplicated) { - if (cache.getName().equals(orgCacheType.cacheName)) - compareQueryRes0(cache, "select name from (select name from \"" + orgCacheName + "\".Organization)", true, - new Object[0], Ordering.RANDOM); - - if (!cache.getName().equals(orgCacheType.cacheName)) - checkPersonAccountsJoin(cache, data.accountsPerPerson); - - if (!cache.getName().equals(accCacheType.cacheName)) - checkOrganizationPersonsJoin(cache, data.personsPerOrg); - - checkOrganizationPersonAccountJoin(cache, data.accountsPerOrg); - - checkUninon(cache); - - if (!cache.getName().equals(orgCacheType.cacheName)) - checkPersonAccountCrossJoin(cache); - - if (!cache.getName().equals(accCacheType.cacheName)) - checkPersonOrganizationGroupBy(cache); - - if (!cache.getName().equals(orgCacheType.cacheName)) - checkPersonAccountGroupBy(cache); - - if (!cache.getName().equals(accCacheType.cacheName)) - checkPersonOrganizationJoinInsideSubquery(cache); - - checkJoinInsideSubquery(cache); - } - } - } - } - } - finally { - ignite(0).destroyCache(accCacheType.cacheName); - ignite(0).destroyCache(personCacheType.cacheName); - ignite(0).destroyCache(orgCacheType.cacheName); - - Statement st = conn.createStatement(); - - st.execute("drop table \"" + accCacheName + "\".Account"); - st.execute("drop table \"" + personCacheName + "\".Person"); - st.execute("drop table \"" + orgCacheName + "\".Organization"); - - conn.commit(); - - st.close(); - } - } - - /** - * @param cache Cache. - */ - private void assertProperException(final IgniteCache cache) { - final IgniteCache accCache = ignite(0).cache(accCacheName); - final IgniteCache personCache = ignite(0).cache(personCacheName); - - GridTestUtils.assertThrows(log, new Callable() { - @Override public Object call() throws Exception { - cache.query(new SqlFieldsQuery("select p.name from " + - "\"" + personCache.getName() + "\".Person p, " + - "\"" + accCache.getName() + "\".Account a " + - "where p._key = a.personId").setDistributedJoins(true)); - - return null; - } - }, CacheException.class, "Queries using distributed JOINs have to be run on partitioned cache"); - - GridTestUtils.assertThrows(log, new Callable() { - @Override public Object call() throws Exception { - cache.query(new SqlQuery(Person.class, - "from \"" + personCache.getName() + "\".Person , " + - "\"" + accCache.getName() + "\".Account " + - "where Person._key = Account.personId") - .setDistributedJoins(true)); - - return null; - } - }, CacheException.class, "Queries using distributed JOINs have to be run on partitioned cache"); - } - - /** - * Organization ids: [0, 9]. Person ids: randoms at [10, 9999]. Accounts ids: randoms at [10000, 999_999] - * - * @return Data. - */ - private static Data prepareData() { - Map personsPerOrg = new HashMap<>(); - Map accountsPerPerson = new HashMap<>(); - Map accountsPerOrg = new HashMap<>(); - Map maxSalaryPerOrg = new HashMap<>(); - - Collection orgs = new ArrayList<>(); - Collection persons = new ArrayList<>(); - Collection accounts = new ArrayList<>(); - - final int ORG_CNT = 10; - - for (int id = 0; id < ORG_CNT; id++) - orgs.add(new Organization(id, "org-" + id)); - - Set personIds = new HashSet<>(); - Set accountIds = new HashSet<>(); - - for (int orgId = 0; orgId < ORG_CNT; orgId++) { - int personsCnt = ThreadLocalRandom.current().nextInt(20); - - int accsPerOrg = 0; - int maxSalary = -1; - - for (int p = 0; p < personsCnt; p++) { - int personId = ThreadLocalRandom.current().nextInt(10, 10_000); - - while (!personIds.add(personId)) - personId = ThreadLocalRandom.current().nextInt(10, 10_000); - - String name = "person-" + personId; - - int salary = ThreadLocalRandom.current().nextInt(1, 10) * 1000; - - if (salary > maxSalary) - maxSalary = salary; - - persons.add(new Person(personId, orgId, name, salary)); - - int accountsCnt = ThreadLocalRandom.current().nextInt(10); - - for (int a = 0; a < accountsCnt; a++) { - int accountId = ThreadLocalRandom.current().nextInt(10_000, 1000_00); - - while (!accountIds.add(accountId)) - accountId = ThreadLocalRandom.current().nextInt(10_000, 1000_000); - - accounts.add(new Account(accountId, personId, orgId)); - } - - accountsPerPerson.put(personId, accountsCnt); - - accsPerOrg += accountsCnt; - } - - personsPerOrg.put(orgId, personsCnt); - accountsPerOrg.put(orgId, accsPerOrg); - maxSalaryPerOrg.put(orgId, maxSalary); - } - - return new Data(orgs, persons, accounts, personsPerOrg, accountsPerPerson, accountsPerOrg, maxSalaryPerOrg); - } - - /** - * @param cacheName Cache name. - * @param cacheMode Cache mode. - * @param backups Number of backups. - * @param accountIdx Account index flag. - * @param personIdx Person index flag. - * @param orgIdx Organization index flag. - * @return Cache configuration. - */ - private CacheConfiguration cacheConfiguration(String cacheName, - CacheMode cacheMode, - int backups, - boolean accountIdx, - boolean personIdx, - boolean orgIdx) { - CacheConfiguration ccfg = new CacheConfiguration(); - - ccfg.setName(cacheName); - - ccfg.setCacheMode(cacheMode); - - if (cacheMode == PARTITIONED) - ccfg.setBackups(backups); - - ccfg.setWriteSynchronizationMode(FULL_SYNC); - - List entities = new ArrayList<>(); - - if (accountIdx) { - QueryEntity account = new QueryEntity(); - account.setKeyType(Integer.class.getName()); - account.setValueType(Account.class.getName()); - account.addQueryField("id", Integer.class.getName(), null); - account.addQueryField("personId", Integer.class.getName(), null); - account.addQueryField("personDateId", Date.class.getName(), null); - account.addQueryField("personStrId", String.class.getName(), null); - - entities.add(account); - } - - if (personIdx) { - QueryEntity person = new QueryEntity(); - person.setKeyType(Integer.class.getName()); - person.setValueType(Person.class.getName()); - person.addQueryField("id", Integer.class.getName(), null); - person.addQueryField("dateId", Date.class.getName(), null); - person.addQueryField("strId", String.class.getName(), null); - person.addQueryField("orgId", Integer.class.getName(), null); - person.addQueryField("orgDateId", Date.class.getName(), null); - person.addQueryField("orgStrId", String.class.getName(), null); - person.addQueryField("name", String.class.getName(), null); - person.addQueryField("salary", Integer.class.getName(), null); - - entities.add(person); - } - - if (orgIdx) { - QueryEntity org = new QueryEntity(); - org.setKeyType(Integer.class.getName()); - org.setValueType(Organization.class.getName()); - org.addQueryField("id", Integer.class.getName(), null); - org.addQueryField("dateId", Date.class.getName(), null); - org.addQueryField("strId", String.class.getName(), null); - org.addQueryField("name", String.class.getName(), null); - - entities.add(org); - } - - ccfg.setQueryEntities(entities); - - return ccfg; - } - - /** - * @param cache Cache. - * @param cnts Organizations per person counts. - */ - private void checkOrganizationPersonsJoin(IgniteCache cache, Map cnts) { - SqlFieldsQuery qry = new SqlFieldsQuery("select o.name, p.name " + - "from \"" + orgCacheName + "\".Organization o, \"" + personCacheName + "\".Person p " + - "where p.orgId = o._key and o._key=?"); - - qry.setDistributedJoins(true); - - SqlQuery qry2 = null; - - if (personCacheName.equals(cache.getName())) { - qry2 = new SqlQuery(Person.class, - "from \"" + orgCacheName + "\".Organization, \"" + personCacheName + "\".Person " + - "where Person.orgId = Organization._key and Organization._key=?" - ); - - qry2.setDistributedJoins(true); - } - - long total = 0; - - for (int i = 0; i < cnts.size(); i++) { - qry.setArgs(i); - - if (qry2 != null) - qry2.setArgs(i); - - List> res = cache.query(qry).getAll(); - - assertEquals((int)cnts.get(i), res.size()); - - if (qry2 != null) { - List> res2 = cache.query(qry2).getAll(); - - assertEquals((int)cnts.get(i), res2.size()); - } - - total += res.size(); - } - - SqlFieldsQuery qry3 = new SqlFieldsQuery("select count(*) " + - "from \"" + orgCacheName + "\".Organization o, \"" + personCacheName + "\".Person p where p.orgId = o._key"); - - qry3.setDistributedJoins(true); - - List> res = cache.query(qry3).getAll(); - - assertEquals(1, res.size()); - assertEquals(total, res.get(0).get(0)); - } - - /** - * @param cache Cache. - * @param cnts Accounts per person counts. - */ - private void checkPersonAccountsJoin(IgniteCache cache, Map cnts) { - List qrys = new ArrayList<>(); - - qrys.add(new SqlFieldsQuery("select p.name from " + - "\"" + personCacheName + "\".Person p, " + - "\"" + accCacheName + "\".Account a " + - "where p._key = a.personId and p._key=?") - ); - - qrys.add(new SqlFieldsQuery("select p.name from " + - "\"" + personCacheName + "\".Person p, " + - "\"" + accCacheName + "\".Account a " + - "where p.dateId = a.personDateId and p._key=?") - ); - - qrys.add(new SqlFieldsQuery("select p.name from " + - "\"" + personCacheName + "\".Person p, " + - "\"" + accCacheName + "\".Account a " + - "where p.strId = a.personStrId and p._key=?") - ); - - qrys.add(new SqlFieldsQuery("select p.name from " + - "\"" + personCacheName + "\".Person p, " + - "\"" + accCacheName + "\".Account a " + - "where p.id = a.personId and p.id=?") - ); - - qrys.add(new SqlFieldsQuery("select p.name from " + - "\"" + personCacheName + "\".Person p, " + - "\"" + accCacheName + "\".Account a " + - "where p.dateId = a.personDateId and p.id=?") - ); - - qrys.add(new SqlFieldsQuery("select p.name from " + - "\"" + personCacheName + "\".Person p, " + - "\"" + accCacheName + "\".Account a " + - "where p.strId = a.personStrId and p.id=?") - ); - - if (personCacheName.equals(cache.getName())) { - qrys.add(new SqlQuery(Person.class, - "from \"" + personCacheName + "\".Person , \"" + accCacheName + "\".Account " + - "where Person._key = Account.personId and Person._key=?") - ); - - qrys.add(new SqlQuery(Person.class, - "from \"" + personCacheName + "\".Person , \"" + accCacheName + "\".Account " + - "where Person.id = Account.personId and Person.id=?") - ); - } - - long total = 0; - - for (Map.Entry e : cnts.entrySet()) { - List> res = null; - - for (Query q : qrys) { - if (q instanceof SqlFieldsQuery) { - ((SqlFieldsQuery)q).setDistributedJoins(true); - - ((SqlFieldsQuery)q).setArgs(e.getKey()); - } - else { - ((SqlQuery)q).setDistributedJoins(true); - - ((SqlQuery)q).setArgs(e.getKey()); - } - - res = cache.query(q).getAll(); - - assertEquals((int)e.getValue(), res.size()); - } - - total += res.size(); - } - - qrys.clear(); - - qrys.add(new SqlFieldsQuery("select count(*) " + - "from \"" + personCacheName + "\".Person p, \"" + accCacheName + "\".Account" + " a " + - "where p.id = a.personId")); - - qrys.add(new SqlFieldsQuery("select count(*) " + - "from \"" + personCacheName + "\".Person p, \"" + accCacheName + "\".Account" + " a " + - "where p.Dateid = a.personDateId")); - - qrys.add(new SqlFieldsQuery("select count(*) " + - "from \"" + personCacheName + "\".Person p, \"" + accCacheName + "\".Account" + " a " + - "where p.strId = a.personStrId")); - - qrys.add(new SqlFieldsQuery("select count(*) " + - "from \"" + personCacheName + "\".Person p, \"" + accCacheName + "\".Account" + " a " + - "where p._key = a.personId")); - - for (Query q : qrys) { - ((SqlFieldsQuery)q).setDistributedJoins(true); - - List> res = cache.query(q).getAll(); - - assertEquals(1, res.size()); - assertEquals(total, res.get(0).get(0)); - } - } - - /** - * @param cache Cache. - * @param cnts Accounts per organization count - */ - private void checkOrganizationPersonAccountJoin(IgniteCache cache, Map cnts) { - List queries = new ArrayList<>(); - - queries.add(new SqlFieldsQuery("select o.name, p.name, a._key " + - "from " + - "\"" + orgCacheName + "\".Organization o, " + - "\"" + personCacheName + "\".Person p, " + - "\"" + accCacheName + "\".Account a " + - "where p.orgId = o._key and p._key = a.personId and o.id = ?")); - - queries.add(new SqlFieldsQuery("select o.name, p.name, a._key " + - "from " + - "\"" + orgCacheName + "\".Organization o, " + - "\"" + personCacheName + "\".Person p, " + - "\"" + accCacheName + "\".Account a " + - "where p.orgDateId = o.dateId and p.strId = a.personStrId and o.id = ?")); - - queries.add(new SqlFieldsQuery("select o.name, p.name, a._key " + - "from " + - "\"" + orgCacheName + "\".Organization o, " + - "\"" + personCacheName + "\".Person p, " + - "\"" + accCacheName + "\".Account a " + - "where p.orgStrId = o.strId and p.id = a.personId and o.id = ?")); - - if (accCacheName.equals(cache.getName())) { - queries.add(new SqlQuery(Account.class, "from " + - "\"" + orgCacheName + "\".Organization , " + - "\"" + personCacheName + "\".Person , " + - "\"" + accCacheName + "\".Account " + - "where Person.orgId = Organization._key and Person._key = Account.personId and Organization.id = ?")); - } - - long total = 0; - - for (int orgId = 0; orgId < cnts.size(); orgId++) { - List> res = null; - - for (Query q : queries) { - if (q instanceof SqlFieldsQuery) { - ((SqlFieldsQuery)q).setDistributedJoins(true); - - ((SqlFieldsQuery)q).setArgs(orgId); - } - else { - ((SqlQuery)q).setDistributedJoins(true); - - ((SqlQuery)q).setArgs(orgId); - } - - res = cache.query(q).getAll(); - - assertEquals((int)cnts.get(orgId), res.size()); - } - - total += res.size(); - } - - SqlFieldsQuery qry3 = new SqlFieldsQuery("select count(*) " + - "from " + - "\"" + orgCacheName + "\".Organization o, " + - "\"" + personCacheName + "\".Person p, " + - "\"" + accCacheName + "\".Account a " + - "where p.orgId = o._key and p._key = a.personId"); - - qry3.setDistributedJoins(true); - - List> res = cache.query(qry3).getAll(); - - assertEquals(1, res.size()); - assertEquals(total, res.get(0).get(0)); - - } - - /** - * @param cache Cache. - */ - private void checkUninon(IgniteCache cache) { - List queries = new ArrayList<>(); - - queries.add(new SqlFieldsQuery( - "select p.name from " + - "\"" + personCacheName + "\".Person p, " + - "\"" + accCacheName + "\".Account a " + - "where p._key = a.personId and p.id = ? " + - "union all " + - "select o.name from " + - "\"" + orgCacheName + "\".Organization o, " + - "\"" + personCacheName + "\".Person p " + - "where p.orgStrId = o.strId and o.id = ?" - )); - - Map personsPerOrg = data.personsPerOrg; - Map accountsPerPerson = data.accountsPerPerson; - - for (Map.Entry e1 : personsPerOrg.entrySet()) { - Integer orgId = e1.getKey(); - Integer personsCnt = e1.getValue(); - - for (Map.Entry e2 : accountsPerPerson.entrySet()) { - Integer personId = e2.getKey(); - Integer accsCnt = e2.getValue(); - - for (Query q : queries) { - ((SqlFieldsQuery)q).setDistributedJoins(true); - - ((SqlFieldsQuery)q).setArgs(personId, orgId); - - List res = cache.query(q).getAll(); - - assertEquals(personsCnt + accsCnt, res.size()); - } - } - } - } - - /** - * @param cache Cache. - */ - private void checkPersonAccountCrossJoin(IgniteCache cache) { - SqlFieldsQuery q = new SqlFieldsQuery("select p.name " + - "from \"" + personCacheName + "\".Person p " + - "cross join \"" + accCacheName + "\".Account a"); - - q.setDistributedJoins(true); - - List res = cache.query(q).getAll(); - - assertEquals(data.persons.size() * data.accounts.size(), res.size()); - } - - /** - * @param cache Cache. - */ - private void checkPersonOrganizationGroupBy(IgniteCache cache) { - // Max salary per organization. - SqlFieldsQuery q = new SqlFieldsQuery("select max(p.salary) " + - "from \"" + personCacheName + "\".Person p join \"" + orgCacheName + "\".Organization o " + - "on p.orgId = o.id " + - "group by o.name " + - "having o.id = ?"); - - q.setDistributedJoins(true); - - for (Map.Entry e : data.maxSalaryPerOrg.entrySet()) { - Integer orgId = e.getKey(); - Integer maxSalary = e.getValue(); - - q.setArgs(orgId); - - List> res = cache.query(q).getAll(); - - String errMsg = "Expected data [orgId=" + orgId + ", maxSalary=" + maxSalary + ", data=" + dataAsString() + "]"; - - // MaxSalary == -1 means that there are no persons at organization. - if (maxSalary > 0) { - assertEquals(errMsg, 1, res.size()); - assertEquals(errMsg, 1, res.get(0).size()); - assertEquals(errMsg, maxSalary, res.get(0).get(0)); - } - else - assertEquals(errMsg, 0, res.size()); - } - } - - /** - * @param cache Cache. - */ - private void checkPersonAccountGroupBy(IgniteCache cache) { - // Count accounts per person. - SqlFieldsQuery q = new SqlFieldsQuery("select count(a.id) " + - "from \"" + personCacheName + "\".Person p join \"" + accCacheName + "\".Account a " + - "on p.strId = a.personStrId " + - "group by p.name " + - "having p.id = ?"); - - q.setDistributedJoins(true); - - for (Map.Entry e : data.accountsPerPerson.entrySet()) { - Integer personId = e.getKey(); - Integer cnt = e.getValue(); - - q.setArgs(personId); - - List> res = cache.query(q).getAll(); - - String errMsg = "Expected data [personId=" + personId + ", cnt=" + cnt + ", data=" + dataAsString() + "]"; - - // Cnt == 0 means that there are no accounts for the person. - if (cnt > 0) { - assertEquals(errMsg, 1, res.size()); - assertEquals(errMsg, 1, res.get(0).size()); - assertEquals(errMsg, (long)cnt, res.get(0).get(0)); - } - else - assertEquals(errMsg, 0, res.size()); - } - } - - /** - * @param cache Cache. - */ - private void checkPersonAccountOrganizationGroupBy(IgniteCache cache) { - // Max count of accounts at org. - SqlFieldsQuery q = new SqlFieldsQuery("select max(count(a.id)) " + - "from " + - "\"" + personCacheName + "\".Person p " + - "\"" + orgCacheName + "\".Organization o " + - "\"" + accCacheName + "\".Account a " + - "where p.id = a.personId and p.orgStrId = o.strId " + - "group by org.id " + - "having o.id = ?"); - - q.setDistributedJoins(true); - - for (Map.Entry e : data.accountsPerPerson.entrySet()) { - Integer personId = e.getKey(); - Integer cnt = e.getValue(); - - q.setArgs(personId); - - List> res = cache.query(q).getAll(); - - String errMsg = "Expected data [personId=" + personId + ", cnt=" + cnt + ", data=" + dataAsString() + "]"; - - // Cnt == 0 means that there are no accounts for the person. - if (cnt > 0) { - assertEquals(errMsg, 1, res.size()); - assertEquals(errMsg, 1, res.get(0).size()); - assertEquals(errMsg, (long)cnt, res.get(0).get(0)); - } - else - assertEquals(errMsg, 0, res.size()); - } - } - - /** - * @param cache Cache. - */ - private void checkPersonOrganizationJoinInsideSubquery(IgniteCache cache) throws SQLException { - // Select persons with max salary at organization. - String sql = "select p.id " + - "from \"" + personCacheName + "\".Person p, " + - "\"" + orgCacheName + "\".Organization o " + - "where p.orgId = o.id and o.id = ? and p.salary = (" + - " select max(p.salary) from \"" + personCacheName + "\".Person p join " + - " \"" + orgCacheName + "\".Organization o on p.orgDateId = o.dateId group by o.id having o.id = ?)"; - - for (Organization org : data.orgs) { - Integer orgId = org.id; - - compareQueryRes0(cache, sql, true, new Object[] {orgId, orgId}, Ordering.RANDOM); - } - } - - /** - * @param cache Cache. - */ - private void checkJoinInsideSubquery(IgniteCache cache) throws SQLException { - // Select persons with count of accounts of person at organization. - String sql = "select p.id, count(a.id) " + - "from " + - "\"" + personCacheName + "\".Person p, " + - "\"" + orgCacheName + "\".Organization o, " + - "\"" + accCacheName + "\".Account a " + - "where p.id = a.personId and p.orgStrId = o.strId " + - "group by p.id " + - "having o.id = ?"; - - for (Organization org : data.orgs) - compareQueryRes0(cache, sql, true, new Object[] {org.id}, Ordering.RANDOM); - } - - /** - * @return Data as string. - */ - private String dataAsString() { - if (dataAsStr == null) - dataAsStr = data.toString(); - - return dataAsStr; - } - - /** - * - */ - private enum TestCacheType { - /** */ - REPLICATED_1(CacheMode.REPLICATED, 0), - - /** */ - REPLICATED_2(CacheMode.REPLICATED, 0), - - /** */ - REPLICATED_3(CacheMode.REPLICATED, 0), - - /** */ - PARTITIONED_b0_1(CacheMode.PARTITIONED, 0), - - /** */ - PARTITIONED_b0_2(CacheMode.PARTITIONED, 0), - - /** */ - PARTITIONED_b0_3(CacheMode.PARTITIONED, 0), - - /** */ - PARTITIONED_b1_1(CacheMode.PARTITIONED, 1), - - /** */ - PARTITIONED_b1_2(CacheMode.PARTITIONED, 1), - - /** */ - PARTITIONED_b1_3(CacheMode.PARTITIONED, 1); - - /** */ - final String cacheName; - - /** */ - final CacheMode cacheMode; - - /** */ - final int backups; - - /** - * @param mode Cache mode. - * @param backups Backups. - */ - TestCacheType(CacheMode mode, int backups) { - cacheName = name(); - cacheMode = mode; - this.backups = backups; - } - } - - /** - * - */ - private static class Data { - /** */ - final Collection orgs; - - /** */ - final Collection persons; - - /** */ - final Collection accounts; - - /** */ - final Map personsPerOrg; - - /** PersonId to count of accounts that person has. */ - final Map accountsPerPerson; - - /** */ - final Map accountsPerOrg; - - /** */ - final Map maxSalaryPerOrg; - - /** - * @param orgs Organizations. - * @param persons Persons. - * @param accounts Accounts. - * @param personsPerOrg Count of persons per organization. - * @param accountsPerPerson Count of accounts per person. - * @param accountsPerOrg Count of accounts per organization. - */ - Data(Collection orgs, Collection persons, Collection accounts, - Map personsPerOrg, Map accountsPerPerson, - Map accountsPerOrg, Map maxSalaryPerOrg) { - this.orgs = orgs; - this.persons = persons; - this.accounts = accounts; - this.personsPerOrg = personsPerOrg; - this.accountsPerPerson = accountsPerPerson; - this.accountsPerOrg = accountsPerOrg; - this.maxSalaryPerOrg = maxSalaryPerOrg; - } - - /** {@inheritDoc} */ - @Override public String toString() { - return "Data{" + - "orgs=" + orgs + - ", persons=" + persons + - ", accounts=" + accounts + - ", personsPerOrg=" + personsPerOrg + - ", accountsPerPerson=" + accountsPerPerson + - ", accountsPerOrg=" + accountsPerOrg + - ", maxSalaryPerOrg=" + maxSalaryPerOrg + - '}'; - } - } - - /** - * - */ - private static class Account implements Serializable { - /** */ - @QuerySqlField - private int id; - - /** */ - @QuerySqlField - private int personId; - - /** */ - @QuerySqlField - private Date personDateId; - - /** */ - @QuerySqlField - private String personStrId; - - @QuerySqlField - private int orgId; - - /** - * @param id ID. - * @param personId Person ID. - */ - Account(int id, int personId, int orgId) { - this.id = id; - this.personId = personId; - this.orgId = orgId; - personDateId = new Date(personId); - personStrId = "personId" + personId; - } - - /** {@inheritDoc} */ - @Override public String toString() { - return "Account{" + - "id=" + id + - ", personId=" + personId + - '}'; - } - } - - /** - * - */ - private static class Person implements Serializable { - /** */ - @QuerySqlField - int id; - - /** Date as ID. */ - @QuerySqlField - Date dateId; - - /** String as ID */ - @QuerySqlField - String strId; - - /** */ - @QuerySqlField - int orgId; - - /** */ - @QuerySqlField - Date orgDateId; - - /** */ - @QuerySqlField - String orgStrId; - - /** */ - @QuerySqlField - String name; - - /** */ - @QuerySqlField - int salary; - - /** - * @param id ID. - * @param orgId Organization ID. - * @param name Name. - */ - Person(int id, int orgId, String name, int salary) { - this.id = id; - dateId = new Date(id); - strId = "personId" + id; - this.orgId = orgId; - orgDateId = new Date(orgId); - orgStrId = "orgId" + orgId; - this.name = name; - this.salary = salary; - } - - /** {@inheritDoc} */ - @Override public String toString() { - return "Person{" + - "id=" + id + - ", orgId=" + orgId + - ", name='" + name + '\'' + - ", salary=" + salary + - '}'; - } - } - - /** - * - */ - private static class Organization implements Serializable { - /** */ - @QuerySqlField - int id; - - /** */ - @QuerySqlField - Date dateId; - - /** */ - @QuerySqlField - String strId; - - /** */ - @QuerySqlField - String name; - - /** - * @param id ID. - * @param name Name. - */ - Organization(int id, String name) { - this.id = id; - dateId = new Date(id); - strId = "orgId" + id; - this.name = name; - } - - /** {@inheritDoc} */ - @Override public String toString() { - return "Organization{" + - "name='" + name + '\'' + - ", id=" + id + - '}'; - } - } -}