gg-11414: distributed join test
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/ccc19564 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/ccc19564 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/ccc19564 Branch: refs/heads/ignite-3477 Commit: ccc1956463eae5f46457824bed251cd1d4c2552b Parents: 37eb93b Author: Sergey Sidorov <ssido...@gridgain.com> Authored: Fri Nov 25 12:01:45 2016 +0300 Committer: Sergey Sidorov <ssido...@gridgain.com> Committed: Fri Nov 25 12:01:45 2016 +0300 ---------------------------------------------------------------------- .../query/IgniteSqlDistributedJoinSelfTest.java | 172 +++++++++++++++++++ 1 file changed, 172 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/ccc19564/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlDistributedJoinSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlDistributedJoinSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlDistributedJoinSelfTest.java new file mode 100644 index 0000000..d851a31 --- /dev/null +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlDistributedJoinSelfTest.java @@ -0,0 +1,172 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query; + +import org.apache.ignite.*; +import org.apache.ignite.cache.*; +import org.apache.ignite.cache.query.*; +import org.apache.ignite.cache.query.annotations.*; +import org.apache.ignite.configuration.*; +import org.apache.ignite.plugin.*; +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.testframework.junits.common.*; + +import java.util.*; + +/** + * Tests for correct distributed sql joins. + */ +public class IgniteSqlDistributedJoinSelfTest extends GridCommonAbstractTest { + /** */ + private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true); + private static final int NODES_COUNT = 2; + private static final int ORG_COUNT = NODES_COUNT; + private static final int PERSON_PER_ORG_COUNT = 50; + + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(gridName); + + cfg.setPeerClassLoadingEnabled(false); + + TcpDiscoverySpi disco = new TcpDiscoverySpi(); + + disco.setIpFinder(IP_FINDER); + + cfg.setDiscoverySpi(disco); + + return cfg; + } + + /** {@inheritDoc} */ + @Override protected void beforeTestsStarted() throws Exception { + startGridsMultiThreaded(NODES_COUNT, false); + } + + /** {@inheritDoc} */ + @Override protected void afterTestsStopped() throws Exception { + stopAllGrids(); + } + + /** + * @param name Cache name. + * @param partitioned Partition or replicated cache. + * @param idxTypes Indexed types. + * @return Cache configuration. + */ + private static CacheConfiguration cacheConfig(String name, boolean partitioned, Class<?>... idxTypes) { + return new CacheConfiguration() + .setName(name) + .setCacheMode(partitioned ? CacheMode.PARTITIONED : CacheMode.REPLICATED) + .setAtomicityMode(CacheAtomicityMode.ATOMIC) + .setBackups(1) + .setIndexedTypes(idxTypes); + } + + public void testNonCollocatedDistributedJoin() throws Exception { + CacheConfiguration ccfg1 = cacheConfig("pers", true, String.class, Person.class); + CacheConfiguration ccfg2 = cacheConfig("org", true, String.class, Organization.class); + + IgniteCache<String, Person> c1 = ignite(0).getOrCreateCache(ccfg1); + IgniteCache<String, Organization> c2 = ignite(0).getOrCreateCache(ccfg2); + + try { + awaitPartitionMapExchange(); + + populateDataIntoCaches(c1, c2); + + String joinSql = + "select * from Person, \"org\".Organization as org " + + "where Person.orgId = org.id " + + "and lower(org.name) = lower(?)"; + + SqlQuery qry = new SqlQuery<String, Person>(Person.class, joinSql).setArgs("Organization #0"); + + qry.setDistributedJoins(true); + + List<Person> prns = c1.query(qry).getAll(); + + assertEquals(PERSON_PER_ORG_COUNT, prns.size()); + } + finally { + c1.destroy(); + c2.destroy(); + } + } + + private void populateDataIntoCaches(IgniteCache<String, Person> c1, IgniteCache<String, Organization> c2) { + int personId = 0; + + for (int i = 0; i < ORG_COUNT; i++) { + Organization org = new Organization(); + org.setId("org" + i); + org.setName("Organization #" + i); + + c2.put(org.getId(), org); + + for (int j = 0; j < PERSON_PER_ORG_COUNT; j++) { + Person prsn = new Person(); + prsn.setId("pers" + personId); + prsn.setOrgId(org.getId()); + prsn.setName("Person name #" + personId); + + c1.put(prsn.getId(), prsn); + + personId++; + } + } + } + + private static class Person { + @QuerySqlField(index = true) + private String id; + @QuerySqlField(index = true) + private String orgId; + @QuerySqlField(index = true) + private String name; + + public String getId() { return id; } + + public void setId(String id) { this.id = id; } + + public String getOrgId() { return orgId; } + + public void setOrgId(String orgId) { this.orgId = orgId; } + + public String getName() { return name; } + + public void setName(String name) { this.name = name; } + } + + private static class Organization { + @QuerySqlField(index = true) + private String id; + @QuerySqlField(index = true) + private String name; + + public void setId(String id) { this.id = id; } + + public String getId() { return id; } + + public String getName() { return name; } + + public void setName(String name) { this.name = name; } + } +}