package com.splout.db.common;
/*
* #%L
* Splout SQL commons
* %%
* Copyright (C) 2012 Datasalt Systems S.L.
* %%
* Licensed 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.
* #L%
*/
import com.splout.db.common.JSONSerDe.JSONSerDeException;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class TestPartitionMap {
protected PartitionMap testPartitionMap() {
List<PartitionEntry> entries = new ArrayList<PartitionEntry>();
PartitionEntry entry = new PartitionEntry();
entry.setMin(null);
entry.setMax("c");
entry.setShard(0);
entries.add(entry);
entry = new PartitionEntry();
entry.setMin("c");
entry.setMax("f");
entry.setShard(1);
entries.add(entry);
entry = new PartitionEntry();
entry.setMin("f");
entry.setMax("m");
entry.setShard(2);
entries.add(entry);
entry = new PartitionEntry();
entry.setMin("m");
entry.setMax("x");
entry.setShard(3);
entries.add(entry);
entry = new PartitionEntry();
entry.setMin("x");
entry.setMax(null);
entry.setShard(4);
entries.add(entry);
PartitionMap map = new PartitionMap();
map.setPartitionEntries(entries);
return map;
}
@Test
public void testOpenedMapSerDe() throws Exception {
PartitionMap map = PartitionMap.oneShardOpenedMap();
String json = JSONSerDe.ser(map);
map = (PartitionMap) JSONSerDe.deSer(json, PartitionMap.PARTITION_MAP_REF);
assertEquals((Integer) 0, map.getPartitionEntries().get(0).getShard());
}
/*
* Because keys are always strings,
* For using a kind of numeric comparison one needs to use padding.
* You can use padding easily with method String.format(),
*/
@Test
public void testNumericComparison() {
List<PartitionEntry> entries = new ArrayList<PartitionEntry>();
for (int i = 0; i < 20; i++) {
int min = i * 50;
int max = (i + 1) * 50;
PartitionEntry entry = new PartitionEntry();
entry.setMin(String.format("%05d", min));
entry.setMax(String.format("%05d", max));
entry.setShard(i);
entries.add(entry);
}
entries.get(0).setMin(null);
entries.get(19).setMax(null);
PartitionMap partitionMap = new PartitionMap(entries);
assertEquals(100 / 50 - 1, partitionMap.findPartition(String.format("%05d", 100)));
assertEquals(200 / 50 - 1, partitionMap.findPartition(String.format("%05d", 200)));
assertEquals(300 / 50 - 1, partitionMap.findPartition(String.format("%05d", 300)));
}
@Test
public void testNormalQuery() {
PartitionMap map = testPartitionMap();
assertEquals(0, map.findPartition("c"));
assertEquals(0, map.findPartition("b"));
assertEquals(0, map.findPartition("aa"));
assertEquals(1, map.findPartition("d"));
assertEquals(2, map.findPartition("g"));
assertEquals(3, map.findPartition("n"));
assertEquals(3, map.findPartition("x"));
assertEquals(4, map.findPartition("xxxxxxxxxxx"));
assertEquals(0, map.findPartition("5"));
}
@Test
public void testRangeQuery() {
PartitionMap map = testPartitionMap();
List<Integer> partitions = map.findPartitions("c", "n");
assertEquals(4, partitions.size());
assertTrue(partitions.contains(0));
assertTrue(partitions.contains(1));
assertTrue(partitions.contains(2));
assertTrue(partitions.contains(3));
partitions = map.findPartitions("a", "n");
assertEquals(4, partitions.size());
assertTrue(partitions.contains(0));
assertTrue(partitions.contains(1));
assertTrue(partitions.contains(2));
assertTrue(partitions.contains(3));
partitions = map.findPartitions("m", "xx");
assertEquals(3, partitions.size());
assertTrue(partitions.contains(2));
assertTrue(partitions.contains(3));
assertTrue(partitions.contains(4));
partitions = map.findPartitions("x", "xxxx");
assertEquals(2, partitions.size());
assertTrue(partitions.contains(3));
assertTrue(partitions.contains(4));
}
@Test
public void testNullKey() {
List<PartitionEntry> entries = new ArrayList<PartitionEntry>();
PartitionEntry entry = new PartitionEntry();
entry.setMin(null);
entry.setMax("");
entry.setShard(0);
entries.add(entry);
//
entry = new PartitionEntry();
entry.setMin("");
entry.setMax("foo");
entry.setShard(1);
entries.add(entry);
//
entry = new PartitionEntry();
entry.setMin("foo");
entry.setMax(null);
entry.setShard(2);
entries.add(entry);
PartitionMap map = new PartitionMap(entries);
System.out.println(map.findPartition("foo"));
}
@Test
public void test() throws JSONSerDeException {
List<PartitionEntry> entries = new ArrayList<PartitionEntry>();
PartitionEntry entry = new PartitionEntry();
entry.setMax("a");
entry.setMin("b");
entry.setShard(0);
entries.add(entry);
PartitionMap map = new PartitionMap();
map.setPartitionEntries(entries);
String json = JSONSerDe.ser(map);
PartitionMap map2 = JSONSerDe.deSer(json, PartitionMap.PARTITION_MAP_REF);
assertEquals(map2.getPartitionEntries().toString(), map.getPartitionEntries().toString());
}
}