/*******************************************************************************
* Copyright 2012-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use
* this file except in compliance with the License. A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file.
* This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
* *****************************************************************************
*
* AWS Tools for Windows (TM) PowerShell (TM)
*
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Management.Automation;
using System.Text;
using Amazon.PowerShell.Common;
using Amazon.Runtime;
using Amazon.Glue;
using Amazon.Glue.Model;
namespace Amazon.PowerShell.Cmdlets.GLUE
{
///
/// Retrieves information about the partitions in a table.
This cmdlet automatically pages all available results to the pipeline - parameters related to iteration are only needed if you want to manually control the paginated output. To disable autopagination, use -NoAutoIteration.
///
[Cmdlet("Get", "GLUEPartitionList")]
[OutputType("Amazon.Glue.Model.Partition")]
[AWSCmdlet("Calls the AWS Glue GetPartitions API operation.", Operation = new[] {"GetPartitions"}, SelectReturnType = typeof(Amazon.Glue.Model.GetPartitionsResponse))]
[AWSCmdletOutput("Amazon.Glue.Model.Partition or Amazon.Glue.Model.GetPartitionsResponse",
"This cmdlet returns a collection of Amazon.Glue.Model.Partition objects.",
"The service call response (type Amazon.Glue.Model.GetPartitionsResponse) can also be referenced from properties attached to the cmdlet entry in the $AWSHistory stack."
)]
public partial class GetGLUEPartitionListCmdlet : AmazonGlueClientCmdlet, IExecutor
{
#region Parameter CatalogId
///
///
/// The ID of the Data Catalog where the partitions in question reside. If none is provided,
/// the Amazon Web Services account ID is used by default.
///
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public System.String CatalogId { get; set; }
#endregion
#region Parameter DatabaseName
///
///
/// The name of the catalog database where the partitions reside.
///
///
#if !MODULAR
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
#else
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true, Mandatory = true)]
[System.Management.Automation.AllowEmptyString]
[System.Management.Automation.AllowNull]
#endif
[Amazon.PowerShell.Common.AWSRequiredParameter]
public System.String DatabaseName { get; set; }
#endregion
#region Parameter ExcludeColumnSchema
///
///
/// When true, specifies not returning the partition column schema. Useful when you are
/// interested only in other partition attributes such as partition values or location.
/// This approach avoids the problem of a large response by not returning duplicate data.
///
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public System.Boolean? ExcludeColumnSchema { get; set; }
#endregion
#region Parameter Expression
///
///
/// An expression that filters the partitions to be returned.The expression uses SQL syntax similar to the SQL WHERE
filter clause.
/// The SQL statement parser JSQLParser
/// parses the expression. Operators: The following are the operators that you can use in the Expression
/// API call:- =
- Checks whether the values of the two operands are equal; if yes, then the condition
/// becomes true.Example: Assume 'variable a' holds 10 and 'variable b' holds 20. (a = b) is not true.
- < >
- Checks whether the values of two operands are equal; if the values are not equal,
/// then the condition becomes true.Example: (a < > b) is true.
- >
- Checks whether the value of the left operand is greater than the value of the right
/// operand; if yes, then the condition becomes true.Example: (a > b) is not true.
- <
- Checks whether the value of the left operand is less than the value of the right operand;
/// if yes, then the condition becomes true.Example: (a < b) is true.
- >=
- Checks whether the value of the left operand is greater than or equal to the value
/// of the right operand; if yes, then the condition becomes true.Example: (a >= b) is not true.
- <=
- Checks whether the value of the left operand is less than or equal to the value of
/// the right operand; if yes, then the condition becomes true.Example: (a <= b) is true.
- AND, OR, IN, BETWEEN, LIKE, NOT, IS NULL
- Logical operators.
Supported Partition Key Types: The following are the supported partition keys.string
date
timestamp
int
bigint
long
tinyint
smallint
decimal
If an type is encountered that is not valid, an exception is thrown. The following list shows the valid operators on each type. When you define a crawler,
/// the partitionKey
type is created as a STRING
, to be compatible
/// with the catalog partitions. Sample API Call:
///
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public System.String Expression { get; set; }
#endregion
#region Parameter QueryAsOfTime
///
///
/// The time as of when to read the partition contents. If not set, the most recent transaction
/// commit time will be used. Cannot be specified along with TransactionId
.
///
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public System.DateTime? QueryAsOfTime { get; set; }
#endregion
#region Parameter Segment
///
///
/// The segment of the table's partitions to scan in this request.
///
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public Amazon.Glue.Model.Segment Segment { get; set; }
#endregion
#region Parameter TableName
///
///
/// The name of the partitions' table.
///
///
#if !MODULAR
[System.Management.Automation.Parameter(Position = 0, ValueFromPipelineByPropertyName = true, ValueFromPipeline = true)]
#else
[System.Management.Automation.Parameter(Position = 0, ValueFromPipelineByPropertyName = true, ValueFromPipeline = true, Mandatory = true)]
[System.Management.Automation.AllowEmptyString]
[System.Management.Automation.AllowNull]
#endif
[Amazon.PowerShell.Common.AWSRequiredParameter]
public System.String TableName { get; set; }
#endregion
#region Parameter TransactionId
///
///
/// The transaction ID at which to read the partition contents.
///
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public System.String TransactionId { get; set; }
#endregion
#region Parameter MaxResult
///
///
/// The maximum number of partitions to return in a single response.
///
///
///
Note: In AWSPowerShell and AWSPowerShell.NetCore this parameter is used to limit the total number of items returned by the cmdlet.
///
In AWS.Tools this parameter is simply passed to the service to specify how many items should be returned by each service call.
///
Pipe the output of this cmdlet into Select-Object -First to terminate retrieving data pages early and control the number of items returned.
///
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
[Alias("MaxItems","MaxResults")]
public int? MaxResult { get; set; }
#endregion
#region Parameter NextToken
///
///
/// A continuation token, if this is not the first call to retrieve these partitions.
///
///
///
Note: This parameter is only used if you are manually controlling output pagination of the service API call.
///
In order to manually control output pagination, use '-NextToken $null' for the first call and '-NextToken $AWSHistory.LastServiceResponse.NextToken' for subsequent calls.
///
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public System.String NextToken { get; set; }
#endregion
#region Parameter Select
///
/// Use the -Select parameter to control the cmdlet output. The default value is 'Partitions'.
/// Specifying -Select '*' will result in the cmdlet returning the whole service response (Amazon.Glue.Model.GetPartitionsResponse).
/// Specifying the name of a property of type Amazon.Glue.Model.GetPartitionsResponse will result in that property being returned.
/// Specifying -Select '^ParameterName' will result in the cmdlet returning the selected cmdlet parameter value.
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public string Select { get; set; } = "Partitions";
#endregion
#region Parameter PassThru
///
/// Changes the cmdlet behavior to return the value passed to the TableName parameter.
/// The -PassThru parameter is deprecated, use -Select '^TableName' instead. This parameter will be removed in a future version.
///
[System.Obsolete("The -PassThru parameter is deprecated, use -Select '^TableName' instead. This parameter will be removed in a future version.")]
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public SwitchParameter PassThru { get; set; }
#endregion
#region Parameter NoAutoIteration
///
/// By default the cmdlet will auto-iterate and retrieve all results to the pipeline by performing multiple
/// service calls. If set, the cmdlet will retrieve only the next 'page' of results using the value of NextToken
/// as the start point.
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public SwitchParameter NoAutoIteration { get; set; }
#endregion
protected override void ProcessRecord()
{
this._AWSSignerType = "v4";
base.ProcessRecord();
var context = new CmdletContext();
// allow for manipulation of parameters prior to loading into context
PreExecutionContextLoad(context);
#pragma warning disable CS0618, CS0612 //A class member was marked with the Obsolete attribute
if (ParameterWasBound(nameof(this.Select)))
{
context.Select = CreateSelectDelegate(Select) ??
throw new System.ArgumentException("Invalid value for -Select parameter.", nameof(this.Select));
if (this.PassThru.IsPresent)
{
throw new System.ArgumentException("-PassThru cannot be used when -Select is specified.", nameof(this.Select));
}
}
else if (this.PassThru.IsPresent)
{
context.Select = (response, cmdlet) => this.TableName;
}
#pragma warning restore CS0618, CS0612 //A class member was marked with the Obsolete attribute
context.CatalogId = this.CatalogId;
context.DatabaseName = this.DatabaseName;
#if MODULAR
if (this.DatabaseName == null && ParameterWasBound(nameof(this.DatabaseName)))
{
WriteWarning("You are passing $null as a value for parameter DatabaseName which is marked as required. In case you believe this parameter was incorrectly marked as required, report this by opening an issue at https://github.com/aws/aws-tools-for-powershell/issues.");
}
#endif
context.ExcludeColumnSchema = this.ExcludeColumnSchema;
context.Expression = this.Expression;
context.MaxResult = this.MaxResult;
#if !MODULAR
if (ParameterWasBound(nameof(this.MaxResult)) && this.MaxResult.HasValue)
{
WriteWarning("AWSPowerShell and AWSPowerShell.NetCore use the MaxResult parameter to limit the total number of items returned by the cmdlet." +
" This behavior is obsolete and will be removed in a future version of these modules. Pipe the output of this cmdlet into Select-Object -First to terminate" +
" retrieving data pages early and control the number of items returned. AWS.Tools already implements the new behavior of simply passing MaxResult" +
" to the service to specify how many items should be returned by each service call.");
}
#endif
context.NextToken = this.NextToken;
context.QueryAsOfTime = this.QueryAsOfTime;
context.Segment = this.Segment;
context.TableName = this.TableName;
#if MODULAR
if (this.TableName == null && ParameterWasBound(nameof(this.TableName)))
{
WriteWarning("You are passing $null as a value for parameter TableName which is marked as required. In case you believe this parameter was incorrectly marked as required, report this by opening an issue at https://github.com/aws/aws-tools-for-powershell/issues.");
}
#endif
context.TransactionId = this.TransactionId;
// allow further manipulation of loaded context prior to processing
PostExecutionContextLoad(context);
var output = Execute(context) as CmdletOutput;
ProcessOutput(output);
}
#region IExecutor Members
#if MODULAR
public object Execute(ExecutorContext context)
{
var cmdletContext = context as CmdletContext;
#pragma warning disable CS0618, CS0612 //A class member was marked with the Obsolete attribute
var useParameterSelect = this.Select.StartsWith("^") || this.PassThru.IsPresent;
#pragma warning restore CS0618, CS0612 //A class member was marked with the Obsolete attribute
// create request and set iteration invariants
var request = new Amazon.Glue.Model.GetPartitionsRequest();
if (cmdletContext.CatalogId != null)
{
request.CatalogId = cmdletContext.CatalogId;
}
if (cmdletContext.DatabaseName != null)
{
request.DatabaseName = cmdletContext.DatabaseName;
}
if (cmdletContext.ExcludeColumnSchema != null)
{
request.ExcludeColumnSchema = cmdletContext.ExcludeColumnSchema.Value;
}
if (cmdletContext.Expression != null)
{
request.Expression = cmdletContext.Expression;
}
if (cmdletContext.MaxResult != null)
{
request.MaxResults = AutoIterationHelpers.ConvertEmitLimitToServiceTypeInt32(cmdletContext.MaxResult.Value);
}
if (cmdletContext.QueryAsOfTime != null)
{
request.QueryAsOfTime = cmdletContext.QueryAsOfTime.Value;
}
if (cmdletContext.Segment != null)
{
request.Segment = cmdletContext.Segment;
}
if (cmdletContext.TableName != null)
{
request.TableName = cmdletContext.TableName;
}
if (cmdletContext.TransactionId != null)
{
request.TransactionId = cmdletContext.TransactionId;
}
// Initialize loop variant and commence piping
var _nextToken = cmdletContext.NextToken;
var _userControllingPaging = this.NoAutoIteration.IsPresent || ParameterWasBound(nameof(this.NextToken));
var client = Client ?? CreateClient(_CurrentCredentials, _RegionEndpoint);
do
{
request.NextToken = _nextToken;
CmdletOutput output;
try
{
var response = CallAWSServiceOperation(client, request);
object pipelineOutput = null;
if (!useParameterSelect)
{
pipelineOutput = cmdletContext.Select(response, this);
}
output = new CmdletOutput
{
PipelineOutput = pipelineOutput,
ServiceResponse = response
};
_nextToken = response.NextToken;
}
catch (Exception e)
{
output = new CmdletOutput { ErrorResponse = e };
}
ProcessOutput(output);
} while (!_userControllingPaging && AutoIterationHelpers.HasValue(_nextToken));
if (useParameterSelect)
{
WriteObject(cmdletContext.Select(null, this));
}
return null;
}
#else
public object Execute(ExecutorContext context)
{
var cmdletContext = context as CmdletContext;
var useParameterSelect = this.Select.StartsWith("^") || this.PassThru.IsPresent;
// create request and set iteration invariants
var request = new Amazon.Glue.Model.GetPartitionsRequest();
if (cmdletContext.CatalogId != null)
{
request.CatalogId = cmdletContext.CatalogId;
}
if (cmdletContext.DatabaseName != null)
{
request.DatabaseName = cmdletContext.DatabaseName;
}
if (cmdletContext.ExcludeColumnSchema != null)
{
request.ExcludeColumnSchema = cmdletContext.ExcludeColumnSchema.Value;
}
if (cmdletContext.Expression != null)
{
request.Expression = cmdletContext.Expression;
}
if (cmdletContext.QueryAsOfTime != null)
{
request.QueryAsOfTime = cmdletContext.QueryAsOfTime.Value;
}
if (cmdletContext.Segment != null)
{
request.Segment = cmdletContext.Segment;
}
if (cmdletContext.TableName != null)
{
request.TableName = cmdletContext.TableName;
}
if (cmdletContext.TransactionId != null)
{
request.TransactionId = cmdletContext.TransactionId;
}
// Initialize loop variants and commence piping
System.String _nextToken = null;
int? _emitLimit = null;
int _retrievedSoFar = 0;
if (AutoIterationHelpers.HasValue(cmdletContext.NextToken))
{
_nextToken = cmdletContext.NextToken;
}
if (cmdletContext.MaxResult.HasValue)
{
// The service has a maximum page size of 1000. If the user has
// asked for more items than page max, and there is no page size
// configured, we rely on the service ignoring the set maximum
// and giving us 1000 items back. If a page size is set, that will
// be used to configure the pagination.
// We'll make further calls to satisfy the user's request.
_emitLimit = cmdletContext.MaxResult;
}
var _userControllingPaging = this.NoAutoIteration.IsPresent || ParameterWasBound(nameof(this.NextToken));
var client = Client ?? CreateClient(_CurrentCredentials, _RegionEndpoint);
do
{
request.NextToken = _nextToken;
if (_emitLimit.HasValue)
{
int correctPageSize = Math.Min(1000, _emitLimit.Value);
request.MaxResults = AutoIterationHelpers.ConvertEmitLimitToInt32(correctPageSize);
}
CmdletOutput output;
try
{
var response = CallAWSServiceOperation(client, request);
object pipelineOutput = null;
if (!useParameterSelect)
{
pipelineOutput = cmdletContext.Select(response, this);
}
output = new CmdletOutput
{
PipelineOutput = pipelineOutput,
ServiceResponse = response
};
int _receivedThisCall = response.Partitions.Count;
_nextToken = response.NextToken;
_retrievedSoFar += _receivedThisCall;
if (_emitLimit.HasValue)
{
_emitLimit -= _receivedThisCall;
}
}
catch (Exception e)
{
if (_retrievedSoFar == 0 || !_emitLimit.HasValue)
{
output = new CmdletOutput { ErrorResponse = e };
}
else
{
break;
}
}
ProcessOutput(output);
} while (!_userControllingPaging && AutoIterationHelpers.HasValue(_nextToken) && (!_emitLimit.HasValue || _emitLimit.Value >= 1));
if (useParameterSelect)
{
WriteObject(cmdletContext.Select(null, this));
}
return null;
}
#endif
public ExecutorContext CreateContext()
{
return new CmdletContext();
}
#endregion
#region AWS Service Operation Call
private Amazon.Glue.Model.GetPartitionsResponse CallAWSServiceOperation(IAmazonGlue client, Amazon.Glue.Model.GetPartitionsRequest request)
{
Utils.Common.WriteVerboseEndpointMessage(this, client.Config, "AWS Glue", "GetPartitions");
try
{
#if DESKTOP
return client.GetPartitions(request);
#elif CORECLR
return client.GetPartitionsAsync(request).GetAwaiter().GetResult();
#else
#error "Unknown build edition"
#endif
}
catch (AmazonServiceException exc)
{
var webException = exc.InnerException as System.Net.WebException;
if (webException != null)
{
throw new Exception(Utils.Common.FormatNameResolutionFailureMessage(client.Config, webException.Message), webException);
}
throw;
}
}
#endregion
internal partial class CmdletContext : ExecutorContext
{
public System.String CatalogId { get; set; }
public System.String DatabaseName { get; set; }
public System.Boolean? ExcludeColumnSchema { get; set; }
public System.String Expression { get; set; }
public int? MaxResult { get; set; }
public System.String NextToken { get; set; }
public System.DateTime? QueryAsOfTime { get; set; }
public Amazon.Glue.Model.Segment Segment { get; set; }
public System.String TableName { get; set; }
public System.String TransactionId { get; set; }
public System.Func Select { get; set; } =
(response, cmdlet) => response.Partitions;
}
}
}