All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.tigergraph.jdbc.restpp.RestppStatement Maven / Gradle / Ivy

package com.tigergraph.jdbc.restpp;

import com.tigergraph.jdbc.common.Statement;
import com.tigergraph.jdbc.restpp.driver.QueryParser;
import com.tigergraph.jdbc.restpp.driver.QueryType;
import com.tigergraph.jdbc.restpp.driver.RestppResponse;
import com.tigergraph.jdbc.log.TGLoggerFactory;

import org.json.JSONObject;
import org.slf4j.Logger;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class RestppStatement extends Statement {

  private static final Logger logger = TGLoggerFactory.getLogger(RestppStatement.class);

  private Integer timeout = 0;
  private Integer atomic = 0;
  private List edge_list;
  private List vertex_list;
  private QueryParser parser;
  private QueryType query_type;

  public RestppStatement(RestppConnection restppConnection, Integer timeout, Integer atomic) {
    super(restppConnection);
    this.timeout = timeout;
    this.atomic = atomic;
    edge_list = new ArrayList();
    vertex_list = new ArrayList();
  }

  @Override
  public ResultSet executeQuery(String query) throws SQLException {
    this.execute(query);
    return currentResultSet;
  }

  @Override
  public boolean execute(String query) throws SQLException {
    // execute the query
    this.parser =
        new QueryParser(
            (RestppConnection) getConnection(), query, null, this.timeout, this.atomic, true);
    this.query_type = parser.getQueryType();

    String json = "";
    if (!this.parser.getEdgeJson().equals("")) {
      StringBuilder sb = new StringBuilder();
      sb.append("{\"edges\": {");
      sb.append(this.parser.getEdgeJson());
      sb.append("}}");
      json = sb.toString();
    } else if (!this.parser.getVertexJson().equals("")) {
      StringBuilder sb = new StringBuilder();
      sb.append("{\"vertices\": {");
      sb.append(this.parser.getVertexJson());
      sb.append("}}");
      json = sb.toString();
    }

    RestppResponse response = ((RestppConnection) getConnection()).executeQuery(parser, json);

    if (response.hasError()) {
      logger.error(response.getErrMsg());
      throw new SQLException(response.getErrMsg());
    }

    // Parse response data
    boolean hasResultSets = response.hasResultSets();

    // If source vertex id is not null, Spark is trying to retrieve edge.
    boolean isGettingEdge = ((RestppConnection) getConnection()).getSource() != null;
    this.currentResultSet =
        hasResultSets
            ? new RestppResultSet(
                this, response.getResults(), parser.getFieldList(), this.query_type, isGettingEdge)
            : null;

    return hasResultSets;
  }

  @Override
  public void addBatch(String sql) throws SQLException {
    this.parser =
        new QueryParser(
            (RestppConnection) getConnection(), sql, null, this.timeout, this.atomic, false);
    String vertex_json = parser.getVertexJson();
    String edge_json = parser.getEdgeJson();
    if (vertex_json != "") {
      vertex_list.add(vertex_json);
    }
    if (edge_json != "") {
      edge_list.add(edge_json);
    }
  }

  @Override
  public void clearBatch() throws SQLException {
    edge_list.clear();
    vertex_list.clear();
  }

  @Override
  public int[] executeBatch() throws SQLException {
    logger.info("Batch Query: {}.", this.parser.getQueryType());
    int[] count = new int[2];
    if (this.edge_list.size() == 0 && this.vertex_list.size() == 0) {
      return count;
    }

    StringBuilder sb = new StringBuilder();
    sb.append("{");
    if (this.vertex_list.size() > 0) {
      sb.append("\"vertices\": {");
      sb.append(this.vertex_list.get(0));
      for (int i = 1; i < this.vertex_list.size(); ++i) {
        sb.append(",");
        sb.append(this.vertex_list.get(i));
      }
      sb.append("}");
    }
    if (this.edge_list.size() > 0) {
      if (this.vertex_list.size() > 0) {
        sb.append(",");
      }
      sb.append("\"edges\": {");
      sb.append(this.edge_list.get(0));
      for (int i = 1; i < this.edge_list.size(); ++i) {
        sb.append(",");
        sb.append(this.edge_list.get(i));
      }
      sb.append("}");
    }
    sb.append("}");
    String payload = sb.toString();
    RestppResponse response =
        ((RestppConnection) getConnection()).executeQuery(this.parser, payload);

    if (response.hasError()) {
      logger.error(response.getErrMsg());
      throw new SQLException(response.getErrMsg());
    }

    List results = response.getResults();
    if (results.size() > 0) {
      logger.debug("Result: {}", results.get(0));
      count[0] = results.get(0).getInt("accepted_vertices");
      count[1] = results.get(0).getInt("accepted_edges");
    }
    logger.info("Accepted vertices: {}, accepted edges: {}", count[0], count[1]);

    return count;
  }

  @Override
  public int executeUpdate(String query) throws SQLException {
    logger.debug("executeUpdate: {}", query);
    return 0;
  }

  /** Methods not implemented yet. */
  @Override
  public int getResultSetConcurrency() throws SQLException {
    throw new UnsupportedOperationException("Not implemented yet.");
  }

  @Override
  public int getResultSetType() throws SQLException {
    throw new UnsupportedOperationException("Not implemented yet.");
  }

  @Override
  public int getResultSetHoldability() throws SQLException {
    throw new UnsupportedOperationException("Not implemented yet.");
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy