package org.teiid.test.bufferservice;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.teiid.common.buffer.STree;
import org.teiid.common.buffer.STree.InsertMode;
import org.teiid.common.buffer.TupleBrowser;
import org.teiid.common.buffer.impl.BufferFrontedFileStoreCache;
import org.teiid.common.buffer.impl.BufferManagerImpl;
import org.teiid.common.buffer.impl.MemoryStorageManager;
import org.teiid.common.buffer.impl.SplittableStorageManager;
import org.teiid.core.TeiidComponentException;
import org.teiid.core.TeiidProcessingException;
import org.teiid.core.types.DataTypeManager;
import org.teiid.query.processor.CollectionTupleSource;
import org.teiid.query.sql.symbol.ElementSymbol;
public class STreeTest {
public static void main(String[] args) throws Exception {
testRemoveAll();
testUnOrderedInsert();
testOrderedInsert();
testStorageWrites();
testSearch();
}
static void testSearch() throws TeiidComponentException, TeiidProcessingException {
ElementSymbol x = new ElementSymbol("x");
x.setType(DataTypeManager.DefaultDataClasses.INTEGER);
ElementSymbol y = new ElementSymbol("y");
y.setType(DataTypeManager.DefaultDataClasses.INTEGER);
List<ElementSymbol> elements = Arrays.asList(x, y);
BufferManagerImpl bm = new BufferManagerImpl();
MemoryStorageManager storageManager = new MemoryStorageManager();
SplittableStorageManager ssm = new SplittableStorageManager(storageManager);
ssm.setMaxFileSizeDirect(MemoryStorageManager.MAX_FILE_SIZE);
BufferFrontedFileStoreCache fsc = new BufferFrontedFileStoreCache();
fsc.setBufferManager(bm);
fsc.setDirect(false);
fsc.setMaxStorageObjectSize(1<<20);
fsc.setMemoryBufferSpace(1<<21);
fsc.setStorageManager(ssm);
fsc.initialize();
bm.setCache(fsc);
bm.initialize();
STree stree = bm.createSTree(elements, "1", 1);
int size = 1<<16;
for (int i = size; i > 0; i--) {
stree.insert(Arrays.asList(i, i), InsertMode.NEW, -1);
}
System.out.println(stree);
System.out.println(stree.getHeight());
System.out.println(stree.getRowCount());
System.out.println(stree.getKeyLength());
System.out.println(stree.isPreferMemory());
System.out.println();
stree.compact();
for (int i = 0; i < size; i++) {
TupleBrowser tb = new TupleBrowser(stree, new CollectionTupleSource(Collections.singletonList(Arrays.asList(i)).iterator()), true);
System.out.println(tb.nextTuple());
}
}
static void testStorageWrites() throws TeiidComponentException {
ElementSymbol x = new ElementSymbol("x");
x.setType(String.class);
List<ElementSymbol> elements = Arrays.asList(x);
BufferManagerImpl bm = new BufferManagerImpl();
MemoryStorageManager storageManager = new MemoryStorageManager();
SplittableStorageManager ssm = new SplittableStorageManager(storageManager);
ssm.setMaxFileSizeDirect(MemoryStorageManager.MAX_FILE_SIZE);
BufferFrontedFileStoreCache fsc = new BufferFrontedFileStoreCache();
fsc.setBufferManager(bm);
fsc.setDirect(false);
fsc.setMaxStorageObjectSize(1<<19);
fsc.setMemoryBufferSpace(1<<19);
fsc.setStorageManager(ssm);
fsc.initialize();
bm.setCache(fsc);
bm.initialize();
STree stree = bm.createSTree(elements, "1", 1);
int size = 1000;
for (int i = 0; i < size; i++) {
stree.insert(Arrays.asList(new String(new byte[1000])), InsertMode.ORDERED, size);
}
System.out.println(stree);
System.out.println(stree.getHeight());
System.out.println(stree.getRowCount());
System.out.println(stree.getKeyLength());
System.out.println(stree.isPreferMemory());
System.out.println();
for (int i = 0; i < size; i++) {
List<?> list = stree.remove(Arrays.asList(new String(new byte[1000])));
System.out.println(list);
}
}
static void testOrderedInsert() throws TeiidComponentException {
ElementSymbol x = new ElementSymbol("x");
x.setType(DataTypeManager.DefaultDataClasses.INTEGER);
List<ElementSymbol> elements = Arrays.asList(x);
BufferManagerImpl bm = new BufferManagerImpl();
bm.setProcessorBatchSize(4);
MemoryStorageManager storageManager = new MemoryStorageManager();
SplittableStorageManager ssm = new SplittableStorageManager(storageManager);
ssm.setMaxFileSizeDirect(MemoryStorageManager.MAX_FILE_SIZE);
BufferFrontedFileStoreCache fsc = new BufferFrontedFileStoreCache();
fsc.setBufferManager(bm);
fsc.setDirect(false);
fsc.setMaxStorageObjectSize(1<<20);
fsc.setMemoryBufferSpace(1<<21);
fsc.setStorageManager(ssm);
fsc.initialize();
bm.setCache(fsc);
bm.initialize();
STree stree = bm.createSTree(elements, "1", 1);
int size = (1<<16) + (1<<4) + 1;
for (int i = 0; i < size; i++) {
stree.insert(Arrays.asList(i), InsertMode.ORDERED, size);
}
System.out.println(stree);
System.out.println(stree.getHeight());
System.out.println(stree.getRowCount());
System.out.println(stree.getKeyLength());
System.out.println(stree.isPreferMemory());
System.out.println();
for (int i = 0; i < size; i++){
List<?> list = stree.remove(Arrays.asList(i));
System.out.println(list);
}
}
static void testUnOrderedInsert() throws TeiidComponentException {
ElementSymbol x = new ElementSymbol("x");
x.setType(DataTypeManager.DefaultDataClasses.INTEGER);
List<ElementSymbol> elements = Arrays.asList(x);
BufferManagerImpl bm = new BufferManagerImpl();
bm.setProcessorBatchSize(16);
MemoryStorageManager storageManager = new MemoryStorageManager();
SplittableStorageManager ssm = new SplittableStorageManager(storageManager);
ssm.setMaxFileSizeDirect(MemoryStorageManager.MAX_FILE_SIZE);
BufferFrontedFileStoreCache fsc = new BufferFrontedFileStoreCache();
fsc.setBufferManager(bm);
fsc.setDirect(false);
fsc.setMaxStorageObjectSize(1<<20);
fsc.setMemoryBufferSpace(1<<21);
fsc.setStorageManager(ssm);
fsc.initialize();
bm.setCache(fsc);
bm.initialize();
STree stree = bm.createSTree(elements, "1", 1);
int size = (1<<16) + (1<<4) + 1;
int logSize = stree.getExpectedHeight(size);
for (int i = 0; i < size; i++) {
stree.insert(Arrays.asList(i), InsertMode.NEW, logSize);
}
System.out.println(stree);
System.out.println(stree.getHeight());
System.out.println(stree.getRowCount());
System.out.println(stree.getKeyLength());
System.out.println(stree.isPreferMemory());
System.out.println();
}
@SuppressWarnings("unchecked")
static void testRemoveAll() throws TeiidComponentException {
ElementSymbol x = new ElementSymbol("x");
x.setType(DataTypeManager.DefaultDataClasses.INTEGER);
ElementSymbol y = new ElementSymbol("x");
y.setType(DataTypeManager.DefaultDataClasses.STRING);
List<ElementSymbol> elements = Arrays.asList(x, y);
BufferManagerImpl bm = new BufferManagerImpl();
MemoryStorageManager storageManager = new MemoryStorageManager();
SplittableStorageManager ssm = new SplittableStorageManager(storageManager);
ssm.setMaxFileSizeDirect(MemoryStorageManager.MAX_FILE_SIZE);
BufferFrontedFileStoreCache fsc = new BufferFrontedFileStoreCache();
fsc.setBufferManager(bm);
fsc.setDirect(false);
fsc.setMaxStorageObjectSize(1<<20);
fsc.setMemoryBufferSpace(1<<21);
fsc.setStorageManager(ssm);
fsc.initialize();
bm.setCache(fsc);
bm.initialize();
STree stree = bm.createSTree(elements, "1", 1);
for (int i = 20000; i > 0; i--) {
stree.insert(Arrays.asList(i, String.valueOf(i)), InsertMode.NEW, -1);
}
System.out.println(stree);
System.out.println(stree.getHeight());
System.out.println(stree.getRowCount());
System.out.println(stree.getKeyLength());
System.out.println(stree.isPreferMemory());
System.out.println();
for (int i = 20000; i > 0; i--) {
List<?> list = stree.remove(Arrays.asList(i));
System.out.println(list);
}
System.out.println();
System.out.println(stree.getRowCount());
}
}