org.apache.jena.sparql.resultset.TSVInput Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jena-arq Show documentation
Show all versions of jena-arq Show documentation
ARQ is a SPARQL 1.1 query engine for Apache Jena
/*
* 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.resultset;
import java.io.BufferedReader ;
import java.io.IOException ;
import java.io.InputStream ;
import java.util.ArrayList ;
import java.util.List ;
import java.util.regex.Pattern ;
import org.apache.jena.atlas.io.IO ;
import org.apache.jena.graph.Node ;
import org.apache.jena.query.ResultSet ;
import org.apache.jena.riot.RiotException ;
import org.apache.jena.sparql.ARQException ;
import org.apache.jena.sparql.core.Var ;
import org.apache.jena.sparql.engine.ResultSetStream ;
import org.apache.jena.sparql.util.NodeFactoryExtra ;
/**
* Input reader associated to {@link TSVOutput}.
*/
public class TSVInput {
static Pattern pattern = Pattern.compile("\t");
/**
* Reads SPARQL Results from TSV format into a {@link ResultSet} instance
* @param in Input Stream
*/
public static ResultSet fromTSV(InputStream in) {
BufferedReader reader = IO.asBufferedUTF8(in);
List vars = new ArrayList<>();
List varNames = new ArrayList<>();
String str = null;
try {
// Here we try to parse only the Header Row
str = reader.readLine();
if ( str == null )
throw new ARQException("TSV Results malformed, input is empty (no header row)");
if ( !str.isEmpty() ) {
String[] tokens = pattern.split(str, -1);
for ( String token : tokens ) {
Node v;
try {
v = NodeFactoryExtra.parseNode(token);
if ( v == null || !v.isVariable() )
throw new ResultSetException("TSV Results malformed, not a variable: " + token);
}
catch (RiotException ex) {
throw new ResultSetException("TSV Results malformed, variable names must begin with a ? in the header: " + token);
}
Var var = Var.alloc(v);
vars.add(var);
varNames.add(var.getName());
}
}
}
catch (IOException ex) {
throw new ARQException(ex);
}
//Generate an instance of ResultSetStream using TSVInputIterator
//This will parse actual result rows as needed thus minimising memory usage
return new ResultSetStream(varNames, null, new TSVInputIterator(reader, vars));
}
/**
* Reads SPARQL Boolean result from TSV
* @param in Input Stream
* @return boolean
*/
public static boolean booleanFromTSV(InputStream in) {
BufferedReader reader = IO.asBufferedUTF8(in);
String str = null;
try {
// First try to parse the header
str = reader.readLine();
if ( str == null )
throw new ARQException("TSV Boolean Results malformed, input is empty");
str = str.trim(); // Remove extraneous white space
// Expect a header row with single ?_askResult variable
if ( !str.equals("?_askResult") )
throw new ARQException("TSV Boolean Results malformed, did not get expected ?_askResult header row");
// Then try to parse the boolean result
str = reader.readLine();
if ( str == null )
throw new ARQException("TSV Boolean Results malformed, unexpected end of input after header row");
str = str.trim();
if ( str.equalsIgnoreCase("true") || str.equalsIgnoreCase("yes") ) {
return true;
} else if ( str.equalsIgnoreCase("false") || str.equalsIgnoreCase("no") ) {
return false;
} else {
throw new ARQException("TSV Boolean Results malformed, expected one of - true yes false no - but got " + str);
}
}
catch (IOException ex) {
throw new ARQException(ex);
}
}
}