content: // Copyright 2020 Andy Grove
  //
  // Licensed 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 io.andygrove.kquery.jdbc;
  
  import java.sql.Connection;
  import java.sql.ResultSet;
  import java.sql.SQLException;
  import java.sql.SQLFeatureNotSupportedException;
  import java.sql.SQLWarning;
  import java.util.concurrent.TimeUnit;
  
  import org.apache.arrow.flight.CallOption;
  import org.apache.arrow.flight.CallOptions;
  import org.apache.arrow.flight.FlightClient;
  import org.apache.arrow.flight.FlightStream;
  import org.apache.arrow.flight.Location;
  import org.apache.arrow.flight.Ticket;
  import org.apache.arrow.memory.RootAllocator;
  
  /**
   * Statement.
   */
  public class FlightStatement implements java.sql.Statement {
  
    protected final FlightConnection flightConnection;
  
    public FlightStatement(FlightConnection flightConnection) {
      this.flightConnection = flightConnection;
    }
  
    @Override
    public ResultSet executeQuery(String query) throws SQLException {
  
      FlightClient client = FlightClient.builder()
          .allocator(new RootAllocator(Long.MAX_VALUE))
          .location(Location.forGrpcInsecure(flightConnection.host, flightConnection.port))
          .build();
  
      CallOption callOptions = CallOptions.timeout(5, TimeUnit.SECONDS);
  
      Ticket ticket = new Ticket(query.getBytes());
  
      FlightStream stream = client.getStream(ticket, callOptions);
  
      return new FlightResultSet(stream);
    }
  
    @Override
    public int executeUpdate(String s) throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public void close() throws SQLException {
    }
  
    @Override
    public int getMaxFieldSize() throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public void setMaxFieldSize(int i) throws SQLException {
  
    }
  
    @Override
    public int getMaxRows() throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public void setMaxRows(int i) throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public void setEscapeProcessing(boolean b) throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public int getQueryTimeout() throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public void setQueryTimeout(int i) throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public void cancel() throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public SQLWarning getWarnings() throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public void clearWarnings() throws SQLException {
    }
  
    @Override
    public void setCursorName(String s) throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public boolean execute(String s) throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public ResultSet getResultSet() throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public int getUpdateCount() throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public boolean getMoreResults() throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public int getFetchDirection() throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public void setFetchDirection(int i) throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public int getFetchSize() throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public void setFetchSize(int i) throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public int getResultSetConcurrency() throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public int getResultSetType() throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public void addBatch(String s) throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public void clearBatch() throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public int[] executeBatch() throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public Connection getConnection() throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public boolean getMoreResults(int i) throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public ResultSet getGeneratedKeys() throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public int executeUpdate(String s, int i) throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public int executeUpdate(String s, int[] ints) throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public int executeUpdate(String s, String[] strings) throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public boolean execute(String s, int i) throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public boolean execute(String s, int[] ints) throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public boolean execute(String s, String[] strings) throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public int getResultSetHoldability() throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public boolean isClosed() throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public boolean isPoolable() throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public void setPoolable(boolean b) throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public void closeOnCompletion() throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public boolean isCloseOnCompletion() throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public <T> T unwrap(Class<T> aClass) throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  
    @Override
    public boolean isWrapperFor(Class<?> aClass) throws SQLException {
      throw new SQLFeatureNotSupportedException();
    }
  }
  