{-# 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.ColumnHierarchy
-- 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.ColumnHierarchy 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.DateTimeHierarchy
import Amazonka.QuickSight.Types.ExplicitHierarchy
import Amazonka.QuickSight.Types.PredefinedHierarchy

-- | The option that determines the hierarchy of the fields for a visual
-- element.
--
-- /See:/ 'newColumnHierarchy' smart constructor.
data ColumnHierarchy = ColumnHierarchy'
  { -- | The option that determines the hierarchy of any @DateTime@ fields.
    ColumnHierarchy -> Maybe DateTimeHierarchy
dateTimeHierarchy :: Prelude.Maybe DateTimeHierarchy,
    -- | The option that determines the hierarchy of the fields that are built
    -- within a visual\'s field wells. These fields can\'t be duplicated to
    -- other visuals.
    ColumnHierarchy -> Maybe ExplicitHierarchy
explicitHierarchy :: Prelude.Maybe ExplicitHierarchy,
    -- | The option that determines the hierarchy of the fields that are defined
    -- during data preparation. These fields are available to use in any
    -- analysis that uses the data source.
    ColumnHierarchy -> Maybe PredefinedHierarchy
predefinedHierarchy :: Prelude.Maybe PredefinedHierarchy
  }
  deriving (ColumnHierarchy -> ColumnHierarchy -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ColumnHierarchy -> ColumnHierarchy -> Bool
$c/= :: ColumnHierarchy -> ColumnHierarchy -> Bool
== :: ColumnHierarchy -> ColumnHierarchy -> Bool
$c== :: ColumnHierarchy -> ColumnHierarchy -> Bool
Prelude.Eq, ReadPrec [ColumnHierarchy]
ReadPrec ColumnHierarchy
Int -> ReadS ColumnHierarchy
ReadS [ColumnHierarchy]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ColumnHierarchy]
$creadListPrec :: ReadPrec [ColumnHierarchy]
readPrec :: ReadPrec ColumnHierarchy
$creadPrec :: ReadPrec ColumnHierarchy
readList :: ReadS [ColumnHierarchy]
$creadList :: ReadS [ColumnHierarchy]
readsPrec :: Int -> ReadS ColumnHierarchy
$creadsPrec :: Int -> ReadS ColumnHierarchy
Prelude.Read, Int -> ColumnHierarchy -> ShowS
[ColumnHierarchy] -> ShowS
ColumnHierarchy -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ColumnHierarchy] -> ShowS
$cshowList :: [ColumnHierarchy] -> ShowS
show :: ColumnHierarchy -> String
$cshow :: ColumnHierarchy -> String
showsPrec :: Int -> ColumnHierarchy -> ShowS
$cshowsPrec :: Int -> ColumnHierarchy -> ShowS
Prelude.Show, forall x. Rep ColumnHierarchy x -> ColumnHierarchy
forall x. ColumnHierarchy -> Rep ColumnHierarchy x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ColumnHierarchy x -> ColumnHierarchy
$cfrom :: forall x. ColumnHierarchy -> Rep ColumnHierarchy x
Prelude.Generic)

-- |
-- Create a value of 'ColumnHierarchy' 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:
--
-- 'dateTimeHierarchy', 'columnHierarchy_dateTimeHierarchy' - The option that determines the hierarchy of any @DateTime@ fields.
--
-- 'explicitHierarchy', 'columnHierarchy_explicitHierarchy' - The option that determines the hierarchy of the fields that are built
-- within a visual\'s field wells. These fields can\'t be duplicated to
-- other visuals.
--
-- 'predefinedHierarchy', 'columnHierarchy_predefinedHierarchy' - The option that determines the hierarchy of the fields that are defined
-- during data preparation. These fields are available to use in any
-- analysis that uses the data source.
newColumnHierarchy ::
  ColumnHierarchy
newColumnHierarchy :: ColumnHierarchy
newColumnHierarchy =
  ColumnHierarchy'
    { $sel:dateTimeHierarchy:ColumnHierarchy' :: Maybe DateTimeHierarchy
dateTimeHierarchy =
        forall a. Maybe a
Prelude.Nothing,
      $sel:explicitHierarchy:ColumnHierarchy' :: Maybe ExplicitHierarchy
explicitHierarchy = forall a. Maybe a
Prelude.Nothing,
      $sel:predefinedHierarchy:ColumnHierarchy' :: Maybe PredefinedHierarchy
predefinedHierarchy = forall a. Maybe a
Prelude.Nothing
    }

-- | The option that determines the hierarchy of any @DateTime@ fields.
columnHierarchy_dateTimeHierarchy :: Lens.Lens' ColumnHierarchy (Prelude.Maybe DateTimeHierarchy)
columnHierarchy_dateTimeHierarchy :: Lens' ColumnHierarchy (Maybe DateTimeHierarchy)
columnHierarchy_dateTimeHierarchy = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ColumnHierarchy' {Maybe DateTimeHierarchy
dateTimeHierarchy :: Maybe DateTimeHierarchy
$sel:dateTimeHierarchy:ColumnHierarchy' :: ColumnHierarchy -> Maybe DateTimeHierarchy
dateTimeHierarchy} -> Maybe DateTimeHierarchy
dateTimeHierarchy) (\s :: ColumnHierarchy
s@ColumnHierarchy' {} Maybe DateTimeHierarchy
a -> ColumnHierarchy
s {$sel:dateTimeHierarchy:ColumnHierarchy' :: Maybe DateTimeHierarchy
dateTimeHierarchy = Maybe DateTimeHierarchy
a} :: ColumnHierarchy)

-- | The option that determines the hierarchy of the fields that are built
-- within a visual\'s field wells. These fields can\'t be duplicated to
-- other visuals.
columnHierarchy_explicitHierarchy :: Lens.Lens' ColumnHierarchy (Prelude.Maybe ExplicitHierarchy)
columnHierarchy_explicitHierarchy :: Lens' ColumnHierarchy (Maybe ExplicitHierarchy)
columnHierarchy_explicitHierarchy = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ColumnHierarchy' {Maybe ExplicitHierarchy
explicitHierarchy :: Maybe ExplicitHierarchy
$sel:explicitHierarchy:ColumnHierarchy' :: ColumnHierarchy -> Maybe ExplicitHierarchy
explicitHierarchy} -> Maybe ExplicitHierarchy
explicitHierarchy) (\s :: ColumnHierarchy
s@ColumnHierarchy' {} Maybe ExplicitHierarchy
a -> ColumnHierarchy
s {$sel:explicitHierarchy:ColumnHierarchy' :: Maybe ExplicitHierarchy
explicitHierarchy = Maybe ExplicitHierarchy
a} :: ColumnHierarchy)

-- | The option that determines the hierarchy of the fields that are defined
-- during data preparation. These fields are available to use in any
-- analysis that uses the data source.
columnHierarchy_predefinedHierarchy :: Lens.Lens' ColumnHierarchy (Prelude.Maybe PredefinedHierarchy)
columnHierarchy_predefinedHierarchy :: Lens' ColumnHierarchy (Maybe PredefinedHierarchy)
columnHierarchy_predefinedHierarchy = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ColumnHierarchy' {Maybe PredefinedHierarchy
predefinedHierarchy :: Maybe PredefinedHierarchy
$sel:predefinedHierarchy:ColumnHierarchy' :: ColumnHierarchy -> Maybe PredefinedHierarchy
predefinedHierarchy} -> Maybe PredefinedHierarchy
predefinedHierarchy) (\s :: ColumnHierarchy
s@ColumnHierarchy' {} Maybe PredefinedHierarchy
a -> ColumnHierarchy
s {$sel:predefinedHierarchy:ColumnHierarchy' :: Maybe PredefinedHierarchy
predefinedHierarchy = Maybe PredefinedHierarchy
a} :: ColumnHierarchy)

