/*
* Copyright (c) 2013-2017 Cinchapi Inc.
*
* 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.
*/
package com.cinchapi.concourse.server.plugin.data;
import java.nio.ByteBuffer;
import java.util.Map;
import java.util.Set;
import org.junit.Assert;
import org.junit.Test;
import com.cinchapi.concourse.server.plugin.data.ObjectResultDataset;
import com.cinchapi.concourse.server.plugin.data.TObjectResultDataset;
import com.cinchapi.concourse.server.plugin.io.PluginSerializer;
import com.cinchapi.concourse.thrift.ComplexTObject;
import com.cinchapi.concourse.time.Time;
import com.cinchapi.concourse.util.Convert;
import com.google.common.collect.Maps;
/**
* Unit tests for {@link ObjectResultDataset}
*
* @author Jeff Nelson
*/
public class ObjectResultDatasetTest {
@Test
public void testReproNPE() {
ObjectResultDataset dataset = new ObjectResultDataset(
new TObjectResultDataset());
dataset.insert(0L, "key", true);
Assert.assertFalse(dataset.get(0L).isEmpty());
Assert.assertFalse(dataset.get(0L, "key").isEmpty());
}
@Test
public void testEntrySetNotEmpty() {
TObjectResultDataset dataset = new TObjectResultDataset();
dataset.insert(1L, "age", Convert.javaToThrift(100));
ObjectResultDataset dataset2 = new ObjectResultDataset(dataset);
Assert.assertFalse(dataset2.entrySet().isEmpty());
}
@Test
public void testConvertToComplexTObject() {
TObjectResultDataset dataset = new TObjectResultDataset();
dataset.insert(1L, "age", Convert.javaToThrift(100));
ObjectResultDataset expected = new ObjectResultDataset(dataset);
ComplexTObject complex = ComplexTObject.fromJavaObject(expected);
Map<Long, Map<String, Object>> actual = complex.getJavaObject();
expected.forEach((key, value) -> {
Assert.assertTrue(actual.containsKey(key));
Assert.assertTrue(actual.containsValue(value));
});
}
@Test
public void testSerialization() {
ObjectResultDataset dataset = new ObjectResultDataset(
new TObjectResultDataset());
dataset.insert(1L, "name", "Jeff Nelson");
PluginSerializer serializer = new PluginSerializer();
ByteBuffer bytes = serializer.serialize(dataset);
ComplexTObject complex = ComplexTObject.fromJavaObject(bytes);
ByteBuffer bytes2 = complex.getJavaObject();
Object obj = serializer.deserialize(bytes2);
Assert.assertEquals(dataset, obj);
}
@Test
public void testGetKeyRecordIterator() {
ObjectResultDataset dataset = new ObjectResultDataset(
new TObjectResultDataset());
dataset.insert(1L, "name", "Jeff Nelson");
Set<Object> set = dataset.get(1L, "name");
for (Object obj : set) {
Assert.assertNotNull(obj);
}
}
@Test
public void testInvertedEntrySetWhenNoData() {
ObjectResultDataset dataset = new ObjectResultDataset();
Map<String, Map<Object, Set<Long>>> inverted = dataset.invert();
Assert.assertNotNull(inverted.get("foo").entrySet().iterator());
}
@Test
public void testGetEntityGetAttributeIteratorNoNpe() {
ObjectResultDataset dataset = new ObjectResultDataset();
dataset.insert(1L, "name", "Jeff Nelson");
Assert.assertNotNull(dataset.get(1L).get("name").iterator().next());
}
@Test
public void testInvertedAttributeKeyDeletedIfEmpty() {
ObjectResultDataset dataset = new ObjectResultDataset();
dataset.insert(1L, "name", "Jeff Nelson");
dataset.remove(1L);
Assert.assertFalse(dataset.invert().containsKey("name"));
}
@Test
public void testInvertedAttributeValueKeyDeletedIfEmpty() {
ObjectResultDataset dataset = new ObjectResultDataset();
dataset.insert(1L, "name", "Jeff Nelson");
dataset.insert(2L, "name", "Jeff Nelson");
dataset.remove(1L);
Assert.assertTrue(dataset.invert().containsKey("name"));
Assert.assertFalse(
dataset.invert().get("name").get("Jeff Nelson").contains(1L));
Assert.assertTrue(
dataset.invert().get("name").get("Jeff Nelson").contains(2L));
}
@Test
public void testCacheDeletedAfterDeletingEntity() {
ObjectResultDataset dataset = new ObjectResultDataset();
dataset.insert(1L, "name", "Jeff Nelson");
dataset.insert(2L, "name", "Jeff Nelson");
dataset.remove(1L);
dataset.forEach((record, data) -> {
Assert.assertNotEquals(Long.valueOf(1), record);
});
}
@Test
public void testRemoveConcurrentModificationExceptionRepro() {
ObjectResultDataset dataset = new ObjectResultDataset();
dataset.insert(1L, "name", "Jeff Nelson");
dataset.insert(1L, "age", 29);
dataset.insert(1L, "enabled", true);
dataset.remove(1L);
}
@Test
public void testRecordAttributeIsEmpty() {
ObjectResultDataset dataset = new ObjectResultDataset();
dataset.insert(1L, "age", 23);
Assert.assertTrue(dataset.get(1L, "name").isEmpty());
}
@Test
public void testDispersion() {
ObjectResultDataset a = new ObjectResultDataset();
Map<String, Integer> names = Maps.newHashMap();
names.put("Jeff Nelson", 2);
names.put("John Doe", 4);
names.put("Jane Doe", 6);
names.put("Jonathan Barronville", 8);
names.put("Lilian Brown", 10);
names.put("Kylie Jenner", 12);
names.put("Adrian Brown", 14);
Map<Integer, Integer> ages = Maps.newHashMap();
ages.put(20, 1);
ages.put(30, 1);
ages.put(31, 2);
ages.put(32, 2);
ages.put(33, 1);
ages.put(40, 1);
ages.put(41, 1);
names.forEach((name, count) -> {
for (int i = 0; i < count; ++i) {
a.insert(Time.now(), "name", name);
}
});
ages.forEach((age, count) -> {
for (int i = 0; i < count; ++i) {
a.insert(Time.now(), "age", age);
}
});
Assert.assertTrue(((TrackingMultimap<Object, Long>) a.invert("name"))
.spread() > ((TrackingMultimap<Object, Long>) a.invert("age"))
.spread());
}
}