/*
* ModeShape (http://www.modeshape.org)
*
* 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 org.modeshape.jcr.query;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import java.util.Comparator;
import java.util.Iterator;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mapdb.BTreeKeySerializer;
import org.mapdb.Serializer;
import org.modeshape.jcr.ExecutionContext;
import org.modeshape.jcr.query.BufferManager.DistinctBuffer;
import org.modeshape.jcr.query.BufferManager.SortingBuffer;
import org.modeshape.jcr.query.model.TypeSystem;
import org.modeshape.jcr.query.model.TypeSystem.TypeFactory;
/**
* @author Randall Hauch (rhauch@redhat.com)
*/
public class BufferManagerTest {
private ExecutionContext context;
private BufferManager mgr;
private TypeSystem types;
@Before
public void beforeEach() {
context = new ExecutionContext();
mgr = new BufferManager(context);
types = context.getValueFactories().getTypeSystem();
}
@After
public void afterEach() {
mgr.close();
}
@Test
public void shouldCreateDistinctBufferOnHeap() {
try (DistinctBuffer<String> buffer = mgr.createDistinctBuffer(Serializer.STRING).useHeap(true).keepSize(true).make()) {
assertTrue(buffer.addIfAbsent("first"));
assertTrue(buffer.addIfAbsent("second"));
assertTrue(buffer.addIfAbsent("third"));
assertTrue(buffer.addIfAbsent("fourth"));
assertFalse(buffer.addIfAbsent("first"));
assertFalse(buffer.addIfAbsent("second"));
assertFalse(buffer.addIfAbsent("fourth"));
assertFalse(buffer.addIfAbsent("third"));
assertThat(buffer.size(), is(4L));
}
}
@Test
public void shouldCreateDistinctBufferOffHeap() {
try (DistinctBuffer<String> buffer = mgr.createDistinctBuffer(Serializer.STRING).useHeap(false).keepSize(true).make()) {
assertTrue(buffer.addIfAbsent("first"));
assertTrue(buffer.addIfAbsent("second"));
assertTrue(buffer.addIfAbsent("third"));
assertTrue(buffer.addIfAbsent("fourth"));
assertFalse(buffer.addIfAbsent("first"));
assertFalse(buffer.addIfAbsent("second"));
assertFalse(buffer.addIfAbsent("fourth"));
assertFalse(buffer.addIfAbsent("third"));
assertThat(buffer.size(), is(4L));
}
}
@SuppressWarnings( "unchecked" )
@Test
public void shouldCreateSortBufferOnHeap() {
TypeFactory<String> stringType = types.getStringFactory();
BTreeKeySerializer<String> strKeySerializer = (BTreeKeySerializer<String>)mgr.bTreeKeySerializerFor(stringType, false);
Serializer<String> strSerializer = (Serializer<String>)mgr.serializerFor(stringType);
try (SortingBuffer<String, String> buffer = mgr.createSortingBuffer(strKeySerializer, strSerializer).useHeap(true)
.keepSize(true).make()) {
buffer.put("value1", "first");
buffer.put("value2", "first");
buffer.put("value3", "first");
buffer.put("value1", "second");
buffer.put("value3", "second");
buffer.put("value1", "third");
assertThat(buffer.size(), is(3L));
Iterator<String> iter = buffer.ascending();
assertThat(iter.next(), is("third"));
assertThat(iter.next(), is("first"));
assertThat(iter.next(), is("second"));
assertThat(iter.hasNext(), is(false));
iter = buffer.descending();
assertThat(iter.next(), is("second"));
assertThat(iter.next(), is("first"));
assertThat(iter.next(), is("third"));
assertThat(iter.hasNext(), is(false));
iter = buffer.getAll("value1");
assertThat(iter.next(), is("third"));
assertThat(iter.hasNext(), is(false));
}
}
@SuppressWarnings( "unchecked" )
@Test
public void shouldCreateSortBufferOffHeap() {
TypeFactory<String> stringType = types.getStringFactory();
BTreeKeySerializer<String> strKeySerializer = (BTreeKeySerializer<String>)mgr.bTreeKeySerializerFor(stringType, false);
Serializer<String> strSerializer = (Serializer<String>)mgr.serializerFor(stringType);
try (SortingBuffer<String, String> buffer = mgr.createSortingBuffer(strKeySerializer, strSerializer).useHeap(false)
.keepSize(true).make()) {
buffer.put("value1", "first");
buffer.put("value2", "first");
buffer.put("value3", "first");
buffer.put("value1", "second");
buffer.put("value3", "second");
buffer.put("value1", "third");
assertThat(buffer.size(), is(3L));
Iterator<String> iter = buffer.ascending();
assertThat(iter.next(), is("third"));
assertThat(iter.next(), is("first"));
assertThat(iter.next(), is("second"));
assertThat(iter.hasNext(), is(false));
iter = buffer.descending();
assertThat(iter.next(), is("second"));
assertThat(iter.next(), is("first"));
assertThat(iter.next(), is("third"));
assertThat(iter.hasNext(), is(false));
iter = buffer.getAll("value1");
assertThat(iter.next(), is("third"));
assertThat(iter.hasNext(), is(false));
}
}
@SuppressWarnings( "unchecked" )
@Test
public void shouldCreateSortWithDuplicateKeysBufferOnHeap() {
TypeFactory<String> stringType = types.getStringFactory();
Serializer<String> strSerializer = (Serializer<String>)mgr.serializerFor(stringType);
Comparator<String> keyComparator = stringType.getComparator();
try (SortingBuffer<String, String> buffer = mgr.createSortingWithDuplicatesBuffer(strSerializer, keyComparator,
strSerializer).useHeap(true)
.keepSize(true).make()) {
buffer.put("value1", "first");
buffer.put("value2", "first");
buffer.put("value3", "first");
buffer.put("value1", "second");
buffer.put("value3", "second");
buffer.put("value1", "third");
assertThat(buffer.size(), is(6L));
Iterator<String> iter = buffer.ascending();
assertThat(iter.next(), is("first"));
assertThat(iter.next(), is("second"));
assertThat(iter.next(), is("third"));
assertThat(iter.next(), is("first"));
assertThat(iter.next(), is("first"));
assertThat(iter.next(), is("second"));
assertThat(iter.hasNext(), is(false));
iter = buffer.descending();
assertThat(iter.next(), is("second"));
assertThat(iter.next(), is("first"));
assertThat(iter.next(), is("first"));
assertThat(iter.next(), is("third"));
assertThat(iter.next(), is("second"));
assertThat(iter.next(), is("first"));
assertThat(iter.hasNext(), is(false));
iter = buffer.getAll("value1");
assertThat(iter.next(), is("first"));
assertThat(iter.next(), is("second"));
assertThat(iter.next(), is("third"));
assertThat(iter.hasNext(), is(false));
}
}
}