
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/Var> 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