{-# 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.QuickSight.Types.TransformOperation
-- 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.QuickSight.Types.TransformOperation 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.QuickSight.Types.CastColumnTypeOperation
import Amazonka.QuickSight.Types.CreateColumnsOperation
import Amazonka.QuickSight.Types.FilterOperation
import Amazonka.QuickSight.Types.ProjectOperation
import Amazonka.QuickSight.Types.RenameColumnOperation
import Amazonka.QuickSight.Types.TagColumnOperation
import Amazonka.QuickSight.Types.UntagColumnOperation

-- | A data transformation on a logical table. This is a variant type
-- structure. For this structure to be valid, only one of the attributes
-- can be non-null.
--
-- /See:/ 'newTransformOperation' smart constructor.
data TransformOperation = TransformOperation'
  { -- | A transform operation that casts a column to a different type.
    TransformOperation -> Maybe CastColumnTypeOperation
castColumnTypeOperation :: Prelude.Maybe CastColumnTypeOperation,
    -- | An operation that creates calculated columns. Columns created in one
    -- such operation form a lexical closure.
    TransformOperation -> Maybe CreateColumnsOperation
createColumnsOperation :: Prelude.Maybe CreateColumnsOperation,
    -- | An operation that filters rows based on some condition.
    TransformOperation -> Maybe FilterOperation
filterOperation :: Prelude.Maybe FilterOperation,
    -- | An operation that projects columns. Operations that come after a
    -- projection can only refer to projected columns.
    TransformOperation -> Maybe ProjectOperation
projectOperation :: Prelude.Maybe ProjectOperation,
    -- | An operation that renames a column.
    TransformOperation -> Maybe RenameColumnOperation
renameColumnOperation :: Prelude.Maybe RenameColumnOperation,
    -- | An operation that tags a column with additional information.
    TransformOperation -> Maybe TagColumnOperation
tagColumnOperation :: Prelude.Maybe TagColumnOperation,
    TransformOperation -> Maybe UntagColumnOperation
untagColumnOperation :: Prelude.Maybe UntagColumnOperation
  }
  deriving (TransformOperation -> TransformOperation -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TransformOperation -> TransformOperation -> Bool
$c/= :: TransformOperation -> TransformOperation -> Bool
== :: TransformOperation -> TransformOperation -> Bool
$c== :: TransformOperation -> TransformOperation -> Bool
Prelude.Eq, Int -> TransformOperation -> ShowS
[TransformOperation] -> ShowS
TransformOperation -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TransformOperation] -> ShowS
$cshowList :: [TransformOperation] -> ShowS
show :: TransformOperation -> String
$cshow :: TransformOperation -> String
showsPrec :: Int -> TransformOperation -> ShowS
$cshowsPrec :: Int -> TransformOperation -> ShowS
Prelude.Show, forall x. Rep TransformOperation x -> TransformOperation
forall x. TransformOperation -> Rep TransformOperation x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep TransformOperation x -> TransformOperation
$cfrom :: forall x. TransformOperation -> Rep TransformOperation x
Prelude.Generic)

-- |
-- Create a value of 'TransformOperation' 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:
--
-- 'castColumnTypeOperation', 'transformOperation_castColumnTypeOperation' - A transform operation that casts a column to a different type.
--
-- 'createColumnsOperation', 'transformOperation_createColumnsOperation' - An operation that creates calculated columns. Columns created in one
-- such operation form a lexical closure.
--
-- 'filterOperation', 'transformOperation_filterOperation' - An operation that filters rows based on some condition.
--
-- 'projectOperation', 'transformOperation_projectOperation' - An operation that projects columns. Operations that come after a
-- projection can only refer to projected columns.
--
-- 'renameColumnOperation', 'transformOperation_renameColumnOperation' - An operation that renames a column.
--
-- 'tagColumnOperation', 'transformOperation_tagColumnOperation' - An operation that tags a column with additional information.
--
-- 'untagColumnOperation', 'transformOperation_untagColumnOperation' - Undocumented member.
newTransformOperation ::
  TransformOperation
newTransformOperation :: TransformOperation
newTransformOperation =
  TransformOperation'
    { $sel:castColumnTypeOperation:TransformOperation' :: Maybe CastColumnTypeOperation
castColumnTypeOperation =
        forall a. Maybe a
Prelude.Nothing,
      $sel:createColumnsOperation:TransformOperation' :: Maybe CreateColumnsOperation
createColumnsOperation = forall a. Maybe a
Prelude.Nothing,
      $sel:filterOperation:TransformOperation' :: Maybe FilterOperation
filterOperation = forall a. Maybe a
Prelude.Nothing,
      $sel:projectOperation:TransformOperation' :: Maybe ProjectOperation
projectOperation = forall a. Maybe a
Prelude.Nothing,
      $sel:renameColumnOperation:TransformOperation' :: Maybe RenameColumnOperation
renameColumnOperation = forall a. Maybe a
Prelude.Nothing,
      $sel:tagColumnOperation:TransformOperation' :: Maybe TagColumnOperation
tagColumnOperation = forall a. Maybe a
Prelude.Nothing,
      $sel:untagColumnOperation:TransformOperation' :: Maybe UntagColumnOperation
untagColumnOperation = forall a. Maybe a
Prelude.Nothing
    }

-- | A transform operation that casts a column to a different type.
transformOperation_castColumnTypeOperation :: Lens.Lens' TransformOperation (Prelude.Maybe CastColumnTypeOperation)
transformOperation_castColumnTypeOperation :: Lens' TransformOperation (Maybe CastColumnTypeOperation)
transformOperation_castColumnTypeOperation = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\TransformOperation' {Maybe CastColumnTypeOperation
castColumnTypeOperation :: Maybe CastColumnTypeOperation
$sel:castColumnTypeOperation:TransformOperation' :: TransformOperation -> Maybe CastColumnTypeOperation
castColumnTypeOperation} -> Maybe CastColumnTypeOperation
castColumnTypeOperation) (\s :: TransformOperation
s@TransformOperation' {} Maybe CastColumnTypeOperation
a -> TransformOperation
s {$sel:castColumnTypeOperation:TransformOperation' :: Maybe CastColumnTypeOperation
castColumnTypeOperation = Maybe CastColumnTypeOperation
a} :: TransformOperation)

-- | An operation that creates calculated columns. Columns created in one
-- such operation form a lexical closure.
transformOperation_createColumnsOperation :: Lens.Lens' TransformOperation (Prelude.Maybe CreateColumnsOperation)
transformOperation_createColumnsOperation :: Lens' TransformOperation (Maybe CreateColumnsOperation)
transformOperation_createColumnsOperation = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\TransformOperation' {Maybe CreateColumnsOperation
createColumnsOperation :: Maybe CreateColumnsOperation
$sel:createColumnsOperation:TransformOperation' :: TransformOperation -> Maybe CreateColumnsOperation
createColumnsOperation} -> Maybe CreateColumnsOperation
createColumnsOperation) (\s :: TransformOperation
s@TransformOperation' {} Maybe CreateColumnsOperation
a -> TransformOperation
s {$sel:createColumnsOperation:TransformOperation' :: Maybe CreateColumnsOperation
createColumnsOperation = Maybe CreateColumnsOperation
a} :: TransformOperation)

-- | An operation that filters rows based on some condition.
transformOperation_filterOperation :: Lens.Lens' TransformOperation (Prelude.Maybe FilterOperation)
transformOperation_filterOperation :: Lens' TransformOperation (Maybe FilterOperation)
transformOperation_filterOperation = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\TransformOperation' {Maybe FilterOperation
filterOperation :: Maybe FilterOperation
$sel:filterOperation:TransformOperation' :: TransformOperation -> Maybe FilterOperation
filterOperation} -> Maybe FilterOperation
filterOperation) (\s :: TransformOperation
s@TransformOperation' {} Maybe FilterOperation
a -> TransformOperation
s {$sel:filterOperation:TransformOperation' :: Maybe FilterOperation
filterOperation = Maybe FilterOperation
a} :: TransformOperation)

-- | An operation that projects columns. Operations that come after a
-- projection can only refer to projected columns.
transformOperation_projectOperation :: Lens.Lens' TransformOperation (Prelude.Maybe ProjectOperation)
transformOperation_projectOperation :: Lens' TransformOperation (Maybe ProjectOperation)
transformOperation_projectOperation = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\TransformOperation' {Maybe ProjectOperation
projectOperation :: Maybe ProjectOperation
$sel:projectOperation:TransformOperation' :: TransformOperation -> Maybe ProjectOperation
projectOperation} -> Maybe ProjectOperation
projectOperation) (\s :: TransformOperation
s@TransformOperation' {} Maybe ProjectOperation
a -> TransformOperation
s {$sel:projectOperation:TransformOperation' :: Maybe ProjectOperation
projectOperation = Maybe ProjectOperation
a} :: TransformOperation)

