Athena
MicroStack emulates Amazon Athena's query management plane. Queries complete synchronously and immediately with status SUCCEEDED. Simple SELECT projections return parsed column names and values in the result set. Work groups, named queries, data catalogs, and prepared statements are fully managed in memory.
Supported Operations
Query Execution: StartQueryExecution, GetQueryExecution, GetQueryResults, StopQueryExecution, ListQueryExecutions, BatchGetQueryExecution
Work Groups: CreateWorkGroup, GetWorkGroup, ListWorkGroups, UpdateWorkGroup, DeleteWorkGroup
Named Queries: CreateNamedQuery, GetNamedQuery, ListNamedQueries, DeleteNamedQuery, BatchGetNamedQuery
Data Catalogs: CreateDataCatalog, GetDataCatalog, ListDataCatalogs, UpdateDataCatalog, DeleteDataCatalog
Prepared Statements: CreatePreparedStatement, GetPreparedStatement, ListPreparedStatements, DeletePreparedStatement
Table Metadata (stubs): GetTableMetadata, ListTableMetadata, GetDatabase, ListDatabases
Tags: TagResource, UntagResource, ListTagsForResource
Usage
using Amazon.Athena;
using Amazon.Athena.Model;
using Amazon.Runtime;
var config = new AmazonAthenaConfig
{
ServiceURL = "http://localhost:4566",
};
using var client = new AmazonAthenaClient(
new BasicAWSCredentials("test", "test"), config);
// Execute a query
var resp = await client.StartQueryExecutionAsync(new StartQueryExecutionRequest
{
QueryString = "SELECT 42 AS answer, 'hello' AS greeting",
QueryExecutionContext = new QueryExecutionContext { Database = "default" },
ResultConfiguration = new ResultConfiguration
{
OutputLocation = "s3://my-athena-results/",
},
});
var queryId = resp.QueryExecutionId;
// Check status (completes synchronously — always SUCCEEDED)
var status = await client.GetQueryExecutionAsync(new GetQueryExecutionRequest
{
QueryExecutionId = queryId,
});
Console.WriteLine($"State: {status.QueryExecution.Status.State}");
// => SUCCEEDED
// Fetch results
var results = await client.GetQueryResultsAsync(new GetQueryResultsRequest
{
QueryExecutionId = queryId,
});
// Row 0 = column headers, Row 1+ = data rows
foreach (var row in results.ResultSet.Rows)
{
Console.WriteLine(string.Join(", ", row.Data.Select(d => d.VarCharValue)));
}
// => answer, greeting
// => 42, helloWork Groups
// Create a work group with a result configuration
await client.CreateWorkGroupAsync(new CreateWorkGroupRequest
{
Name = "analytics",
Description = "Analytics team queries",
Configuration = new WorkGroupConfiguration
{
ResultConfiguration = new ResultConfiguration
{
OutputLocation = "s3://my-athena-results/analytics/",
},
},
});
// Run a query scoped to the work group
var q = await client.StartQueryExecutionAsync(new StartQueryExecutionRequest
{
QueryString = "SELECT * FROM events LIMIT 100",
WorkGroup = "analytics",
QueryExecutionContext = new QueryExecutionContext { Database = "my_db" },
});
// List all query executions in the work group
var executions = await client.ListQueryExecutionsAsync(new ListQueryExecutionsRequest
{
WorkGroup = "analytics",
});
Console.WriteLine($"Executions: {executions.QueryExecutionIds.Count}");Named Queries and Prepared Statements
// Save a named query for reuse
var nq = await client.CreateNamedQueryAsync(new CreateNamedQueryRequest
{
Name = "top-events",
Database = "my_db",
WorkGroup = "primary",
QueryString = "SELECT event_type, COUNT(*) AS cnt FROM events GROUP BY event_type ORDER BY cnt DESC LIMIT 10",
Description = "Top event types",
});
Console.WriteLine($"Named query ID: {nq.NamedQueryId}");
// Create a prepared statement (parameterized query)
await client.CreatePreparedStatementAsync(new CreatePreparedStatementRequest
{
StatementName = "get_by_id",
WorkGroup = "primary",
QueryStatement = "SELECT * FROM events WHERE id = ?",
});
MicroStack