package org.aksw.jena_sparql_api.stmt; import java.util.List; import java.util.function.Function; import org.aksw.jena_sparql_api.concepts.Concept; import org.apache.jena.sparql.core.Var; import org.apache.jena.sparql.syntax.Element; import org.apache.jena.sparql.syntax.ElementGroup; public class SparqlConceptParserImpl implements SparqlConceptParser { private Function<String, Element> elementParser; public SparqlConceptParserImpl(Function<String, Element> elementParser) { this.elementParser = elementParser; } @Override public Concept apply(String conceptStr) { Concept result = SparqlConceptParserImpl.parse(conceptStr, elementParser); return result; } public static Concept parse(String conceptStr, Function<String, Element> elementParser) { String[] splits = conceptStr.split("\\|", 2); if(splits.length != 2) { throw new RuntimeException("Invalid string: " + conceptStr); } // Remove leading ? of the varName String varName = splits[0].trim(); if(varName.charAt(0) != '?') { throw new RuntimeException("var name must start with '?'"); } varName = varName.substring(1); Concept result = create(splits[1], varName, elementParser); return result; } public static Concept create(String elementStr, String varName, Function<String, Element> elementParser) { Var var = Var.alloc(varName); String tmp = elementStr.trim(); // boolean isEnclosed = tmp.startsWith("{") && tmp.endsWith("}"); // if(!isEnclosed) { // tmp = "{" + tmp + "}"; // } // // //ParserSparql10 p; // tmp = "Select * " + tmp; Element element = elementParser.apply(tmp); //Element element = ParserSPARQL10.parseElement(tmp); //Element element = ParserSPARQL11.parseElement(tmp); // TODO Find a generic flatten routine if(element instanceof ElementGroup) { ElementGroup group = (ElementGroup)element; List<Element> elements = group.getElements(); if(elements.size() == 1) { element = elements.get(0); } } Concept result = new Concept(element, var); return result; } }