# -------------------------------------------------------------------
# This file was auto-generated. Do not edit directly.
# Generated by: StageGeneratorV2
# -------------------------------------------------------------------

from typing import TYPE_CHECKING, Union, Literal, overload
import ibm_watsonx_data_integration.services.datastage.models.stages as stage
from ibm_watsonx_data_integration.services.datastage.models.flow.dag import DAG
from ibm_watsonx_data_integration.services.datastage.models.flow.string_to_stage import string_to_stage_class
from ibm_watsonx_data_integration.services.datastage.models.stage_type_str import StageTypeStr
from typing import Literal, overload



class FlowComposer:
    def __init__(self, dag: "DAG"):
        self._dag = dag


    @overload
    def add_stage(self, type: Literal["Address Verification"], label: str = None) -> stage.AddressVerificationStage: ...

    @overload
    def add_stage(self, type: Literal["Aggregator"], label: str = None) -> stage.AggregatorStage: ...

    @overload
    def add_stage(self, type: Literal["Amazon RDS for MySQL"], label: str = None) -> stage.AmazonRDSForMysqlStage: ...

    @overload
    def add_stage(self, type: Literal["Amazon RDS for Oracle"], label: str = None) -> stage.AmazonRDSForOracleStage: ...

    @overload
    def add_stage(self, type: Literal["Amazon RDS for PostgreSQL"], label: str = None) -> stage.AmazonRDSForPostgresqlStage: ...

    @overload
    def add_stage(self, type: Literal["Amazon Redshift"], label: str = None) -> stage.AmazonRedshiftStage: ...

    @overload
    def add_stage(self, type: Literal["Amazon S3"], label: str = None) -> stage.AmazonS3Stage: ...

    @overload
    def add_stage(self, type: Literal["Apache Cassandra"], label: str = None) -> stage.ApacheCassandraStage: ...

    @overload
    def add_stage(self, type: Literal["Apache Cassandra for DataStage"], label: str = None) -> stage.ApacheCassandraForDatastageStage: ...

    @overload
    def add_stage(self, type: Literal["Apache Derby"], label: str = None) -> stage.ApacheDerbyStage: ...

    @overload
    def add_stage(self, type: Literal["Apache HBase"], label: str = None) -> stage.ApacheHbaseStage: ...

    @overload
    def add_stage(self, type: Literal["Apache HDFS"], label: str = None) -> stage.ApacheHDFSStage: ...

    @overload
    def add_stage(self, type: Literal["Apache Hive"], label: str = None) -> stage.ApacheHiveStage: ...

    @overload
    def add_stage(self, type: Literal["Apache Impala"], label: str = None) -> stage.ApacheImpalaStage: ...

    @overload
    def add_stage(self, type: Literal["Apache Kafka"], label: str = None) -> stage.ApacheKafkaStage: ...

    @overload
    def add_stage(self, type: Literal["Azure PostgreSQL"], label: str = None) -> stage.AzurePostgresqlStage: ...

    @overload
    def add_stage(self, type: Literal["Bloom Filter"], label: str = None) -> stage.BloomFilterStage: ...

    @overload
    def add_stage(self, type: Literal["Box"], label: str = None) -> stage.BoxStage: ...

    @overload
    def add_stage(self, type: Literal["Change Apply"], label: str = None) -> stage.ChangeApplyStage: ...

    @overload
    def add_stage(self, type: Literal["Change Capture"], label: str = None) -> stage.ChangeCaptureStage: ...

    @overload
    def add_stage(self, type: Literal["Checksum"], label: str = None) -> stage.ChecksumStage: ...

    @overload
    def add_stage(self, type: Literal["Column Export"], label: str = None) -> stage.ColumnExportStage: ...

    @overload
    def add_stage(self, type: Literal["Column Generator"], label: str = None) -> stage.ColumnGeneratorStage: ...

    @overload
    def add_stage(self, type: Literal["Column Import"], label: str = None) -> stage.ColumnImportStage: ...

    @overload
    def add_stage(self, type: Literal["Combine Records"], label: str = None) -> stage.CombineRecordsStage: ...

    @overload
    def add_stage(self, type: Literal["Compare"], label: str = None) -> stage.CompareStage: ...

    @overload
    def add_stage(self, type: Literal["Complex Flat File"], label: str = None) -> stage.ComplexFlatFileStage: ...

    @overload
    def add_stage(self, type: Literal["Compress"], label: str = None) -> stage.CompressStage: ...

    @overload
    def add_stage(self, type: Literal["Copy"], label: str = None) -> stage.CopyStage: ...

    @overload
    def add_stage(self, type: Literal["Data Rules"], label: str = None) -> stage.DataRulesStage: ...

    @overload
    def add_stage(self, type: Literal["Data set"], label: str = None) -> stage.DataSetStage: ...

    @overload
    def add_stage(self, type: Literal["DataStax Enterprise"], label: str = None) -> stage.DatastaxEnterpriseStage: ...

    @overload
    def add_stage(self, type: Literal["Decode"], label: str = None) -> stage.DecodeStage: ...

    @overload
    def add_stage(self, type: Literal["Denodo"], label: str = None) -> stage.DenodoStage: ...

    @overload
    def add_stage(self, type: Literal["Difference"], label: str = None) -> stage.DifferenceStage: ...

    @overload
    def add_stage(self, type: Literal["Dremio"], label: str = None) -> stage.DremioStage: ...

    @overload
    def add_stage(self, type: Literal["Dropbox"], label: str = None) -> stage.DropboxStage: ...

    @overload
    def add_stage(self, type: Literal["Elasticsearch"], label: str = None) -> stage.ElasticsearchStage: ...

    @overload
    def add_stage(self, type: Literal["Encode"], label: str = None) -> stage.EncodeStage: ...

    @overload
    def add_stage(self, type: Literal["Exasol"], label: str = None) -> stage.ExasolStage: ...

    @overload
    def add_stage(self, type: Literal["Expand"], label: str = None) -> stage.ExpandStage: ...

    @overload
    def add_stage(self, type: Literal["External Filter"], label: str = None) -> stage.ExternalFilterStage: ...

    @overload
    def add_stage(self, type: Literal["External Source"], label: str = None) -> stage.ExternalSourceStage: ...

    @overload
    def add_stage(self, type: Literal["External Target"], label: str = None) -> stage.ExternalTargetStage: ...

    @overload
    def add_stage(self, type: Literal["FTP"], label: str = None) -> stage.FTPStage: ...

    @overload
    def add_stage(self, type: Literal["File set"], label: str = None) -> stage.FileSetStage: ...

    @overload
    def add_stage(self, type: Literal["Filter"], label: str = None) -> stage.FilterStage: ...

    @overload
    def add_stage(self, type: Literal["Funnel"], label: str = None) -> stage.FunnelStage: ...

    @overload
    def add_stage(self, type: Literal["Generic"], label: str = None) -> stage.GenericStage: ...

    @overload
    def add_stage(self, type: Literal["Generic JDBC"], label: str = None) -> stage.GenericJDBCStage: ...

    @overload
    def add_stage(self, type: Literal["Generic S3"], label: str = None) -> stage.GenericS3Stage: ...

    @overload
    def add_stage(self, type: Literal["Google BigQuery"], label: str = None) -> stage.GoogleBigqueryStage: ...

    @overload
    def add_stage(self, type: Literal["Google Cloud Pub/Sub"], label: str = None) -> stage.GoogleCloudPubSubStage: ...

    @overload
    def add_stage(self, type: Literal["Google Cloud Storage"], label: str = None) -> stage.GoogleCloudStorageStage: ...

    @overload
    def add_stage(self, type: Literal["Google Looker"], label: str = None) -> stage.GoogleLookerStage: ...

    @overload
    def add_stage(self, type: Literal["Greenplum"], label: str = None) -> stage.GreenplumStage: ...

    @overload
    def add_stage(self, type: Literal["HTTP"], label: str = None) -> stage.HTTPStage: ...

    @overload
    def add_stage(self, type: Literal["Head"], label: str = None) -> stage.HeadStage: ...

    @overload
    def add_stage(self, type: Literal["Hierarchical Data"], label: str = None) -> stage.HierarchicalDataStage: ...

    @overload
    def add_stage(self, type: Literal["IBM Cloud Databases for MongoDB"], label: str = None) -> stage.IBMCloudDatabasesForMongodbStage: ...

    @overload
    def add_stage(self, type: Literal["IBM Cloud Databases for MySQL"], label: str = None) -> stage.IBMCloudDatabasesForMysqlStage: ...

    @overload
    def add_stage(self, type: Literal["IBM Cloud Databases for PostgreSQL"], label: str = None) -> stage.IBMCloudDatabasesForPostgresqlStage: ...

    @overload
    def add_stage(self, type: Literal["IBM Cloud Object Storage"], label: str = None) -> stage.IBMCloudObjectStorageStage: ...

    @overload
    def add_stage(self, type: Literal["IBM Cognos Analytics"], label: str = None) -> stage.IBMCognosAnalyticsStage: ...

    @overload
    def add_stage(self, type: Literal["IBM Data Virtualization"], label: str = None) -> stage.IBMDataVirtualizationStage: ...

    @overload
    def add_stage(self, type: Literal["IBM Data Virtualization Manager for z/OS"], label: str = None) -> stage.IBMDataVirtualizationManagerForZOSStage: ...

    @overload
    def add_stage(self, type: Literal["IBM Db2"], label: str = None) -> stage.IBMDb2Stage: ...

    @overload
    def add_stage(self, type: Literal["IBM Db2 Big SQL"], label: str = None) -> stage.IBMDb2BigSQLStage: ...

    @overload
    def add_stage(self, type: Literal["IBM Db2 Warehouse"], label: str = None) -> stage.IBMDb2WarehouseStage: ...

    @overload
    def add_stage(self, type: Literal["IBM Db2 for DataStage"], label: str = None) -> stage.IBMDb2ForDatastageStage: ...

    @overload
    def add_stage(self, type: Literal["IBM Db2 for i"], label: str = None) -> stage.IBMDb2ForIStage: ...

    @overload
    def add_stage(self, type: Literal["IBM Db2 for z/OS"], label: str = None) -> stage.IBMDb2ForZOSStage: ...

    @overload
    def add_stage(self, type: Literal["IBM Db2 on Cloud"], label: str = None) -> stage.IBMDb2OnCloudStage: ...

    @overload
    def add_stage(self, type: Literal["IBM Informix"], label: str = None) -> stage.IBMInformixStage: ...

    @overload
    def add_stage(self, type: Literal["IBM MQ"], label: str = None) -> stage.IBMMQStage: ...

    @overload
    def add_stage(self, type: Literal["IBM Match 360"], label: str = None) -> stage.IBMMatch360Stage: ...

    @overload
    def add_stage(self, type: Literal["IBM Netezza Performance Server"], label: str = None) -> stage.IBMNetezzaPerformanceServerStage: ...

    @overload
    def add_stage(self, type: Literal["IBM Netezza Performance Server for DataStage"], label: str = None) -> stage.IBMNetezzaPerformanceServerForDatastageStage: ...

    @overload
    def add_stage(self, type: Literal["IBM Planning Analytics"], label: str = None) -> stage.IBMPlanningAnalyticsStage: ...

    @overload
    def add_stage(self, type: Literal["IBM watsonx.data Presto"], label: str = None) -> stage.IBMWatsonxDataPrestoStage: ...

    @overload
    def add_stage(self, type: Literal["Investigate"], label: str = None) -> stage.InvestigateStage: ...

    @overload
    def add_stage(self, type: Literal["Java Integration"], label: str = None) -> stage.JavaIntegrationStage: ...

    @overload
    def add_stage(self, type: Literal["Join"], label: str = None) -> stage.JoinStage: ...

    @overload
    def add_stage(self, type: Literal["Lookup"], label: str = None) -> stage.LookupStage: ...

    @overload
    def add_stage(self, type: Literal["Lookup file set"], label: str = None) -> stage.LookupFileSetStage: ...

    @overload
    def add_stage(self, type: Literal["Make Subrecord"], label: str = None) -> stage.MakeSubrecordStage: ...

    @overload
    def add_stage(self, type: Literal["Make Vector"], label: str = None) -> stage.MakeVectorStage: ...

    @overload
    def add_stage(self, type: Literal["MariaDB"], label: str = None) -> stage.MariadbStage: ...

    @overload
    def add_stage(self, type: Literal["Match Frequency"], label: str = None) -> stage.MatchFrequencyStage: ...

    @overload
    def add_stage(self, type: Literal["Merge"], label: str = None) -> stage.MergeStage: ...

    @overload
    def add_stage(self, type: Literal["Microsoft Azure Blob Storage"], label: str = None) -> stage.MicrosoftAzureBlobStorageStage: ...

    @overload
    def add_stage(self, type: Literal["Microsoft Azure Cosmos DB"], label: str = None) -> stage.MicrosoftAzureCosmosDBStage: ...

    @overload
    def add_stage(self, type: Literal["Microsoft Azure Data Lake Storage"], label: str = None) -> stage.MicrosoftAzureDataLakeStorageStage: ...

    @overload
    def add_stage(self, type: Literal["Microsoft Azure Databricks"], label: str = None) -> stage.MicrosoftAzureDatabricksStage: ...

    @overload
    def add_stage(self, type: Literal["Microsoft Azure File Storage"], label: str = None) -> stage.MicrosoftAzureFileStorageStage: ...

    @overload
    def add_stage(self, type: Literal["Microsoft Azure SQL Database"], label: str = None) -> stage.MicrosoftAzureSQLDatabaseStage: ...

    @overload
    def add_stage(self, type: Literal["Microsoft Azure Synapse Analytics"], label: str = None) -> stage.MicrosoftAzureSynapseAnalyticsStage: ...

    @overload
    def add_stage(self, type: Literal["Microsoft SQL Server"], label: str = None) -> stage.MicrosoftSQLServerStage: ...

    @overload
    def add_stage(self, type: Literal["MinIO"], label: str = None) -> stage.MinioStage: ...

    @overload
    def add_stage(self, type: Literal["Modify"], label: str = None) -> stage.ModifyStage: ...

    @overload
    def add_stage(self, type: Literal["MongoDB"], label: str = None) -> stage.MongodbStage: ...

    @overload
    def add_stage(self, type: Literal["MySQL"], label: str = None) -> stage.MysqlStage: ...

    @overload
    def add_stage(self, type: Literal["ODBC"], label: str = None) -> stage.ODBCStage: ...

    @overload
    def add_stage(self, type: Literal["One-source Match"], label: str = None) -> stage.OneSourceMatchStage: ...

    @overload
    def add_stage(self, type: Literal["Oracle"], label: str = None) -> stage.OracleStage: ...

    @overload
    def add_stage(self, type: Literal["Oracle Database for DataStage"], label: str = None) -> stage.OracleDatabaseForDatastageStage: ...

    @overload
    def add_stage(self, type: Literal["Peek"], label: str = None) -> stage.PeekStage: ...

    @overload
    def add_stage(self, type: Literal["Pivot Enterprise"], label: str = None) -> stage.PivotEnterpriseStage: ...

    @overload
    def add_stage(self, type: Literal["PostgreSQL"], label: str = None) -> stage.PostgresqlStage: ...

    @overload
    def add_stage(self, type: Literal["Presto"], label: str = None) -> stage.PrestoStage: ...

    @overload
    def add_stage(self, type: Literal["Promote Subrecord"], label: str = None) -> stage.PromoteSubrecordStage: ...

    @overload
    def add_stage(self, type: Literal["Remove Duplicates"], label: str = None) -> stage.RemoveDuplicatesStage: ...

    @overload
    def add_stage(self, type: Literal["Rest"], label: str = None) -> stage.RestStage: ...

    @overload
    def add_stage(self, type: Literal["Row Generator"], label: str = None) -> stage.RowGeneratorStage: ...

    @overload
    def add_stage(self, type: Literal["SAP ASE"], label: str = None) -> stage.SAPASEStage: ...

    @overload
    def add_stage(self, type: Literal["SAP BAPI"], label: str = None) -> stage.SAPBAPIStage: ...

    @overload
    def add_stage(self, type: Literal["SAP Bulk Extract"], label: str = None) -> stage.SAPBulkExtractStage: ...

    @overload
    def add_stage(self, type: Literal["SAP Delta Extract"], label: str = None) -> stage.SAPDeltaExtractStage: ...

    @overload
    def add_stage(self, type: Literal["SAP HANA"], label: str = None) -> stage.SAPHANAStage: ...

    @overload
    def add_stage(self, type: Literal["SAP IDoc"], label: str = None) -> stage.SAPIdocStage: ...

    @overload
    def add_stage(self, type: Literal["SAP IQ"], label: str = None) -> stage.SAPIQStage: ...

    @overload
    def add_stage(self, type: Literal["SAP OData"], label: str = None) -> stage.SAPOdataStage: ...

    @overload
    def add_stage(self, type: Literal["Salesforce API for DataStage"], label: str = None) -> stage.SalesforceAPIForDatastageStage: ...

    @overload
    def add_stage(self, type: Literal["Salesforce.com"], label: str = None) -> stage.SalesforceComStage: ...

    @overload
    def add_stage(self, type: Literal["Sample"], label: str = None) -> stage.SampleStage: ...

    @overload
    def add_stage(self, type: Literal["Sequential file"], label: str = None) -> stage.SequentialFileStage: ...

    @overload
    def add_stage(self, type: Literal["SingleStoreDB"], label: str = None) -> stage.SinglestoredbStage: ...

    @overload
    def add_stage(self, type: Literal["Slowly Changing Dimension"], label: str = None) -> stage.SlowlyChangingDimensionStage: ...

    @overload
    def add_stage(self, type: Literal["Snowflake"], label: str = None) -> stage.SnowflakeStage: ...

    @overload
    def add_stage(self, type: Literal["Sort"], label: str = None) -> stage.SortStage: ...

    @overload
    def add_stage(self, type: Literal["Split Subrecord"], label: str = None) -> stage.SplitSubrecordStage: ...

    @overload
    def add_stage(self, type: Literal["Split Vector"], label: str = None) -> stage.SplitVectorStage: ...

    @overload
    def add_stage(self, type: Literal["Standardize"], label: str = None) -> stage.StandardizeStage: ...

    @overload
    def add_stage(self, type: Literal["Storage volume"], label: str = None) -> stage.StorageVolumeStage: ...

    @overload
    def add_stage(self, type: Literal["Surrogate Key Generator"], label: str = None) -> stage.SurrogateKeyGeneratorStage: ...

    @overload
    def add_stage(self, type: Literal["Survive"], label: str = None) -> stage.SurviveStage: ...

    @overload
    def add_stage(self, type: Literal["Switch"], label: str = None) -> stage.SwitchStage: ...

    @overload
    def add_stage(self, type: Literal["Tableau"], label: str = None) -> stage.TableauStage: ...

    @overload
    def add_stage(self, type: Literal["Tail"], label: str = None) -> stage.TailStage: ...

    @overload
    def add_stage(self, type: Literal["Teradata"], label: str = None) -> stage.TeradataStage: ...

    @overload
    def add_stage(self, type: Literal["Teradata database for DataStage"], label: str = None) -> stage.TeradataDatabaseForDatastageStage: ...

    @overload
    def add_stage(self, type: Literal["Transformer"], label: str = None) -> stage.TransformerStage: ...

    @overload
    def add_stage(self, type: Literal["Two-source Match"], label: str = None) -> stage.TwoSourceMatchStage: ...

    @overload
    def add_stage(self, type: Literal["Vertica"], label: str = None) -> stage.VerticaStage: ...

    @overload
    def add_stage(self, type: Literal["Wave Generator"], label: str = None) -> stage.WaveGeneratorStage: ...

    @overload
    def add_stage(self, type: Literal["Web Service"], label: str = None) -> stage.WebServiceStage: ...

    @overload
    def add_stage(self, type: Literal["Write Range Map"], label: str = None) -> stage.WriteRangeMapStage: ...

    @overload
    def add_stage(self, type: Literal["XML Input"], label: str = None) -> stage.XMLInputStage: ...

    @overload
    def add_stage(self, type: Literal["XML Output"], label: str = None) -> stage.XMLOutputStage: ...

    def add_stage(self, type: StageTypeStr, label: str = None):
        stage_class = string_to_stage_class(type)
        node = stage_class(self._dag, label=label)
        self._dag.add_node(node)
        return node
