org.apache.jena.tdb.lib.DumpOps 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.lib;
import java.io.PrintStream ;
import java.util.Arrays ;
import java.util.HashSet ;
import java.util.Iterator ;
import java.util.Set ;
import org.apache.jena.atlas.io.IndentedWriter ;
import org.apache.jena.atlas.lib.ByteBufferLib ;
import org.apache.jena.atlas.lib.Pair ;
import org.apache.jena.atlas.lib.tuple.Tuple ;
import org.apache.jena.atlas.lib.tuple.TupleFactory ;
import org.apache.jena.graph.Node ;
import org.apache.jena.query.Dataset ;
import org.apache.jena.riot.out.NodeFmtLib ;
import org.apache.jena.tdb.TDBException ;
import org.apache.jena.tdb.base.block.Block ;
import org.apache.jena.tdb.base.block.BlockMgr ;
import org.apache.jena.tdb.index.bplustree.BPlusTree ;
import org.apache.jena.tdb.store.DatasetGraphTDB ;
import org.apache.jena.tdb.store.DatasetPrefixesTDB ;
import org.apache.jena.tdb.store.NodeId ;
import org.apache.jena.tdb.store.nodetable.NodeTable ;
import org.apache.jena.tdb.store.nodetupletable.NodeTupleTable ;
import org.apache.jena.tdb.store.tupletable.TupleIndex ;
import org.apache.jena.tdb.store.tupletable.TupleTable ;
public class DumpOps
{
public static void dump(Dataset ds)
{
DatasetGraphTDB dsg = (DatasetGraphTDB)(ds.asDatasetGraph()) ;
NodeTupleTable nodeTupleTableTriples = dsg.getTripleTable().getNodeTupleTable() ;
NodeTupleTable nodeTupleTableQuads = dsg.getQuadTable().getNodeTupleTable() ;
if ( nodeTupleTableTriples.getNodeTable() != nodeTupleTableQuads.getNodeTable() )
throw new TDBException("Different node tables for triples and quads") ;
NodeTable nodeTable = nodeTupleTableTriples.getNodeTable() ;
// V special.
Set dumpedNodeTables = new HashSet<>() ;
if ( true )
{
System.out.print("## Node Table\n") ;
dumpNodeTable(nodeTupleTableTriples.getNodeTable(), dumpedNodeTables) ;
dumpNodeTable(nodeTupleTableQuads.getNodeTable(), dumpedNodeTables) ;
}
if ( false )
{
System.out.print("## Triple Table\n") ;
dumpNodeTupleTable(nodeTupleTableTriples.getTupleTable()) ;
System.out.print("## Quad Table\n") ;
dumpNodeTupleTable(nodeTupleTableQuads.getTupleTable()) ;
}
// Indexes.
if ( true )
{
dumpTupleIndexes(nodeTupleTableTriples.getTupleTable().getIndexes()) ;
dumpTupleIndexes(nodeTupleTableQuads.getTupleTable().getIndexes()) ;
}
// Prefixes
if ( true )
{
System.out.print("## Prefix Table\n") ;
DatasetPrefixesTDB prefixes = dsg.getPrefixes() ;
NodeTupleTable pntt = prefixes.getNodeTupleTable() ;
if ( ! dumpedNodeTables.contains(pntt.getNodeTable()))
{
dumpNodeTable(pntt.getNodeTable(), dumpedNodeTables) ;
dumpedNodeTables.add(pntt.getNodeTable()) ;
}
dumpTupleIndexes(prefixes.getNodeTupleTable().getTupleTable().getIndexes()) ;
}
}
public static void dumpNodeTable(NodeTable nodeTable, Set dumpedNodeTables)
{
if ( dumpedNodeTables.contains(nodeTable) )
return ;
Iterator> iter = nodeTable.all() ;
for ( ; iter.hasNext() ; )
{
Pair pair = iter.next() ;
NodeId nid = pair.car() ;
Node n = pair.cdr();
String x = NodeFmtLib.displayStr(n) ;
System.out.printf("%016X %s\n", nid.getId(), x) ;
}
dumpedNodeTables.add(nodeTable) ;
}
public static void dumpTupleIndexes(TupleIndex[] tupleIndexes)
{
for ( TupleIndex tIdx : tupleIndexes )
dumpTupleIndex(tIdx) ;
}
public static void dumpTupleIndex(TupleIndex tIdx)
{
System.out.print("## "+tIdx.getMapping()+"\n") ;
Iterator> iter = tIdx.all() ;
for ( ; iter.hasNext() ; )
{
Tuple t = iter.next() ;
System.out.print(t) ;
System.out.print("\n") ;
}
}
public static void dumpBlockMgr(PrintStream out, BlockMgr blkMgr)
{
try {
for ( int id = 0 ; id < 9999999 ; id++)
{
if ( ! blkMgr.valid(id) ) break ;
Block blk = blkMgr.getRead(id) ;
out.print("id="+blk.getId()+" ") ;
ByteBufferLib.print(out, blk.getByteBuffer()) ;
}
} catch (Exception ex) {
ex.printStackTrace() ;
}
}
public static void dumpBPlusTree(PrintStream out, BPlusTree bpt)
{
IndentedWriter iw = new IndentedWriter(out) ;
bpt.dump(iw) ;
}
public static void dumpBPlusTreeBlocks(BPlusTree bpt)
{
System.out.println("Data blocks");
DumpOps.dumpBlockMgr(System.out, bpt.getRecordsMgr().getBlockMgr()) ;
System.out.println("Node blocks");
DumpOps.dumpBlockMgr(System.out, bpt.getRecordsMgr().getBlockMgr()) ;
}
public static void dumpNodeTupleTable(TupleTable tupleTable)
{
int N = tupleTable.getTupleLen() ;
NodeId[] nodeIds = new NodeId[N] ;
Arrays.fill(nodeIds, NodeId.NodeIdAny) ;
Tuple t = TupleFactory.asTuple(nodeIds) ;
Iterator> iter = tupleTable.find(t) ;
for ( ; iter.hasNext() ; )
{
Tuple tuple = iter.next() ;
System.out.print(tuple) ;
System.out.print("\n") ;
}
}
}