{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.SageMaker.Types.OfflineStoreConfig
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
module Amazonka.SageMaker.Types.OfflineStoreConfig where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import qualified Amazonka.Prelude as Prelude
import Amazonka.SageMaker.Types.DataCatalogConfig
import Amazonka.SageMaker.Types.S3StorageConfig
import Amazonka.SageMaker.Types.TableFormat

-- | The configuration of an @OfflineStore@.
--
-- Provide an @OfflineStoreConfig@ in a request to @CreateFeatureGroup@ to
-- create an @OfflineStore@.
--
-- To encrypt an @OfflineStore@ using at rest data encryption, specify
-- Amazon Web Services Key Management Service (KMS) key ID, or @KMSKeyId@,
-- in @S3StorageConfig@.
--
-- /See:/ 'newOfflineStoreConfig' smart constructor.
data OfflineStoreConfig = OfflineStoreConfig'
  { -- | The meta data of the Glue table that is autogenerated when an
    -- @OfflineStore@ is created.
    OfflineStoreConfig -> Maybe DataCatalogConfig
dataCatalogConfig :: Prelude.Maybe DataCatalogConfig,
    -- | Set to @True@ to disable the automatic creation of an Amazon Web
    -- Services Glue table when configuring an @OfflineStore@.
    OfflineStoreConfig -> Maybe Bool
disableGlueTableCreation :: Prelude.Maybe Prelude.Bool,
    -- | Format for the offline store table. Supported formats are Glue (Default)
    -- and <https://iceberg.apache.org/ Apache Iceberg>.
    OfflineStoreConfig -> Maybe TableFormat
tableFormat :: Prelude.Maybe TableFormat,
    -- | The Amazon Simple Storage (Amazon S3) location of @OfflineStore@.
    OfflineStoreConfig -> S3StorageConfig
s3StorageConfig :: S3StorageConfig
  }
  deriving (OfflineStoreConfig -> OfflineStoreConfig -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: OfflineStoreConfig -> OfflineStoreConfig -> Bool
$c/= :: OfflineStoreConfig -> OfflineStoreConfig -> Bool
== :: OfflineStoreConfig -> OfflineStoreConfig -> Bool
$c== :: OfflineStoreConfig -> OfflineStoreConfig -> Bool
Prelude.Eq, ReadPrec [OfflineStoreConfig]
ReadPrec OfflineStoreConfig
Int -> ReadS OfflineStoreConfig
ReadS [OfflineStoreConfig]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [OfflineStoreConfig]
$creadListPrec :: ReadPrec [OfflineStoreConfig]
readPrec :: ReadPrec OfflineStoreConfig
$creadPrec :: ReadPrec OfflineStoreConfig
readList :: ReadS [OfflineStoreConfig]
$creadList :: ReadS [OfflineStoreConfig]
readsPrec :: Int -> ReadS OfflineStoreConfig
$creadsPrec :: Int -> ReadS OfflineStoreConfig
Prelude.Read, Int -> OfflineStoreConfig -> ShowS
[OfflineStoreConfig] -> ShowS
OfflineStoreConfig -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [OfflineStoreConfig] -> ShowS
$cshowList :: [OfflineStoreConfig] -> ShowS
show :: OfflineStoreConfig -> String
$cshow :: OfflineStoreConfig -> String
showsPrec :: Int -> OfflineStoreConfig -> ShowS
$cshowsPrec :: Int -> OfflineStoreConfig -> ShowS
Prelude.Show, forall x. Rep OfflineStoreConfig x -> OfflineStoreConfig
forall x. OfflineStoreConfig -> Rep OfflineStoreConfig x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep OfflineStoreConfig x -> OfflineStoreConfig
$cfrom :: forall x. OfflineStoreConfig -> Rep OfflineStoreConfig x
Prelude.Generic)

-- |
-- Create a value of 'OfflineStoreConfig' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'dataCatalogConfig', 'offlineStoreConfig_dataCatalogConfig' - The meta data of the Glue table that is autogenerated when an
-- @OfflineStore@ is created.
--
-- 'disableGlueTableCreation', 'offlineStoreConfig_disableGlueTableCreation' - Set to @True@ to disable the automatic creation of an Amazon Web
-- Services Glue table when configuring an @OfflineStore@.
--
-- 'tableFormat', 'offlineStoreConfig_tableFormat' - Format for the offline store table. Supported formats are Glue (Default)
-- and <https://iceberg.apache.org/ Apache Iceberg>.
--
-- 's3StorageConfig', 'offlineStoreConfig_s3StorageConfig' - The Amazon Simple Storage (Amazon S3) location of @OfflineStore@.
newOfflineStoreConfig ::
  -- | 's3StorageConfig'
  S3StorageConfig ->
  OfflineStoreConfig
newOfflineStoreConfig :: S3StorageConfig -> OfflineStoreConfig
newOfflineStoreConfig S3StorageConfig
pS3StorageConfig_ =
  OfflineStoreConfig'
    { $sel:dataCatalogConfig:OfflineStoreConfig' :: Maybe DataCatalogConfig
dataCatalogConfig =
        forall a. Maybe a
Prelude.Nothing,
      $sel:disableGlueTableCreation:OfflineStoreConfig' :: Maybe Bool
disableGlueTableCreation = forall a. Maybe a
Prelude.Nothing,
      $sel:tableFormat:OfflineStoreConfig' :: Maybe TableFormat
tableFormat = forall a. Maybe a
Prelude.Nothing,
      $sel:s3StorageConfig:OfflineStoreConfig' :: S3StorageConfig
s3StorageConfig = S3StorageConfig
pS3StorageConfig_
    }

-- | The meta data of the Glue table that is autogenerated when an
-- @OfflineStore@ is created.
offlineStoreConfig_dataCatalogConfig :: Lens.Lens' OfflineStoreConfig (Prelude.Maybe DataCatalogConfig)
offlineStoreConfig_dataCatalogConfig :: Lens' OfflineStoreConfig (Maybe DataCatalogConfig)
offlineStoreConfig_dataCatalogConfig = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\OfflineStoreConfig' {Maybe DataCatalogConfig
dataCatalogConfig :: Maybe DataCatalogConfig
$sel:dataCatalogConfig:OfflineStoreConfig' :: OfflineStoreConfig -> Maybe DataCatalogConfig
dataCatalogConfig} -> Maybe DataCatalogConfig
dataCatalogConfig) (\s :: OfflineStoreConfig
s@OfflineStoreConfig' {} Maybe DataCatalogConfig
a -> OfflineStoreConfig
s {$sel:dataCatalogConfig:OfflineStoreConfig' :: Maybe DataCatalogConfig
dataCatalogConfig = Maybe DataCatalogConfig
a} :: OfflineStoreConfig)

-- | Set to @True@ to disable the automatic creation of an Amazon Web
-- Services Glue table when configuring an @OfflineStore@.
offlineStoreConfig_disableGlueTableCreation :: Lens.Lens' OfflineStoreConfig (Prelude.Maybe Prelude.Bool)
offlineStoreConfig_disableGlueTableCreation :: Lens' OfflineStoreConfig (Maybe Bool)
offlineStoreConfig_disableGlueTableCreation = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\OfflineStoreConfig' {Maybe Bool
disableGlueTableCreation :: Maybe Bool
$sel:disableGlueTableCreation:OfflineStoreConfig' :: OfflineStoreConfig -> Maybe Bool
disableGlueTableCreation} -> Maybe Bool
disableGlueTableCreation) (\s :: OfflineStoreConfig
s@OfflineStoreConfig' {} Maybe Bool
a -> OfflineStoreConfig
s {$sel:disableGlueTableCreation:OfflineStoreConfig' :: Maybe Bool
disableGlueTableCreation = Maybe Bool
a} :: OfflineStoreConfig)

-- | Format for the offline store table. Supported formats are Glue (Default)
-- and <https://iceberg.apache.org/ Apache Iceberg>.
offlineStoreConfig_tableFormat :: Lens.Lens' OfflineStoreConfig (Prelude.Maybe TableFormat)
offlineStoreConfig_tableFormat :: Lens' OfflineStoreConfig (Maybe TableFormat)
offlineStoreConfig_tableFormat = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\OfflineStoreConfig' {Maybe TableFormat
tableFormat :: Maybe TableFormat
$sel:tableFormat:OfflineStoreConfig' :: OfflineStoreConfig -> Maybe TableFormat
tableFormat} -> Maybe TableFormat
tableFormat) (\s :: OfflineStoreConfig
s@OfflineStoreConfig' {} Maybe TableFormat
a -> OfflineStoreConfig
s {$sel:tableFormat:OfflineStoreConfig' :: Maybe TableFormat
tableFormat = Maybe TableFormat
a} :: OfflineStoreConfig)

-- | The Amazon Simple Storage (Amazon S3) location of @OfflineStore@.
offlineStoreConfig_s3StorageConfig :: Lens.Lens' OfflineStoreConfig S3StorageConfig
offlineStoreConfig_s3StorageConfig :: Lens' OfflineStoreConfig S3StorageConfig
offlineStoreConfig_s3StorageConfig = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\OfflineStoreConfig' {S3StorageConfig
s3StorageConfig :: S3StorageConfig
$sel:s3StorageConfig:OfflineStoreConfig' :: OfflineStoreConfig -> S3StorageConfig
s3StorageConfig} -> S3StorageConfig
s3StorageConfig) (\s :: OfflineStoreConfig
s@OfflineStoreConfig' {} S3StorageConfig
a -> OfflineStoreConfig
s {$sel:s3StorageConfig:OfflineStoreConfig' :: S3StorageConfig
s3StorageConfig = S3StorageConfig
a} :: OfflineStoreConfig)

instance Data.FromJSON OfflineStoreConfig where
  parseJSON :: Value -> Parser OfflineStoreConfig
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"OfflineStoreConfig"
      ( \Object
x ->
          Maybe DataCatalogConfig
-> Maybe Bool
-> Maybe TableFormat
-> S3StorageConfig
-> OfflineStoreConfig
OfflineStoreConfig'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"DataCatalogConfig")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"DisableGlueTableCreation")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"TableFormat")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser a
Data..: Key
"S3StorageConfig")
      )

instance Prelude.Hashable OfflineStoreConfig where
  hashWithSalt :: Int -> OfflineStoreConfig -> Int
hashWithSalt Int
_salt OfflineStoreConfig' {Maybe Bool
Maybe DataCatalogConfig
Maybe TableFormat
S3StorageConfig
s3StorageConfig :: S3StorageConfig
tableFormat :: Maybe TableFormat
disableGlueTableCreation :: Maybe Bool
dataCatalogConfig :: Maybe DataCatalogConfig
$sel:s3StorageConfig:OfflineStoreConfig' :: OfflineStoreConfig -> S3StorageConfig
$sel:tableFormat:OfflineStoreConfig' :: OfflineStoreConfig -> Maybe TableFormat
$sel:disableGlueTableCreation:OfflineStoreConfig' :: OfflineStoreConfig -> Maybe Bool
$sel:dataCatalogConfig:OfflineStoreConfig' :: OfflineStoreConfig -> Maybe DataCatalogConfig
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe DataCatalogConfig
dataCatalogConfig
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Bool
disableGlueTableCreation
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe TableFormat
tableFormat
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` S3StorageConfig
s3StorageConfig

instance Prelude.NFData OfflineStoreConfig where
  rnf :: OfflineStoreConfig -> ()
rnf OfflineStoreConfig' {Maybe Bool
Maybe DataCatalogConfig
Maybe TableFormat
S3StorageConfig
s3StorageConfig :: S3StorageConfig
tableFormat :: Maybe TableFormat
disableGlueTableCreation :: Maybe Bool
dataCatalogConfig :: Maybe DataCatalogConfig
$sel:s3StorageConfig:OfflineStoreConfig' :: OfflineStoreConfig -> S3StorageConfig
$sel:tableFormat:OfflineStoreConfig' :: OfflineStoreConfig -> Maybe TableFormat
$sel:disableGlueTableCreation:OfflineStoreConfig' :: OfflineStoreConfig -> Maybe Bool
$sel:dataCatalogConfig:OfflineStoreConfig' :: OfflineStoreConfig -> Maybe DataCatalogConfig
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe DataCatalogConfig
dataCatalogConfig
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Bool
disableGlueTableCreation
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe TableFormat
tableFormat
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf S3StorageConfig
s3StorageConfig

instance Data.ToJSON OfflineStoreConfig where
  toJSON :: OfflineStoreConfig -> Value
toJSON OfflineStoreConfig' {Maybe Bool
Maybe DataCatalogConfig
Maybe TableFormat
S3StorageConfig
s3StorageConfig :: S3StorageConfig
tableFormat :: Maybe TableFormat
disableGlueTableCreation :: Maybe Bool
dataCatalogConfig :: Maybe DataCatalogConfig
$sel:s3StorageConfig:OfflineStoreConfig' :: OfflineStoreConfig -> S3StorageConfig
$sel:tableFormat:OfflineStoreConfig' :: OfflineStoreConfig -> Maybe TableFormat
$sel:disableGlueTableCreation:OfflineStoreConfig' :: OfflineStoreConfig -> Maybe Bool
$sel:dataCatalogConfig:OfflineStoreConfig' :: OfflineStoreConfig -> Maybe DataCatalogConfig
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"DataCatalogConfig" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=)
              forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe DataCatalogConfig
dataCatalogConfig,
            (Key
"DisableGlueTableCreation" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=)
              forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Bool
disableGlueTableCreation,
            (Key
"TableFormat" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe TableFormat
tableFormat,
            forall a. a -> Maybe a
Prelude.Just
              (Key
"S3StorageConfig" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= S3StorageConfig
s3StorageConfig)
          ]
      )