-- | An operation that renames a column.
transformOperation_renameColumnOperation :: Lens.Lens' TransformOperation (Prelude.Maybe RenameColumnOperation)
transformOperation_renameColumnOperation :: Lens' TransformOperation (Maybe RenameColumnOperation)
transformOperation_renameColumnOperation = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\TransformOperation' {Maybe RenameColumnOperation
renameColumnOperation :: Maybe RenameColumnOperation
$sel:renameColumnOperation:TransformOperation' :: TransformOperation -> Maybe RenameColumnOperation
renameColumnOperation} -> Maybe RenameColumnOperation
renameColumnOperation) (\s :: TransformOperation
s@TransformOperation' {} Maybe RenameColumnOperation
a -> TransformOperation
s {$sel:renameColumnOperation:TransformOperation' :: Maybe RenameColumnOperation
renameColumnOperation = Maybe RenameColumnOperation
a} :: TransformOperation)

-- | An operation that tags a column with additional information.
transformOperation_tagColumnOperation :: Lens.Lens' TransformOperation (Prelude.Maybe TagColumnOperation)
transformOperation_tagColumnOperation :: Lens' TransformOperation (Maybe TagColumnOperation)
transformOperation_tagColumnOperation = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\TransformOperation' {Maybe TagColumnOperation
tagColumnOperation :: Maybe TagColumnOperation
$sel:tagColumnOperation:TransformOperation' :: TransformOperation -> Maybe TagColumnOperation
tagColumnOperation} -> Maybe TagColumnOperation
tagColumnOperation) (\s :: TransformOperation
s@TransformOperation' {} Maybe TagColumnOperation
a -> TransformOperation
s {$sel:tagColumnOperation:TransformOperation' :: Maybe TagColumnOperation
tagColumnOperation = Maybe TagColumnOperation
a} :: TransformOperation)

-- | Undocumented member.
transformOperation_untagColumnOperation :: Lens.Lens' TransformOperation (Prelude.Maybe UntagColumnOperation)
transformOperation_untagColumnOperation :: Lens' TransformOperation (Maybe UntagColumnOperation)
transformOperation_untagColumnOperation = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\TransformOperation' {Maybe UntagColumnOperation
untagColumnOperation :: Maybe UntagColumnOperation
$sel:untagColumnOperation:TransformOperation' :: TransformOperation -> Maybe UntagColumnOperation
untagColumnOperation} -> Maybe UntagColumnOperation
untagColumnOperation) (\s :: TransformOperation
s@TransformOperation' {} Maybe UntagColumnOperation
a -> TransformOperation
s {$sel:untagColumnOperation:TransformOperation' :: Maybe UntagColumnOperation
untagColumnOperation = Maybe UntagColumnOperation
a} :: TransformOperation)

instance Data.FromJSON TransformOperation where
  parseJSON :: Value -> Parser TransformOperation
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"TransformOperation"
      ( \Object
x ->
          Maybe CastColumnTypeOperation
-> Maybe CreateColumnsOperation
-> Maybe FilterOperation
-> Maybe ProjectOperation
-> Maybe RenameColumnOperation
-> Maybe TagColumnOperation
-> Maybe UntagColumnOperation
-> TransformOperation
TransformOperation'
            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
"CastColumnTypeOperation")
            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
"CreateColumnsOperation")
            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
"FilterOperation")
            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
"ProjectOperation")
            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
"RenameColumnOperation")
            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
"TagColumnOperation")
            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
"UntagColumnOperation")
      )

instance Prelude.Hashable TransformOperation where
  hashWithSalt :: Int -> TransformOperation -> Int
hashWithSalt Int
_salt TransformOperation' {Maybe CastColumnTypeOperation
Maybe CreateColumnsOperation
Maybe FilterOperation
Maybe ProjectOperation
Maybe RenameColumnOperation
Maybe TagColumnOperation
Maybe UntagColumnOperation
untagColumnOperation :: Maybe UntagColumnOperation
tagColumnOperation :: Maybe TagColumnOperation
renameColumnOperation :: Maybe RenameColumnOperation
projectOperation :: Maybe ProjectOperation
filterOperation :: Maybe FilterOperation
createColumnsOperation :: Maybe CreateColumnsOperation
castColumnTypeOperation :: Maybe CastColumnTypeOperation
$sel:untagColumnOperation:TransformOperation' :: TransformOperation -> Maybe UntagColumnOperation
$sel:tagColumnOperation:TransformOperation' :: TransformOperation -> Maybe TagColumnOperation
$sel:renameColumnOperation:TransformOperation' :: TransformOperation -> Maybe RenameColumnOperation
$sel:projectOperation:TransformOperation' :: TransformOperation -> Maybe ProjectOperation
$sel:filterOperation:TransformOperation' :: TransformOperation -> Maybe FilterOperation
$sel:createColumnsOperation:TransformOperation' :: TransformOperation -> Maybe CreateColumnsOperation
$sel:castColumnTypeOperation:TransformOperation' :: TransformOperation -> Maybe CastColumnTypeOperation
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe CastColumnTypeOperation
castColumnTypeOperation
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe CreateColumnsOperation
createColumnsOperation
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe FilterOperation
filterOperation
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ProjectOperation
projectOperation
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe RenameColumnOperation
renameColumnOperation
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe TagColumnOperation
tagColumnOperation
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe UntagColumnOperation
untagColumnOperation

instance Prelude.NFData TransformOperation where
  rnf :: TransformOperation -> ()
rnf TransformOperation' {Maybe CastColumnTypeOperation
Maybe CreateColumnsOperation
Maybe FilterOperation
Maybe ProjectOperation
Maybe RenameColumnOperation
Maybe TagColumnOperation
Maybe UntagColumnOperation
untagColumnOperation :: Maybe UntagColumnOperation
tagColumnOperation :: Maybe TagColumnOperation
renameColumnOperation :: Maybe RenameColumnOperation
projectOperation :: Maybe ProjectOperation
filterOperation :: Maybe FilterOperation
createColumnsOperation :: Maybe CreateColumnsOperation
castColumnTypeOperation :: Maybe CastColumnTypeOperation
$sel:untagColumnOperation:TransformOperation' :: TransformOperation -> Maybe UntagColumnOperation
$sel:tagColumnOperation:TransformOperation' :: TransformOperation -> Maybe TagColumnOperation
$sel:renameColumnOperation:TransformOperation' :: TransformOperation -> Maybe RenameColumnOperation
$sel:projectOperation:TransformOperation' :: TransformOperation -> Maybe ProjectOperation
$sel:filterOperation:TransformOperation' :: TransformOperation -> Maybe FilterOperation
$sel:createColumnsOperation:TransformOperation' :: TransformOperation -> Maybe CreateColumnsOperation
$sel:castColumnTypeOperation:TransformOperation' :: TransformOperation -> Maybe CastColumnTypeOperation
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe CastColumnTypeOperation
castColumnTypeOperation
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe CreateColumnsOperation
createColumnsOperation
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe FilterOperation
filterOperation
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe ProjectOperation
projectOperation
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe RenameColumnOperation
renameColumnOperation
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe TagColumnOperation
tagColumnOperation
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe UntagColumnOperation
untagColumnOperation

instance Data.ToJSON TransformOperation where
  toJSON :: TransformOperation -> Value
toJSON TransformOperation' {Maybe CastColumnTypeOperation
Maybe CreateColumnsOperation
Maybe FilterOperation
Maybe ProjectOperation
Maybe RenameColumnOperation
Maybe TagColumnOperation
Maybe UntagColumnOperation
untagColumnOperation :: Maybe UntagColumnOperation
tagColumnOperation :: Maybe TagColumnOperation
renameColumnOperation :: Maybe RenameColumnOperation
projectOperation :: Maybe ProjectOperation
filterOperation :: Maybe FilterOperation
createColumnsOperation :: Maybe CreateColumnsOperation
castColumnTypeOperation :: Maybe CastColumnTypeOperation
$sel:untagColumnOperation:TransformOperation' :: TransformOperation -> Maybe UntagColumnOperation
$sel:tagColumnOperation:TransformOperation' :: TransformOperation -> Maybe TagColumnOperation
$sel:renameColumnOperation:TransformOperation' :: TransformOperation -> Maybe RenameColumnOperation
$sel:projectOperation:TransformOperation' :: TransformOperation -> Maybe ProjectOperation
$sel:filterOperation:TransformOperation' :: TransformOperation -> Maybe FilterOperation
$sel:createColumnsOperation:TransformOperation' :: TransformOperation -> Maybe CreateColumnsOperation
$sel:castColumnTypeOperation:TransformOperation' :: TransformOperation -> Maybe CastColumnTypeOperation
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"CastColumnTypeOperation" 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 CastColumnTypeOperation
castColumnTypeOperation,
            (Key
"CreateColumnsOperation" 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 CreateColumnsOperation
createColumnsOperation,
            (Key
"FilterOperation" 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 FilterOperation
filterOperation,
            (Key
"ProjectOperation" 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 ProjectOperation
projectOperation,
            (Key
"RenameColumnOperation" 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 RenameColumnOperation
renameColumnOperation,
            (Key
"TagColumnOperation" 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 TagColumnOperation
tagColumnOperation,
            (Key
"UntagColumnOperation" 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 UntagColumnOperation
untagColumnOperation
          ]
      )