26
26
import com .amazonaws .athena .connector .lambda .domain .TableName ;
27
27
import com .amazonaws .athena .connector .lambda .domain .spill .SpillLocation ;
28
28
import com .amazonaws .athena .connector .lambda .handlers .GlueMetadataHandler ;
29
+ import com .amazonaws .athena .connector .lambda .metadata .GetDataSourceCapabilitiesRequest ;
30
+ import com .amazonaws .athena .connector .lambda .metadata .GetDataSourceCapabilitiesResponse ;
29
31
import com .amazonaws .athena .connector .lambda .metadata .GetSplitsRequest ;
30
32
import com .amazonaws .athena .connector .lambda .metadata .GetSplitsResponse ;
31
33
import com .amazonaws .athena .connector .lambda .metadata .GetTableLayoutRequest ;
37
39
import com .amazonaws .athena .connector .lambda .metadata .ListTablesResponse ;
38
40
import com .amazonaws .athena .connector .lambda .metadata .MetadataRequest ;
39
41
import com .amazonaws .athena .connector .lambda .metadata .glue .GlueFieldLexer ;
42
+ import com .amazonaws .athena .connector .lambda .metadata .optimizations .OptimizationSubType ;
40
43
import com .amazonaws .athena .connector .lambda .security .EncryptionKeyFactory ;
44
+ import com .amazonaws .athena .connectors .docdb .qpt .DocDBQueryPassthrough ;
41
45
import com .amazonaws .services .athena .AmazonAthena ;
42
46
import com .amazonaws .services .glue .AWSGlue ;
43
47
import com .amazonaws .services .glue .model .Database ;
44
48
import com .amazonaws .services .glue .model .Table ;
45
49
import com .amazonaws .services .secretsmanager .AWSSecretsManager ;
46
50
import com .google .common .base .Strings ;
51
+ import com .google .common .collect .ImmutableMap ;
47
52
import com .mongodb .client .MongoClient ;
48
53
import com .mongodb .client .MongoCursor ;
49
54
import com .mongodb .client .MongoDatabase ;
@@ -98,6 +103,7 @@ public class DocDBMetadataHandler
98
103
99
104
private final AWSGlue glue ;
100
105
private final DocDBConnectionFactory connectionFactory ;
106
+ private final DocDBQueryPassthrough queryPassthrough = new DocDBQueryPassthrough ();
101
107
102
108
public DocDBMetadataHandler (java .util .Map <String , String > configOptions )
103
109
{
@@ -143,6 +149,15 @@ private String getConnStr(MetadataRequest request)
143
149
return conStr ;
144
150
}
145
151
152
+ @ Override
153
+ public GetDataSourceCapabilitiesResponse doGetDataSourceCapabilities (BlockAllocator allocator , GetDataSourceCapabilitiesRequest request )
154
+ {
155
+ ImmutableMap .Builder <String , List <OptimizationSubType >> capabilities = ImmutableMap .builder ();
156
+ queryPassthrough .addQueryPassthroughCapabilityIfEnabled (capabilities , configOptions );
157
+
158
+ return new GetDataSourceCapabilitiesResponse (request .getCatalogName (), capabilities .build ());
159
+ }
160
+
146
161
/**
147
162
* List databases in your DocumentDB instance treating each as a 'schema' (aka database)
148
163
*
@@ -241,7 +256,6 @@ public ListTablesResponse doListTables(BlockAllocator blockAllocator, ListTables
241
256
private Stream <String > doListTablesWithCommand (MongoClient client , ListTablesRequest request )
242
257
{
243
258
logger .debug ("doListTablesWithCommand Start" );
244
- List <String > tables = new ArrayList <>();
245
259
Document queryDocument = new Document ("listCollections" , 1 ).append ("nameOnly" , true ).append ("authorizedCollections" , true );
246
260
Document document = client .getDatabase (request .getSchemaName ()).runCommand (queryDocument );
247
261
@@ -262,8 +276,19 @@ public GetTableResponse doGetTable(BlockAllocator blockAllocator, GetTableReques
262
276
throws Exception
263
277
{
264
278
logger .info ("doGetTable: enter" , request .getTableName ());
265
- String schemaNameInput = request .getTableName ().getSchemaName ();
266
- String tableNameInput = request .getTableName ().getTableName ();
279
+ String schemaNameInput ;
280
+ String tableNameInput ;
281
+
282
+ if (request .isQueryPassthrough ()) {
283
+ queryPassthrough .verify (request .getQueryPassthroughArguments ());
284
+ schemaNameInput = request .getQueryPassthroughArguments ().get (DocDBQueryPassthrough .DATABASE );
285
+ tableNameInput = request .getQueryPassthroughArguments ().get (DocDBQueryPassthrough .COLLECTION );
286
+ }
287
+ else {
288
+ schemaNameInput = request .getTableName ().getSchemaName ();
289
+ tableNameInput = request .getTableName ().getTableName ();
290
+ }
291
+
267
292
TableName tableName = new TableName (schemaNameInput , tableNameInput );
268
293
Schema schema = null ;
269
294
try {
@@ -292,6 +317,12 @@ public GetTableResponse doGetTable(BlockAllocator blockAllocator, GetTableReques
292
317
return new GetTableResponse (request .getCatalogName (), tableName , schema );
293
318
}
294
319
320
+ @ Override
321
+ public GetTableResponse doGetQueryPassthroughSchema (BlockAllocator allocator , GetTableRequest request ) throws Exception
322
+ {
323
+ return doGetTable (allocator , request );
324
+ }
325
+
295
326
/**
296
327
* Our table doesn't support complex layouts or partitioning so we simply make this method a NoOp.
297
328
*
0 commit comments