blob: cfcb8748ebc3351c7eb42aa16a444146cda9519d [file] [log] [blame]
/**
* 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.riot.thrift;
import java.io.InputStream ;
import java.util.ArrayList ;
import java.util.Iterator ;
import java.util.List ;
import org.apache.jena.atlas.iterator.IteratorSlotted ;
import org.apache.jena.graph.Node ;
import org.apache.jena.riot.thrift.wire.RDF_DataTuple ;
import org.apache.jena.riot.thrift.wire.RDF_Term ;
import org.apache.jena.riot.thrift.wire.RDF_VAR ;
import org.apache.jena.riot.thrift.wire.RDF_VarTuple ;
import org.apache.jena.sparql.core.Var ;
import org.apache.jena.sparql.engine.binding.Binding ;
import org.apache.jena.sparql.engine.binding.BindingFactory ;
import org.apache.jena.sparql.engine.binding.BindingMap ;
import org.apache.thrift.TException ;
import org.apache.thrift.protocol.TProtocol ;
import org.apache.thrift.transport.TIOStreamTransport ;
import org.apache.thrift.transport.TTransportException ;
/** Converted from SPARQL result set encoded in Thrift to Bindings */
public class Thift2Binding extends IteratorSlotted<Binding> implements Iterator<Binding> {
private List<Var> vars = new ArrayList<>() ;
private List<String> varNames = new ArrayList<>() ;
private final RDF_DataTuple row = new RDF_DataTuple() ;
private InputStream in ;
private TProtocol protocol ;
public Thift2Binding(InputStream in) {
this.in = in ;
TIOStreamTransport transport = new TIOStreamTransport(in) ;
this.protocol = TRDF.protocol(transport) ;
readVars() ;
}
public Thift2Binding(TProtocol out) {
this.in = null ;
this.protocol = out ;
readVars() ;
}
private void readVars() {
RDF_VarTuple vrow = new RDF_VarTuple() ;
try { vrow.read(protocol) ; }
catch (TException e) { TRDF.exception(e) ; }
// ** Java8
// vrow.getVars().forEach(rv -> {
// String vn = rv.getName() ;
// Var v = Var.alloc(rv.getName()) ;
// varNames.add(vn) ;
// }) ;
for ( RDF_VAR rv : vrow.getVars() ) {
String vn = rv.getName() ;
Var v = Var.alloc(rv.getName()) ;
varNames.add(vn) ;
}
vars = Var.varList(varNames) ;
}
public List<Var> getVars() { return vars ; }
public List<String> getVarNames() { return varNames ; }
@Override
protected Binding moveToNext() {
try { row.read(protocol) ; }
catch (TTransportException e) { return null ; }
catch (TException e) { TRDF.exception(e) ; }
if ( row.getRowSize() != vars.size() )
throw new RiotThriftException(String.format("Vars %d : Row length : %d", vars.size(), row.getRowSize())) ;
BindingMap b = BindingFactory.create() ;
for ( int i = 0 ; i < vars.size() ; i++ ) {
// Old school
Var v = vars.get(i) ;
RDF_Term rt = row.getRow().get(i) ;
if ( rt.isSetUndefined() )
continue ;
Node n = ThriftConvert.convert(rt) ;
b.add(v, n) ;
}
row.clear() ;
return b ;
}
@Override
protected boolean hasMore() {
return true ;
}
}