instance Data.FromJSON ColumnHierarchy where
  parseJSON :: Value -> Parser ColumnHierarchy
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"ColumnHierarchy"
      ( \Object
x ->
          Maybe DateTimeHierarchy
-> Maybe ExplicitHierarchy
-> Maybe PredefinedHierarchy
-> ColumnHierarchy
ColumnHierarchy'
            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
"DateTimeHierarchy")
            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
"ExplicitHierarchy")
            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
"PredefinedHierarchy")
      )

instance Prelude.Hashable ColumnHierarchy where
  hashWithSalt :: Int -> ColumnHierarchy -> Int
hashWithSalt Int
_salt ColumnHierarchy' {Maybe PredefinedHierarchy
Maybe ExplicitHierarchy
Maybe DateTimeHierarchy
predefinedHierarchy :: Maybe PredefinedHierarchy
explicitHierarchy :: Maybe ExplicitHierarchy
dateTimeHierarchy :: Maybe DateTimeHierarchy
$sel:predefinedHierarchy:ColumnHierarchy' :: ColumnHierarchy -> Maybe PredefinedHierarchy
$sel:explicitHierarchy:ColumnHierarchy' :: ColumnHierarchy -> Maybe ExplicitHierarchy
$sel:dateTimeHierarchy:ColumnHierarchy' :: ColumnHierarchy -> Maybe DateTimeHierarchy
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe DateTimeHierarchy
dateTimeHierarchy
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ExplicitHierarchy
explicitHierarchy
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe PredefinedHierarchy
predefinedHierarchy

instance Prelude.NFData ColumnHierarchy where
  rnf :: ColumnHierarchy -> ()
rnf ColumnHierarchy' {Maybe PredefinedHierarchy
Maybe ExplicitHierarchy
Maybe DateTimeHierarchy
predefinedHierarchy :: Maybe PredefinedHierarchy
explicitHierarchy :: Maybe ExplicitHierarchy
dateTimeHierarchy :: Maybe DateTimeHierarchy
$sel:predefinedHierarchy:ColumnHierarchy' :: ColumnHierarchy -> Maybe PredefinedHierarchy
$sel:explicitHierarchy:ColumnHierarchy' :: ColumnHierarchy -> Maybe ExplicitHierarchy
$sel:dateTimeHierarchy:ColumnHierarchy' :: ColumnHierarchy -> Maybe DateTimeHierarchy
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe DateTimeHierarchy
dateTimeHierarchy
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe ExplicitHierarchy
explicitHierarchy
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe PredefinedHierarchy
predefinedHierarchy

instance Data.ToJSON ColumnHierarchy where
  toJSON :: ColumnHierarchy -> Value
toJSON ColumnHierarchy' {Maybe PredefinedHierarchy
Maybe ExplicitHierarchy
Maybe DateTimeHierarchy
predefinedHierarchy :: Maybe PredefinedHierarchy
explicitHierarchy :: Maybe ExplicitHierarchy
dateTimeHierarchy :: Maybe DateTimeHierarchy
$sel:predefinedHierarchy:ColumnHierarchy' :: ColumnHierarchy -> Maybe PredefinedHierarchy
$sel:explicitHierarchy:ColumnHierarchy' :: ColumnHierarchy -> Maybe ExplicitHierarchy
$sel:dateTimeHierarchy:ColumnHierarchy' :: ColumnHierarchy -> Maybe DateTimeHierarchy
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"DateTimeHierarchy" 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 DateTimeHierarchy
dateTimeHierarchy,
            (Key
"ExplicitHierarchy" 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 ExplicitHierarchy
explicitHierarchy,
            (Key
"PredefinedHierarchy" 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 PredefinedHierarchy
predefinedHierarchy
          ]
      )