/*
* 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.util;
import java.util.HashMap ;
import java.util.Map ;
import java.util.Set ;
import org.apache.jena.graph.Node ;
import org.apache.jena.graph.NodeFactory ;
import org.apache.jena.sparql.ARQConstants ;
import org.apache.jena.sparql.core.VarAlloc ;
/** Map from _:* form to bNodes */
public class LabelToNodeMap
{
// Wil be replaced by LabelToNode in RIOT
Map<String, Node> bNodeLabels = new HashMap<>() ;
// Variables or bNodes?
// True means variables (query pattern)
// False means blank node (construct template)
boolean generateVars = false ;
VarAlloc allocator = null ;
/** Create blank nodes, with the same blank node returned for thre same label.
*
* @return LabelToNodeMap
*/
public static LabelToNodeMap createBNodeMap()
{ return new LabelToNodeMap(false, null) ; }
/** Create variables (Var), starting from zero each time
* This means that parsing a query string will generate
* the same variable names for bNode variables each time,
* making Query.equals and Query.hashCode work.
*
* @return LabelToNodeMap
*/
public static LabelToNodeMap createVarMap()
{ return new LabelToNodeMap(true, new VarAlloc(ARQConstants.allocParserAnonVars) ) ; }
private LabelToNodeMap(boolean genVars, VarAlloc allocator)
{
generateVars = genVars ;
this.allocator = allocator ;
}
public Set<String> getLabels() { return bNodeLabels.keySet() ; }
public Node asNode(String label)
{
Node n = bNodeLabels.get(label) ;
if ( n != null )
return n ;
n = allocNode() ;
bNodeLabels.put(label, n) ;
return n ;
}
public Node allocNode()
{
if ( generateVars )
return allocAnonVariable() ;
return NodeFactory.createBlankNode() ;
}
private Node allocAnonVariable()
{
return allocator.allocVar() ;
}
public void clear()
{
bNodeLabels.clear() ;
}
}