blob: 4ef2b724a7922fcb0373fd6024bbc2f4357bbd91 [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.OutputStream ;
import java.util.ArrayList;
import java.util.Collection ;
import java.util.Iterator ;
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.thrift.TException ;
import org.apache.thrift.protocol.TProtocol ;
import org.apache.thrift.transport.TIOStreamTransport ;
/** Converted from Bindings to SPARQL result set encoded in Thrift */
public class Binding2Thrift implements AutoCloseable {
private final RDF_DataTuple row = new RDF_DataTuple() ;
private final Collection<Var> vars ;
private final OutputStream out ;
private final TProtocol protocol ;
private final boolean encodeValues ;
public Binding2Thrift(OutputStream out, Collection<Var> vars, boolean encodeValues) {
this.out = out ;
this.vars = vars ;
TIOStreamTransport transport = new TIOStreamTransport(out) ;
this.protocol = TRDF.protocol(transport) ;
this.encodeValues = encodeValues ;
varsRow() ;
}
private void varsRow() {
RDF_VarTuple vrow = new RDF_VarTuple(new ArrayList<>(vars.size())) ;
for ( Var v : vars ) {
RDF_VAR rv = new RDF_VAR() ;
rv.setName(v.getName()) ;
vrow.addToVars(rv) ;
}
try { vrow.write(protocol) ; }
catch (TException e) { TRDF.exception(e) ; }
}
public Binding2Thrift(TProtocol out, Collection<Var> vars, boolean encodeValues) {
this.vars = vars ;
this.out = null ;
this.protocol = out ;
this.encodeValues = encodeValues ;
varsRow() ;
}
public void output(Binding binding) {
Iterator<Var> vIter = (vars == null ? null : vars.iterator()) ;
if ( vIter == null )
vIter = binding.vars() ;
// ** Java8
// vIter.forEachRemaining(v -> {
// Node n = binding.get(v) ;
// RDF_Term rt = ( n == null ) ? TRDF.tUNDEF : ThriftConvert.convert(n) ;
// row.addToRow(rt) ;
// }) ;
while(vIter.hasNext()) {
Var v = vIter.next();
Node n = binding.get(v) ;
RDF_Term rt = ( n == null ) ? TRDF.tUNDEF : ThriftConvert.convert(n, encodeValues) ;
row.addToRow(rt) ;
}
try { row.write(protocol) ; }
catch (TException e) { TRDF.exception(e) ; }
row.clear() ;
}
@Override
public void close() {
TRDF.flush(protocol) ;
}
}