blob: 2c6dd72d521fec9b26f9e80def378bbfbe5c7027 [file] [log] [blame]
/*
* 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.sqltests;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
/**
* Includes all base sql test plus tests that make sense in replicated mode.
*/
public class ReplicatedSqlTest extends BaseSqlTest {
/** Name of the department table created in partitioned mode. */
static final String DEP_PART_TAB = "DepartmentPart";
/**
* Create and fill common tables in replicated mode.
* Also create additional department table in partitioned mode to
* test mixed partitioned/replicated scenarios.
*/
@Override protected void setupData() {
createTables("template=replicated");
fillCommonData();
createDepartmentTable(DEP_PART_TAB, "template=partitioned");
fillDepartmentTable(DEP_PART_TAB);
}
/**
* Checks distributed INNER JOIN of replicated and replicated tables.
*/
@Test
public void testInnerDistributedJoinReplicatedReplicated() {
checkInnerDistJoinWithReplicated(DEP_TAB);
}
/**
* Checks distributed INNER JOIN of partitioned and replicated tables.
*/
@Test
public void testInnerDistJoinPartitionedReplicated() {
checkInnerDistJoinWithReplicated(DEP_PART_TAB);
}
/**
* Checks distributed INNER JOIN of specified and replicated tables.
*
* @param depTab department table name.
*/
private void checkInnerDistJoinWithReplicated(String depTab) {
Arrays.asList(true, false).forEach(forceOrder -> testAllNodes(node -> {
final String qryTpl = "SELECT d.id, d.name, a.address " +
"FROM " + depTab + " d INNER JOIN Address a " +
"ON d.%s = a.%s";
Result actIdxOnOn = executeFrom(distributedJoinQry(forceOrder, qryTpl, "id", "depId"), node);
Result actIdxOnOff = executeFrom(distributedJoinQry(forceOrder, qryTpl, "id", "depIdNoidx"), node);
Result actIdxOffOn = executeFrom(distributedJoinQry(forceOrder, qryTpl, "idNoidx", "depId"), node);
Result actIdxOffOff = executeFrom(distributedJoinQry(forceOrder, qryTpl, "idNoidx", "depIdNoidx"), node);
List<List<Object>> exp = doInnerJoin(node.cache(cacheName(depTab)), node.cache(ADDR_CACHE_NAME),
(dep, addr) -> sqlEq(dep.get("ID"), addr.get("DEPID")),
(dep, addr) -> Arrays.asList(dep.get("ID"), dep.get("NAME"), addr.get("ADDRESS")));
assertContainsEq("Distributed join on 'idx = idx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOnOn.values(), exp);
assertContainsEq("Distributed join on 'idx = noidx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOnOff.values(), exp);
assertContainsEq("Distributed join on 'noidx = idx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOffOn.values(), exp);
assertContainsEq("Distributed join on 'noidx = noidx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOffOff.values(), exp);
}));
}
/**
* Checks distributed INNER JOIN of replicated and partitioned tables.
*/
@Test
public void testMixedInnerDistJoinReplicatedPartitioned() {
checkInnerDistJoinReplicatedWith(DEP_PART_TAB);
}
/**
* Checks distributed INNER JOIN of replicated and specified tables.
*
* @param depTab department table name.
*/
private void checkInnerDistJoinReplicatedWith(String depTab) {
Arrays.asList(true, false).forEach(forceOrder -> testAllNodes(node -> {
final String qryTpl = "SELECT d.id, d.name, a.address " +
"FROM Address a INNER JOIN " + depTab + " d " +
"ON d.%s = a.%s";
Result actIdxOnOn = executeFrom(distributedJoinQry(forceOrder, qryTpl, "id", "depId"), node);
Result actIdxOnOff = executeFrom(distributedJoinQry(forceOrder, qryTpl, "id", "depIdNoidx"), node);
Result actIdxOffOn = executeFrom(distributedJoinQry(forceOrder, qryTpl, "idNoidx", "depId"), node);
Result actIdxOffOff = executeFrom(distributedJoinQry(forceOrder, qryTpl, "idNoidx", "depIdNoidx"), node);
// tables order is insufficient for golden result for inner join.
List<List<Object>> exp = doInnerJoin(node.cache(cacheName(depTab)), node.cache(ADDR_CACHE_NAME),
(dep, addr) -> sqlEq(dep.get("ID"), addr.get("DEPID")),
(dep, addr) -> Arrays.asList(dep.get("ID"), dep.get("NAME"), addr.get("ADDRESS")));
assertContainsEq("Distributed join on 'idx = idx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOnOn.values(), exp);
assertContainsEq("Distributed join on 'idx = noidx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOnOff.values(), exp);
assertContainsEq("Distributed join on 'noidx = idx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOffOn.values(), exp);
assertContainsEq("Distributed join on 'noidx = noidx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOffOff.values(), exp);
}));
}
/**
* Checks distributed LEFT JOIN of replicated and replicated tables.
*/
@Test
public void testLeftDistributedJoinReplicatedReplicated() {
checkLeftDistributedJoinWithReplicated(DEP_TAB);
}
/**
* Checks distributed LEFT JOIN of partitioned and replicated tables.
*/
@Test
public void testLeftDistributedJoinPartitionedReplicated() {
setExplain(true);
checkLeftDistributedJoinWithReplicated(DEP_PART_TAB);
}
/**
* Checks distributed LEFT JOIN of specified and replicated tables.
*
* @param depTab department table name.
*/
private void checkLeftDistributedJoinWithReplicated(String depTab) {
Arrays.asList(true, false).forEach(forceOrder -> testAllNodes(node -> {
final String qryTpl = "SELECT d.id, d.name, a.address " +
"FROM " + depTab + " d LEFT JOIN Address a " +
"ON d.%s = a.%s";
Result actIdxOnOn = executeFrom(distributedJoinQry(forceOrder, qryTpl, "id", "depId"), node);
Result actIdxOnOff = executeFrom(distributedJoinQry(forceOrder, qryTpl, "id", "depIdNoidx"), node);
Result actIdxOffOn = executeFrom(distributedJoinQry(forceOrder, qryTpl, "idNoidx", "depId"), node);
Result actIdxOffOff = executeFrom(distributedJoinQry(forceOrder, qryTpl, "idNoidx", "depIdNoidx"), node);
List<List<Object>> exp = doLeftJoin(node.cache(cacheName(depTab)), node.cache(ADDR_CACHE_NAME),
(dep, addr) -> sqlEq(dep.get("ID"), addr.get("DEPID")),
(dep, addr) -> Arrays.asList(dep.get("ID"), dep.get("NAME"), addr.get("ADDRESS")));
assertContainsEq("Distributed join on 'idx = idx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOnOn.values(), exp);
assertContainsEq("Distributed join on 'idx = noidx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOnOff.values(), exp);
assertContainsEq("Distributed join on 'noidx = idx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOffOn.values(), exp);
assertContainsEq("Distributed join on 'noidx = noidx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOffOff.values(), exp);
}));
}
/**
* Checks distributed LEFT JOIN of specified and replicated tables.
*
* @param depTab department table name.
*/
private void checkLeftDistributedJoinReplicatedWith(String depTab) {
Arrays.asList(true, false).forEach(forceOrder -> testAllNodes(node -> {
final String qryTpl = "SELECT d.id, d.name, a.address " +
"FROM Address a LEFT JOIN " + depTab + " d " +
"ON d.%s = a.%s";
Result actIdxOnOn = executeFrom(distributedJoinQry(forceOrder, qryTpl, "id", "depId"), node);
Result actIdxOnOff = executeFrom(distributedJoinQry(forceOrder, qryTpl, "id", "depIdNoidx"), node);
Result actIdxOffOn = executeFrom(distributedJoinQry(forceOrder, qryTpl, "idNoidx", "depId"), node);
Result actIdxOffOff = executeFrom(distributedJoinQry(forceOrder, qryTpl, "idNoidx", "depIdNoidx"), node);
List<List<Object>> exp = doLeftJoin(node.cache(ADDR_CACHE_NAME), node.cache(cacheName(depTab)),
(addr, dep) -> sqlEq(dep.get("ID"), addr.get("DEPID")),
(addr, dep) -> Arrays.asList(dep.get("ID"), dep.get("NAME"), addr.get("ADDRESS")));
assertContainsEq("Distributed join on 'idx = idx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOnOn.values(), exp);
assertContainsEq("Distributed join on 'idx = noidx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOnOff.values(), exp);
assertContainsEq("Distributed join on 'noidx = idx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOffOn.values(), exp);
assertContainsEq("Distributed join on 'noidx = noidx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOffOff.values(), exp);
}));
}
/**
* Checks distributed RIGHT JOIN of replicated and replicated tables.
*/
@Test
public void testRightDistributedJoinReplicatedReplicated() {
checkRightDistributedJoinWithReplicated(DEP_TAB);
}
/**
* Checks distributed RIGHT JOIN of replicated and partitioned tables.
*/
@Test
public void testRightDistributedJoinReplicatedPartitioned() {
setExplain(true);
checkRightDistributedJoinReplicatedWith(DEP_PART_TAB);
}
/**
* Checks distributed RIGHT JOIN of replicated and specified tables.
*
* @param depTab department table name.
*/
public void checkRightDistributedJoinWithReplicated(String depTab) {
Arrays.asList(true, false).forEach(forceOrder -> testAllNodes(node -> {
final String qryTpl = "SELECT d.id, d.name, a.address " +
"FROM " + depTab + " d RIGHT JOIN Address a " +
"ON d.%s = a.%s";
Result actIdxOnOn = executeFrom(distributedJoinQry(forceOrder, qryTpl, "id", "depId"), node);
Result actIdxOnOff = executeFrom(distributedJoinQry(forceOrder, qryTpl, "id", "depIdNoidx"), node);
Result actIdxOffOn = executeFrom(distributedJoinQry(forceOrder, qryTpl, "idNoidx", "depId"), node);
Result actIdxOffOff = executeFrom(distributedJoinQry(forceOrder, qryTpl, "idNoidx", "depIdNoidx"), node);
List<List<Object>> exp = doRightJoin(node.cache(cacheName(depTab)), node.cache(ADDR_CACHE_NAME),
(dep, addr) -> sqlEq(dep.get("ID"), addr.get("DEPID")),
(dep, addr) -> Arrays.asList(dep.get("ID"), dep.get("NAME"), addr.get("ADDRESS")));
assertContainsEq("Distributed join on 'idx = idx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOnOn.values(), exp);
assertContainsEq("Distributed join on 'idx = noidx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOnOff.values(), exp);
assertContainsEq("Distributed join on 'noidx = idx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOffOn.values(), exp);
assertContainsEq("Distributed join on 'noidx = noidx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOffOff.values(), exp);
}));
}
/**
* Checks distributed RIGHT JOIN of replicated and specified tables.
*
* @param depTab department table name.
*/
public void checkRightDistributedJoinReplicatedWith(String depTab) {
Arrays.asList(true, false).forEach(forceOrder -> testAllNodes(node -> {
final String qryTpl = "SELECT d.id, d.name, a.address " +
"FROM Address a RIGHT JOIN " + depTab + " d " +
"ON d.%s = a.%s";
Result actIdxOnOn = executeFrom(distributedJoinQry(forceOrder, qryTpl, "id", "depId"), node);
Result actIdxOnOff = executeFrom(distributedJoinQry(forceOrder, qryTpl, "id", "depIdNoidx"), node);
Result actIdxOffOn = executeFrom(distributedJoinQry(forceOrder, qryTpl, "idNoidx", "depId"), node);
Result actIdxOffOff = executeFrom(distributedJoinQry(forceOrder, qryTpl, "idNoidx", "depIdNoidx"), node);
List<List<Object>> exp = doRightJoin(node.cache(ADDR_CACHE_NAME), node.cache(cacheName(depTab)),
(addr, dep) -> sqlEq(dep.get("ID"), addr.get("DEPID")),
(addr, dep) -> Arrays.asList(dep.get("ID"), dep.get("NAME"), addr.get("ADDRESS")));
assertContainsEq("Distributed join on 'idx = idx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOnOn.values(), exp);
assertContainsEq("Distributed join on 'idx = noidx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOnOff.values(), exp);
assertContainsEq("Distributed join on 'noidx = idx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOffOn.values(), exp);
assertContainsEq("Distributed join on 'noidx = noidx' returned unexpected result. " +
"Preserve join order = " + forceOrder + ".", actIdxOffOff.values(), exp);
}));
}
/**
* Check INNER JOIN with collocated data of replicated and partitioned tables.
*/
@Test
public void testInnerJoinReplicatedPartitioned() {
checkInnerJoinEmployeeDepartment(DEP_PART_TAB);
}
/**
* Check INNER JOIN with collocated data of partitioned and replicated tables.
*/
@Test
public void testInnerJoinPartitionedReplicated() {
checkInnerJoinDepartmentEmployee(DEP_PART_TAB);
}
/**
* Check LEFT JOIN with collocated data of partitioned and replicated tables.
*/
@Test
public void testLeftJoinPartitionedReplicated() {
checkLeftJoinDepartmentEmployee(DEP_PART_TAB);
}
/**
* Check RIGHT JOIN with collocated data of replicated and partitioned tables.
*/
@Test
public void testRightJoinReplicatedPartitioned() {
checkRightJoinEmployeeDepartment(DEP_PART_TAB);
}
}