[ 
https://issues.apache.org/jira/browse/CAMEL-14992?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17116011#comment-17116011
 ] 

Jon Chase commented on CAMEL-14992:
-----------------------------------

I've changed the URI to accept the operation as a parameter instead of part of 
the path. 

 

I've also added a few additional endpoints: getQueryExecution, getQueryResults, 
listQueryExecutions, startQueryExecution,

I can add support for more, but those are the interesting ones to me. :)  I 
will likely round out the query-centric endpoints (e.g. StopQueryExecution, 
etc.).  If there are specific requests for other endpoints, I'll happily add 
them now, but otherwise I'm not planning on writing support for e.g 
"UntagResource", "UpdateWorkGroup", etc (I don't use these myself).  Either 
way, it'd be easy to add support for those when desired.

 

I've tried to make `getQueryResults` similar to the JDBC component in that it 
supports different return types:  
`outputType=[StreamList,SelectList,S3Pointer]`:
{code:java}
/**
 * Represents various ways to return query results from Athena.  For example, 
choose between a streaming iterator
 * that will yield all results, a static list of rows, or a pointer to the 
results in S3.
 */
public enum Athena2OutputType {
  /**
   * When using an endpoint that returns rows directly back to the caller, such 
as {@code getQueryResults}, use
   * AWS 2 Athena {@link GetQueryResultsIterable} to return a streaming list of 
results.  Returning a streaming
   * result means that no API requests happen until the streaming result is 
accessed.
   *
   * <p>This is the type to use if you need to process large result sets in 
memory (as opposed to, e.g. an EMR job),
   * as the iterator returned using this method will stream results from AWS a 
page at a time, thus limiting the amount
   * of memory consumed at any one point.
   */
  StreamList,

  /**
   * Return a static list of rows.  The amount of rows returned is limited to 
the max response size of Athena's
   * {@code GetQueryResults} (currently 1,000).
   *
   * @see <a 
href="https://docs.aws.amazon.com/athena/latest/APIReference/API_GetQueryResults.html";>GetQueryResults</a>
   */
  SelectList,

  /**
   * Return the path to the results in S3.  This may be preferred if you want 
to pass the pointer to the results to
   * another process for handling.
   */
  S3Pointer
}
 {code}
 

I've got some clean up to do, after which I'll put up a PR.  I expect it to 
take this week to find the time for the clean up.  

 

Here's what the routes from the integration test look like now:
{code:java}
  @Override
  protected RouteBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {
      @Override
      public void configure() throws Exception {
//                String s = "&accessKey=xxx&secretKey=yyy&region=eu-west-1";
        String s = "amazonAthenaClient=#athenaClient";

        from("direct:athenaExecuteQueryTest")
            .setBody(constant(
                "SELECT * FROM ("
                    + "    VALUES"
                    + "        (1, 'a'),"
                    + "        (2, 'b')"
                    + ") AS t (id, name)"))
            .to("aws2-athena://label?operation=executeQuery&outputLocation=" + 
s3Bucket + "&" + s);

        from("direct:athenaExecuteQueryHandlesPermFailTest")
            .setBody(constant(
                "SELECT INVALID SQL"))
            .to("aws2-athena://label?operation=executeQuery&outputLocation=" + 
s3Bucket + "&" + s);

        from("direct:athenaGetQueryExecutionTest")
            .setBody(constant("SELECT 'foo'"))
            
.to("aws2-athena://label?operation=startQueryExecution&outputLocation=" + 
s3Bucket + "&" + s)
            .to("aws2-athena://label?operation=getQueryExecution&" + s);

        from("direct:athenaGetQueryResultsAsStreamListTest")
            .setBody(constant(
                "SELECT * FROM ("
                    + "    VALUES"
                    + "        (1, 'a'),"
                    + "        (2, 'b')"
                    + ") AS t (id, name)"))
            
.to("aws2-athena://label?operation=startQueryExecution&outputLocation=" + 
s3Bucket + "&" + s)
            
.to("aws2-athena://label?operation=getQueryResults&outputType=StreamList&" + s);

        from("direct:athenaGetQueryResultsAsStaticListTest")
            .setBody(constant(
                "SELECT * FROM ("
                    + "    VALUES"
                    + "        (1, 'a'),"
                    + "        (2, 'b')"
                    + ") AS t (id, name)"))
            
.to("aws2-athena://label?operation=startQueryExecution&outputLocation=" + 
s3Bucket + "&" + s)
            
.to("aws2-athena://label?operation=getQueryResults&outputType=SelectList&" + s);

        from("direct:athenaGetQueryResultsAsS3PointerTest")
            .setBody(constant("SELECT 1 as foo"))
            
.to("aws2-athena://label?operation=startQueryExecution&outputLocation=" + 
s3Bucket + "&" + s)
            
.to("aws2-athena://label?operation=getQueryResults&outputType=S3Pointer&" + s);

        from("direct:athenaListQueryExecutionsTest")
            .setBody(constant("SELECT 1 AS foo"))
            
.to("aws2-athena://label?operation=startQueryExecution&outputLocation=" + 
s3Bucket + "&" + s)
            .log("ensured there will be a query execution to return from the 
following listQueryExecutions call")
            .to("aws2-athena://label?operation=listQueryExecutions&" + s);

        from("direct:athenaStartQueryExecutionTest")
            .setBody(constant("SELECT 1 AS foo"))
            
.to("aws2-athena://label?operation=startQueryExecution&outputLocation=" + 
s3Bucket + "&" + s);

        from("direct:athenaStartQueryExecutionAndGetQueryExecutionUsingHeaders")
            .setBody(constant("SELECT 1"))
            
.to("aws2-athena://label?operation=startQueryExecution&outputLocation=" + 
s3Bucket + "&" + s)
            .to("aws2-athena://label?operation=getQueryExecution&" + s);
      }
    };
  }
 {code}
 

> Create a Camel AWS2 Athena component
> ------------------------------------
>
>                 Key: CAMEL-14992
>                 URL: https://issues.apache.org/jira/browse/CAMEL-14992
>             Project: Camel
>          Issue Type: New Feature
>          Components: camel-aws2
>            Reporter: Andrea Cosentino
>            Assignee: Andrea Cosentino
>            Priority: Major
>             Fix For: 3.x
>
>




--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to