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

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

The newest version!
package org.aksw.jena_sparql_api.utils;

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

import org.aksw.commons.collections.diff.ListDiff;
import org.aksw.jena_sparql_api.utils.model.QuerySolutionWithEquals;
import org.apache.jena.graph.Node;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.query.ResultSetFactory;
import org.apache.jena.rdf.model.RDFNode;
import org.apache.jena.sparql.algebra.Table;
import org.apache.jena.sparql.algebra.TableFactory;
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.BindingFactory;
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;

import com.google.common.collect.HashMultiset;
import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multiset;
import com.google.common.collect.Multisets;


public class ResultSetUtils {

    /** Materialize a {@link ResultSet} into a {@link Table} */
    public static Table resultSetToTable(ResultSet rs) {
        List vars = Var.varList(rs.getResultVars());
        Table result = TableFactory.create(vars);
        while (rs.hasNext()) {
            Binding b = BindingFactory.copy(rs.nextBinding());
            result.addBinding(b);
        }

        return result;
    }

    public static Multiset toMultisetQs(ResultSet rs) {
        Multiset result = HashMultiset.create();
        while(rs.hasNext()) {
            QuerySolution original = rs.next();

            QuerySolution wrapped = new QuerySolutionWithEquals(original);

            result.add(wrapped);
        }

        return result;
    }

    public static Multiset toMultiset(ResultSet rs) {
        Multiset result = HashMultiset.create();
        while(rs.hasNext()) {
            Binding original = rs.nextBinding();

            Binding wrapped = original;
            //QuerySolution wrapped = new QuerySolutionWithEquals(original);

            result.add(wrapped);
        }

        return result;
    }

    /**
     * Traverse the resultset in order, and write out the missing items on each side:
     * 1 2
     * ---
     * a a
     * b c
     * d d
     *
     * gives:
     * [c] [b]
     *
     * (1 lacks c, 2 lacks b)
     *
     *
     * @param a
     * @param b
     * @return
     */
    public static ListDiff compareOrdered(ResultSet a, ResultSet b) {
        ListDiff result = new ListDiff<>();

        Binding x = null;
        Binding y = null;

        while(a.hasNext()) {
            if(!b.hasNext()) {
                while(a.hasNext()) {
                    result.getAdded().add(a.nextBinding());
                }
                return result;
            }

            //if((x == null && y == null) ||  x.equals(y)
            if(x == y || x.equals(y)) {
                x = a.nextBinding();
                y = b.nextBinding();
                continue;
            }

            String sx = x.toString();
            String sy = y.toString();

            if(sx.compareTo(sy) < 0) {
                result.getRemoved().add(x);
                x = a.nextBinding();
            } else {
                result.getAdded().add(y);
                y = b.nextBinding();
            }
        }

        while(b.hasNext()) {
            result.getRemoved().add(b.nextBinding());
        }

        return result;
    }

    public static ListDiff compareUnordered(ResultSet a, ResultSet b) {
        ListDiff result = new ListDiff<>();

        Multiset x = toMultiset(a);
        Multiset y = toMultiset(b);

        Multiset common = HashMultiset.create(Multisets.intersection(x, y));

        y.removeAll(common);
        x.removeAll(common);

        result.getAdded().addAll(y);
        result.getRemoved().addAll(x);

        return result;
    }

    public static List getVars(ResultSet rs) {
        List result = VarUtils.toList(rs.getResultVars());
        return result;
    }

    public static Node getNextNode(ResultSet rs, Var v) {
        Node result = null;

        if (rs.hasNext()) {
            Binding binding = rs.nextBinding();
            result = binding.get(v);
        }
        return result;
    }

    public static Optional tryGetNextNode(ResultSet rs, Var v) {
        Node node = getNextNode(rs, v);
        Optional result = Optional.ofNullable(node);
        return result;
    }

    public static RDFNode getNextRDFNode(ResultSet rs, Var v) {
        RDFNode result = null;
        if (rs.hasNext()) {
            QuerySolution qs = rs.next();
            String varName = v.getName();
            result = qs.get(varName);
        }
        return result;
    }

    public static Optional tryGetNextRDFNode(ResultSet rs, Var v) {
        RDFNode node = getNextRDFNode(rs, v);
        Optional result = Optional.ofNullable(node);
        return result;
    }

    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();
            Binding n = BindingUtils.project(o, vars);

            newBindings.add(n);
        }

        ResultSet result = create2(vars, newBindings.iterator());

        return result;
    }

    public static ResultSet create(List varNames, Iterator bindingIt) {
        QueryIterator queryIter = new QueryIterPlainWrapper(bindingIt);

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

    public static ResultSet create2(Iterable vars, Iterator bindingIt) {
        List varNames = org.aksw.jena_sparql_api.utils.VarUtils.getVarNames(vars);
        ResultSet result = create(varNames, bindingIt);
        return result;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy