/** * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0. */ #pragma once #include #include #include #include #include #include namespace Aws { namespace Utils { namespace Json { class JsonValue; class JsonView; } // namespace Json } // namespace Utils namespace CostExplorer { namespace Model { /** *

Use Expression to filter in various Cost Explorer APIs.

*

Not all Expression types are supported in each API. Refer to the * documentation for each specific API to see what is supported.

There are * two patterns:

  • Simple dimension values.

    • There * are three types of simple dimension values: CostCategories, * Tags, and Dimensions.

      • Specify the * CostCategories field to define a filter that acts on Cost * Categories.

      • Specify the Tags field to define a * filter that acts on Cost Allocation Tags.

      • Specify the * Dimensions field to define a filter that acts on the * DimensionValues .

    • For each filter * type, you can set the dimension name and values for the filters that you plan to * use.

      • For example, you can filter for REGION==us-east-1 OR * REGION==us-west-1. For GetRightsizingRecommendation, the * Region is a full name (for example, REGION==US East (N. * Virginia).

      • The corresponding Expression * for this example is as follows: { "Dimensions": { "Key": "REGION", * "Values": [ "us-east-1", "us-west-1" ] } }

      • As shown in * the previous example, lists of dimension values are combined with * OR when applying the filter.

    • You can * also set different match options to further control how the filter behaves. Not * all APIs support match options. Refer to the documentation for each specific API * to see what is supported.

      • For example, you can filter for * linked account names that start with "a".

      • The corresponding * Expression for this example is as follows: { "Dimensions": { * "Key": "LINKED_ACCOUNT_NAME", "MatchOptions": [ "STARTS_WITH" ], "Values": [ "a" * ] } }

  • Compound * Expression types with logical operations.

    • You can * use multiple Expression types and the logical operators * AND/OR/NOT to create a list of one or more Expression * objects. By doing this, you can filter by more advanced options.

    • *

      For example, you can filter by ((REGION == us-east-1 OR REGION == * us-west-1) OR (TAG.Type == Type1)) AND (USAGE_TYPE != DataTransfer).

      *
    • The corresponding Expression for this example is as * follows: { "And": [ {"Or": [ {"Dimensions": { "Key": "REGION", "Values": [ * "us-east-1", "us-west-1" ] }}, {"Tags": { "Key": "TagName", "Values": ["Value1"] * } } ]}, {"Not": {"Dimensions": { "Key": "USAGE_TYPE", "Values": ["DataTransfer"] * }}} ] }

    Because each Expression * can have only one operator, the service returns an error if more than one is * specified. The following example shows an Expression object that * creates an error: { "And": [ ... ], "Dimensions": { "Key": "USAGE_TYPE", * "Values": [ "DataTransfer" ] } }

    The following is an example of * the corresponding error message: "Expression has more than one roots. Only * one root operator is allowed for each expression: And, Or, Not, Dimensions, * Tags, CostCategories"

For the * GetRightsizingRecommendation action, a combination of OR and NOT * isn't supported. OR isn't supported between different dimensions, or dimensions * and tags. NOT operators aren't supported. Dimensions are also limited to * LINKED_ACCOUNT, REGION, or * RIGHTSIZING_TYPE.

For the * GetReservationPurchaseRecommendation action, only NOT is supported. * AND and OR aren't supported. Dimensions are limited to * LINKED_ACCOUNT.

See Also:

AWS API * Reference

*/ class Expression { public: AWS_COSTEXPLORER_API Expression(); AWS_COSTEXPLORER_API Expression(Aws::Utils::Json::JsonView jsonValue); AWS_COSTEXPLORER_API Expression& operator=(Aws::Utils::Json::JsonView jsonValue); AWS_COSTEXPLORER_API Aws::Utils::Json::JsonValue Jsonize() const; /** *

Return results that match either Dimension object.

*/ inline const Aws::Vector& GetOr() const{ return m_or; } /** *

Return results that match either Dimension object.

*/ inline bool OrHasBeenSet() const { return m_orHasBeenSet; } /** *

Return results that match either Dimension object.

*/ inline void SetOr(const Aws::Vector& value) { m_orHasBeenSet = true; m_or = value; } /** *

Return results that match either Dimension object.

*/ inline void SetOr(Aws::Vector&& value) { m_orHasBeenSet = true; m_or = std::move(value); } /** *

Return results that match either Dimension object.

*/ inline Expression& WithOr(const Aws::Vector& value) { SetOr(value); return *this;} /** *

Return results that match either Dimension object.

*/ inline Expression& WithOr(Aws::Vector&& value) { SetOr(std::move(value)); return *this;} /** *

Return results that match either Dimension object.

*/ inline Expression& AddOr(const Expression& value) { m_orHasBeenSet = true; m_or.push_back(value); return *this; } /** *

Return results that match either Dimension object.

*/ inline Expression& AddOr(Expression&& value) { m_orHasBeenSet = true; m_or.push_back(std::move(value)); return *this; } /** *

Return results that match both Dimension objects.

*/ inline const Aws::Vector& GetAnd() const{ return m_and; } /** *

Return results that match both Dimension objects.

*/ inline bool AndHasBeenSet() const { return m_andHasBeenSet; } /** *

Return results that match both Dimension objects.

*/ inline void SetAnd(const Aws::Vector& value) { m_andHasBeenSet = true; m_and = value; } /** *

Return results that match both Dimension objects.

*/ inline void SetAnd(Aws::Vector&& value) { m_andHasBeenSet = true; m_and = std::move(value); } /** *

Return results that match both Dimension objects.

*/ inline Expression& WithAnd(const Aws::Vector& value) { SetAnd(value); return *this;} /** *

Return results that match both Dimension objects.

*/ inline Expression& WithAnd(Aws::Vector&& value) { SetAnd(std::move(value)); return *this;} /** *

Return results that match both Dimension objects.

*/ inline Expression& AddAnd(const Expression& value) { m_andHasBeenSet = true; m_and.push_back(value); return *this; } /** *

Return results that match both Dimension objects.

*/ inline Expression& AddAnd(Expression&& value) { m_andHasBeenSet = true; m_and.push_back(std::move(value)); return *this; } /** *

Return results that don't match a Dimension object.

*/ AWS_COSTEXPLORER_API const Expression& GetNot() const; /** *

Return results that don't match a Dimension object.

*/ AWS_COSTEXPLORER_API bool NotHasBeenSet() const; /** *

Return results that don't match a Dimension object.

*/ AWS_COSTEXPLORER_API void SetNot(const Expression& value); /** *

Return results that don't match a Dimension object.

*/ AWS_COSTEXPLORER_API void SetNot(Expression&& value); /** *

Return results that don't match a Dimension object.

*/ AWS_COSTEXPLORER_API Expression& WithNot(const Expression& value); /** *

Return results that don't match a Dimension object.

*/ AWS_COSTEXPLORER_API Expression& WithNot(Expression&& value); /** *

The specific Dimension to use for Expression.

*/ inline const DimensionValues& GetDimensions() const{ return m_dimensions; } /** *

The specific Dimension to use for Expression.

*/ inline bool DimensionsHasBeenSet() const { return m_dimensionsHasBeenSet; } /** *

The specific Dimension to use for Expression.

*/ inline void SetDimensions(const DimensionValues& value) { m_dimensionsHasBeenSet = true; m_dimensions = value; } /** *

The specific Dimension to use for Expression.

*/ inline void SetDimensions(DimensionValues&& value) { m_dimensionsHasBeenSet = true; m_dimensions = std::move(value); } /** *

The specific Dimension to use for Expression.

*/ inline Expression& WithDimensions(const DimensionValues& value) { SetDimensions(value); return *this;} /** *

The specific Dimension to use for Expression.

*/ inline Expression& WithDimensions(DimensionValues&& value) { SetDimensions(std::move(value)); return *this;} /** *

The specific Tag to use for Expression.

*/ inline const TagValues& GetTags() const{ return m_tags; } /** *

The specific Tag to use for Expression.

*/ inline bool TagsHasBeenSet() const { return m_tagsHasBeenSet; } /** *

The specific Tag to use for Expression.

*/ inline void SetTags(const TagValues& value) { m_tagsHasBeenSet = true; m_tags = value; } /** *

The specific Tag to use for Expression.

*/ inline void SetTags(TagValues&& value) { m_tagsHasBeenSet = true; m_tags = std::move(value); } /** *

The specific Tag to use for Expression.

*/ inline Expression& WithTags(const TagValues& value) { SetTags(value); return *this;} /** *

The specific Tag to use for Expression.

*/ inline Expression& WithTags(TagValues&& value) { SetTags(std::move(value)); return *this;} /** *

The filter that's based on CostCategory values.

*/ inline const CostCategoryValues& GetCostCategories() const{ return m_costCategories; } /** *

The filter that's based on CostCategory values.

*/ inline bool CostCategoriesHasBeenSet() const { return m_costCategoriesHasBeenSet; } /** *

The filter that's based on CostCategory values.

*/ inline void SetCostCategories(const CostCategoryValues& value) { m_costCategoriesHasBeenSet = true; m_costCategories = value; } /** *

The filter that's based on CostCategory values.

*/ inline void SetCostCategories(CostCategoryValues&& value) { m_costCategoriesHasBeenSet = true; m_costCategories = std::move(value); } /** *

The filter that's based on CostCategory values.

*/ inline Expression& WithCostCategories(const CostCategoryValues& value) { SetCostCategories(value); return *this;} /** *

The filter that's based on CostCategory values.

*/ inline Expression& WithCostCategories(CostCategoryValues&& value) { SetCostCategories(std::move(value)); return *this;} private: Aws::Vector m_or; bool m_orHasBeenSet = false; Aws::Vector m_and; bool m_andHasBeenSet = false; std::shared_ptr m_not; bool m_notHasBeenSet = false; DimensionValues m_dimensions; bool m_dimensionsHasBeenSet = false; TagValues m_tags; bool m_tagsHasBeenSet = false; CostCategoryValues m_costCategories; bool m_costCategoriesHasBeenSet = false; }; } // namespace Model } // namespace CostExplorer } // namespace Aws