org.apache.jena.tdb.index.bplustree.BPlusTreeTools Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jena-tdb Show documentation
Show all versions of jena-tdb Show documentation
TDB is a storage subsystem for Jena and ARQ, it is a native triple store providing persistent storage of triples/quads.
/*
* 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.jena.tdb.index.bplustree;
import java.io.IOException ;
import java.io.RandomAccessFile ;
import java.nio.ByteBuffer ;
import java.nio.channels.FileChannel ;
import org.apache.jena.atlas.lib.ByteBufferLib ;
import org.apache.jena.tdb.base.block.BlockMgr ;
import org.apache.jena.tdb.base.block.BlockMgrFactory ;
import org.apache.jena.tdb.base.buffer.RecordBuffer ;
import org.apache.jena.tdb.base.record.RecordFactory ;
import org.apache.jena.tdb.base.recordbuffer.RecordBufferPage ;
import org.apache.jena.tdb.base.recordbuffer.RecordBufferPageMgr ;
import org.apache.jena.tdb.sys.SystemTDB ;
/** Tools for working with B+Trees and datastructures associated with them, rather directly */
class BPlusTreeTools
{
/*public*/private static void binDump(String filename)
{
try(RandomAccessFile fh = new RandomAccessFile(filename, "r")) {
ByteBuffer bb = ByteBuffer.allocate(8*1024) ;
FileChannel ch = fh.getChannel() ;
int idx = 0 ;
while(true)
{
int x = ch.read(bb) ;
if ( x < 0 )
break ;
ByteBufferLib.print(bb) ;
bb.clear() ;
}
} catch (IOException ex)
{
ex.printStackTrace();
}
}
/** Scan/dump a file of RecordBuffers */
/*public*/private static void bpt_scan_record_buffer(String filename, boolean verbose)
{
BlockMgr blkMgr = BlockMgrFactory.createStdFileNoCache(filename, SystemTDB.BlockSize) ;
bpt_scan_record_buffer(blkMgr, verbose) ;
blkMgr.close();
}
/*public*/private static void bpt_scan_record_buffer(BPlusTree bpt, boolean verbose)
{
bpt_scan_record_buffer(bpt.getRecordsMgr().getBlockMgr(), verbose) ;
}
/*public*/private static void bpt_scan_record_buffer(BlockMgr blkMgr, boolean verbose)
{
RecordFactory f = SystemTDB.indexRecordTripleFactory ;
RecordBufferPageMgr recordPageMgr = new RecordBufferPageMgr(f, blkMgr) ;
bpt_scan_record_buffer(recordPageMgr,verbose) ;
}
/*public*/private static void bpt_scan_record_buffer(RecordBufferPageMgr recordPageMgr, boolean verbose)
{
System.out.print("[Scan Records] start\n") ;
int idx = 0 ;
int n = 0 ;
int total = 0 ;
if ( verbose ) System.out.printf("recordPageMgr = %s\n", recordPageMgr) ;
// Blocks in scan order
try {
while ( idx >= 0 )
{
if ( verbose ) System.out.printf("idx = %d\n", idx) ;
RecordBufferPage page = recordPageMgr.getRead(idx) ;
if ( verbose ) System.out.printf("%04d :: id=%04d -> link=%04d [count=%d, max=%d]\n", n, page.getId(), page.getLink(), page.getCount(), page.getMaxSize()) ;
RecordBuffer rb = page.getRecordBuffer() ;
if ( verbose ) System.out.printf(" :: %d %d\n", rb.getSize(), rb.maxSize() ) ;
total += rb.size();
idx = page.getLink() ;
n++ ;
recordPageMgr.release(page) ;
}
} catch (Exception ex)
{
System.out.println("Exception: "+ex) ;
}
System.out.printf("[Scan Records] Count = %d in %d blocks (avg: %.2f)\n", total, n, ((float)total)/n) ;
}
// /*public*/private static void bpt_scan_nodes(String filename, boolean verbose)
// {
// RecordFactory f = FactoryGraphTDB.indexRecordTripleFactory ;
// BPlusTree.
// BlockMgr blkMgr = BlockMgrFactory.createStdFileNoCache(filename, SystemTDB.BlockSize) ;
// bpt_scan_nodes(bpt, blkMgr, verbose) ;
// blkMgr.close();
// }
/*public*/private static void bpt_scan_nodes(BPlusTree bpt, boolean verbose)
{
System.out.print("[Scan Nodes] start\n") ;
RecordFactory f = SystemTDB.indexRecordTripleFactory ;
BPTreeNodeMgr nodeMgr = new BPTreeNodeMgr(bpt, bpt.getNodeManager().getBlockMgr()) ;
int idx = 0 ;
int n = 0 ;
int total = 0 ;
if ( verbose ) System.out.printf("BPTreeNodeMgr = %s\n", nodeMgr) ;
// Blocks in file order
try {
while ( idx >= 0 )
{
if ( verbose ) System.out.printf("idx = %d\n", idx) ;
BPTreeNode node = nodeMgr.getRead(idx, 0) ;
if ( node == null )
break ;
System.out.println(node) ;
// if ( verbose )
// System.out.printf("%04d :: id=%04d -> link=%04d [count=%d, max=%d]\n", n, page.getId(), page.getLink(), page.getCount(), page.getMaxSize()) ;
n++ ;
idx ++ ;
nodeMgr.release(node) ;
}
} catch (Exception ex)
{
System.out.println("Exception: "+ex) ;
ex.printStackTrace() ;
}
System.out.printf("[Scan Nodes] Count = %d in %d blocks (avg: %.2f)\n", total, n, ((float)total)/n) ;
}
}