All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.jena.tdb.lib.TupleLib Maven / Gradle / Ivy

Go to download

TDB is a storage subsystem for Jena and ARQ, it is a native triple store providing persistent storage of triples/quads.

There is a newer version: 4.10.0
Show newest version
/*
 * 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 static org.apache.jena.tdb.sys.SystemTDB.SizeOfLong ;

import java.util.Iterator;

import org.apache.jena.atlas.iterator.Iter ;
import org.apache.jena.atlas.lib.Bytes ;
import org.apache.jena.atlas.lib.InternalErrorException ;
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.graph.Triple ;
import org.apache.jena.sparql.core.Quad ;
import org.apache.jena.tdb.TDBException ;
import org.apache.jena.tdb.base.record.Record ;
import org.apache.jena.tdb.base.record.RecordFactory ;
import org.apache.jena.tdb.store.NodeId ;
import org.apache.jena.tdb.store.nodetable.NodeTable ;

public class TupleLib
{
    public static  Iterator> convertToNodes(final NodeTable nodeTable, Iterator> iter)
    {
        return Iter.map(iter, item -> tupleNodes(nodeTable, item)) ;
    }
    
    public static Iterator> convertToNodeId(final NodeTable nodeTable, Iterator> iter)
    {
        return Iter.map(iter, item -> tupleNodeIds(nodeTable, item)) ;
    }
    
    //Leave - bypasses extract step in Tuple -> Tuple -> Triple
    public static Iterator convertToTriples(final NodeTable nodeTable, Iterator> iter)
    {
        return Iter.map(iter, item -> triple(nodeTable, item)) ;
    }
    
    public static Iterator convertToQuads(final NodeTable nodeTable, Iterator> iter)
    {
        return Iter.map(iter, item -> quad(nodeTable, item)) ;
    }
    
    public static Tuple tupleNodes(NodeTable nodeTable, Tuple ids) 
    {
        int N = ids.len() ;
        Node[] n = new Node[N] ;
        for ( int i = 0 ; i < N ; i++ )
            n[i] = nodeTable.getNodeForNodeId(ids.get(i)) ;
        return TupleFactory.asTuple(n) ;
    }
    
    public static Tuple tupleNodeIds(NodeTable nodeTable, Tuple nodes) 
    {
        int N = nodes.len() ;
        NodeId[] n = new NodeId[N] ;
        for ( int i = 0 ; i < N ; i++ )
            n[i] = nodeTable.getNodeIdForNode(nodes.get(i)) ;
        return TupleFactory.asTuple(n) ;
    }
    
    private static Triple triple(NodeTable nodeTable, Tuple tuple) 
    {
        if ( tuple.len() != 3 )
            throw new TDBException("Tuple is not of length 3: "+tuple) ;
        return triple(nodeTable, tuple.get(0), tuple.get(1), tuple.get(2)) ;
    }

    private static Triple triple(NodeTable nodeTable, NodeId s, NodeId p, NodeId o) 
    {
        if ( ! NodeId.isConcrete(s) )
            throw new InternalErrorException("Invalid id for subject: "+fmt(s,p,o)) ;
        if ( ! NodeId.isConcrete(p) )
            throw new InternalErrorException("Invalid id for predicate: "+fmt(s,p,o)) ;
        if ( ! NodeId.isConcrete(o) )
            throw new InternalErrorException("Invalid id for object: "+fmt(s,p,o)) ;
        
        Node sNode = nodeTable.getNodeForNodeId(s) ;
        if ( sNode == null )
            throw new InternalErrorException("Invalid id node for subject (null node): "+fmt(s,p,o)) ;

        Node pNode = nodeTable.getNodeForNodeId(p) ;
        if ( pNode == null )
        {
            nodeTable.getNodeForNodeId(p) ;
            throw new InternalErrorException("Invalid id node for predicate (null node): "+fmt(s,p,o)) ;
        }
        
        Node oNode = nodeTable.getNodeForNodeId(o) ;
        if ( oNode == null )
            throw new InternalErrorException("Invalid id node for object (null node): "+fmt(s,p,o)) ;
        
        return new Triple(sNode, pNode, oNode) ;
    }
    
    private static String fmt(NodeId s, NodeId p, NodeId o)
    {
        return "("+s+", "+p+", "+o+")" ;
    }
    
    private static Quad quad(NodeTable nodeTable, Tuple tuple) 
    {
        if ( tuple.len() != 4 )
            throw new TDBException("Tuple is not of length 4: "+tuple) ;
        return quad(nodeTable, tuple.get(0), tuple.get(1), tuple.get(2), tuple.get(3)) ;
    }
    
    private static Quad quad(NodeTable nodeTable, NodeId g, NodeId s, NodeId p, NodeId o) 
    {
        Node gNode = nodeTable.getNodeForNodeId(g) ;
        Node sNode = nodeTable.getNodeForNodeId(s) ;
        Node pNode = nodeTable.getNodeForNodeId(p) ;
        Node oNode = nodeTable.getNodeForNodeId(o) ;
        return new Quad(gNode, sNode, pNode, oNode) ;
    }

    // ---- Tuples and Records
    public static Tuple tuple(Record r, ColumnMap cMap)
    {
        int N = r.getKey().length/SizeOfLong ;
        NodeId[] nodeIds = new NodeId[N] ;
        for ( int i = 0 ; i < N ; i++ )
        {
            NodeId id = NodeId.create(r.getKey(), i*SizeOfLong) ;
            int j = i ;
            if ( cMap != null )
                j = cMap.fetchSlotIdx(i) ;
            nodeIds[j] = id ;
        }
        return TupleFactory.asTuple(nodeIds) ;
    }

    public static Record record(RecordFactory factory, Tuple tuple, ColumnMap cMap) 
    {
        byte[] b = new byte[tuple.len()*NodeId.SIZE] ;
        for ( int i = 0 ; i < tuple.len() ; i++ )
        {
            int j = cMap.mapSlotIdx(i) ;
            // i'th Nodeid goes to j'th bytes slot.
            Bytes.setLong(tuple.get(i).getId(), b,j*SizeOfLong) ;
        }
            
        return factory.create(b) ;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy