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

org.aksw.jena_sparql_api.utils.ResultSetUtils Maven / Gradle / Ivy

There is a newer version: 3.17.0-1
Show newest version
package org.aksw.jena_sparql_api.utils;

import java.io.Closeable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.google.common.collect.Iterators;
import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.Multimap;
import org.apache.jena.graph.Node;
import org.apache.jena.graph.Triple;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.query.ResultSetFactory;
import org.apache.jena.sparql.core.Var;
import org.apache.jena.sparql.engine.QueryIterator;
import org.apache.jena.sparql.engine.binding.Binding;
import org.apache.jena.sparql.engine.binding.BindingHashMap;
import org.apache.jena.sparql.engine.iterator.QueryIter;
import org.apache.jena.sparql.engine.iterator.QueryIterPlainWrapper;
import org.apache.jena.sparql.expr.NodeValue;
import org.apache.jena.util.iterator.ExtendedIterator;
import org.apache.jena.util.iterator.WrappedIterator;


public class ResultSetUtils {

    public static Integer resultSetToInt(ResultSet rs, Var v) {
        Integer result = null;

        if (rs.hasNext()) {
            Binding binding = rs.nextBinding();

            Node node = binding.get(v);
            NodeValue nv = NodeValue.makeNode(node);
            result = nv.getInteger().intValue();

            // TODO Validate that the result actually is int.
            //result = node.getLiteral().
        }

        return result;
    }

//    public static Long resultSetToInt(ResultSet rs, Var v) {
//        Integer result = null;
//
//        if (rs.hasNext()) {
//            Binding binding = rs.nextBinding();
//
//            Node node = binding.get(v);
//            NodeValue nv = NodeValue.makeNode(node);
//            result = nv.getInteger().longValue();
//
//            // TODO Validate that the result actually is int.
//            //result = node.getLiteral().
//        }
//
//        return result;
//    }


    public static List resultSetToList(ResultSet rs, Var v) {
        List result = new ArrayList();
        while (rs.hasNext()) {
            Binding binding = rs.nextBinding();

            Node node = binding.get(v);
            result.add(node);
        }
        return result;
    }


    public static Map partition(ResultSet rs, Var var) {
        List varNames = rs.getResultVars();
        Map result = new LinkedHashMap();

        while(rs.hasNext()) {
            Binding binding = rs.nextBinding();
            Node node = binding.get(var);

            ResultSetPart rsp = result.get(node);
            if(rsp == null) {

                rsp = new ResultSetPart(varNames);
                result.put(node, rsp);
            }

            rsp.getBindings().add(binding);
        }

        return result;
    }

    public static ExtendedIterator toIteratorBinding(QueryExecution qe) {
        ResultSet rs = qe.execSelect();
        ExtendedIterator result = toIteratorBinding(rs, qe);
        return result;
    }
    /**
     * This version returns an iterator capable of closing the corresponding query execution
     *
     * @param rs
     * @param qe
     * @return
     */
    public static ExtendedIterator toIteratorBinding(ResultSet rs, QueryExecution qe) {
        Iterator it = new IteratorResultSetBinding(rs);
        Closeable closeable = new CloseableQueryExecution(qe);
        Iterator tmp = new IteratorClosable(it, closeable);
        ExtendedIterator result = WrappedIterator.create(tmp);

        return result;
    }

    public static Iterator toIteratorBinding(ResultSet rs) {
        Iterator result = new IteratorResultSetBinding(rs);
        return result;
    }

    public static Multimap, Binding> index(ResultSet rs, List vars) {
        Multimap, Binding> result = LinkedListMultimap.create();

        while(rs.hasNext()) {
            Binding binding = rs.nextBinding();

            List key = new ArrayList(vars.size());
            for(Var var : vars) {
                Node node = binding.get(var);
                key.add(node);
            }

            result.put(key, binding);
        }

        return result;
    }

    public static ResultSet join(ResultSet a, ResultSet b) {
        //Set aVarNames = new HashSet(a.getResultVars());
        List aVarNames = a.getResultVars();

        Set joinVarNames = new HashSet(aVarNames);
        joinVarNames.retainAll(b.getResultVars());

        List bVarsOnly = new ArrayList(b.getResultVars());
        bVarsOnly.removeAll(joinVarNames);

        List allVars = new ArrayList(aVarNames);
        allVars.addAll(bVarsOnly);


        List joinVars = VarUtils.toList(joinVarNames);

        Multimap, Binding> ma = index(a, joinVars);
        Multimap, Binding> mb = index(b, joinVars);

        Set> keys = new HashSet>(ma.keySet());
        keys.retainAll(mb.keySet());

        // Clean up unused keys
        ma.keySet().retainAll(keys);
        mb.keySet().retainAll(keys);

        Iterator joinIterator = new IteratorJoin>(keys.iterator(), ma, mb);

        QueryIterator queryIter = new QueryIterPlainWrapper(joinIterator);

        ResultSet result = ResultSetFactory.create(queryIter, allVars);
        return result;
    }


    public static ResultSet project(ResultSet rs, Iterable vars, boolean uniq) {

        Collection newBindings = uniq
            ? new HashSet()
            : new ArrayList()
            ;

        while(rs.hasNext()) {
            Binding o = rs.nextBinding();

            BindingHashMap n = new BindingHashMap();

            for(Var var : vars) {
                Node node = o.get(var);
                n.add(var, node);;
            }

            newBindings.add(n);
        }

        QueryIterator queryIter = new QueryIterPlainWrapper(newBindings.iterator());

        List varNames = org.aksw.jena_sparql_api.utils.VarUtils.getVarNames(vars);
        ResultSet result = ResultSetFactory.create(queryIter, varNames);

        return result;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy