/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jena.sparql.engine.binding ;
import java.util.Iterator ;
import org.apache.jena.atlas.logging.Log ;
import org.apache.jena.graph.Node ;
import org.apache.jena.query.QuerySolution ;
import org.apache.jena.rdf.model.RDFNode ;
import org.apache.jena.sparql.ARQInternalErrorException ;
import org.apache.jena.sparql.core.ResultBinding ;
import org.apache.jena.sparql.core.Var ;
public class BindingUtils {
/** Convert a query solution to a binding */
public static Binding asBinding(QuerySolution qSolution) {
if ( qSolution == null )
return null ;
if ( qSolution instanceof ResultBinding )
// Only named variables.
return new BindingProjectNamed(((ResultBinding)qSolution).getBinding()) ;
BindingMap binding = BindingFactory.create() ;
addToBinding(binding, qSolution) ;
return binding ;
}
public static void addToBinding(BindingMap binding, QuerySolution qSolution) {
if ( qSolution == null )
return ;
for ( Iterator<String> iter = qSolution.varNames() ; iter.hasNext() ; ) {
String n = iter.next() ;
RDFNode x = qSolution.get(n) ;
if ( Var.isBlankNodeVarName(n) )
continue ;
try {
binding.add(Var.alloc(n), x.asNode()) ;
}
catch (ARQInternalErrorException ex) {
// bad binding attempt.
Log.warn(BindingUtils.class, "Attempt to bind " + n + " when already bound") ;
}
}
}
public static void addAll(BindingMap dest, Binding src) {
Iterator<Var> iter = src.vars() ;
for ( ; iter.hasNext() ; ) {
Var v = iter.next() ;
Node n = src.get(v) ;
dest.add(v, n) ;
}
}
/** Merge two bindings, assuming they are compatible. */
public static Binding merge(Binding bind1, Binding bind2) {
//Create binding from LHS
BindingMap b2 = BindingFactory.create(bind1) ;
Iterator<Var> vIter = bind2.vars() ;
// Add any variables from the RHS
for ( ; vIter.hasNext() ; ) {
Var v = vIter.next() ;
if ( ! b2.contains(v) )
b2.add(v, bind2.get(v)) ;
else {
// Checking!
Node n1 = bind1.get(v) ;
Node n2 = bind2.get(v) ;
if ( ! n1.equals(n2) )
Log.warn(BindingUtils.class, "merge: Mismatch : "+n1+" != "+n2);
}
}
return b2 ;
}
public static boolean equals(Binding b1, Binding b2) {
return BindingBase.equals(b1, b2) ;
}
}