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

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

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

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;

import org.aksw.commons.collections.generator.Generator;
import org.apache.jena.sparql.core.Var;
import org.apache.jena.sparql.graph.NodeTransform;

public class VarUtils {
    public static final Pattern VARNAME = Pattern.compile("(\\?|\\$)?(?\\S*)");

    /**
     * Parse the patterns (?|$)\\S* as variables
     *
     * @return
     */
//	public static Var parseVar(String str) {
//		Matcher m = VARNAME.matcher(str);
//		String s = m.find()
//				? m.group(2)
//				: null;
//
//		Var result = Var.alloc(s);
//		return result;
//	}


    /**
     * This method parses the string generated by Map.toString() back into the Java object.
     * Variable names must not contain symbols '=' and ','
     *
     * @param str
     * @return
     */
    public static Map parseVarMap(String str) {
        Map result = new HashMap<>();

        int l = str.length();

        int start = str.startsWith("{") ? 1 : 0;
        int end = str.endsWith("}") ? l - 1 : l;

        String sub = str.substring(start, end);
        String[] entries = sub.split(",");

        for(String entry : entries) {
            String[] kv = entry.split("=", 2);
            Var k = parseVar(kv[0]);
            Var v = parseVar(kv[1]);
            result.put(k, v);
        }

        return result;
    }

    public static Var parseVar(String str) {
        // Remove leading ? of the varName
        String varName = str.trim();
        char c = varName.charAt(0);
        if(c != '?' && c != '$') {
            throw new RuntimeException("var name must start with '?' or '$'");
        }
        varName = varName.substring(1);

        Var result = Var.alloc(varName);
        return result;
    }


    /**
     * Create a generator which yields fresh variables that is not contained in the array 'vars'.
     * The new var name will have the given prefix
     *
     */
    public static Generator createVarGen(String prefix, Collection excludeVars) {
        prefix = prefix == null ? "v" : prefix;

        Generator result = VarGeneratorBlacklist.create(prefix, excludeVars);
        //      Set excludeVarNames = getVarNames(excludeVars);
        //var generator = GenSym.create(prefix);
        //var genVarName = new GeneratorBlacklist(generator, excludeVarNames);

        //var result = new VarGen(genVarName);

        return result;
    }

    /**
     * Returns a list of variable names as strings for a given iterable of Var objects.
     *
     * @param vars
     * @return
     */
    public static List getVarNames(Iterable vars) {
        List result = new ArrayList();

        for(Var var : vars) {
            result.add(var.getName());
        }

        return result;
    }

    public static List toList(Collection varNames) {
        List result = new ArrayList(varNames.size());
        for(String varName : varNames) {
            Var var = Var.alloc(varName);
            result.add(var);
        }

        return result;
    }

    /** Convert a collection of var names into a linked hash set of Vars */
    public static Set toSet(Collection varNames) {
        Set result = new LinkedHashSet<>();
        for(String varName : varNames) {
            Var var = Var.alloc(varName);
            result.add(var);
        }

        return result;
    }


    public static List map(Collection varNames, Map varMap) {
        List result = new ArrayList(varNames.size());
        for(String varName : varNames) {
            Var sourceVar = Var.alloc(varName);
            Var targetVar = varMap.get(sourceVar);

            if(targetVar == null) {
                targetVar = sourceVar;
            }

            String targetVarName = targetVar.getVarName();
            result.add(targetVarName);
        }

        return result;
    }

    public static Var applyNodeTransform(Var var, NodeTransform nodeTransform) {
        Var result = applyNodeTransform(var, nodeTransform, var);
        return result;
    }

    public static Var applyNodeTransform(Var var, NodeTransform nodeTransform, Var defaultVar) {
        Var tmp = (Var)nodeTransform.apply(var);
        Var result = tmp == null ? defaultVar : tmp;
        return result;
    }

    /**
     * Returns a map that maps *each* variable from vbs to a name that does not appear in vas.
     *
     * @param excludeSymmetry if true, exclude mappings from a var in vbs to itself.
     */
    public static Map createDistinctVarMap(Collection vas, Collection vbs, boolean excludeSymmetry, Generator generator) {

        // Ensure that the generator does not yield a forbidden variable
        Set forbidden = new HashSet<>();
        forbidden.addAll(vas);
        forbidden.addAll(vbs);
        generator = VarGeneratorBlacklist.create(generator, forbidden); //vas);

        // Rename all variables that are in common
        Map result = new HashMap();

        for(Var oldVar : vbs) {
            Var newVar;
            if (vas.contains(oldVar)) {
                newVar = generator.next();
            } else {
                newVar = oldVar;
            }

            boolean isSame = oldVar.equals(newVar);
            if(!(excludeSymmetry && isSame)) {
                result.put(oldVar, newVar);
            }
        }

        return result;
    }

    public static Map createJoinVarMap(Collection sourceVars, Collection targetVars, List sourceJoinVars, List targetJoinVars, Generator generator) {

        if (sourceJoinVars.size() != targetJoinVars.size()) {
            throw new RuntimeException("Cannot join on different number of columns");
        }

        Map result = VarUtils.createDistinctVarMap(sourceVars, targetVars, true, generator);

        for (int i = 0; i < sourceJoinVars.size(); ++i) {
            Var sourceJoinVar = sourceJoinVars.get(i);
            Var targetJoinVar = targetJoinVars.get(i);

            // Map targetVar to sourceVar
            result.put(targetJoinVar, sourceJoinVar);
            // rename[targetVar.getName()] = sourceVar;
        }

        return result;
    }




}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy