package org.aksw.sparqlify.core.sparql; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.aksw.jena_sparql_api.views.RestrictedExpr; import org.apache.jena.graph.Node; import org.apache.jena.sparql.core.Var; import org.apache.jena.sparql.engine.binding.Binding; import org.apache.jena.sparql.engine.binding.BindingHashMap; import org.apache.jena.sparql.expr.Expr; import org.apache.jena.sparql.expr.ExprVars; import org.springframework.jdbc.core.RowMapper; import com.google.common.collect.Multimap; public class RowMapperSparqlifyCombined implements RowMapper<Binding> { protected Var rowIdVar; protected Multimap<Var, RestrictedExpr> sparqlVarMap; protected boolean adjustVarNames = true; protected Map<Var, Var> normalizedToVar = new HashMap<>(); public RowMapperSparqlifyCombined(Multimap<Var, RestrictedExpr> sparqlVarMap) { this(sparqlVarMap, (Var)null); } public RowMapperSparqlifyCombined(Multimap<Var, RestrictedExpr> sparqlVarMap, String rowIdName) { this(sparqlVarMap, rowIdName == null ? null : Var.alloc(rowIdName)); } public RowMapperSparqlifyCombined(Multimap<Var, RestrictedExpr> sparqlVarMap, Var rowIdVar) { this.sparqlVarMap = sparqlVarMap; this.rowIdVar = rowIdVar; for(RestrictedExpr rexpr : sparqlVarMap.values()) { Expr expr = rexpr.getExpr(); Set<Var> vars = ExprVars.getVarsMentioned(expr); for(Var v : vars) { normalizedToVar.put(Var.alloc(v.getName().toLowerCase()), v); } } } @Override public Binding mapRow(ResultSet rs, int rowNum) throws SQLException { Binding tmp = RowMapperSparqlifyBinding.map(rs, rowNum, rowIdVar); if(adjustVarNames) { BindingHashMap adjust = new BindingHashMap(); Iterator<Var> it = tmp.vars(); while(it.hasNext()) { Var v = it.next(); Var lookupVar; boolean isExactMatch = sparqlVarMap.containsKey(v); if(isExactMatch) { lookupVar = v; } else { Var normalizedVar = Var.alloc(v.getName().toLowerCase()); lookupVar = normalizedToVar.get(normalizedVar); } if(lookupVar != null) { Node node = tmp.get(v); adjust.add(lookupVar, node); } } tmp = adjust; } Binding result = ItemProcessorSparqlify.process(sparqlVarMap, tmp); return result; } }