public static SqlOpQuery makeSelectOrTable(SqlOpQuery node) {
    String alias = aliasGenerator.next();

    SqlOpQuery result = new SqlOpQuery(node.getSchema(), node.getQueryString(), alias);

    return result;
  }
  /**
   * Builds up the one triple that states where the actual data for the target mapping comes from.
   * Such a source can be simply a database table or an SQL query.
   *
   * @param r2rml the target com.hp.hpl.jena.rdf.model.Model
   * @param relation the data source (table name or SQL query)
   * @return the whole Statement stating where the data comes from, e.g. '[] rr:tableName "EMP"'
   */
  private Statement buildLogicalTableTriple(Model r2rml, SqlOpBase relation) {
    // subject (a blank node [])
    Resource logicalTableSubject = ResourceFactory.createResource();
    // predicate (rr:tableName or rr:sqlQuery)
    Property logicalTablePredicate;
    // object (a Literal like "SELECT DEPTNO FROM DEPT WHERE DEPTNO > 23" or
    // simply a table name like "DEPTNO"
    Literal logicalTableObject;

    // it's a table
    if (relation instanceof SqlOpTable) {
      SqlOpTable tbl = (SqlOpTable) relation;
      logicalTablePredicate = ResourceFactory.createProperty(rrNamespace, "tableName");
      logicalTableObject = ResourceFactory.createPlainLiteral(tbl.getTableName());

      // it's a query
    } else if (relation instanceof SqlOpQuery) {
      SqlOpQuery query = (SqlOpQuery) relation;
      logicalTablePredicate = ResourceFactory.createProperty(rrNamespace, "sqlQuery");
      logicalTableObject = ResourceFactory.createPlainLiteral(query.getQueryString());

      // it's not possible
    } else {
      // should never be called since a relation can either be a table
      // or a query
      logicalTablePredicate = ResourceFactory.createProperty("");
      logicalTableObject = ResourceFactory.createPlainLiteral("");
    }

    Statement logicalTblStatement =
        r2rml.createStatement(logicalTableSubject, logicalTablePredicate, logicalTableObject);

    return logicalTblStatement;
  }
  public static SqlOpSelectBlock makeSelect(SqlOpQuery node) {

    SqlOpQuery opQuery = makeSelectOrTable(node);

    SqlOpSelectBlock result = SqlOpSelectBlock.create(opQuery);

    for (String columnName : opQuery.getSchema().getColumnNames()) {
      result
          .getProjection()
          .put(columnName, new ExprVar(opQuery.getAliasName() + "." + columnName));
    }

    return result;
  }